Browse Source

XNAT save function save the properties

Miklos Espak 11 years ago
parent
commit
4354b2fc38

+ 1 - 1
CMakeExternals/qRestAPI.cmake

@@ -23,7 +23,7 @@ if(${add_project})
 
     if(NOT DEFINED qRestAPI_DIR)
 
-      set(revision_tag "5830a8146b")
+      set(revision_tag "d81b73b330")
       if(${proj}_REVISION_TAG)
         set(revision_tag ${${proj}_REVISION_TAG})
       endif()

+ 41 - 1
Libs/XNAT/Core/Testing/ctkXnatConnectionTest.cpp

@@ -35,6 +35,7 @@
 #include <ctkXnatConnectionFactory.h>
 #include <ctkXnatProject.h>
 #include <ctkXnatServer.h>
+#include <ctkXnatSubject.h>
 
 class ctkXnatConnectionTestCasePrivate
 {
@@ -121,7 +122,7 @@ void ctkXnatConnectionTestCase::testCreateProject()
   bool exists = d->Connection->exists(project);
   QVERIFY(!exists);
 
-  d->Connection->create(project);
+  d->Connection->save(project);
 
   exists = d->Connection->exists(project);
   QVERIFY(exists);
@@ -132,6 +133,45 @@ void ctkXnatConnectionTestCase::testCreateProject()
   QVERIFY(!exists);
 }
 
+void ctkXnatConnectionTestCase::testCreateSubject()
+{
+  Q_D(ctkXnatConnectionTestCase);
+
+  ctkXnatServer* server = d->Connection->server();
+
+  QString projectId = QString("CTK_") + QUuid::createUuid().toString().mid(1, 8);
+  d->Project = projectId;
+
+  ctkXnatProject* project = new ctkXnatProject(server);
+  project->setId(projectId);
+  project->setName(projectId);
+  project->setDescription("CTK test project");
+
+  QVERIFY(!project->exists());
+
+  project->save();
+
+  QVERIFY(project->exists());
+
+  ctkXnatSubject* subject = new ctkXnatSubject(project);
+
+  QString subjectName = QString("CTK_S") + QUuid::createUuid().toString().mid(1, 8);
+  subject->setId(subjectName);
+  subject->setName(subjectName);
+
+  subject->save();
+
+  QVERIFY(!subject->id().isNull());
+
+  subject->erase();
+
+  QVERIFY(!subject->exists());
+
+  project->erase();
+
+  QVERIFY(!project->exists());
+}
+
 // --------------------------------------------------------------------------
 int ctkXnatConnectionTest(int argc, char* argv[])
 {

+ 2 - 0
Libs/XNAT/Core/Testing/ctkXnatConnectionTest.h

@@ -48,6 +48,8 @@ private slots:
 
   void testCreateProject();
 
+  void testCreateSubject();
+
 private:
   QScopedPointer<ctkXnatConnectionTestCasePrivate> d_ptr;
 

+ 30 - 4
Libs/XNAT/Core/ctkXnatConnection.cpp

@@ -384,7 +384,7 @@ void ctkXnatConnection::fetch(ctkXnatReconstructionResource* reconstructionResou
   }
 }
 
-bool ctkXnatConnection::exists(ctkXnatObject* object)
+bool ctkXnatConnection::exists(const ctkXnatObject* object)
 {
   Q_D(ctkXnatConnection);
 
@@ -394,18 +394,44 @@ bool ctkXnatConnection::exists(ctkXnatObject* object)
   return success;
 }
 
-void ctkXnatConnection::create(ctkXnatObject* object)
+void ctkXnatConnection::save(ctkXnatObject* object)
 {
   Q_D(ctkXnatConnection);
 
   QString query = object->resourceUri();
+
+  const QMap<QString, QString>& properties = object->properties();
+  QMap<QString, QString>::ConstIterator itProperties = properties.begin();
+  QMap<QString, QString>::ConstIterator endProperties = properties.end();
+  if (itProperties != endProperties)
+  {
+    query.append(QString("?%1=%2").arg(itProperties.key(), itProperties.value()));
+    ++itProperties;
+  }
+  while (itProperties != endProperties)
+  {
+    query.append(QString("&%1=%2").arg(itProperties.key(), itProperties.value()));
+    ++itProperties;
+  }
+
   qDebug() << "ctkXnatConnection::create() query:" << query;
-  bool success = d->xnat->sync(d->xnat->put(query));
+  QUuid queryId = d->xnat->put(query);
+  qRestResult* result = d->xnat->takeResult(queryId);
 
-  if (!success)
+  if (!result || !result->error().isNull())
   {
     throw ctkXnatException("Error occurred while creating the data.");
   }
+
+  const QList<QVariantMap>& maps = result->results();
+  if (maps.size() == 1 && maps[0].size() == 1)
+  {
+    QVariant id = maps[0]["ID"];
+    if (!id.isNull())
+    {
+      object->setId(id.toString());
+    }
+  }
 }
 
 void ctkXnatConnection::remove(ctkXnatObject* object)

