Browse Source

Merge branch 'minor-xnat-api-adaptions-integration' into minor-xnat-api-adaptions-integration-final

Conflicts:
	Libs/XNAT/Core/ctkXnatSession.cpp
Andreas Fetzer 10 years ago
parent
commit
ee0c78977a

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

@@ -8,6 +8,7 @@ set(KIT_export_directive "CTK_XNAT_CORE_EXPORT")
 
 set(KIT_SRCS
   ctkXnatAPI.cpp
+  ctkXnatConstants.cpp
   ctkXnatDataModel.cpp
   ctkXnatDefaultSchemaTypes.cpp
   ctkXnatException.cpp

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

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

+ 45 - 0
Libs/XNAT/Core/ctkXnatConstants.cpp

@@ -0,0 +1,45 @@
+/*=============================================================================
+
+ Library: XNAT/Core
+
+ Copyright (c) German Cancer Research Center,
+   Division of Medical and Biological Informatics
+
+ 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 "ctkXnatConstants.h"
+
+QString ctkXnatObjectFields::ID = "ID";
+QString ctkXnatObjectFields::NAME = "name";
+QString ctkXnatObjectFields::LABEL = "label";
+
+QString ctkXnatObjectFields::SECONDARY_ID = "secondary_ID";
+QString ctkXnatObjectFields::DESCRIPTION = "description";
+QString ctkXnatObjectFields::PI_FIRSTNAME = "pi_firstname";
+QString ctkXnatObjectFields::PI_LASTNAME = "pi_lastname";
+
+QString ctkXnatObjectFields::INSERT_DATE = "insert_date";
+QString ctkXnatObjectFields::INSERT_USER = "insert_user";
+
+QString ctkXnatObjectFields::QUALITY = "quality";
+QString ctkXnatObjectFields::SERIES_DESCRIPTION = "series_description";
+QString ctkXnatObjectFields::TYPE = "type";
+
+QString ctkXnatObjectFields::ABSTRACT_RESOURCE_ID = "xnat_abstractresource_id";
+
+QString ctkXnatObjectFields::FILE_NAME = "Name";
+QString ctkXnatObjectFields::FILE_TAGS = "file_tags";
+QString ctkXnatObjectFields::FILE_FORMAT = "file_format";
+QString ctkXnatObjectFields::FILE_CONTENT = "file_content";

+ 63 - 0
Libs/XNAT/Core/ctkXnatConstants.h

@@ -0,0 +1,63 @@
+/*=============================================================================
+
+ Library: XNAT/Core
+
+ Copyright (c) German Cancer Research Center,
+   Division of Medical and Biological Informatics
+
+ 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 CTKXNATCONSTANTS_H
+#define CTKXNATCONSTANTS_H
+
+#include "ctkXNATCoreExport.h"
+
+#include <QString>
+
+/**
+ * @ingroup XNAT_Core
+ */
+
+struct CTK_XNAT_CORE_EXPORT ctkXnatObjectFields
+{
+  static QString ID;
+  static QString NAME;
+  static QString LABEL;
+
+  // XnatProject specific
+  static QString SECONDARY_ID;
+  static QString DESCRIPTION;
+  static QString PI_FIRSTNAME;
+  static QString PI_LASTNAME;
+
+  // XnatSubject specific
+  static QString INSERT_DATE;
+  static QString INSERT_USER;
+
+  // XnatScan specific
+  static QString TYPE;
+  static QString QUALITY;
+  static QString SERIES_DESCRIPTION;
+
+  // XnatResource specific
+  static QString ABSTRACT_RESOURCE_ID;
+
+  // XnatFile specific
+  static QString FILE_NAME;
+  static QString FILE_TAGS;
+  static QString FILE_FORMAT;
+  static QString FILE_CONTENT;
+};
+#endif // CTKXNATCONSTANTS_H

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

@@ -143,5 +143,4 @@ void ctkXnatExperiment::fetchImpl()
   }
 
   this->fetchResources();
-
 }

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

@@ -21,8 +21,9 @@
 
 #include "ctkXnatFile.h"
 
-#include "ctkXnatSession.h"
+#include "ctkXnatConstants.h"
 #include "ctkXnatObjectPrivate.h"
+#include "ctkXnatSession.h"
 
 
 //----------------------------------------------------------------------------
