ctkConfigurationStore.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /*=============================================================================
  2. Library: CTK
  3. Copyright (c) German Cancer Research Center,
  4. Division of Medical and Biological Informatics
  5. Licensed under the Apache License, Version 2.0 (the "License");
  6. you may not use this file except in compliance with the License.
  7. You may obtain a copy of the License at
  8. http://www.apache.org/licenses/LICENSE-2.0
  9. Unless required by applicable law or agreed to in writing, software
  10. distributed under the License is distributed on an "AS IS" BASIS,
  11. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. See the License for the specific language governing permissions and
  13. limitations under the License.
  14. =============================================================================*/
  15. #include "ctkConfigurationStore_p.h"
  16. #include "ctkConfigurationAdminFactory_p.h"
  17. #include <ctkPluginContext.h>
  18. #include <service/log/ctkLogService.h>
  19. #include <QDateTime>
  20. const QString ctkConfigurationStore::STORE_DIR = "store";
  21. const QString ctkConfigurationStore::PID_EXT = ".pid";
  22. ctkConfigurationStore::ctkConfigurationStore(
  23. ctkConfigurationAdminFactory* configurationAdminFactory,
  24. ctkPluginContext* context)
  25. : configurationAdminFactory(configurationAdminFactory),
  26. createdPidCount(0)
  27. {
  28. store = context->getDataFile(STORE_DIR).absoluteDir();
  29. if (!store.mkpath(store.absolutePath()))
  30. {
  31. return; // no persistent store
  32. }
  33. QStringList nameFilters;
  34. nameFilters << QString('*') + PID_EXT;
  35. QFileInfoList configurationFiles = store.entryInfoList(nameFilters, QDir::Files | QDir::CaseSensitive);
  36. foreach (QFileInfo configFileInfo, configurationFiles)
  37. {
  38. QString configurationFilePath = configFileInfo.absoluteFilePath();
  39. QString configurationFileName = configFileInfo.fileName();
  40. QString pid = configurationFileName.mid(0, configurationFileName.size() - PID_EXT.size());
  41. bool deleteFile = false;
  42. QIODevice* iodevice = new QFile(configurationFilePath);
  43. iodevice->open(QIODevice::ReadOnly);
  44. QDataStream dataStream(iodevice);
  45. ctkDictionary dictionary;
  46. dataStream >> dictionary;
  47. if (dataStream.status() == QDataStream::Ok)
  48. {
  49. ctkConfigurationImplPtr config(new ctkConfigurationImpl(configurationAdminFactory, this, dictionary));
  50. configurations.insert(config->getPid(), config);
  51. }
  52. else
  53. {
  54. QString message = iodevice->errorString();
  55. QString errorMessage = QString("{Configuration Admin - pid = %1} could not be restored. %2").arg(pid).arg(message);
  56. CTK_ERROR(configurationAdminFactory->getLogService()) << errorMessage;
  57. deleteFile = true;
  58. }
  59. iodevice->close();
  60. delete iodevice;
  61. if (deleteFile)
  62. {
  63. QFile::remove(configurationFilePath);
  64. }
  65. }
  66. }
  67. void ctkConfigurationStore::saveConfiguration(const QString& pid, ctkConfigurationImpl* config)
  68. {
  69. if (!store.exists())
  70. return; // no persistent store
  71. config->checkLocked();
  72. QFile configFile(store.filePath(pid + PID_EXT));
  73. ctkDictionary configProperties = config->getAllProperties();
  74. //TODO security
  75. // try
  76. // {
  77. // AccessController.doPrivileged(new PrivilegedExceptionAction() {
  78. // public Object run() throws Exception {
  79. writeConfigurationFile(configFile, configProperties);
  80. // return null;
  81. // }
  82. // });
  83. // }
  84. // catch (PrivilegedActionException e)
  85. // {
  86. // throw (IOException) e.getException();
  87. // }
  88. }
  89. void ctkConfigurationStore::removeConfiguration(const QString& pid)
  90. {
  91. QMutexLocker lock(&mutex);
  92. configurations.remove(pid);
  93. if (!store.exists())
  94. return; // no persistent store
  95. QFile configFile(store.filePath(pid + PID_EXT));
  96. //TODO security// AccessController.doPrivileged(new PrivilegedAction() {
  97. // public Object run() {
  98. deleteConfigurationFile(configFile);
  99. // return null;
  100. // }
  101. // });
  102. }
  103. ctkConfigurationImplPtr ctkConfigurationStore::getConfiguration(
  104. const QString& pid, const QString& location)
  105. {
  106. QMutexLocker lock(&mutex);
  107. ctkConfigurationImplPtr config = configurations.value(pid);
  108. if (config.isNull())
  109. {
  110. config = ctkConfigurationImplPtr(new ctkConfigurationImpl(configurationAdminFactory, this,
  111. QString(), pid, location));
  112. configurations.insert(pid, config);
  113. }
  114. return config;
  115. }
  116. ctkConfigurationImplPtr ctkConfigurationStore::createFactoryConfiguration(
  117. const QString& factoryPid, const QString& location)
  118. {
  119. QMutexLocker lock(&mutex);
  120. //TODO Qt4.7 use QDateTime::currentMSecsSinceEpoch()
  121. QString pid = factoryPid + "-" + QDateTime::currentDateTime().toString("yyyyMMdd-hhmmsszzz") + "-" + QString::number(createdPidCount++);
  122. ctkConfigurationImplPtr config(new ctkConfigurationImpl(configurationAdminFactory, this, factoryPid, pid, location));
  123. configurations.insert(pid, config);
  124. return config;
  125. }
  126. ctkConfigurationImplPtr ctkConfigurationStore::findConfiguration(const QString& pid)
  127. {
  128. QMutexLocker lock(&mutex);
  129. return configurations.value(pid);
  130. }
  131. QList<ctkConfigurationImplPtr> ctkConfigurationStore::getFactoryConfigurations(const QString& factoryPid)
  132. {
  133. QMutexLocker lock(&mutex);
  134. QList<ctkConfigurationImplPtr> resultList;
  135. foreach (ctkConfigurationImplPtr config, configurations)
  136. {
  137. QString otherFactoryPid = config->getFactoryPid();
  138. if (otherFactoryPid == factoryPid)
  139. {
  140. resultList.push_back(config);
  141. }
  142. }
  143. return resultList;
  144. }
  145. QList<ctkConfigurationImplPtr> ctkConfigurationStore::listConfigurations(const ctkLDAPSearchFilter& filter)
  146. {
  147. QMutexLocker lock(&mutex);
  148. QList<ctkConfigurationImplPtr> resultList;
  149. foreach (ctkConfigurationImplPtr config, configurations)
  150. {
  151. ctkDictionary properties = config->getAllProperties();
  152. if (filter.match(properties))
  153. {
  154. resultList.push_back(config);
  155. }
  156. }
  157. return resultList;
  158. }
  159. void ctkConfigurationStore::unbindConfigurations(QSharedPointer<ctkPlugin> plugin)
  160. {
  161. QMutexLocker lock(&mutex);
  162. foreach (ctkConfigurationImplPtr config, configurations)
  163. {
  164. config->unbind(plugin);
  165. }
  166. }
  167. void ctkConfigurationStore::writeConfigurationFile(QFile& configFile,
  168. const ctkDictionary& configProperties)
  169. {
  170. QIODevice* iodevice = &configFile;
  171. iodevice->open(QIODevice::WriteOnly);
  172. QDataStream datastream(iodevice);
  173. datastream << configProperties;
  174. // ignore errors
  175. iodevice->close();
  176. }
  177. void ctkConfigurationStore::deleteConfigurationFile(QFile& configFile)
  178. {
  179. configFile.remove();
  180. }