Forráskód Böngészése

Merge branch 'xnat-assessment-support'

* xnat-assessment-support:
  Use ctkXnatResource for types which directly use xnat:abstractResource.
  Revert "ctkBackTrace: bug fix discovered on MacOSX, the method signature was wrong"
  QDebug header include case-corrected
  FEATURE-ADD: adding all the xnat properties in the description of the ctkXnatObject so that they appear as tooltip in the tree.
  CRASH-FIX: When the http request fails, a ctkException is thrown and never catched at the ctkXnat* level, making the whole application to crash, we need to try-catch every instance of the method httpResults(), it is done here at the Experiment level
  removing unused qdebugs
  removing unused qdebugs
  The Assessor support is working properly, including the download function
  adding some debug information, temporary
  adding the assessor related methods in the session class
  adding the assessor related methods in the session class
  adding assessors in the cmakelists
  removing unused includes
  adding the XSI schema types for assessors
  adding the assessor, assessor folder and assessor resource classes
  ctkBackTrace: bug fix discovered on MacOSX, the method signature was wrong

Conflicts:
	Applications/ctkXnatTreeBrowser/ctkXnatTreeBrowserMainWindow.cpp
Sascha Zelzer 10 éve
szülő
commit
1d7af8dd2b

+ 2 - 2
Libs/XNAT/Core/CMakeLists.txt

