Parcourir la source

XNAT Core refactorings and basic support for creating objects

Miklos Espak il y a 11 ans
Parent
commit
f5f3ddff70

+ 16 - 8
Libs/XNAT/Core/Testing/ctkXnatConnectionTest.cpp

@@ -95,26 +95,34 @@ void ctkXnatConnectionTestCase::testProjectList()
   QVERIFY(projects.size() > 0);
 }
 
+void ctkXnatConnectionTestCase::testResourceUri()
+{
+  Q_D(ctkXnatConnectionTestCase);
+
+  ctkXnatServer* server = d->Connection->server();
+  QVERIFY(!server->resourceUri().isNull());
+  QVERIFY(server->resourceUri().isEmpty());
+}
+
 void ctkXnatConnectionTestCase::testCreateProject()
 {
   Q_D(ctkXnatConnectionTestCase);
 
   ctkXnatServer* server = d->Connection->server();
 
+  QString projectId = QString("CTK_") + QUuid::createUuid().toString().mid(1, 8);
+  d->Project = projectId;
+  qDebug() << "Creating project" << id;
+
   ctkXnatProject* project = new ctkXnatProject();
-  project->setId("CTK_432");
-  project->setName("CTK 432");
+  project->setId(projectId);
+  project->setName(projectId);
   project->setDescription("CTK test project");
   server->add(project);
 
-//  project->save();
-
-//  bool saved = project->exists();
-
-//  QVERIFY(projects.size() > 0);
+  d->Connection->create(project);
 }
 
