Преглед изворни кода

Added support for resources for all levels of the xnat data hierachy

Andreas Fetzer пре 11 година
родитељ
комит
752e37a75e

+ 1 - 0
Libs/XNAT/Core/CMakeLists.txt

@@ -21,6 +21,7 @@ set(KIT_SRCS
   ctkXnatReconstruction.cpp
   ctkXnatReconstructionFolder.cpp
   ctkXnatReconstructionResource.cpp
+  ctkXnatResource.cpp
   ctkXnatScan.cpp
   ctkXnatScanFolder.cpp
   ctkXnatScanResource.cpp

+ 1 - 0
Libs/XNAT/Core/ctkXnatDefaultSchemaTypes.cpp

@@ -29,3 +29,4 @@ QString ctkXnatDefaultSchemaTypes::XSI_RECONSTRUCTION_RESOURCE = "xnat:reconstru
 QString ctkXnatDefaultSchemaTypes::XSI_SCAN = "xnat:imageScanData";
 QString ctkXnatDefaultSchemaTypes::XSI_SCAN_RESOURCE = "xnat:scanResource";
 QString ctkXnatDefaultSchemaTypes::XSI_SUBJECT = "xnat:subjectData";
+QString ctkXnatDefaultSchemaTypes::XSI_RESOURCE = "xnat:resource";

+ 1 - 0
Libs/XNAT/Core/ctkXnatDefaultSchemaTypes.h

@@ -39,6 +39,7 @@ struct CTK_XNAT_CORE_EXPORT ctkXnatDefaultSchemaTypes
   static QString XSI_SCAN; // = "xnat:imageScanData"
   static QString XSI_SCAN_RESOURCE; // = "xnat:scanResource"
   static QString XSI_SUBJECT; // = "xnat:subjectData"
+  static QString XSI_RESOURCE; // = "xnat:resource"
 };
 
 #endif // CTKXNATDEFAULTSCHEMATYPES_H

+ 1 - 0
Libs/XNAT/Core/ctkXnatExperiment.cpp

@@ -99,4 +99,5 @@ void ctkXnatExperiment::fetchImpl()
     ctkXnatReconstructionFolder* reconstructionFolder = new ctkXnatReconstructionFolder();
     this->add(reconstructionFolder);
   }
+  this->fetchResources();
 }

+ 23 - 1
Libs/XNAT/Core/ctkXnatObject.cpp

@@ -22,8 +22,9 @@
 #include "ctkXnatObject.h"
 #include "ctkXnatObjectPrivate.h"
 
-#include "ctkXnatSession.h"
 #include "ctkXnatDataModel.h"
+#include "ctkXnatSession.h"
+#include "ctkXnatDefaultSchemaTypes.h"
 
 #include <QDebug>
 #include <QVariant>
@@ -262,6 +263,27 @@ void ctkXnatObject::save()
 }
 
 //----------------------------------------------------------------------------
+void ctkXnatObject::fetchResources()
+{
+  QString query = this->resourceUri() + "/resources";
+  ctkXnatSession* const session = this->session();
+  QUuid queryId = session->httpGet(query);
+
+  QList<ctkXnatObject*> resources = session->httpResults(queryId,
+                                                           ctkXnatDefaultSchemaTypes::XSI_RESOURCE);
+
+  foreach (ctkXnatObject* resource, resources)
+  {
+    QString label = resource->property("label");
+    if (!label.isEmpty())
+    {
+      resource->setProperty("ID", label);
+    }
+    this->add(resource);
+  }
+}
+
+//----------------------------------------------------------------------------
 void ctkXnatObject::erase()
 {
   this->session()->remove(this);

+ 3 - 0
Libs/XNAT/Core/ctkXnatObject.h

@@ -120,6 +120,9 @@ public:
   /// Deletes the object on the XNAT server and removes it from its parent.
   void erase();
 
+  /// Fetches the resources of the object
+  virtual void fetchResources();
+
   virtual void download(const QString&);
   virtual void upload(const QString&);
 

+ 1 - 0
Libs/XNAT/Core/ctkXnatProject.cpp

@@ -157,4 +157,5 @@ void ctkXnatProject::fetchImpl()
 
     this->add(subject);
   }
+  this->fetchResources();
 }

+ 97 - 0
Libs/XNAT/Core/ctkXnatResource.cpp