@@ -56,9 +57,54 @@ ctkXnatFile::~ctkXnatFile()
 }
 
 //----------------------------------------------------------------------------
+void ctkXnatFile::setName(const QString &name)
+{
+  setProperty(ctkXnatObjectFields::FILE_NAME, name);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatFile::name() const
+{
+  return property(ctkXnatObjectFields::FILE_NAME);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatFile::setFileFormat(const QString &fileFormat)
+{
+  setProperty(ctkXnatObjectFields::FILE_FORMAT, fileFormat);
+}
+
+QString ctkXnatFile::fileFormat() const
+{
+  return property(ctkXnatObjectFields::FILE_FORMAT);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatFile::setFileContent(const QString &fileContent)
+{
+  setProperty(ctkXnatObjectFields::FILE_CONTENT, fileContent);
+}
+
+QString ctkXnatFile::fileContent() const
+{
+  return property(ctkXnatObjectFields::FILE_CONTENT);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatFile::setFileTags(const QString &fileTags)
+{
+  setProperty(ctkXnatObjectFields::FILE_TAGS, fileTags);
+}
+
+QString ctkXnatFile::fileTags() const
+{
+  return property(ctkXnatObjectFields::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());
 }
 
 //----------------------------------------------------------------------------

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

@@ -44,6 +44,18 @@ public:
 
   virtual QString resourceUri() const;
 
+  void setName(const QString &name);
+  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);
 

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

@@ -20,12 +20,14 @@
 =============================================================================*/
 
 #include "ctkXnatDataModel.h"
+
+#include "ctkXnatConstants.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 +68,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(ctkXnatObjectFields::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;
 };
 

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

@@ -22,9 +22,10 @@
 #include "ctkXnatObject.h"
 #include "ctkXnatObjectPrivate.h"
 
+#include "ctkXnatConstants.h"
 #include "ctkXnatDataModel.h"
-#include "ctkXnatSession.h"
 #include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatSession.h"
 
 #include <QDateTime>
 #include <QDebug>
@@ -67,37 +68,39 @@ ctkXnatObject::~ctkXnatObject()
 //----------------------------------------------------------------------------
 QString ctkXnatObject::id() const
 {
-  return property("ID");
+  return property(ctkXnatObjectFields::ID);
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatObject::setId(const QString& id)
 {
-  setProperty("ID", id);
+  setProperty(ctkXnatObjectFields::ID, id);
 }
 
 //----------------------------------------------------------------------------
 QString ctkXnatObject::name() const
 {
-  return property("name");
+  return property(ctkXnatObjectFields::NAME);
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatObject::setName(const QString& name)
 {
-  setProperty("name", name);
+  setProperty(ctkXnatObjectFields::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 +264,12 @@ QString ctkXnatObject::schemaType() const
 }
 
 //----------------------------------------------------------------------------
+void ctkXnatObject::setSchemaType(const QString& schemaType)
+{
+  this->setProperty("xsiType", schemaType);
+}
+
+//----------------------------------------------------------------------------
 void ctkXnatObject::fetch()
 {
   Q_D(ctkXnatObject);
@@ -284,12 +293,6 @@ ctkXnatSession* ctkXnatObject::session() const
 }
 
 //----------------------------------------------------------------------------
-void ctkXnatObject::setSchemaType(const QString& schemaType)
-{
-  this->setProperty("xsiType", schemaType);
-}
-
-//----------------------------------------------------------------------------
 void ctkXnatObject::download(const QString& /*zipFilename*/)
 {
 }
@@ -323,13 +326,13 @@ void ctkXnatObject::fetchResources(const QString& path)
 
   foreach (ctkXnatObject* resource, resources)
   {
-    QString label = resource->property("label");
+    QString label = resource->property(ctkXnatObjectFields::LABEL);
     if (label.isEmpty())
     {
       label = "NO NAME";
     }
 
-    resource->setProperty("label", label);
+    resource->setProperty(ctkXnatObjectFields::LABEL, label);
     this->add(resource);
   }
 }

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

@@ -48,10 +48,11 @@ public:
   /// Destructs the ctkXnatObject.
   virtual ~ctkXnatObject();
 
-  /// Gets the ID of the object.
+  /// Gets the global ID of the object.
   QString id() const;
 
   /// Sets the ID of the object.
+  /// @warning You must not change the ID of an existing object
   void setId(const QString& id);
 
   /// Gets the resource URI of the object that can be used to access it through
@@ -59,10 +60,10 @@ public:
   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;

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

+ 23 - 22
Libs/XNAT/Core/ctkXnatProject.cpp

@@ -21,11 +21,12 @@
 
 #include "ctkXnatProject.h"
 
+#include "ctkXnatConstants.h"
 #include "ctkXnatDataModel.h"
+#include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatObjectPrivate.h"
 #include "ctkXnatSession.h"
 #include "ctkXnatSubject.h"
-#include "ctkXnatObjectPrivate.h"
-#include "ctkXnatDefaultSchemaTypes.h"
 
 
 //----------------------------------------------------------------------------
@@ -40,15 +41,9 @@ public:
 
   void reset()
   {
-    secondaryId.clear();
-    piFirstName.clear();
-    piLastName.clear();
 //    uri.clear();
   }
 
-  QString secondaryId;
-  QString piFirstName;
-  QString piLastName;
 //  QString uri;
 };
 
@@ -79,43 +74,49 @@ QString ctkXnatProject::childDataType() const
 //----------------------------------------------------------------------------
 const QString& ctkXnatProject::secondaryId() const
 {
-  Q_D(const ctkXnatProject);
-  return d->secondaryId;
+  return property(ctkXnatObjectFields::SECONDARY_ID);
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatProject::setSecondaryId(const QString& secondaryId)
 {
-  Q_D(ctkXnatProject);
-  d->secondaryId = secondaryId;
+  setProperty(ctkXnatObjectFields::SECONDARY_ID, secondaryId);
 }
 
 //----------------------------------------------------------------------------
 const QString& ctkXnatProject::piFirstName() const
 {
-  Q_D(const ctkXnatProject);
-  return d->piFirstName;
+  return property(ctkXnatObjectFields::PI_FIRSTNAME);
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatProject::setPiFirstName(const QString& piFirstName)
 {
-  Q_D(ctkXnatProject);
-  d->piFirstName = piFirstName;
+  setProperty(ctkXnatObjectFields::PI_FIRSTNAME, piFirstName);
 }
 
 //----------------------------------------------------------------------------
 const QString& ctkXnatProject::piLastName() const
 {
-  Q_D(const ctkXnatProject);
-  return d->piLastName;
+  return property(ctkXnatObjectFields::PI_LASTNAME);
 }
 
 //----------------------------------------------------------------------------
 void ctkXnatProject::setPiLastName(const QString& piLastName)
 {
-  Q_D(ctkXnatProject);
-  d->piLastName = piLastName;
+  setProperty(ctkXnatObjectFields::PI_LASTNAME, piLastName);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatProject::projectDescription() const
+{
+  return property(ctkXnatObjectFields::DESCRIPTION);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatProject::setProjectDescription(const QString& description)
+{
+  setProperty(ctkXnatObjectFields::DESCRIPTION, description);
 }
 
 //----------------------------------------------------------------------------
@@ -149,10 +150,10 @@ void ctkXnatProject::fetchImpl()
 
   foreach (ctkXnatObject* subject, subjects)
   {
-    QString label = subject->property("label");
+    QString label = subject->property(ctkXnatObjectFields::LABEL);
     if (!label.isEmpty())
     {
-      subject->setProperty("ID", label);
+      subject->setProperty(ctkXnatObjectFields::ID, label);
     }
 
     this->add(subject);

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

@@ -55,6 +55,9 @@ public:
   const QString& piLastName() const;
   void setPiLastName(const QString& piLastName);
 
+  QString projectDescription() const;
+  void setProjectDescription(const QString &description);
+
   void reset();
 
 private:

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

@@ -21,10 +21,11 @@
 
 #include "ctkXnatReconstruction.h"
 
-#include "ctkXnatSession.h"
+#include "ctkXnatConstants.h"
+#include "ctkXnatDefaultSchemaTypes.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->property(ctkXnatObjectFields::FILE_NAME);
     if (!label.isEmpty())
     {
-      reconstructionResource->setProperty("ID", label);
+      reconstructionResource->setProperty(ctkXnatObjectFields::ID, label);
     }
 
     this->add(reconstructionResource);

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

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

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

@@ -21,8 +21,9 @@
 
 #include "ctkXnatResource.h"
 
-#include "ctkXnatSession.h"
+#include "ctkXnatConstants.h"
 #include "ctkXnatObjectPrivate.h"
+#include "ctkXnatSession.h"
 
 //----------------------------------------------------------------------------
 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 property(ctkXnatObjectFields::ABSTRACT_RESOURCE_ID);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatResource::setId(const QString &id)
+{
+  setProperty(ctkXnatObjectFields::ABSTRACT_RESOURCE_ID, id);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatResource::name() const
+{
+  return this->label();
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatResource::setName(const QString &name)
+{
+  this->setLabel(name);
+}
+
+//----------------------------------------------------------------------------
+QString ctkXnatResource::label() const
+{
+  return property(ctkXnatObjectFields::LABEL);
+}
+
+//----------------------------------------------------------------------------
+void ctkXnatResource::setLabel(const QString &label)
+{
+  setProperty(ctkXnatObjectFields::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);
   }
 }

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

@@ -44,6 +44,18 @@ public:
 
   QString resourceUri() const;
 
+  QString id() const;
+  void setId(const QString &id);
+
+  QString name() const;
+  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);

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

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

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

@@ -43,6 +43,15 @@ 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();

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

@@ -21,11 +21,12 @@
 
 #include "ctkXnatScanFolder.h"
 
-#include "ctkXnatSession.h"
+#include "ctkXnatConstants.h"
+#include "ctkXnatDefaultSchemaTypes.h"
 #include "ctkXnatExperiment.h"
 #include "ctkXnatObjectPrivate.h"
 #include "ctkXnatScan.h"
-#include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatSession.h"
 
 
 //----------------------------------------------------------------------------
@@ -51,8 +52,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(ctkXnatObjectFields::LABEL, "Scans");
 }
 
 //----------------------------------------------------------------------------
@@ -84,10 +85,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 (ctkXnatObjectFields::SERIES_DESCRIPTION);
+    QString label = scan->property (ctkXnatObjectFields::LABEL);
     label = label.isEmpty() ? series_description : label;
-    scan->setProperty ("label", label);
+    scan->setProperty (ctkXnatObjectFields::LABEL, label);
     
     this->add(scan);
   }

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

@@ -21,7 +21,10 @@
 
 #include "ctkXnatSession.h"
 
+#include "ctkXnatAssessor.h"
+#include "ctkXnatConstants.h"
 #include "ctkXnatDataModel.h"
+#include "ctkXnatDefaultSchemaTypes.h"
 #include "ctkXnatException.h"
 #include "ctkXnatExperiment.h"
 #include "ctkXnatFile.h"
@@ -31,9 +34,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 +366,7 @@ void ctkXnatSession::open()
   }
 
   d->dataModel.reset(new ctkXnatDataModel(this));
-  d->dataModel->setProperty("label", this->url().toString());
+  d->dataModel->setProperty(ctkXnatObjectFields::LABEL, this->url().toString());
   emit sessionOpened();
 }
 
@@ -568,7 +569,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][ctkXnatObjectFields::ID];
     if (!id.isNull())
     {
       object->setId(id.toString());

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

@@ -21,13 +21,12 @@
 
 #include "ctkXnatSubject.h"
 
-#include "ctkXnatProject.h"
-
-#include "ctkXnatSession.h"
-#include "ctkXnatObjectPrivate.h"
+#include "ctkXnatConstants.h"
+#include "ctkXnatDefaultSchemaTypes.h"
 #include "ctkXnatExperiment.h"
+#include "ctkXnatObjectPrivate.h"
 #include "ctkXnatProject.h"
-#include "ctkXnatDefaultSchemaTypes.h"
+#include "ctkXnatSession.h"
 
 
 //----------------------------------------------------------------------------
@@ -119,10 +118,10 @@ void ctkXnatSubject::fetchImpl()
 
   foreach (ctkXnatObject* experiment, experiments)
   {
-    QString label = experiment->property ("label");
+    QString label = experiment->property (ctkXnatObjectFields::LABEL);
     if (!label.isEmpty())
     {
-      experiment->setProperty ("ID", label);
+      experiment->setProperty (ctkXnatObjectFields::ID, label);
     }
 
     this->add(experiment);

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

@@ -46,9 +46,13 @@ public:
   QList<ctkXnatProject*> getProjects() 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;

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

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