Kaynağa Gözat

Merge pull request #529 from AndreasFetzer/minor-xnat-api-adaptions-integration-final

Xnat API adaptions
Sascha Zelzer 11 yıl önce
ebeveyn
işleme
3ab06f1112

+ 5 - 5
Libs/XNAT/Core/ctkXnatAssessorFolder.cpp

@@ -21,11 +21,11 @@
 
 #include "ctkXnatAssessorFolder.h"
 
-#include "ctkXnatSession.h"
-#include "ctkXnatExperiment.h"
-#include "ctkXnatObjectPrivate.h"
 #include "ctkXnatAssessor.h"
 #include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatExperiment.h"
+#include "ctkXnatObjectPrivate.h"
+#include "ctkXnatSession.h"
 
 //----------------------------------------------------------------------------
 class ctkXnatAssessorFolderPrivate : public ctkXnatObjectPrivate
@@ -48,8 +48,8 @@ ctkXnatAssessorFolder::ctkXnatAssessorFolder(ctkXnatObject* parent)
   : ctkXnatObject(*new ctkXnatAssessorFolderPrivate(), parent, QString::null)
 {
   
-  this->setProperty("ID", "assessors");
-  this->setProperty("label", "Assessments");
+  this->setProperty(ID, "assessors");
+  this->setProperty(LABEL, "Assessments");
 }
 
 //----------------------------------------------------------------------------

+ 1 - 1
Libs/XNAT/Core/ctkXnatDataModel.h

@@ -51,7 +51,7 @@ public:
 
 private:
 
-  QString resourceUri() const;
+  virtual QString resourceUri() const;
 
   virtual void fetchImpl();
 

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

@@ -71,6 +71,30 @@ QString ctkXnatExperiment::resourceUri() const
 }
 
 //----------------------------------------------------------------------------