@@ -0,0 +1,97 @@
+/*=============================================================================
+
+  Library: XNAT/Core
+
+  Copyright (c) University College London,
+    Centre for Medical Image Computing
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=============================================================================*/
+
+#include "ctkXnatResource.h"
+
+#include "ctkXnatSession.h"
+#include "ctkXnatObjectPrivate.h"
+#include "ctkXnatFile.h"
+#include "ctkXnatDefaultSchemaTypes.h"
+
+
+//----------------------------------------------------------------------------
+class ctkXnatResourcePrivate : public ctkXnatObjectPrivate
+{
+public:
+
+  ctkXnatResourcePrivate()
+  : ctkXnatObjectPrivate()
+  {
+  }
+
+  void reset()
+  {
+//    uri.clear();
+  }
+
+//  QString uri;
+};
+
+
+//----------------------------------------------------------------------------
+ctkXnatResource::ctkXnatResource(ctkXnatObject* parent, const QString& schemaType)
+: ctkXnatObject(*new ctkXnatResourcePrivate(), parent, schemaType)
+{
+}
+
+//----------------------------------------------------------------------------
+ctkXnatResource::~ctkXnatResource()
+{
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatResource::resourceUri() const
+{
+  return QString("%1/resources/%2").arg(parent()->resourceUri(), this->property("label"));
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatResource::reset()
+{
+  ctkXnatObject::reset();
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatResource::fetchImpl()
+{
+  QString resourceFilesUrinatResource = this->resourceUri() + "/files";
+  ctkXnatSession* const session = this->session();
+  QUuid queryId = session->httpGet(resourceFilesUrinatResource);
+
+  QList<ctkXnatObject*> files = session->httpResults(queryId,
+                                                     ctkXnatDefaultSchemaTypes::XSI_FILE);
+
+  foreach (ctkXnatObject* file, files)
+  {
+    QString label = file->property("Name");
+    if (!label.isEmpty())
+    {
+      file->setProperty("ID", label);
+    }
+    this->add(file);
+  }
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatResource::download(const QString& filename)
+{
+//  this->session()->download(this, filename);
+}

+ 60 - 0
Libs/XNAT/Core/ctkXnatResource.h

@@ -0,0 +1,60 @@
+/*=============================================================================
+
+  Library: XNAT/Core
+
+  Copyright (c) University College London,
+    Centre for Medical Image Computing
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=============================================================================*/
+
+#ifndef ctkXnatResource_h
+#define ctkXnatResource_h
+
+#include "ctkXNATCoreExport.h"
+
+#include "ctkXnatObject.h"
+#include "ctkXnatDefaultSchemaTypes.h"
+
+class ctkXnatResourcePrivate;
+
+/**
+ * @ingroup XNAT_Core
+ */
+class CTK_XNAT_CORE_EXPORT ctkXnatResource : public ctkXnatObject
+{
+
+public:
+
+  ctkXnatResource(ctkXnatObject* parent = 0,
+                      const QString& schemaType = ctkXnatDefaultSchemaTypes::XSI_RESOURCE);
+
+  virtual ~ctkXnatResource();
+
+  QString resourceUri() const;
+
+  void reset();
+
+  void download(const QString& filename);
+
+private:
+
+  friend class qRestResult;
+  virtual void fetchImpl();
+
+  Q_DECLARE_PRIVATE(ctkXnatResource)
+
+};
+
+#endif

+ 2 - 0
Libs/XNAT/Core/ctkXnatSession.cpp

@@ -31,6 +31,7 @@
 #include "ctkXnatReconstruction.h"
 #include "ctkXnatReconstructionFolder.h"
 #include "ctkXnatReconstructionResource.h"
+#include "ctkXnatResource.h"
 #include "ctkXnatScan.h"
 #include "ctkXnatScanFolder.h"
 #include "ctkXnatScanResource.h"
@@ -308,6 +309,7 @@ ctkXnatSession::ctkXnatSession(const ctkXnatLoginProfile& loginProfile)
   qRegisterMetaType<ctkXnatScanResource>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_SCAN_RESOURCE));
   qRegisterMetaType<ctkXnatFile>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_FILE));
   qRegisterMetaType<ctkXnatReconstructionResource>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_RECONSTRUCTION_RESOURCE));
+  qRegisterMetaType<ctkXnatResource>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_RESOURCE));
 
   QString url = d->loginProfile.serverUrl().toString();
   d->xnat->setServerUrl(url);

+ 1 - 0
Libs/XNAT/Core/ctkXnatSubject.cpp

@@ -127,4 +127,5 @@ void ctkXnatSubject::fetchImpl()
 
     this->add(experiment);
   }
+  this->fetchResources();
 }