@@ -20,11 +20,11 @@ set(KIT_SRCS
   ctkXnatProject.cpp
   ctkXnatReconstruction.cpp
   ctkXnatReconstructionFolder.cpp
-  ctkXnatReconstructionResource.cpp
   ctkXnatResource.cpp
   ctkXnatScan.cpp
   ctkXnatScanFolder.cpp
-  ctkXnatScanResource.cpp
+  ctkXnatAssessor.cpp
+  ctkXnatAssessorFolder.cpp
   ctkXnatSession.cpp
   ctkXnatSettings.cpp
   ctkXnatSubject.cpp

+ 15 - 37
Libs/XNAT/Core/ctkXnatReconstructionResource.cpp

@@ -19,81 +19,59 @@
 
 =============================================================================*/
 
-#include "ctkXnatReconstructionResource.h"
+#include "ctkXnatAssessor.h"
 
 #include "ctkXnatSession.h"
-#include "ctkXnatFile.h"
+#include "ctkXnatObject.h"
 #include "ctkXnatObjectPrivate.h"
-#include "ctkXnatReconstruction.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
 
 //----------------------------------------------------------------------------
-class ctkXnatReconstructionResourcePrivate : public ctkXnatObjectPrivate
+class ctkXnatAssessorPrivate : public ctkXnatObjectPrivate
 {
 public:
 
-  ctkXnatReconstructionResourcePrivate()
+  ctkXnatAssessorPrivate()
   : ctkXnatObjectPrivate()
   {
   }
 
   void reset()
   {
-//    uri.clear();
+    uri.clear();
   }
 
-//  QString uri;
+  QString uri;
 };
 
 
 //----------------------------------------------------------------------------
-ctkXnatReconstructionResource::ctkXnatReconstructionResource(ctkXnatObject* parent, const QString& schemaType)
-: ctkXnatObject(*new ctkXnatReconstructionResourcePrivate(), parent, schemaType)
+ctkXnatAssessor::ctkXnatAssessor(ctkXnatObject* parent, const QString& schemaType)
+: ctkXnatObject(*new ctkXnatAssessorPrivate(), parent, schemaType)
 {
 }
 
 //----------------------------------------------------------------------------
-ctkXnatReconstructionResource::~ctkXnatReconstructionResource()
+ctkXnatAssessor::~ctkXnatAssessor()
 {
 }
 
 //----------------------------------------------------------------------------
-QString ctkXnatReconstructionResource::resourceUri() const
+QString ctkXnatAssessor::resourceUri() const
 {
-  return QString("%1/resources/%2").arg(parent()->resourceUri(), this->property("label"));
+  return QString("%1/%2").arg(parent()->resourceUri(), this->id());
 }
 
 //----------------------------------------------------------------------------
-void ctkXnatReconstructionResource::reset()
+void ctkXnatAssessor::reset()
 {
   ctkXnatObject::reset();
 }
 
 //----------------------------------------------------------------------------
-void ctkXnatReconstructionResource::fetchImpl()
+void ctkXnatAssessor::fetchImpl()
 {
-  QString reconstructionResourceFilesUri = this->resourceUri() + "/files";
-  ctkXnatSession* const session = this->session();
-  QUuid queryId = session->httpGet(reconstructionResourceFilesUri);
-
-  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 ctkXnatReconstructionResource::download(const QString& filename)
-{
-  this->session()->download(this, filename);
+  this->fetchResources();
+  this->fetchResources("/out/resources");
 }

+ 8 - 15
Libs/XNAT/Core/ctkXnatScanResource.h

@@ -19,44 +19,37 @@
 
 =============================================================================*/
 
-#ifndef ctkXnatScanResource_h
-#define ctkXnatScanResource_h
+#ifndef ctkXnatAssessor_h
+#define ctkXnatAssessor_h
 
 #include "ctkXNATCoreExport.h"
 
 #include "ctkXnatObject.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
-class ctkXnatConnection;
-class ctkXnatScan;
-class ctkXnatScanResourcePrivate;
+class ctkXnatAssessorPrivate;
 
 /**
  * @ingroup XNAT_Core
  */
-class CTK_XNAT_CORE_EXPORT ctkXnatScanResource : public ctkXnatObject
+class CTK_XNAT_CORE_EXPORT ctkXnatAssessor : public ctkXnatObject
 {
 
 public:
 
-  ctkXnatScanResource(ctkXnatObject* parent = 0,
-                      const QString& schemaType = ctkXnatDefaultSchemaTypes::XSI_SCAN_RESOURCE);
+  ctkXnatAssessor(ctkXnatObject* parent = 0, const QString& schemaType = ctkXnatDefaultSchemaTypes::XSI_ASSESSOR);
 
-  virtual ~ctkXnatScanResource();
+  virtual ~ctkXnatAssessor();
 
-  QString resourceUri() const;
+  virtual QString resourceUri() const;
 
   void reset();
 
-  void download(const QString& filename);
-
 private:
 
-  friend class qRestResult;
   virtual void fetchImpl();
 
-  Q_DECLARE_PRIVATE(ctkXnatScanResource)
-
+  Q_DECLARE_PRIVATE(ctkXnatAssessor)
 };
 
 #endif

+ 22 - 33
Libs/XNAT/Core/ctkXnatScanResource.cpp

@@ -19,80 +19,69 @@
 
 =============================================================================*/
 
-#include "ctkXnatScanResource.h"
+#include "ctkXnatAssessorFolder.h"
 
 #include "ctkXnatSession.h"
+#include "ctkXnatExperiment.h"
 #include "ctkXnatObjectPrivate.h"
-#include "ctkXnatScan.h"
-#include "ctkXnatFile.h"
+#include "ctkXnatAssessor.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
-
 //----------------------------------------------------------------------------
-class ctkXnatScanResourcePrivate : public ctkXnatObjectPrivate
+class ctkXnatAssessorFolderPrivate : public ctkXnatObjectPrivate
 {
 public:
 
-  ctkXnatScanResourcePrivate()
+  ctkXnatAssessorFolderPrivate()
   : ctkXnatObjectPrivate()
   {
   }
 
   void reset()
   {
-//    uri.clear();
   }
 
-//  QString uri;
 };
 
-
 //----------------------------------------------------------------------------
-ctkXnatScanResource::ctkXnatScanResource(ctkXnatObject* parent, const QString& schemaType)
-: ctkXnatObject(*new ctkXnatScanResourcePrivate(), parent, schemaType)
+ctkXnatAssessorFolder::ctkXnatAssessorFolder(ctkXnatObject* parent)
+  : ctkXnatObject(*new ctkXnatAssessorFolderPrivate(), parent, QString::null)
 {
+  
+  this->setProperty("ID", "assessors");
+  this->setProperty("label", "Assessments");
 }
 
 //----------------------------------------------------------------------------
-ctkXnatScanResource::~ctkXnatScanResource()
+ctkXnatAssessorFolder::~ctkXnatAssessorFolder()
 {
 }
 
 //----------------------------------------------------------------------------
-QString ctkXnatScanResource::resourceUri() const
+QString ctkXnatAssessorFolder::resourceUri() const
 {
-  return QString("%1/resources/%2").arg(parent()->resourceUri(), this->property("label"));
+  return QString("%1/%2").arg(parent()->resourceUri(), this->id());
 }
 
 //----------------------------------------------------------------------------
-void ctkXnatScanResource::reset()
+void ctkXnatAssessorFolder::reset()
 {
   ctkXnatObject::reset();
 }
 
 //----------------------------------------------------------------------------
-void ctkXnatScanResource::fetchImpl()
+void ctkXnatAssessorFolder::fetchImpl()
 {
-  QString scanResourceFilesUri = this->resourceUri() + "/files";
+  QString assessorsUri = this->resourceUri();
   ctkXnatSession* const session = this->session();
-  QUuid queryId = session->httpGet(scanResourceFilesUri);
+  QUuid queryId = session->httpGet(assessorsUri);
 
-  QList<ctkXnatObject*> files = session->httpResults(queryId,
-                                                     ctkXnatDefaultSchemaTypes::XSI_FILE);
+  QList<ctkXnatObject*> assessors = session->httpResults(queryId,
+                                                     ctkXnatDefaultSchemaTypes::XSI_ASSESSOR);
 
-  foreach (ctkXnatObject* file, files)
+  foreach (ctkXnatObject* assessor, assessors)
   {
-    QString label = file->property("Name");
-    if (!label.isEmpty())
-    {
-      file->setProperty("ID", label);
-    }
-    this->add(file);
+    
+    this->add(assessor);
   }
 }
-
-//----------------------------------------------------------------------------
-void ctkXnatScanResource::download(const QString& filename)
-{
-  this->session()->download(this, filename);
-}

+ 7 - 14
Libs/XNAT/Core/ctkXnatReconstructionResource.h

@@ -19,44 +19,37 @@
 
 =============================================================================*/
 
-#ifndef ctkXnatReconstructionResource_h
-#define ctkXnatReconstructionResource_h
+#ifndef ctkXnatAssessorFolder_h
+#define ctkXnatAssessorFolder_h
 
 #include "ctkXNATCoreExport.h"
 
 #include "ctkXnatObject.h"
-#include "ctkXnatDefaultSchemaTypes.h"
 
-class ctkXnatConnection;
-class ctkXnatReconstructionResourcePrivate;
-class ctkXnatReconstruction;
+class ctkXnatAssessorFolderPrivate;
 
 /**
  * @ingroup XNAT_Core
  */
-class CTK_XNAT_CORE_EXPORT ctkXnatReconstructionResource : public ctkXnatObject
+class CTK_XNAT_CORE_EXPORT ctkXnatAssessorFolder : public ctkXnatObject
 {
 
 public:
 
-  ctkXnatReconstructionResource(ctkXnatObject* parent = 0,
-                                const QString& schemaType = ctkXnatDefaultSchemaTypes::XSI_RECONSTRUCTION_RESOURCE);
+  ctkXnatAssessorFolder(ctkXnatObject* parent = NULL);
 
-  virtual ~ctkXnatReconstructionResource();
+  virtual ~ctkXnatAssessorFolder();
 
   virtual QString resourceUri() const;
 
   void reset();
 
-  void download(const QString& filename);
-
 private:
 
   friend class qRestResult;
   virtual void fetchImpl();
 
-  Q_DECLARE_PRIVATE(ctkXnatReconstructionResource)
-
+  Q_DECLARE_PRIVATE(ctkXnatAssessorFolder)
 };
 
 #endif

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

@@ -21,12 +21,11 @@
 
 #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_ASSESSOR = "xnat:imageAssessorData";
 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";

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

@@ -31,14 +31,13 @@
  */
 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_ASSESSOR; // = "xnat:imageAssessorData"
   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/ctkXnatListModel.cpp

@@ -26,7 +26,6 @@
 #include "ctkXnatExperiment.h"
 #include "ctkXnatScanFolder.h"
 #include "ctkXnatScan.h"
-#include "ctkXnatScanResource.h"
 
 #include <iostream>
 #include <typeinfo>

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

@@ -312,9 +312,9 @@ void ctkXnatObject::save()
 }
 
 //----------------------------------------------------------------------------
-void ctkXnatObject::fetchResources()
+void ctkXnatObject::fetchResources(const QString& path)
 {
-  QString query = this->resourceUri() + "/resources";
+  QString query = this->resourceUri() + path;
   ctkXnatSession* const session = this->session();
   QUuid queryId = session->httpGet(query);
 
@@ -324,10 +324,12 @@ void ctkXnatObject::fetchResources()
   foreach (ctkXnatObject* resource, resources)
   {
     QString label = resource->property("label");
-    if (!label.isEmpty())
+    if (label.isEmpty())
     {
-      resource->setProperty("ID", label);
+      label = "NO NAME";
     }
+
+    resource->setProperty("label", label);
     this->add(resource);
   }
 }

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

@@ -126,9 +126,6 @@ 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&);
 