+QString ctkXnatExperiment::name() const
+{
+  return this->label();
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatExperiment::setName(const QString &name)
+{
+  this->setLabel(name);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatExperiment::label() const
+{
+  return this->property(LABEL);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatExperiment::setLabel(const QString &label)
+{
+  this->setProperty(LABEL, label);
+}
+
+//----------------------------------------------------------------------------
 void ctkXnatExperiment::reset()
 {
   ctkXnatObject::reset();
@@ -143,5 +167,4 @@ void ctkXnatExperiment::fetchImpl()
   }
 
   this->fetchResources();
-
 }

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

@@ -43,6 +43,15 @@ public:
 
   virtual QString resourceUri() const;
 
+  /// Sets the name, i.e. the label of the subject
+  virtual void setName(const QString &name);
+  /// Returns the name, i.e. the label of the subject
+  virtual QString name() const;
+
+  void setLabel(const QString &label);
+  QString label() const;
+
+
   void reset();
 
 private:

+ 51 - 2
Libs/XNAT/Core/ctkXnatFile.cpp

@@ -21,9 +21,13 @@
 
 #include "ctkXnatFile.h"
 
-#include "ctkXnatSession.h"
 #include "ctkXnatObjectPrivate.h"
+#include "ctkXnatSession.h"
 
+const QString ctkXnatFile::FILE_NAME = "Name";
+const QString ctkXnatFile::FILE_TAGS = "file_tags";
+const QString ctkXnatFile::FILE_FORMAT = "file_format";
+const QString ctkXnatFile::FILE_CONTENT = "file_content";
 
 //----------------------------------------------------------------------------
 class ctkXnatFilePrivate : public ctkXnatObjectPrivate
@@ -56,9 +60,54 @@ ctkXnatFile::~ctkXnatFile()
 }
 
 //----------------------------------------------------------------------------
+void ctkXnatFile::setName(const QString &name)
+{
+  this->setProperty(FILE_NAME, name);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatFile::name() const
+{
+  return this->property(FILE_NAME);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatFile::setFileFormat(const QString &fileFormat)
+{
+  this->setProperty(FILE_FORMAT, fileFormat);
+}
+
+QString ctkXnatFile::fileFormat() const
+{
+  return this->property(FILE_FORMAT);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatFile::setFileContent(const QString &fileContent)
+{
+  this->setProperty(FILE_CONTENT, fileContent);
+}
+
+QString ctkXnatFile::fileContent() const
+{
+  return this->property(FILE_CONTENT);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatFile::setFileTags(const QString &fileTags)
+{
+  this->setProperty(FILE_TAGS, fileTags);
+}
+
+QString ctkXnatFile::fileTags() const
+{
+  return this->property(FILE_TAGS);
+}
+
+//----------------------------------------------------------------------------
 QString ctkXnatFile::resourceUri() const
 {
-  return QString("%1/files/%2").arg(parent()->resourceUri(), this->id());
+  return QString("%1/files/%2").arg(parent()->resourceUri(), this->name());
 }
 
 //----------------------------------------------------------------------------

+ 17 - 0
Libs/XNAT/Core/ctkXnatFile.h

@@ -44,11 +44,28 @@ public:
 
   virtual QString resourceUri() const;
 
+  virtual void setName(const QString &name);
+  virtual QString name() const;
+
+  void setFileFormat(const QString& fileFormat);
+  QString fileFormat() const;
+
+  void setFileTags(const QString& fileTags);
+  QString fileTags() const;
+
+  void setFileContent(const QString& fileContent);
+  QString fileContent() const;
+
   void download(const QString& filename);
   void upload(const QString& filename);
 
   void reset();
 
+  static const QString FILE_NAME;
+  static const QString FILE_TAGS;
+  static const QString FILE_FORMAT;
+  static const QString FILE_CONTENT;
+
 private:
 
   virtual void fetchImpl();

+ 8 - 14
Libs/XNAT/Core/ctkXnatListModel.cpp

@@ -20,12 +20,13 @@
 =============================================================================*/
 
 #include "ctkXnatDataModel.h"
+
+#include "ctkXnatExperiment.h"
 #include "ctkXnatListModel.h"
 #include "ctkXnatProject.h"
-#include "ctkXnatSubject.h"
-#include "ctkXnatExperiment.h"
-#include "ctkXnatScanFolder.h"
 #include "ctkXnatScan.h"
+#include "ctkXnatScanFolder.h"
+#include "ctkXnatSubject.h"
 
 #include <iostream>
 #include <typeinfo>
@@ -66,19 +67,12 @@ QVariant ctkXnatListModel::data(const QModelIndex& index, int role) const
   if (role == Qt::DisplayRole)
   {
     ctkXnatObject* child = RootObject->children().at(index.row());
-    if (!child)
-    {
-      qWarning() << "child at index" << index << "is NULL!";
-    }
-    else
+    QString displayData = child->name();
+    if (displayData.isEmpty())
     {
-      QString displayData = child->name();
-      if (displayData.isEmpty())
-      {
-        displayData = child->id();
-      }
-      return displayData;
+      displayData = child->property(ctkXnatObject::LABEL);
     }
+    return displayData;
   }
   else if (role == Qt::UserRole)
   {

+ 1 - 1
Libs/XNAT/Core/ctkXnatListModel.h

@@ -44,7 +44,7 @@ public:
   QVariant data(const QModelIndex &index, int role) const;
   QVariant headerData(int section, Qt::Orientation orientation, int role) const;
 
-private:
+protected:
   ctkXnatObject* RootObject;
 };
 

+ 21 - 15
Libs/XNAT/Core/ctkXnatObject.cpp

@@ -23,8 +23,8 @@
 #include "ctkXnatObjectPrivate.h"
 
 #include "ctkXnatDataModel.h"
-#include "ctkXnatSession.h"
 #include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatSession.h"
 
 #include <QDateTime>
 #include <QDebug>
@@ -32,6 +32,10 @@
 #include <QVariant>
 
 
+const QString ctkXnatObject::ID = "ID";
+const QString ctkXnatObject::NAME = "name";
+const QString ctkXnatObject::LABEL = "label";
+
 //----------------------------------------------------------------------------
 ctkXnatObject::ctkXnatObject(const ctkXnatObject&)
 {
@@ -67,37 +71,39 @@ ctkXnatObject::~ctkXnatObject()
 //----------------------------------------------------------------------------
 QString ctkXnatObject::id() const
 {
-  return property("ID");
+  return this->property(ID);
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatObject::setId(const QString& id)
 {
-  setProperty("ID", id);
+  this->setProperty(ID, id);
 }
 
 //----------------------------------------------------------------------------
 QString ctkXnatObject::name() const
 {
-  return property("name");
+  return this->property(NAME);
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatObject::setName(const QString& name)
 {
-  setProperty("name", name);
+  this->setProperty(NAME, name);
 }
 
 //----------------------------------------------------------------------------
 QString ctkXnatObject::description() const
 {
-  return property("description");
+  Q_D(const ctkXnatObject);
+  return d->description;
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatObject::setDescription(const QString& description)
 {
-  setProperty("description", description);
+  Q_D(ctkXnatObject);
+  d->description = description;
 }
 
 //----------------------------------------------------------------------------
@@ -261,6 +267,12 @@ QString ctkXnatObject::schemaType() const
 }
 
 //----------------------------------------------------------------------------
+void ctkXnatObject::setSchemaType(const QString& schemaType)
+{
+  this->setProperty("xsiType", schemaType);
+}
+
+//----------------------------------------------------------------------------
 void ctkXnatObject::fetch()
 {
   Q_D(ctkXnatObject);
@@ -284,12 +296,6 @@ ctkXnatSession* ctkXnatObject::session() const
 }
 
 //----------------------------------------------------------------------------
-void ctkXnatObject::setSchemaType(const QString& schemaType)
-{
-  this->setProperty("xsiType", schemaType);
-}
-
-//----------------------------------------------------------------------------
 void ctkXnatObject::download(const QString& /*zipFilename*/)
 {
 }
@@ -323,13 +329,13 @@ void ctkXnatObject::fetchResources(const QString& path)
 
   foreach (ctkXnatObject* resource, resources)
   {
-    QString label = resource->property("label");
+    QString label = resource->name();
     if (label.isEmpty())
     {
       label = "NO NAME";
     }
 
-    resource->setProperty("label", label);
+    resource->setName(label);
     this->add(resource);
   }
 }

+ 10 - 5
Libs/XNAT/Core/ctkXnatObject.h

@@ -48,21 +48,22 @@ public:
   /// Destructs the ctkXnatObject.
   virtual ~ctkXnatObject();
 
-  /// Gets the ID of the object.
-  QString id() const;
+  /// Gets the global ID of the object.
+  virtual QString id() const;
 
   /// Sets the ID of the object.
-  void setId(const QString& id);
+  /// @warning You must not change the ID of an existing object
+  virtual void setId(const QString& id);
 
   /// Gets the resource URI of the object that can be used to access it through
   /// the REST API.
   virtual QString resourceUri() const = 0;
 
   /// Gets the name of the object.
-  QString name() const;
+  virtual QString name() const;
 
   /// Sets the name of the object.
-  void setName(const QString& name);
+  virtual void setName(const QString& name);
 
   /// Gets the description of the object.
   QString description() const;
@@ -144,6 +145,10 @@ public:
   // throws ctkXnatTimeoutException
   //bool waitForDownloadFinished(const QString&);
 
+  static const QString ID;
+  static const QString NAME;
+  static const QString LABEL;
+
 protected:
 
   ctkXnatObject(const ctkXnatObject&);

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

@@ -49,6 +49,9 @@ private:
 
   QList<ctkXnatObject*> children;
 
+  // Description of the object that can be used e.g. as tooltip
+  QString description;
+
   QDateTime lastModifiedTime;
 
   bool fetched;

+ 29 - 25
Libs/XNAT/Core/ctkXnatProject.cpp

@@ -22,11 +22,15 @@
 #include "ctkXnatProject.h"
 
 #include "ctkXnatDataModel.h"
+#include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatObjectPrivate.h"
 #include "ctkXnatSession.h"
 #include "ctkXnatSubject.h"
-#include "ctkXnatObjectPrivate.h"
-#include "ctkXnatDefaultSchemaTypes.h"
 
+const QString ctkXnatProject::SECONDARY_ID = "secondary_ID";
+const QString ctkXnatProject::DESCRIPTION = "description";
+const QString ctkXnatProject::PI_FIRSTNAME = "pi_firstname";
+const QString ctkXnatProject::PI_LASTNAME = "pi_lastname";
 
 //----------------------------------------------------------------------------
 class ctkXnatProjectPrivate : public ctkXnatObjectPrivate
@@ -40,15 +44,9 @@ public:
 
   void reset()
   {
-    secondaryId.clear();
-    piFirstName.clear();
-    piLastName.clear();
 //    uri.clear();
   }
 
-  QString secondaryId;
-  QString piFirstName;
-  QString piLastName;
 //  QString uri;
 };
 
@@ -77,45 +75,51 @@ QString ctkXnatProject::childDataType() const
 }
 
 //----------------------------------------------------------------------------
-const QString& ctkXnatProject::secondaryId() const
+const QString ctkXnatProject::secondaryId() const
 {
-  Q_D(const ctkXnatProject);
-  return d->secondaryId;
+  return this->property(SECONDARY_ID);
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatProject::setSecondaryId(const QString& secondaryId)
 {
-  Q_D(ctkXnatProject);
-  d->secondaryId = secondaryId;
+  this->setProperty(SECONDARY_ID, secondaryId);
 }
 
 //----------------------------------------------------------------------------
-const QString& ctkXnatProject::piFirstName() const
+const QString ctkXnatProject::piFirstName() const
 {
-  Q_D(const ctkXnatProject);
-  return d->piFirstName;
+  return this->property(PI_FIRSTNAME);
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatProject::setPiFirstName(const QString& piFirstName)
 {
-  Q_D(ctkXnatProject);
-  d->piFirstName = piFirstName;
+  this->setProperty(PI_FIRSTNAME, piFirstName);
 }
 
 //----------------------------------------------------------------------------
-const QString& ctkXnatProject::piLastName() const
+const QString ctkXnatProject::piLastName() const
 {
-  Q_D(const ctkXnatProject);
-  return d->piLastName;
+  return this->property(PI_LASTNAME);
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatProject::setPiLastName(const QString& piLastName)
 {
-  Q_D(ctkXnatProject);
-  d->piLastName = piLastName;
+  this->setProperty(PI_LASTNAME, piLastName);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatProject::projectDescription() const
+{
+  return this->property(DESCRIPTION);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatProject::setProjectDescription(const QString& description)
+{
+  this->setProperty(DESCRIPTION, description);
 }
 
 //----------------------------------------------------------------------------
@@ -149,10 +153,10 @@ void ctkXnatProject::fetchImpl()
 
   foreach (ctkXnatObject* subject, subjects)
   {
-    QString label = subject->property("label");
+    QString label = subject->name();
     if (!label.isEmpty())
     {
-      subject->setProperty("ID", label);
+      subject->setId(label);
     }
 
     this->add(subject);

+ 11 - 3
Libs/XNAT/Core/ctkXnatProject.h

@@ -46,17 +46,25 @@ public:
 
   virtual QString childDataType() const;
 
-  const QString& secondaryId() const;
+  const QString secondaryId() const;
   void setSecondaryId(const QString& secondaryId);
 
-  const QString& piFirstName() const;
+  const QString piFirstName() const;
   void setPiFirstName(const QString& piFirstName);
 
-  const QString& piLastName() const;
+  const QString piLastName() const;
   void setPiLastName(const QString& piLastName);
 
+  QString projectDescription() const;
+  void setProjectDescription(const QString &description);
+
   void reset();
 
+  static const QString SECONDARY_ID;
+  static const QString DESCRIPTION;
+  static const QString PI_FIRSTNAME;
+  static const QString PI_LASTNAME;
+
 private:
 
   virtual void fetchImpl();

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

@@ -21,10 +21,11 @@
 
 #include "ctkXnatReconstruction.h"
 
-#include "ctkXnatSession.h"
+#include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatFile.h"
 #include "ctkXnatObjectPrivate.h"
 #include "ctkXnatReconstructionFolder.h"
-#include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatSession.h"
 
 
 //----------------------------------------------------------------------------
@@ -81,10 +82,10 @@ void ctkXnatReconstruction::fetchImpl()
 
   foreach (ctkXnatObject* reconstructionResource, reconstructionResources)
   {
-    QString label = reconstructionResource->property("Name");
+    QString label = reconstructionResource->name();
     if (!label.isEmpty())
     {
-      reconstructionResource->setProperty("ID", label);
+      reconstructionResource->setName(label);
     }
 
     this->add(reconstructionResource);

+ 3 - 3
Libs/XNAT/Core/ctkXnatReconstructionFolder.cpp

@@ -21,11 +21,11 @@
 
 #include "ctkXnatReconstructionFolder.h"
 
-#include "ctkXnatSession.h"
+#include "ctkXnatDefaultSchemaTypes.h"
 #include "ctkXnatExperiment.h"
 #include "ctkXnatObjectPrivate.h"
 #include "ctkXnatReconstruction.h"
-#include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatSession.h"
 
 
 //----------------------------------------------------------------------------
@@ -51,7 +51,7 @@ public:
 ctkXnatReconstructionFolder::ctkXnatReconstructionFolder(ctkXnatObject* parent)
   : ctkXnatObject(*new ctkXnatReconstructionFolderPrivate(), parent, QString::null)
 {
-  this->setProperty("ID", "reconstructions");
+  this->setProperty(ID, "reconstructions");
 }
 
 //----------------------------------------------------------------------------

+ 41 - 5
Libs/XNAT/Core/ctkXnatResource.cpp

@@ -21,9 +21,10 @@
 
 #include "ctkXnatResource.h"
 
-#include "ctkXnatSession.h"
 #include "ctkXnatObjectPrivate.h"
+#include "ctkXnatSession.h"
 
+const QString ctkXnatResource::ID = "xnat_abstractresource_id";
 //----------------------------------------------------------------------------
 class ctkXnatResourcePrivate : public ctkXnatObjectPrivate
 {
@@ -33,7 +34,6 @@ public:
   : ctkXnatObjectPrivate()
   {
   }
-
 };
 
 
@@ -51,7 +51,43 @@ ctkXnatResource::~ctkXnatResource()
 //----------------------------------------------------------------------------
 QString ctkXnatResource::resourceUri() const
 {
-  return QString("%1/resources/%2").arg(parent()->resourceUri(), this->property("xnat_abstractresource_id"));
+  return QString("%1/resources/%2").arg(parent()->resourceUri(), this->id());
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatResource::id() const
+{
+  return this->property(ID);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatResource::setId(const QString &id)
+{
+  this->setProperty(ID, id);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatResource::name() const
+{
+  return this->label();
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatResource::setName(const QString &name)
+{
+  this->setLabel(name);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatResource::label() const
+{
+  return this->property(LABEL);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatResource::setLabel(const QString &label)
+{
+  this->setProperty(LABEL, label);
 }
 
 //----------------------------------------------------------------------------
@@ -72,12 +108,12 @@ void ctkXnatResource::fetchImpl()
 
   foreach (ctkXnatObject* file, files)
   {
-    QString label = file->property("Name");
+    QString label = file->name();
     if (label.isEmpty())
     {
       label = "NO NAME";
     }
-    file->setProperty("label", label);
+    file->setName(label);
     this->add(file);
   }
 }

+ 15 - 1
Libs/XNAT/Core/ctkXnatResource.h

@@ -42,12 +42,26 @@ public:
 
   virtual ~ctkXnatResource();
 
-  QString resourceUri() const;
+  virtual QString resourceUri() const;
+
+  virtual QString id() const;
+  virtual void setId(const QString &id);
+
+  virtual QString name() const;
+  virtual void setName(const QString &name);
+
+  /// Gets the label of the object.
+  QString label() const;
+
+  /// Sets the label of the object.
+  void setLabel(const QString& label);
 
   void reset();
 
   void download(const QString& filename);
 
+  static const QString ID;
+
 private:
 
   friend class qRestResult;

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

@@ -21,11 +21,15 @@
 
 #include "ctkXnatScan.h"
 
-#include "ctkXnatSession.h"
-#include "ctkXnatScanFolder.h"
+#include "ctkXnatDefaultSchemaTypes.h"
 #include "ctkXnatObject.h"
 #include "ctkXnatObjectPrivate.h"
-#include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatScanFolder.h"
+#include "ctkXnatSession.h"
+
+const QString ctkXnatScan::QUALITY = "quality";
+const QString ctkXnatScan::SERIES_DESCRIPTION = "series_description";
+const QString ctkXnatScan::TYPE = "type";
 
 //----------------------------------------------------------------------------
 class ctkXnatScanPrivate : public ctkXnatObjectPrivate
@@ -58,6 +62,42 @@ ctkXnatScan::~ctkXnatScan()
 }
 
 //----------------------------------------------------------------------------
+void ctkXnatScan::setQuality(const QString &quality)
+{
+  this->setProperty(QUALITY, quality);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatScan::quality() const
+{
+  return this->property(QUALITY);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatScan::setSeriesDescription(const QString &seriesDescription)
+{
+  this->setProperty(SERIES_DESCRIPTION, seriesDescription);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatScan::seriesDescription() const
+{
+  return this->property(SERIES_DESCRIPTION);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatScan::setType(const QString &type)
+{
+  this->setProperty(TYPE, type);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatScan::type() const
+{
+  return this->property(TYPE);
+}
+
+//----------------------------------------------------------------------------
 QString ctkXnatScan::resourceUri() const
 {
   return QString("%1/%2").arg(parent()->resourceUri(), this->id());

+ 13 - 0
Libs/XNAT/Core/ctkXnatScan.h

@@ -43,10 +43,23 @@ public:
 
   virtual ~ctkXnatScan();
 
+  void setQuality(const QString& quality);
+  QString quality() const;
+
+  void setSeriesDescription(const QString& seriesDescription);
+  QString seriesDescription() const;
+
+  void setType (const QString& type);
+  QString type () const;
+
   virtual QString resourceUri() const;
 
   void reset();
 
+  static const QString QUALITY;
+  static const QString SERIES_DESCRIPTION;
+  static const QString TYPE;
+
 private:
 
   friend class qRestResult;

+ 7 - 8
Libs/XNAT/Core/ctkXnatScanFolder.cpp

@@ -21,12 +21,11 @@
 
 #include "ctkXnatScanFolder.h"
 
-#include "ctkXnatSession.h"
+#include "ctkXnatDefaultSchemaTypes.h"
 #include "ctkXnatExperiment.h"
 #include "ctkXnatObjectPrivate.h"
 #include "ctkXnatScan.h"
-#include "ctkXnatDefaultSchemaTypes.h"
-
+#include "ctkXnatSession.h"
 
 //----------------------------------------------------------------------------
 class ctkXnatScanFolderPrivate : public ctkXnatObjectPrivate
@@ -51,8 +50,8 @@ public:
 ctkXnatScanFolder::ctkXnatScanFolder(ctkXnatObject* parent)
   : ctkXnatObject(*new ctkXnatScanFolderPrivate(), parent, QString::null)
 {
-  this->setProperty("ID", "scans");
-  this->setProperty("label", "Scans");
+  this->setId("scans");
+  this->setProperty(LABEL, "Scans");
 }
 
 //----------------------------------------------------------------------------
@@ -84,10 +83,10 @@ void ctkXnatScanFolder::fetchImpl()
 
   foreach (ctkXnatObject* scan, scans)
   {
-    QString series_description = scan->property ("series_description");
-    QString label = scan->property ("label");
+    QString series_description = scan->property (ctkXnatScan::SERIES_DESCRIPTION);
+    QString label = scan->property (LABEL);
     label = label.isEmpty() ? series_description : label;
-    scan->setProperty ("label", label);
+    scan->setProperty (LABEL, label);
     
     this->add(scan);
   }

+ 4 - 4
Libs/XNAT/Core/ctkXnatSession.cpp

@@ -21,7 +21,9 @@
 
 #include "ctkXnatSession.h"
 
+#include "ctkXnatAssessor.h"
 #include "ctkXnatDataModel.h"
+#include "ctkXnatDefaultSchemaTypes.h"
 #include "ctkXnatException.h"
 #include "ctkXnatExperiment.h"
 #include "ctkXnatFile.h"
@@ -31,9 +33,7 @@
 #include "ctkXnatReconstruction.h"
 #include "ctkXnatResource.h"
 #include "ctkXnatScan.h"
-#include "ctkXnatAssessor.h"
 #include "ctkXnatSubject.h"
-#include "ctkXnatDefaultSchemaTypes.h"
 
 #include <QDateTime>
 #include <QDebug>
@@ -365,7 +365,7 @@ void ctkXnatSession::open()
   }
 
   d->dataModel.reset(new ctkXnatDataModel(this));
-  d->dataModel->setProperty("label", this->url().toString());
+  d->dataModel->setProperty(ctkXnatObject::LABEL, this->url().toString());
   emit sessionOpened();
 }
 
@@ -568,7 +568,7 @@ void ctkXnatSession::save(ctkXnatObject* object)
   const QList<QVariantMap>& maps = result->results();
   if (maps.size() == 1 && maps[0].size() == 1)
   {
-    QVariant id = maps[0]["ID"];
+    QVariant id = maps[0][ctkXnatObject::ID];
     if (!id.isNull())
     {
       object->setId(id.toString());

+ 31 - 7
Libs/XNAT/Core/ctkXnatSubject.cpp

@@ -21,14 +21,14 @@
 
 #include "ctkXnatSubject.h"
 
-#include "ctkXnatProject.h"
-
-#include "ctkXnatSession.h"
-#include "ctkXnatObjectPrivate.h"
+#include "ctkXnatDefaultSchemaTypes.h"
 #include "ctkXnatExperiment.h"
+#include "ctkXnatObjectPrivate.h"
 #include "ctkXnatProject.h"
-#include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatSession.h"
 
+const QString ctkXnatSubject::INSERT_DATE = "insert_date";
+const QString ctkXnatSubject::INSERT_USER = "insert_user";
 
 //----------------------------------------------------------------------------
 class ctkXnatSubjectPrivate : public ctkXnatObjectPrivate
@@ -68,6 +68,30 @@ ctkXnatSubject::~ctkXnatSubject()
 }
 
 //----------------------------------------------------------------------------
+QString ctkXnatSubject::name() const
+{
+  return this->label();
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatSubject::setName(const QString &name)
+{
+  this->setLabel(name);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatSubject::label() const
+{
+  return this->property(LABEL);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatSubject::setLabel(const QString &label)
+{
+  this->setProperty(LABEL, label);
+}
+
+//----------------------------------------------------------------------------
 const QString& ctkXnatSubject::insertDate() const
 {
   Q_D(const ctkXnatSubject);
@@ -119,10 +143,10 @@ void ctkXnatSubject::fetchImpl()
 
   foreach (ctkXnatObject* experiment, experiments)
   {
-    QString label = experiment->property ("label");
+    QString label = experiment->name();
     if (!label.isEmpty())
     {
-      experiment->setProperty ("ID", label);
+      experiment->setId(label);
     }
 
     this->add(experiment);

+ 15 - 0
Libs/XNAT/Core/ctkXnatSubject.h

@@ -45,16 +45,31 @@ public:
   ctkXnatProject* getPrimaryProject() const;
   QList<ctkXnatProject*> getProjects() const;
 
+  /// Sets the name, i.e. the label of the subject
+  virtual void setName(const QString &name);
+  /// Returns the name, i.e. the label of the subject
+  virtual QString name() const;
+
+  void setLabel(const QString &label);
+  QString label() const;
+
   const QString& insertDate() const;
+
+  /// @warning does not overwrite the insert date on the server, since this is read only
   void setInsertDate(const QString& insertDate);
 
   const QString& insertUser() const;
+
+  /// @warning does not overwrite the insert user on the server, since this is read only
   void setInsertUser(const QString& insertUser);
 
   virtual QString resourceUri() const;
 
   void reset();
 
+  static const QString INSERT_DATE;
+  static const QString INSERT_USER;
+
 private:
 
   friend class qRestResult;

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

@@ -20,9 +20,10 @@
 =============================================================================*/
 
 #include "ctkXnatTreeModel.h"
+
+#include "ctkXnatDataModel.h"
 #include "ctkXnatObject.h"
 #include "ctkXnatTreeItem_p.h"
-#include "ctkXnatDataModel.h"
 
 #include <QList>
 
@@ -76,7 +77,7 @@ QVariant ctkXnatTreeModel::data(const QModelIndex& index, int role) const
     QString displayData = xnatObject->name();
     if (displayData.isEmpty())
     {
-      displayData = xnatObject->property("label");
+      displayData = xnatObject->property(ctkXnatObject::LABEL);
     }
     return displayData;
   }