+ 2 - 2
Libs/XNAT/Core/ctkXnatConnection.h

@@ -82,9 +82,9 @@ public:
   void fetch(ctkXnatReconstruction* reconstruction);
   void fetch(ctkXnatReconstructionResource* reconstructionResource);
 
-  bool exists(ctkXnatObject* object);
+  bool exists(const ctkXnatObject* object);
 
-  void create(ctkXnatObject* object);
+  void save(ctkXnatObject* object);
   void remove(ctkXnatObject* object);
 
   void download(ctkXnatFile* file, const QString& fileName);

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

@@ -108,21 +108,10 @@ void ctkXnatObject::setProperty(const QString& name, const QVariant& value)
   d->properties.insert(name, value.toString());
 }
 
-
-QList<QString> ctkXnatObject::properties()
+const QMap<QString, QString>& ctkXnatObject::properties() const
 {
-  Q_D(ctkXnatObject);
-  
-  QList<QString> value;
-
-  QMapIterator<QString, QString> it(d->properties);
-  while (it.hasNext())
-  {
-    it.next();
-    value.push_back (it.key());
-  }
-
-  return value;
+  Q_D(const ctkXnatObject);
+  return d->properties;
 }
 
 ctkXnatObject* ctkXnatObject::parent() const
@@ -173,10 +162,6 @@ void ctkXnatObject::add(ctkXnatObject* child)
 void ctkXnatObject::remove(ctkXnatObject* child)
 {
   Q_D(ctkXnatObject);
-  if (child->parent() == this)
-  {
-    child->d_func()->parent = 0;
-  }
   if (!d->children.removeOne(child))
   {
     qWarning() << "ctkXnatObject::remove(): Child does not exist";
@@ -228,3 +213,19 @@ void ctkXnatObject::download(const QString& /*zipFilename*/)
 void ctkXnatObject::upload(const QString& /*zipFilename*/)
 {
 }
+
+bool ctkXnatObject::exists() const
+{
+  return this->connection()->exists(this);
+}
+
+void ctkXnatObject::save()
+{
+  this->connection()->save(this);
+}
+
+void ctkXnatObject::erase()
+{
+  this->connection()->remove(this);
+  this->parent()->remove(this);
+}

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

@@ -75,9 +75,9 @@ public:
   /// Sets the value of the property with the given name.
   void setProperty(const QString& name, const QVariant& value);
 
-  /// Gets the list of the properties of the object.
-  QList<QString> properties();
-  
+  /// Gets the properties of the object.
+  const QMap<QString, QString>& properties() const;
+
   /// Gets the parent of the object in the data hierarchy. The returned pointer
   /// is 0 for the ctkXnatServer objects and different for any other type of
   /// XNAT objects.
@@ -92,7 +92,7 @@ public:
   /// Adds an object to the children of the current one.
   void add(ctkXnatObject* child);
 
-  /// Removes the object from the children of the current object.
+  /// Removes the object from the children of the current object and removes it from the XNAT server.
   void remove(ctkXnatObject* child);
 
   /// Tells if the children and the properties of the objects have been fetched.
@@ -105,6 +105,15 @@ public:
   /// Fetches the children and the properties of the object.
   void fetch();
 
+  /// Checks if the object exists on the XNAT server.
+  bool exists() const;
+
+  /// Creates the object on the XNAT server and sets the new ID.
+  void save();
+
+  /// Deletes the object on the XNAT server and removes it from its parent.
+  void erase();
+
   virtual void download(const QString&);
   virtual void upload(const QString&);
 

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

@@ -46,7 +46,7 @@ private:
 
   QString schemaType;
 
-  QMap<QString,QString> properties;
+  QMap<QString, QString> properties;
 
   QList<ctkXnatObject*> children;