@@ -161,6 +158,9 @@ protected:
   /// that stores the current object.
   ctkXnatSession* session() const;
 
+  /// Fetches the resources of the object
+  virtual void fetchResources(const QString &path = "/resources");
+
   /// The private implementation part of the object.
   const QScopedPointer<ctkXnatObjectPrivate> d_ptr;
 

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

@@ -24,7 +24,6 @@
 #include "ctkXnatSession.h"
 #include "ctkXnatObjectPrivate.h"
 #include "ctkXnatReconstructionFolder.h"
-#include "ctkXnatReconstructionResource.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
 

+ 4 - 3
Libs/XNAT/Core/ctkXnatResource.cpp

@@ -51,7 +51,7 @@ ctkXnatResource::~ctkXnatResource()
 //----------------------------------------------------------------------------
 QString ctkXnatResource::resourceUri() const
 {
-  return QString("%1/resources/%2").arg(parent()->resourceUri(), this->property("label"));
+  return QString("%1/resources/%2").arg(parent()->resourceUri(), this->property("xnat_abstractresource_id"));
 }
 
 //----------------------------------------------------------------------------
@@ -73,10 +73,11 @@ void ctkXnatResource::fetchImpl()
   foreach (ctkXnatObject* file, files)
   {
     QString label = file->property("Name");
-    if (!label.isEmpty())
+    if (label.isEmpty())
     {
-      file->setProperty("ID", label);
+      label = "NO NAME";
     }
+    file->setProperty("label", label);
     this->add(file);
   }
 }

