浏览代码

Merge remote-tracking branch 'ntoussaint/CTK-XNAT-Library-AssessmentObject' into xnat-assessment-support

Conflicts:
	Libs/XNAT/Core/ctkXnatDefaultSchemaTypes.cpp
	Libs/XNAT/Core/ctkXnatDefaultSchemaTypes.h
	Libs/XNAT/Core/ctkXnatExperiment.cpp
	Libs/XNAT/Core/ctkXnatSession.cpp
Miklos Espak 11 年之前
父节点
当前提交
e0f498dfac

+ 0 - 2
Applications/ctkXnatTreeBrowser/ctkXnatTreeBrowserMainWindow.cpp

@@ -66,8 +66,6 @@ void ctkXnatTreeBrowserMainWindow::loginButtonPushed()
     ui->loginLabel->setText("Disconnected");
     ui->downloadLabel->hide();
 
-    // nt: download tests... //
-    // m_TreeModel->downloadFile (ui->treeView->selectionModel()->currentIndex(), "/Users/nicolastoussaint/Desktop/test.nii.gz");
   }
   else
   {

+ 1 - 1
Libs/Core/ctkBackTrace.cpp

@@ -178,7 +178,7 @@ int ctkBackTracePrivate::trace(void** array, size_t n) const
 #else
 
 // --------------------------------------------------------------------------
-int ctkBackTracePrivate::trace(void** /*array*/, size_t /*n*/) const
+int ctkBackTracePrivate::trace(void** /*array*/, int /*n*/) const
 {
   return 0;
 }

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

@@ -25,6 +25,9 @@ set(KIT_SRCS
   ctkXnatScan.cpp
   ctkXnatScanFolder.cpp
   ctkXnatScanResource.cpp
+  ctkXnatAssessor.cpp
+  ctkXnatAssessorFolder.cpp
+  ctkXnatAssessorResource.cpp
   ctkXnatSession.cpp
   ctkXnatSettings.cpp
   ctkXnatSubject.cpp

+ 112 - 0
Libs/XNAT/Core/ctkXnatAssessor.cpp

@@ -0,0 +1,112 @@
+/*=============================================================================
+
+  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 "ctkXnatAssessor.h"
+
+#include "ctkXnatSession.h"
+#include "ctkXnatObject.h"
+#include "ctkXnatObjectPrivate.h"
+#include "ctkXnatDefaultSchemaTypes.h"
+
+#include "ctkXnatAssessorResource.h"
+#include "ctkXnatScanResource.h"
+
+//----------------------------------------------------------------------------
+class ctkXnatAssessorPrivate : public ctkXnatObjectPrivate
+{
+public:
+
+  ctkXnatAssessorPrivate()
+  : ctkXnatObjectPrivate()
+  {
+  }
+
+  void reset()
+  {
+    uri.clear();
+  }
+
+  QString uri;
+};
+
+
+//----------------------------------------------------------------------------
+ctkXnatAssessor::ctkXnatAssessor(ctkXnatObject* parent, const QString& schemaType)
+: ctkXnatObject(*new ctkXnatAssessorPrivate(), parent, schemaType)
+{
+}
+
+//----------------------------------------------------------------------------
+ctkXnatAssessor::~ctkXnatAssessor()
+{
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatAssessor::resourceUri() const
+{
+  return QString("%1/%2").arg(parent()->resourceUri(), this->id());
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatAssessor::reset()
+{
+  ctkXnatObject::reset();
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatAssessor::fetchImpl()
+{
+  QString assessorResourcesUri = this->resourceUri() + "/resources";
+  ctkXnatSession* const session = this->session();
+  QUuid queryId = session->httpGet(assessorResourcesUri);
+
+  QList<ctkXnatObject*> assessorResources = session->httpResults(queryId,
+                                                             ctkXnatDefaultSchemaTypes::XSI_ASSESSOR_RESOURCE);
+
+  foreach (ctkXnatObject* assessorResource, assessorResources)
+  {
+    QString resource_id = assessorResource->property("xnat_abstractresource_id");
+    QString label = assessorResource->property("label");
+    
+    if (!resource_id.isEmpty())
+      assessorResource->setProperty("ID", resource_id);
+    
+    this->add(assessorResource);
+  }
+  
+  assessorResourcesUri = this->resourceUri() + "/out/resources";
+  queryId = session->httpGet(assessorResourcesUri);
+
+  assessorResources = session->httpResults(queryId,
+					   ctkXnatDefaultSchemaTypes::XSI_ASSESSOR_RESOURCE);
+
+  foreach (ctkXnatObject* assessorResource, assessorResources)
+  {
+    QString resource_id = assessorResource->property("xnat_abstractresource_id");
+    QString label = assessorResource->property("label");
+    
+    if (!resource_id.isEmpty())
+      assessorResource->setProperty("ID", resource_id);
+    
+    this->add(assessorResource);
+  }
+  
+}

+ 55 - 0
Libs/XNAT/Core/ctkXnatAssessor.h

@@ -0,0 +1,55 @@
+/*=============================================================================
+
+  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 ctkXnatAssessor_h
+#define ctkXnatAssessor_h
+
+#include "ctkXNATCoreExport.h"
+
+#include "ctkXnatObject.h"
+#include "ctkXnatDefaultSchemaTypes.h"
+
+class ctkXnatAssessorPrivate;
+
+/**
+ * @ingroup XNAT_Core
+ */
+class CTK_XNAT_CORE_EXPORT ctkXnatAssessor : public ctkXnatObject
+{
+
+public:
+
+  ctkXnatAssessor(ctkXnatObject* parent = 0, const QString& schemaType = ctkXnatDefaultSchemaTypes::XSI_ASSESSOR);
+
+  virtual ~ctkXnatAssessor();
+
+  virtual QString resourceUri() const;
+
+  void reset();
+
+private:
+
+  virtual void fetchImpl();
+
+  Q_DECLARE_PRIVATE(ctkXnatAssessor)
+};
+
+#endif

+ 87 - 0
Libs/XNAT/Core/ctkXnatAssessorFolder.cpp

@@ -0,0 +1,87 @@
+/*=============================================================================
+
+  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 "ctkXnatAssessorFolder.h"
+
+#include "ctkXnatSession.h"
+#include "ctkXnatExperiment.h"
+#include "ctkXnatObjectPrivate.h"
+#include "ctkXnatAssessor.h"
+#include "ctkXnatDefaultSchemaTypes.h"
+
+//----------------------------------------------------------------------------
+class ctkXnatAssessorFolderPrivate : public ctkXnatObjectPrivate
+{
+public:
+
+  ctkXnatAssessorFolderPrivate()
+  : ctkXnatObjectPrivate()
+  {
+  }
+
+  void reset()
+  {
+  }
+
+};
+
+//----------------------------------------------------------------------------
+ctkXnatAssessorFolder::ctkXnatAssessorFolder(ctkXnatObject* parent)
+  : ctkXnatObject(*new ctkXnatAssessorFolderPrivate(), parent, QString::null)
+{
+  
+  this->setProperty("ID", "assessors");
+  this->setProperty("label", "Assessments");
+}
+
+//----------------------------------------------------------------------------
+ctkXnatAssessorFolder::~ctkXnatAssessorFolder()
+{
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatAssessorFolder::resourceUri() const
+{
+  return QString("%1/%2").arg(parent()->resourceUri(), this->id());
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatAssessorFolder::reset()
+{
+  ctkXnatObject::reset();
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatAssessorFolder::fetchImpl()
+{
+  QString assessorsUri = this->resourceUri();
+  ctkXnatSession* const session = this->session();
+  QUuid queryId = session->httpGet(assessorsUri);
+
+  QList<ctkXnatObject*> assessors = session->httpResults(queryId,
+                                                     ctkXnatDefaultSchemaTypes::XSI_ASSESSOR);
+
+  foreach (ctkXnatObject* assessor, assessors)
+  {
+    
+    this->add(assessor);
+  }
+}

+ 55 - 0
Libs/XNAT/Core/ctkXnatAssessorFolder.h

@@ -0,0 +1,55 @@
+/*=============================================================================
+
+  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 ctkXnatAssessorFolder_h
+#define ctkXnatAssessorFolder_h
+
+#include "ctkXNATCoreExport.h"
+
+#include "ctkXnatObject.h"
+
+class ctkXnatAssessorFolderPrivate;
+
+/**
+ * @ingroup XNAT_Core
+ */
+class CTK_XNAT_CORE_EXPORT ctkXnatAssessorFolder : public ctkXnatObject
+{
+
+public:
+
+  ctkXnatAssessorFolder(ctkXnatObject* parent = NULL);
+
+  virtual ~ctkXnatAssessorFolder();
+
+  virtual QString resourceUri() const;
+
+  void reset();
+
+private:
+
+  friend class qRestResult;
+  virtual void fetchImpl();
+
+  Q_DECLARE_PRIVATE(ctkXnatAssessorFolder)
+};
+
+#endif

+ 96 - 0
Libs/XNAT/Core/ctkXnatAssessorResource.cpp

@@ -0,0 +1,96 @@
+/*=============================================================================
+
+  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 "ctkXnatAssessorResource.h"
+
+#include "ctkXnatSession.h"
+#include "ctkXnatObjectPrivate.h"
+#include "ctkXnatDefaultSchemaTypes.h"
+
+//----------------------------------------------------------------------------
+class ctkXnatAssessorResourcePrivate : public ctkXnatObjectPrivate
+{
+public:
+
+  ctkXnatAssessorResourcePrivate()
+  : ctkXnatObjectPrivate()
+  {
+  }
+
+  void reset()
+  {
+  }
+
+};
+
+
+//----------------------------------------------------------------------------
+ctkXnatAssessorResource::ctkXnatAssessorResource(ctkXnatObject* parent, const QString& schemaType)
+: ctkXnatObject(*new ctkXnatAssessorResourcePrivate(), parent, schemaType)
+{  
+}
+
+//----------------------------------------------------------------------------
+ctkXnatAssessorResource::~ctkXnatAssessorResource()
+{
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatAssessorResource::resourceUri() const
+{  
+  return QString("%1/out/resources/%2").arg(parent()->resourceUri(), this->id());
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatAssessorResource::reset()
+{
+  ctkXnatObject::reset();
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatAssessorResource::fetchImpl()
+{
+    
+  QString assessorResourceFilesUri = this->resourceUri() + "/files";
+  ctkXnatSession* const session = this->session();
+  QUuid queryId = session->httpGet(assessorResourceFilesUri);
+
+  
+  QList<ctkXnatObject*> files = session->httpResults(queryId,
+                                                     ctkXnatDefaultSchemaTypes::XSI_FILE);
+
+  foreach (ctkXnatObject* file, files)
+  {
+    QString label = file->property("Name");    
+    if (!label.isEmpty())
+    {
+      file->setProperty("label", label);
+      file->setProperty("ID", label);
+    }
+    this->add(file);
+  }
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatAssessorResource::download(const QString& filename)
+{
+  this->session()->download(this, filename);
+}

+ 60 - 0
Libs/XNAT/Core/ctkXnatAssessorResource.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 ctkXnatAssessorResource_h
+#define ctkXnatAssessorResource_h
+
+#include "ctkXNATCoreExport.h"
+
+#include "ctkXnatObject.h"
+#include "ctkXnatDefaultSchemaTypes.h"
+
+class ctkXnatAssessorResourcePrivate;
+
+/**
+ * @ingroup XNAT_Core
+ */
+class CTK_XNAT_CORE_EXPORT ctkXnatAssessorResource : public ctkXnatObject
+{
+
+public:
+
+  ctkXnatAssessorResource(ctkXnatObject* parent = 0,
+                      const QString& schemaType = ctkXnatDefaultSchemaTypes::XSI_ASSESSOR_RESOURCE);
+
+  virtual ~ctkXnatAssessorResource();
+
+  QString resourceUri() const;
+
+  void reset();
+
+  void download(const QString& filename);
+
+private:
+
+  friend class qRestResult;
+  virtual void fetchImpl();
+
+  Q_DECLARE_PRIVATE(ctkXnatAssessorResource)
+
+};
+
+#endif

+ 6 - 4
Libs/XNAT/Core/ctkXnatDefaultSchemaTypes.cpp

@@ -21,12 +21,14 @@
 
 #include "ctkXnatDefaultSchemaTypes.h"
 
+QString ctkXnatDefaultSchemaTypes::XSI_PROJECT = "xnat:projectData";
+QString ctkXnatDefaultSchemaTypes::XSI_SUBJECT = "xnat:subjectData";
 QString ctkXnatDefaultSchemaTypes::XSI_EXPERIMENT = "xnat:experimentData";
+QString ctkXnatDefaultSchemaTypes::XSI_SCAN = "xnat:imageScanData";
+QString ctkXnatDefaultSchemaTypes::XSI_SCAN_RESOURCE = "xnat:scanResource";
+QString ctkXnatDefaultSchemaTypes::XSI_ASSESSOR = "xnat:imageAssessorData";
+QString ctkXnatDefaultSchemaTypes::XSI_ASSESSOR_RESOURCE = "xnat:assessorResource";
 QString ctkXnatDefaultSchemaTypes::XSI_FILE = "xnat:abstractResource";
-QString ctkXnatDefaultSchemaTypes::XSI_PROJECT = "xnat:projectData";
 QString ctkXnatDefaultSchemaTypes::XSI_RECONSTRUCTION = "xnat:reconstructedImageData";
 QString ctkXnatDefaultSchemaTypes::XSI_RECONSTRUCTION_RESOURCE = "xnat:reconstructionResource";
-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";

+ 6 - 4
Libs/XNAT/Core/ctkXnatDefaultSchemaTypes.h

@@ -31,14 +31,16 @@
  */
 struct CTK_XNAT_CORE_EXPORT ctkXnatDefaultSchemaTypes
 {
+  static QString XSI_PROJECT; // = "xnat:projectData"
+  static QString XSI_SUBJECT; // = "xnat:subjectData"
   static QString XSI_EXPERIMENT; // = "xnat:experimentData"
+  static QString XSI_SCAN; // = "xnat:imageScanData"
+  static QString XSI_SCAN_RESOURCE; // = "xnat:scanResource"
+  static QString XSI_ASSESSOR; // = "xnat:imageAssessorData"
+  static QString XSI_ASSESSOR_RESOURCE; // = "xnat:assessorResource"
   static QString XSI_FILE; // = "xnat:abstractResource"
-  static QString XSI_PROJECT; // = "xnat:projectData"
   static QString XSI_RECONSTRUCTION; // = "xnat:reconstructedImageData"
   static QString XSI_RECONSTRUCTION_RESOURCE; // = "xnat:reconstructionResource"
-  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"
 };
 

+ 49 - 5
Libs/XNAT/Core/ctkXnatExperiment.cpp

@@ -26,10 +26,14 @@
 #include "ctkXnatSubject.h"
 #include "ctkXnatScan.h"
 #include "ctkXnatReconstruction.h"
+#include "ctkXnatAssessor.h"
 #include "ctkXnatScanFolder.h"
 #include "ctkXnatReconstructionFolder.h"
+#include "ctkXnatAssessorFolder.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
+#include <qDebug>
+
 //----------------------------------------------------------------------------
 class ctkXnatExperimentPrivate : public ctkXnatObjectPrivate
 {
@@ -79,8 +83,17 @@ void ctkXnatExperiment::fetchImpl()
   ctkXnatSession* const session = this->session();
   QUuid scansQueryId = session->httpGet(scansUri);
 
-  QList<ctkXnatObject*> scans = session->httpResults(scansQueryId,
-                                                     ctkXnatDefaultSchemaTypes::XSI_SCAN);
+  QList<ctkXnatObject*> scans;
+  
+  try
+  {
+    scans = session->httpResults(scansQueryId,
+				 ctkXnatDefaultSchemaTypes::XSI_SCAN);
+  }
+  catch (const ctkException& e)
+  {
+    qWarning() << QString(e.what());
+  }
 
   if (!scans.isEmpty())
   {
@@ -91,13 +104,44 @@ void ctkXnatExperiment::fetchImpl()
   QString reconstructionsUri = this->resourceUri() + "/reconstructions";
   QUuid reconstructionsQueryId = session->httpGet(reconstructionsUri);
 
-  QList<ctkXnatObject*> reconstructions = session->httpResults(reconstructionsQueryId,
-                                                               ctkXnatDefaultSchemaTypes::XSI_RECONSTRUCTION);
-
+  QList<ctkXnatObject*> reconstructions;
+  try
+  {
+    reconstructions = session->httpResults(reconstructionsQueryId,
+					   ctkXnatDefaultSchemaTypes::XSI_RECONSTRUCTION);
+  }
+  catch (const ctkException& e)
+  {
+    qWarning() << QString(e.what());
+  }
+  
   if (!reconstructions.isEmpty())
   {
     ctkXnatReconstructionFolder* reconstructionFolder = new ctkXnatReconstructionFolder();
     this->add(reconstructionFolder);
   }
+
+  QString assessorsUri = this->resourceUri() + "/assessors";
+  QUuid assessorsQueryId = session->httpGet(assessorsUri);
+  
+  QList<ctkXnatObject*> assessors;
+  
+  try
+  {
+    assessors = session->httpResults(assessorsQueryId,
+				     ctkXnatDefaultSchemaTypes::XSI_ASSESSOR);
+  }
+  catch (const ctkException& e)
+  {
+    qWarning() << QString(e.what());
+  }
+
+  if (!assessors.isEmpty())
+  {
+    ctkXnatAssessorFolder* assessorFolder = new ctkXnatAssessorFolder(this);
+    this->add(assessorFolder);
+  }
+
   this->fetchResources();
+
 }

+ 0 - 2
Libs/XNAT/Core/ctkXnatExperiment.h

@@ -27,9 +27,7 @@
 #include "ctkXnatObject.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
-class ctkXnatConnection;
 class ctkXnatExperimentPrivate;
-class ctkXnatSubject;
 
 /**
  * @ingroup XNAT_Core

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

@@ -22,7 +22,6 @@
 #include "ctkXnatReconstructionResource.h"
 
 #include "ctkXnatSession.h"
-#include "ctkXnatFile.h"
 #include "ctkXnatObjectPrivate.h"
 #include "ctkXnatReconstruction.h"
 #include "ctkXnatDefaultSchemaTypes.h"

+ 0 - 3
Libs/XNAT/Core/ctkXnatScan.cpp

@@ -28,7 +28,6 @@
 #include "ctkXnatObjectPrivate.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
-
 //----------------------------------------------------------------------------
 class ctkXnatScanPrivate : public ctkXnatObjectPrivate
 {
@@ -85,9 +84,7 @@ void ctkXnatScan::fetchImpl()
   {
     QString label = scanResource->property("label");
     if (!label.isEmpty())
-    {
       scanResource->setProperty("ID", label);
-    }
     this->add(scanResource);
   }
 }

+ 6 - 0
Libs/XNAT/Core/ctkXnatScanFolder.cpp

@@ -52,6 +52,7 @@ ctkXnatScanFolder::ctkXnatScanFolder(ctkXnatObject* parent)
   : ctkXnatObject(*new ctkXnatScanFolderPrivate(), parent, QString::null)
 {
   this->setProperty("ID", "scans");
+  this->setProperty("label", "Scans");
 }
 
 //----------------------------------------------------------------------------
@@ -83,6 +84,11 @@ void ctkXnatScanFolder::fetchImpl()
 
   foreach (ctkXnatObject* scan, scans)
   {
+    QString series_description = scan->property ("series_description");
+    QString label = scan->property ("label");
+    label = label.isEmpty() ? series_description : label;
+    scan->setProperty ("label", label);
+    
     this->add(scan);
   }
 }

+ 3 - 2
Libs/XNAT/Core/ctkXnatScanResource.cpp

@@ -24,7 +24,6 @@
 #include "ctkXnatSession.h"
 #include "ctkXnatObjectPrivate.h"
 #include "ctkXnatScan.h"
-#include "ctkXnatFile.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
 
@@ -61,7 +60,7 @@ ctkXnatScanResource::~ctkXnatScanResource()
 //----------------------------------------------------------------------------
 QString ctkXnatScanResource::resourceUri() const
 {
-  return QString("%1/resources/%2").arg(parent()->resourceUri(), this->property("label"));
+  return QString("%1/resources/%2").arg(parent()->resourceUri(), this->id ());
 }
 
 //----------------------------------------------------------------------------
@@ -85,8 +84,10 @@ void ctkXnatScanResource::fetchImpl()
     QString label = file->property("Name");
     if (!label.isEmpty())
     {
+      file->setProperty("label", label);
       file->setProperty("ID", label);
     }
+    
     this->add(file);
   }
 }

+ 29 - 150
Libs/XNAT/Core/ctkXnatSession.cpp

@@ -29,12 +29,12 @@
 #include "ctkXnatObject.h"
 #include "ctkXnatProject.h"
 #include "ctkXnatReconstruction.h"
-#include "ctkXnatReconstructionFolder.h"
 #include "ctkXnatReconstructionResource.h"
 #include "ctkXnatResource.h"
 #include "ctkXnatScan.h"
-#include "ctkXnatScanFolder.h"
 #include "ctkXnatScanResource.h"
+#include "ctkXnatAssessor.h"
+#include "ctkXnatAssessorResource.h"
 #include "ctkXnatSubject.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
@@ -248,15 +248,12 @@ QList<ctkXnatObject*> ctkXnatSessionPrivate::results(qRestResult* restResult, QS
     if (!customSchemaType.isEmpty())
     {
       typeId = QMetaType::type(qPrintable(customSchemaType));
-      if (!typeId)
-      {
-        qWarning() << QString("No ctkXnatObject sub-class registered for the schema %1. Falling back to the default class.").arg(customSchemaType);
-      }
     }
 
     // Fall back. Create the default class according to the default schema type
     if (!typeId)
     {
+      qWarning() << QString("No ctkXnatObject sub-class registered for the schema %1. Falling back to the default class %2.").arg(customSchemaType).arg(schemaType);
       typeId = QMetaType::type(qPrintable(schemaType));
     }
 
@@ -280,10 +277,17 @@ QList<ctkXnatObject*> ctkXnatSessionPrivate::results(qRestResult* restResult, QS
 
     // Fill in the properties
     QMapIterator<QString, QVariant> it(propertyMap);
+    QString description;
+    
     while (it.hasNext())
     {
       it.next();
-      object->setProperty(it.key().toLatin1().data(), it.value());
+
+      QString  str = it.key().toLatin1().data();
+      QVariant var = it.value();
+
+      object->setProperty(str, var);
+      description.append (str + QString ("\t::\t") + var.toString() + "\n");
     }
 
     QVariant lastModifiedHeader = restResult->rawHeader("Last-Modified");
@@ -297,6 +301,7 @@ QList<ctkXnatObject*> ctkXnatSessionPrivate::results(qRestResult* restResult, QS
       object->setLastModifiedTime(lastModifiedTime);
     }
 
+    object->setDescription(description);
     results.push_back(object);
   }
   return results;
@@ -318,10 +323,12 @@ ctkXnatSession::ctkXnatSession(const ctkXnatLoginProfile& loginProfile)
   qRegisterMetaType<ctkXnatScan>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_SCAN));
   qRegisterMetaType<ctkXnatReconstruction>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_RECONSTRUCTION));
   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));
-
+  qRegisterMetaType<ctkXnatAssessor>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_ASSESSOR));
+  qRegisterMetaType<ctkXnatAssessorResource>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_ASSESSOR_RESOURCE));
+  qRegisterMetaType<ctkXnatFile>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_FILE));
+  
   QString url = d->loginProfile.serverUrl().toString();
   d->xnat->setServerUrl(url);
 
@@ -361,7 +368,7 @@ void ctkXnatSession::open()
   }
 
   d->dataModel.reset(new ctkXnatDataModel(this));
-  d->dataModel->setProperty("ID", this->url().toString());
+  d->dataModel->setProperty("label", this->url().toString());
 }
 
 //----------------------------------------------------------------------------
@@ -585,146 +592,6 @@ void ctkXnatSession::remove(ctkXnatObject* object)
 }
 
 //----------------------------------------------------------------------------
-//void ctkXnatSession::create(ctkXnatSubject* subject)
-//{
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatSession);
-
-//  QString query = QString("/REST/projects/%1/subjects/%2").arg(projectName, subjectName);
-//  bool success = d->xnat->sync(d->xnat->put(query));
-
-//  if (!success)
-//  {
-//    throw ctkXnatException("Error occurred while creating the subject.");
-//  }
-//}
-
-//----------------------------------------------------------------------------
-//void ctkXnatSession::downloadScanFiles(ctkXnatExperiment* experiment, const QString& fileName)
-//{
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatSession);
-
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/scans/ALL/files").arg(projectName, subjectName, experimentName);
-//  qRestAPI::Parameters parameters;
-//  parameters["format"] = "zip";
-//  QUuid queryId = d->xnat->download(fileName, query, parameters);
-//  d->xnat->sync(queryId);
-//}
-
-//----------------------------------------------------------------------------
-//void ctkXnatSession::downloadReconstructionFiles(ctkXnatExperiment* experiment, const QString& fileName)
-//{
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatSession);
-
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions/ALL/files").arg(projectName, subjectName, experimentName);
-//  qRestAPI::Parameters parameters;
-//  parameters["format"] = "zip";
-//  QUuid queryId = d->xnat->download(fileName, query, parameters);
-//  d->xnat->sync(queryId);
-//}
-
-//----------------------------------------------------------------------------
-//void ctkXnatSession::downloadReconstruction(ctkXnatReconstruction* reconstruction, const QString& fileName)
-//{
-//  const QString& reconstructionName = reconstruction->getName();
-//  ctkXnatObject* experiment = reconstruction->getParent();
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatSession);
-
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions/%4/ALL/files").arg(projectName, subjectName, experimentName, reconstructionName);
-//  qRestAPI::Parameters parameters;
-//  parameters["format"] = "zip";
-//  QUuid queryId = d->xnat->download(fileName, query, parameters);
-//  d->xnat->sync(queryId);
-//}
-
-//----------------------------------------------------------------------------
-//void ctkXnatSession::downloadReconstructionResourceFiles(ctkXnatReconstructionResource* reconstructionResource, const QString& fileName)
-//{
-//  const QString& reconstructionResourceName = reconstructionResource->getName();
-//  ctkXnatObject* reconstruction = reconstructionResource->getParent();
-//  const QString& reconstructionName = reconstruction->getName();
-//  ctkXnatObject* experiment = reconstruction->getParent()->getParent();
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatSession);
-
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions/%4/ALL/resources/%5/files").arg(projectName, subjectName, experimentName, reconstructionName, reconstructionResourceName);
-//  qRestAPI::Parameters parameters;
-//  parameters["format"] = "zip";
-//  QUuid queryId = d->xnat->download(fileName, query, parameters);
-//  d->xnat->sync(queryId);
-//}
-
-//----------------------------------------------------------------------------
-//void ctkXnatSession::download(ctkXnatReconstructionResourceFile* reconstructionResourceFile, const QString& fileName)
-//{
-//  const QString& reconstructionResourceFileName = reconstructionResourceFile->getName();
-//  ctkXnatObject* reconstructionResource = reconstructionResourceFile->getParent();
-//  const QString& reconstructionResourceName = reconstructionResource->getName();
-//  ctkXnatObject* reconstruction = reconstructionResource->getParent();
-//  const QString& reconstructionName = reconstruction->getName();
-//  ctkXnatObject* experiment = reconstruction->getParent()->getParent();
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatSession);
-
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions/%4/resources/%5/files/%6").arg(projectName, subjectName, experimentName, reconstructionName, reconstructionResourceName, reconstructionResourceFileName);
-//  qRestAPI::Parameters parameters;
-//  parameters["format"] = "zip";
-//  QUuid queryId = d->xnat->download(fileName, query, parameters);
-//  d->xnat->sync(queryId);
-//}
-
-//----------------------------------------------------------------------------
-//void ctkXnatSession::download(ctkXnatScan* scan, const QString& fileName)
-//{
-//  const QString& scanName = scan->getName();
-//  ctkXnatObject* experiment = scan->getParent()->getParent();
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatSession);
-
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/scans/%4/files").arg(projectName, subjectName, experimentName, scanName);
-//  qRestAPI::Parameters parameters;
-//  parameters["format"] = "zip";
-//  QUuid queryId = d->xnat->download(fileName, query, parameters);
-//  d->xnat->sync(queryId);
-//}
-
-//----------------------------------------------------------------------------
 void ctkXnatSession::download(ctkXnatFile* file, const QString& fileName)
 {
   Q_D(ctkXnatSession);
@@ -747,6 +614,18 @@ void ctkXnatSession::download(ctkXnatScanResource* scanResource, const QString&
 }
 
 //----------------------------------------------------------------------------
+void ctkXnatSession::download(ctkXnatAssessorResource* assessorResource, const QString& fileName)
+{
+  Q_D(ctkXnatSession);
+
+  QString query = assessorResource->resourceUri() + "/files";
+  qRestAPI::Parameters parameters;
+  parameters["format"] = "zip";
+  QUuid queryId = d->xnat->download(fileName, query, parameters);
+  d->xnat->sync(queryId);
+}
+
+//----------------------------------------------------------------------------
 void ctkXnatSession::download(ctkXnatReconstructionResource* reconstructionResource, const QString& fileName)
 {
   Q_D(ctkXnatSession);

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

@@ -41,6 +41,7 @@ class ctkXnatDataModel;
 class ctkXnatObject;
 class ctkXnatScanResource;
 class ctkXnatReconstructionResource;
+class ctkXnatAssessorResource;
 
 /**
  * @ingroup XNAT_Core
@@ -197,6 +198,7 @@ public:
 
   void download(ctkXnatScanResource* scanResource, const QString& zipFileName);
   void download(ctkXnatReconstructionResource* reconstructionResource, const QString& zipFileName);
+  void download(ctkXnatAssessorResource* assessorResource, const QString& zipFileName);
 
   /**
    * @brief Sends a http HEAD request to the xnat instance

+ 1 - 1
Libs/XNAT/Core/ctkXnatTreeModel.cpp

@@ -76,7 +76,7 @@ QVariant ctkXnatTreeModel::data(const QModelIndex& index, int role) const
     QString displayData = xnatObject->name();
     if (displayData.isEmpty())
     {
-      displayData = xnatObject->id();
+      displayData = xnatObject->property("label");
     }
     return displayData;
   }