-
 // --------------------------------------------------------------------------
 int ctkXnatConnectionTest(int argc, char* argv[])
 {

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

@@ -44,6 +44,8 @@ private slots:
 
   void testProjectList();
 
+  void testResourceUri();
+
   void testCreateProject();
 
 private:

+ 19 - 47
Libs/XNAT/Core/ctkXnatConnection.cpp

@@ -36,6 +36,7 @@
 #include "ctkXnatServer.h"
 #include "ctkXnatSubject.h"
 
+#include <QDebug>
 #include <QScopedPointer>
 #include <QStringBuilder>
 
@@ -170,9 +171,10 @@ void ctkXnatConnection::fetch(ctkXnatServer* server)
   qRestResult* restResult = d->xnat->takeResult(queryId);
   QList<ctkXnatProject*> projects = restResult->results<ctkXnatProject>();
 
+  qDebug() << "ctkXnatConnection::fetch(ctkXnatServer* server): project number:" << projects.size();
+
   foreach (ctkXnatProject* project, projects)
   {
-    project->setUri(projectsUri + "/" + project->id());
     server->add(project);
   }
 
@@ -183,7 +185,7 @@ void ctkXnatConnection::fetch(ctkXnatProject* project)
 {
   Q_D(ctkXnatConnection);
 
-  QString subjectsUri = project->uri() + "/subjects";
+  QString subjectsUri = project->resourceUri() + "/subjects";
   QUuid queryId = d->xnat->get(subjectsUri);
   qRestResult* restResult = d->xnat->takeResult(queryId);
   QList<ctkXnatSubject*> subjects = restResult->results<ctkXnatSubject>();
@@ -195,7 +197,6 @@ void ctkXnatConnection::fetch(ctkXnatProject* project)
     {
       subject->setProperty("ID", label);
     }
-    subject->setUri(subjectsUri + "/" + subject->id());
 
     project->add(subject);
   }
@@ -207,7 +208,7 @@ void ctkXnatConnection::fetch(ctkXnatSubject* subject)
 {
   Q_D(ctkXnatConnection);
 
-  QString experimentsUri = subject->uri() + "/experiments";
+  QString experimentsUri = subject->resourceUri() + "/experiments";
   QUuid queryId = d->xnat->get(experimentsUri);
   qRestResult* restResult = d->xnat->takeResult(queryId);
 
@@ -220,7 +221,6 @@ void ctkXnatConnection::fetch(ctkXnatSubject* subject)
     {
       experiment->setProperty ("ID", label);
     }
-    experiment->setUri(experimentsUri + "/" + experiment->id());
 
     subject->add(experiment);
   }
@@ -232,7 +232,7 @@ void ctkXnatConnection::fetch(ctkXnatExperiment* experiment)
 {
   Q_D(ctkXnatConnection);
   
-  QString scansUri = experiment->uri() + "/scans";
+  QString scansUri = experiment->resourceUri() + "/scans";
   QUuid scansQueryId = d->xnat->get(scansUri);
   qRestResult* restResult = d->xnat->takeResult(scansQueryId);
   
@@ -241,13 +241,12 @@ void ctkXnatConnection::fetch(ctkXnatExperiment* experiment)
   if (scans.size() > 0)
   {
     ctkXnatScanFolder* scanFolder = new ctkXnatScanFolder();
-    scanFolder->setUri(scansUri);
     experiment->add(scanFolder);
   }
   
   delete restResult;
 
-  QString reconstructionsUri = experiment->uri() + "/reconstructions";
+  QString reconstructionsUri = experiment->resourceUri() + "/reconstructions";
   QUuid reconstructionsQueryId = d->xnat->get(reconstructionsUri);
   restResult = d->xnat->takeResult(reconstructionsQueryId);
 
@@ -256,7 +255,6 @@ void ctkXnatConnection::fetch(ctkXnatExperiment* experiment)
   if (reconstructions.size() > 0)
   {
     ctkXnatReconstructionFolder* reconstructionFolder = new ctkXnatReconstructionFolder();
-    reconstructionFolder->setUri(reconstructionsUri);
     experiment->add(reconstructionFolder);
   }
 
@@ -267,7 +265,7 @@ void ctkXnatConnection::fetch(ctkXnatScanFolder* scanFolder)
 {
   Q_D(ctkXnatConnection);
   
-  QString scansUri = scanFolder->uri();
+  QString scansUri = scanFolder->resourceUri();
   QUuid queryId = d->xnat->get(scansUri);
   qRestResult* restResult = d->xnat->takeResult(queryId);
 
@@ -275,7 +273,6 @@ void ctkXnatConnection::fetch(ctkXnatScanFolder* scanFolder)
   
   foreach (ctkXnatScan* scan, scans)
   {
-    scan->setUri(scansUri + "/" + scan->id());
     scanFolder->add(scan);
   }
   
@@ -287,7 +284,7 @@ void ctkXnatConnection::fetch(ctkXnatScan* scan)
 {
   Q_D(ctkXnatConnection);
   
-  QString scanResourcesUri = scan->uri() + "/resources";
+  QString scanResourcesUri = scan->resourceUri() + "/resources";
   QUuid queryId = d->xnat->get(scanResourcesUri);
   qRestResult* restResult = d->xnat->takeResult(queryId);
   
@@ -300,8 +297,6 @@ void ctkXnatConnection::fetch(ctkXnatScan* scan)
     {
       scanResource->setProperty("ID", label);
     }
-    
-    scanResource->setUri(scanResourcesUri + "/" + label);
     scan->add(scanResource);
   }
 }
@@ -310,7 +305,7 @@ void ctkXnatConnection::fetch(ctkXnatScanResource* scanResource)
 {
   Q_D(ctkXnatConnection);
   
-  QString scanResourceFilesUri = scanResource->uri() + "/files";
+  QString scanResourceFilesUri = scanResource->resourceUri() + "/files";
   QUuid queryId = d->xnat->get(scanResourceFilesUri);
   qRestResult* restResult = d->xnat->takeResult(queryId);
   
@@ -318,19 +313,11 @@ void ctkXnatConnection::fetch(ctkXnatScanResource* scanResource)
 
   foreach (ctkXnatFile* file, files)
   {
-    QString uri = file->property("URI");
-    if (uri.size())
-    {
-      file->setUri(uri);
-    }
-
     QString label = file->property("Name");
     if (label.size())
     {
       file->setProperty("ID", label);
     }
-
-    file->setUri(scanResourceFilesUri + "/" + label);
     scanResource->add(file);
   }
 }
@@ -339,7 +326,7 @@ void ctkXnatConnection::fetch(ctkXnatReconstructionFolder* reconstructionFolder)
 {
   Q_D(ctkXnatConnection);
 
-  QString reconstructionsUri = reconstructionFolder->uri();
+  QString reconstructionsUri = reconstructionFolder->resourceUri();
   QUuid queryId = d->xnat->get(reconstructionsUri);
   qRestResult* restResult = d->xnat->takeResult(queryId);
 
@@ -347,8 +334,6 @@ void ctkXnatConnection::fetch(ctkXnatReconstructionFolder* reconstructionFolder)
 
   foreach (ctkXnatReconstruction* reconstruction, reconstructions)
   {
-    reconstruction->setUri(reconstructionsUri + "/" + reconstruction->id());
-
     reconstructionFolder->add(reconstruction);
   }
 
@@ -360,7 +345,7 @@ void ctkXnatConnection::fetch(ctkXnatReconstruction* reconstruction)
 {
   Q_D(ctkXnatConnection);
 
-  QString reconstructionResourcesUri = reconstruction->uri() + "/resources";
+  QString reconstructionResourcesUri = reconstruction->resourceUri() + "/resources";
   QUuid queryId = d->xnat->get(reconstructionResourcesUri);
   qRestResult* restResult = d->xnat->takeResult(queryId);
 
@@ -374,8 +359,6 @@ void ctkXnatConnection::fetch(ctkXnatReconstruction* reconstruction)
       reconstructionResource->setProperty("ID", label);
     }
 
-    reconstructionResource->setUri(reconstructionResourcesUri + "/" + label);
-
     reconstruction->add(reconstructionResource);
   }
 }
@@ -384,7 +367,7 @@ void ctkXnatConnection::fetch(ctkXnatReconstructionResource* reconstructionResou
 {
   Q_D(ctkXnatConnection);
 
-  QString reconstructionResourceFilesUri = reconstructionResource->uri() + "/files";
+  QString reconstructionResourceFilesUri = reconstructionResource->resourceUri() + "/files";
   QUuid queryId = d->xnat->get(reconstructionResourceFilesUri);
   qRestResult* restResult = d->xnat->takeResult(queryId);
 
@@ -392,31 +375,22 @@ void ctkXnatConnection::fetch(ctkXnatReconstructionResource* reconstructionResou
 
   foreach (ctkXnatFile* file, files)
   {
-    QString uri = file->property("URI");
-    if (uri.size())
-    {
-      file->setUri(uri);
-    }
-
     QString label = file->property("Name");
     if (label.size())
     {
       file->setProperty("ID", label);
     }
 
-    file->setUri(reconstructionResourceFilesUri + "/" + label);
-
     reconstructionResource->add(file);
   }
 }
 
 void ctkXnatConnection::create(ctkXnatObject* object)
 {
-  const QString& uri = object->uri();
-
   Q_D(ctkXnatConnection);
 
-  QString query = uri;
+  QString query = object->resourceUri();
+  qDebug() << "ctkXnatConnection::create() query:" << query;
   bool success = d->xnat->sync(d->xnat->put(query));
 
   if (!success)
@@ -427,11 +401,9 @@ void ctkXnatConnection::create(ctkXnatObject* object)
 
 void ctkXnatConnection::remove(ctkXnatObject* object)
 {
-  const QString& uri = object->uri();
-
   Q_D(ctkXnatConnection);
 
-  QString query = uri;
+  QString query = object->resourceUri();
   bool success = d->xnat->sync(d->xnat->del(query));
 
   if (!success)
@@ -576,7 +548,7 @@ void ctkXnatConnection::remove(ctkXnatObject* object)
 void ctkXnatConnection::download(ctkXnatFile* file, const QString& fileName)
 {
   Q_D(ctkXnatConnection);
-  QString query = file->uri();
+  QString query = file->resourceUri();
 
   QUuid queryId = d->xnat->download(fileName, query);
   d->xnat->sync(queryId);
@@ -586,7 +558,7 @@ void ctkXnatConnection::download(ctkXnatScanResource* scanResource, const QStrin
 {
   Q_D(ctkXnatConnection);
 
-  QString query = scanResource->uri() + "/files";
+  QString query = scanResource->resourceUri() + "/files";
   qRestAPI::Parameters parameters;
   parameters["format"] = "zip";
   QUuid queryId = d->xnat->download(fileName, query, parameters);
@@ -597,7 +569,7 @@ void ctkXnatConnection::download(ctkXnatReconstructionResource* reconstructionRe
 {
   Q_D(ctkXnatConnection);
 
-  QString query = reconstructionResource->uri() + "/files";
+  QString query = reconstructionResource->resourceUri() + "/files";
   qRestAPI::Parameters parameters;
   parameters["format"] = "zip";
   QUuid queryId = d->xnat->download(fileName, query, parameters);

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

@@ -83,10 +83,6 @@ public:
   void fetch(ctkXnatReconstructionResource* reconstructionResource);
 
   void create(ctkXnatObject* object);
-
-  void create(ctkXnatProject* project);
-  void create(ctkXnatSubject* subject);
-
   void remove(ctkXnatObject* object);
 
   void download(ctkXnatFile* file, const QString& fileName);

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

@@ -26,6 +26,8 @@
 #include "ctkXnatObject.h"
 #include "ctkXnatServer.h"
 
+#include <QDebug>
+
 // ctkXnatConnectionFactory class
 
 ctkXnatConnection* ctkXnatConnectionFactory::makeConnection(const QString& url, const QString& user, const QString& password)
@@ -45,6 +47,7 @@ ctkXnatConnection* ctkXnatConnectionFactory::makeConnection(const QString& url,
   }
 
   connection->setUrl(url);
+  qDebug() << "ctkXnatConnectionFactory::makeConnection(const QString& url, const QString& user, const QString& password) url:" << url;
   connection->setUserName(user);
   connection->setPassword(password);
 

+ 4 - 11
Libs/XNAT/Core/ctkXnatExperiment.cpp

@@ -51,17 +51,10 @@ ctkXnatExperiment::~ctkXnatExperiment()
 {
 }
 
-//const QString& ctkXnatExperiment::uri() const
-//{
-//  Q_D(const ctkXnatExperiment);
-//  return d->uri;
-//}
-
-//void ctkXnatExperiment::setUri(const QString& uri)
-//{
-//  Q_D(ctkXnatExperiment);
-//  d->uri = uri;
-//}
+QString ctkXnatExperiment::resourceUri() const
+{
+  return QString("%1/experiments/%2").arg(parent()->resourceUri(), this->id());
+}
 
 void ctkXnatExperiment::reset()
 {

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

@@ -37,9 +37,8 @@ public:
   explicit ctkXnatExperiment(const QString& schemaType = "xnat:experimentData");
   virtual ~ctkXnatExperiment();
   
-//  const QString& uri() const;
-//  void setUri(const QString& uri);
-  
+  virtual QString resourceUri() const;
+
   void reset();
   
 private:

+ 4 - 11
Libs/XNAT/Core/ctkXnatFile.cpp

@@ -51,17 +51,10 @@ ctkXnatFile::~ctkXnatFile()
 {
 }
 
-//const QString& ctkXnatFile::uri() const
-//{
-//  Q_D(const ctkXnatFile);
-//  return d->uri;
-//}
-
-//void ctkXnatFile::setUri(const QString& uri)
-//{
-//  Q_D(ctkXnatFile);
-//  d->uri = uri;
-//}
+QString ctkXnatFile::resourceUri() const
+{
+  return QString("%1/files/%2").arg(parent()->resourceUri(), this->id());
+}
 
 void ctkXnatFile::download(const QString& filename)
 {

+ 1 - 2
Libs/XNAT/Core/ctkXnatFile.h

@@ -37,8 +37,7 @@ public:
   explicit ctkXnatFile();
   virtual ~ctkXnatFile();
   
-//  const QString& uri() const;
-//  void setUri(const QString& uri);
+  virtual QString resourceUri() const;
 
   void download(const QString& filename);
   void upload(const QString& filename);

+ 10 - 13
Libs/XNAT/Core/ctkXnatObject.cpp

@@ -63,16 +63,6 @@ void ctkXnatObject::setId(const QString& id)
   setProperty("ID", id);
 }
 
-QString ctkXnatObject::uri() const
-{
-  return property("URI");
-}
-
-void ctkXnatObject::setUri(const QString& uri)
-{
-  setProperty("URI", uri);
-}
-
 QString ctkXnatObject::schemaType() const
 {
   Q_D(const ctkXnatObject);
@@ -152,7 +142,6 @@ void ctkXnatObject::setParent(ctkXnatObject* parent)
     {
       parent->add(this);
     }
-    d->parent = parent;
   }
 }
 
@@ -167,20 +156,28 @@ void ctkXnatObject::add(ctkXnatObject* child)
   Q_D(ctkXnatObject);
   if (child->parent() != this)
   {
-    child->setParent(this);
+    child->d_func()->parent = this;
   }
   if (!d->children.contains(child))
   {
     d->children.push_back(child);
   }
+  else
+  {
+    qWarning() << "ctkXnatObject::add(): Child already exists";
+  }
 }
 
 void ctkXnatObject::remove(ctkXnatObject* child)
 {
   Q_D(ctkXnatObject);
+  if (child->parent() == this)
+  {
+    child->d_func()->parent = 0;
+  }
   if (!d->children.removeOne(child))
   {
-    qWarning() << "ctkXnatObject::removeChild(): Child does not exist";
+    qWarning() << "ctkXnatObject::remove(): Child does not exist";
   }
 }
 

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

@@ -55,11 +55,7 @@ public:
 
   /// Gets the resource URI of the object that can be used to access it through
   /// the REST API.
-  QString uri() const;
-
-  /// Sets the resource URI of the object that can be used to access it through
-  /// the REST API.
-  void setUri(const QString& uri);
+  virtual QString resourceUri() const = 0;
 
   /// Gets the name of the object.
   QString name() const;

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

@@ -25,6 +25,7 @@
 
 ctkXnatObjectPrivate::ctkXnatObjectPrivate()
 : fetched(false)
+, parent(0)
 {
 }
 

+ 5 - 0
Libs/XNAT/Core/ctkXnatProject.cpp

@@ -56,6 +56,11 @@ ctkXnatProject::~ctkXnatProject()
 {
 }
 
+QString ctkXnatProject::resourceUri() const
+{
+  return QString("%1/data/archive/projects/%2").arg(parent()->resourceUri(), this->id());
+}
+
 const QString& ctkXnatProject::secondaryId() const
 {
   Q_D(const ctkXnatProject);

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

@@ -37,6 +37,8 @@ public:
   explicit ctkXnatProject(const QString& schemaType = "xnat:projectData");
   virtual ~ctkXnatProject();
 
+  virtual QString resourceUri() const;
+
   const QString& secondaryId() const;
   void setSecondaryId(const QString& secondaryId);
 

+ 2 - 9
Libs/XNAT/Core/ctkXnatReconstruction.cpp

@@ -51,16 +51,9 @@ ctkXnatReconstruction::~ctkXnatReconstruction()
 {
 }
 
-const QString& ctkXnatReconstruction::uri() const
+QString ctkXnatReconstruction::resourceUri() const
 {
-  Q_D(const ctkXnatReconstruction);
-  return d->uri;
-}
-
-void ctkXnatReconstruction::setUri(const QString& uri)
-{
-  Q_D(ctkXnatReconstruction);
-  d->uri = uri;
+  return QString("%1/reconstructions/%2").arg(parent()->resourceUri(), this->id());
 }
 
 void ctkXnatReconstruction::reset()

+ 2 - 3
Libs/XNAT/Core/ctkXnatReconstruction.h

@@ -37,9 +37,8 @@ public:
   explicit ctkXnatReconstruction(const QString& schemaType = "xnat:reconstructedImageData");
   virtual ~ctkXnatReconstruction();
   
-  const QString& uri() const;
-  void setUri(const QString& uri);
-  
+  virtual QString resourceUri() const;
+
   void reset();
   
 private:

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

@@ -53,17 +53,10 @@ ctkXnatReconstructionFolder::~ctkXnatReconstructionFolder()
 {
 }
 
-//const QString& ctkXnatReconstructionFolder::uri() const
-//{
-//  Q_D(const ctkXnatReconstructionFolder);
-//  return d->uri;
-//}
-
-//void ctkXnatReconstructionFolder::setUri(const QString& uri)
-//{
-//  Q_D(ctkXnatReconstructionFolder);
-//  d->uri = uri;
-//}
+QString ctkXnatReconstructionFolder::resourceUri() const
+{
+  return QString("%1/%d").arg(parent()->resourceUri(), this->id());
+}
 
 void ctkXnatReconstructionFolder::reset()
 {

+ 2 - 3
Libs/XNAT/Core/ctkXnatReconstructionFolder.h

@@ -37,9 +37,8 @@ public:
   explicit ctkXnatReconstructionFolder();
   virtual ~ctkXnatReconstructionFolder();
   
-//  const QString& uri() const;
-//  void setUri(const QString& uri);
-  
+  virtual QString resourceUri() const;
+
   void reset();
   
 private:

+ 4 - 11
Libs/XNAT/Core/ctkXnatReconstructionResource.cpp

@@ -51,17 +51,10 @@ ctkXnatReconstructionResource::~ctkXnatReconstructionResource()
 {
 }
 
-//const QString& ctkXnatReconstructionResource::uri() const
-//{
-//  Q_D(const ctkXnatReconstructionResource);
-//  return d->uri;
-//}
-
-//void ctkXnatReconstructionResource::setUri(const QString& uri)
-//{
-//  Q_D(ctkXnatReconstructionResource);
-//  d->uri = uri;
-//}
+QString ctkXnatReconstructionResource::resourceUri() const
+{
+  return QString("%1/resources/%d").arg(parent()->resourceUri(), this->property("label"));
+}
 
 void ctkXnatReconstructionResource::reset()
 {

+ 2 - 3
Libs/XNAT/Core/ctkXnatReconstructionResource.h

@@ -37,9 +37,8 @@ public:
   explicit ctkXnatReconstructionResource();
   virtual ~ctkXnatReconstructionResource();
   
-//  const QString& uri() const;
-//  void setUri(const QString& uri);
-  
+  virtual QString resourceUri() const;
+
   void reset();
   
   void download(const QString& filename);

+ 2 - 10
Libs/XNAT/Core/ctkXnatScan.cpp

@@ -51,16 +51,9 @@ ctkXnatScan::~ctkXnatScan()
 {
 }
 
-const QString& ctkXnatScan::uri() const
+QString ctkXnatScan::resourceUri() const
 {
-  Q_D(const ctkXnatScan);
-  return d->uri;
-}
-
-void ctkXnatScan::setUri(const QString& uri)
-{
-  Q_D(ctkXnatScan);
-  d->uri = uri;
+  return QString("%1/scans/%2").arg(parent()->resourceUri(), this->id());
 }
 
 void ctkXnatScan::reset()
@@ -70,6 +63,5 @@ void ctkXnatScan::reset()
 
 void ctkXnatScan::fetchImpl()
 {
-  Q_D(ctkXnatScan);
   this->connection()->fetch(this);
 }

+ 2 - 3
Libs/XNAT/Core/ctkXnatScan.h

@@ -37,9 +37,8 @@ public:
   explicit ctkXnatScan(const QString& schemaType = "xnat:imageScanData");
   virtual ~ctkXnatScan();
   
-  const QString& uri() const;
-  void setUri(const QString& uri);
-  
+  virtual QString resourceUri() const;
+
   void reset();
   
 private:

+ 4 - 11
Libs/XNAT/Core/ctkXnatScanFolder.cpp

@@ -53,17 +53,10 @@ ctkXnatScanFolder::~ctkXnatScanFolder()
 {
 }
 
-//const QString& ctkXnatScanFolder::uri() const
-//{
-//  Q_D(const ctkXnatScanFolder);
-//  return d->uri;
-//}
-
-//void ctkXnatScanFolder::setUri(const QString& uri)
-//{
-//  Q_D(ctkXnatScanFolder);
-//  d->uri = uri;
-//}
+QString ctkXnatScanFolder::resourceUri() const
+{
+  return QString("%1/%d").arg(parent()->resourceUri(), this->id());
+}
 
 void ctkXnatScanFolder::reset()
 {

+ 1 - 2
Libs/XNAT/Core/ctkXnatScanFolder.h

@@ -37,8 +37,7 @@ public:
   explicit ctkXnatScanFolder();
   virtual ~ctkXnatScanFolder();
   
-//  const QString& uri() const;
-//  void setUri(const QString& uri);
+  virtual QString resourceUri() const;
   
   void reset();
   

+ 4 - 11
Libs/XNAT/Core/ctkXnatScanResource.cpp

@@ -51,17 +51,10 @@ ctkXnatScanResource::~ctkXnatScanResource()
 {
 }
 
-//const QString& ctkXnatScanResource::uri() const
-//{
-//  Q_D(const ctkXnatScanResource);
-//  return d->uri;
-//}
-
-//void ctkXnatScanResource::setUri(const QString& uri)
-//{
-//  Q_D(ctkXnatScanResource);
-//  d->uri = uri;
-//}
+QString ctkXnatScanResource::resourceUri() const
+{
+  return QString("%1/resources/%d").arg(parent()->resourceUri(), this->property("label"));
+}
 
 void ctkXnatScanResource::reset()
 {

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

@@ -36,9 +36,8 @@ public:
 
   explicit ctkXnatScanResource();
   virtual ~ctkXnatScanResource();
-  
-//  const QString& uri() const;
-//  void setUri(const QString& uri);
+
+  QString resourceUri() const;
   
   void reset();
   

+ 7 - 0
Libs/XNAT/Core/ctkXnatServer.cpp

@@ -24,6 +24,8 @@
 #include "ctkXnatObjectPrivate.h"
 #include "ctkXnatConnection.h"
 
+#include <QDebug>
+
 class ctkXnatServerPrivate : public ctkXnatObjectPrivate
 {
   explicit ctkXnatServerPrivate(ctkXnatConnection* connection);
@@ -50,6 +52,11 @@ ctkXnatServer::ctkXnatServer(ctkXnatConnection* connection)
 {
 }
 
+QString ctkXnatServer::resourceUri() const
+{
+  return "";
+}
+
 void ctkXnatServer::fetchImpl()
 {
   this->connection()->fetch(this);

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

@@ -37,6 +37,8 @@ public:
 
   ctkXnatServer(ctkXnatConnection* connection);
 
+  virtual QString resourceUri() const;
+
 protected:
 
   virtual ctkXnatConnection* connection() const;

+ 4 - 11
Libs/XNAT/Core/ctkXnatSubject.cpp

@@ -83,17 +83,10 @@ void ctkXnatSubject::setInsertUser(const QString& insertUser)
   d->insertUser = insertUser;
 }
 
-//const QString& ctkXnatSubject::uri() const
-//{
-//  Q_D(const ctkXnatSubject);
-//  return d->uri;
-//}
-
-//void ctkXnatSubject::setUri(const QString& uri)
-//{
-//  Q_D(ctkXnatSubject);
-//  d->uri = uri;
-//}
+QString ctkXnatSubject::resourceUri() const
+{
+  return QString("%1/subjects/%2").arg(parent()->resourceUri(), this->id());
+}
 
 void ctkXnatSubject::reset()
 {

+ 1 - 2
Libs/XNAT/Core/ctkXnatSubject.h

@@ -46,8 +46,7 @@ public:
   const QString& insertUser() const;
   void setInsertUser(const QString& insertUser);
 
-//  const QString& uri() const;
-//  void setUri(const QString& uri);
+  virtual QString resourceUri() const;
 
   void reset();