+ 1 - 18
Libs/XNAT/Core/ctkXnatScan.cpp

@@ -23,12 +23,10 @@
 
 #include "ctkXnatSession.h"
 #include "ctkXnatScanFolder.h"
-#include "ctkXnatScanResource.h"
 #include "ctkXnatObject.h"
 #include "ctkXnatObjectPrivate.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
-
 //----------------------------------------------------------------------------
 class ctkXnatScanPrivate : public ctkXnatObjectPrivate
 {
@@ -74,20 +72,5 @@ void ctkXnatScan::reset()
 //----------------------------------------------------------------------------
 void ctkXnatScan::fetchImpl()
 {
-  QString scanResourcesUri = this->resourceUri() + "/resources";
-  ctkXnatSession* const session = this->session();
-  QUuid queryId = session->httpGet(scanResourcesUri);
-
-  QList<ctkXnatObject*> scanResources = session->httpResults(queryId,
-                                                             ctkXnatDefaultSchemaTypes::XSI_SCAN_RESOURCE);
-
-  foreach (ctkXnatObject* scanResource, scanResources)
-  {
-    QString label = scanResource->property("label");
-    if (!label.isEmpty())
-    {
-      scanResource->setProperty("ID", label);
-    }
-    this->add(scanResource);
-  }
+  this->fetchResources();
 }

+ 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);
   }
 }

+ 20 - 168
Libs/XNAT/Core/ctkXnatSession.cpp

@@ -29,12 +29,9 @@
 #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 "ctkXnatSubject.h"
 #include "ctkXnatDefaultSchemaTypes.h"
 
@@ -248,15 +245,15 @@ 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)
     {
+      if (!customSchemaType.isEmpty())
+      {
+        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;
@@ -317,11 +322,10 @@ ctkXnatSession::ctkXnatSession(const ctkXnatLoginProfile& loginProfile)
   qRegisterMetaType<ctkXnatExperiment>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_EXPERIMENT));
   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<ctkXnatFile>(qPrintable(ctkXnatDefaultSchemaTypes::XSI_FILE));
+  
   QString url = d->loginProfile.serverUrl().toString();
   d->xnat->setServerUrl(url);
 
@@ -361,7 +365,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 +589,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);
@@ -735,23 +599,11 @@ void ctkXnatSession::download(ctkXnatFile* file, const QString& fileName)
 }
 
 //----------------------------------------------------------------------------
-void ctkXnatSession::download(ctkXnatScanResource* scanResource, const QString& fileName)
-{
-  Q_D(ctkXnatSession);
-
-  QString query = scanResource->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)
+void ctkXnatSession::download(ctkXnatResource* resource, const QString& fileName)
 {
   Q_D(ctkXnatSession);
 
-  QString query = reconstructionResource->resourceUri() + "/files";
+  QString query = resource->resourceUri() + "/files";
   qRestAPI::Parameters parameters;
   parameters["format"] = "zip";
   QUuid queryId = d->xnat->download(fileName, query, parameters);

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

@@ -39,8 +39,7 @@ class ctkXnatFile;
 class ctkXnatLoginProfile;
 class ctkXnatDataModel;
 class ctkXnatObject;
-class ctkXnatScanResource;
-class ctkXnatReconstructionResource;
+class ctkXnatResource;
 
 /**
  * @ingroup XNAT_Core
@@ -195,8 +194,7 @@ public:
 
 //  void download(ctkXnatScan* scan, const QString& zipFileName);
 
-  void download(ctkXnatScanResource* scanResource, const QString& zipFileName);
-  void download(ctkXnatReconstructionResource* reconstructionResource, const QString& zipFileName);
+  void download(ctkXnatResource* resource, 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;
   }