| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 | 
							- /*=============================================================================
 
-   Library: CTK
 
-   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 "ctkMetaTypeProviderImpl_p.h"
 
- #include "ctkObjectClassDefinitionImpl_p.h"
 
- #include "ctkAttributeDefinitionImpl_p.h"
 
- #include "ctkMTMsg_p.h"
 
- #include "ctkMTDataParser_p.h"
 
- #include <ctkPluginConstants.h>
 
- #include <ctkException.h>
 
- #include <service/log/ctkLogService.h>
 
- #include <service/metatype/ctkMetaTypeService.h>
 
- #include <QCoreApplication>
 
- #include <QStringList>
 
- #include <QBuffer>
 
- const QString ctkMetaTypeProviderImpl::METADATA_NOT_FOUND = "METADATA_NOT_FOUND";
 
- const QString ctkMetaTypeProviderImpl::OCD_ID_NOT_FOUND = "OCD_ID_NOT_FOUND";
 
- const QString ctkMetaTypeProviderImpl::ASK_INVALID_LOCALE = "ASK_INVALID_LOCALE";
 
- const QString ctkMetaTypeProviderImpl::META_FILE_EXT = ".XML";
 
- const QString ctkMetaTypeProviderImpl::RESOURCE_FILE_CONN = "_";
 
- const QString ctkMetaTypeProviderImpl::RESOURCE_FILE_EXT = ".qm";
 
- const QChar ctkMetaTypeProviderImpl::DIRECTORY_SEP = '/';
 
- ctkMetaTypeProviderImpl::ctkMetaTypeProviderImpl(
 
-   const QSharedPointer<ctkPlugin>& plugin, ctkLogService* logger)
 
-   : _plugin(plugin), logger(logger), _isThereMeta(false)
 
- {
 
-   // read all plugin's metadata files and build internal data structures
 
-   _isThereMeta = readMetaFiles(plugin);
 
-   if (!_isThereMeta)
 
-   {
 
-     CTK_DEBUG(logger) << QCoreApplication::translate(ctkMTMsg::CONTEXT, ctkMTMsg::METADATA_NOT_FOUND)
 
-                          .arg(plugin->getPluginId()).arg(plugin->getSymbolicName());
 
-   }
 
- }
 
- ctkObjectClassDefinitionPtr ctkMetaTypeProviderImpl::getObjectClassDefinition(
 
-   const QString& pid, const QLocale& locale)
 
- {
 
-   ctkObjectClassDefinitionImplPtr ocd;
 
-   if (_allPidOCDs.contains(pid))
 
-   {
 
-     ocd = ctkObjectClassDefinitionImplPtr(new ctkObjectClassDefinitionImpl(*_allPidOCDs.value(pid).data()));
 
-     ocd->setPluginLocalization(locale, _plugin);
 
-     return ocd;
 
-   }
 
-   else if (_allFPidOCDs.contains(pid))
 
-   {
 
-     ocd = ctkObjectClassDefinitionImplPtr(new ctkObjectClassDefinitionImpl(*_allFPidOCDs.value(pid).data()));
 
-     ocd->setPluginLocalization(locale, _plugin);
 
-     return ocd;
 
-   }
 
-   else
 
-   {
 
-     QString msg = QCoreApplication::translate(ctkMTMsg::CONTEXT, ctkMTMsg::OCD_ID_NOT_FOUND).arg(pid);
 
-     throw ctkInvalidArgumentException(msg);
 
-   }
 
- }
 
- QList<QLocale> ctkMetaTypeProviderImpl::getLocales() const
 
- {
 
-   if (!_locales.isEmpty())
 
-     return checkForDefault(_locales);
 
-   QStringList localizationFiles;
 
-   // get all the localization resources for PIDS
 
-   foreach(ctkObjectClassDefinitionImplPtr ocd, _allPidOCDs)
 
-   {
 
-     QString loc = ocd->getLocalization();
 
-     if (!loc.isEmpty() && !localizationFiles.contains(loc))
 
-     {
 
-       localizationFiles << loc;
 
-     }
 
-   }
 
-   // get all the localization resources for FPIDS
 
-   foreach(ctkObjectClassDefinitionImplPtr ocd, _allFPidOCDs)
 
-   {
 
-     QString loc = ocd->getLocalization();
 
-     if (!loc.isEmpty() && !localizationFiles.contains(loc))
 
-     {
 
-       localizationFiles << loc;
 
-     }
 
-   }
 
-   if (localizationFiles.isEmpty())
 
-   {
 
-     localizationFiles << ctkPluginConstants::PLUGIN_LOCALIZATION_DEFAULT_BASENAME;
 
-   }
 
-   QList<QLocale> locales;
 
-   foreach (QString localizationFile, localizationFiles)
 
-   {
 
-     int iSlash = localizationFile.lastIndexOf(DIRECTORY_SEP);
 
-     QString baseDir;
 
-     QString baseFileName;
 
-     if (iSlash < 0)
 
-     {
 
-       baseDir = "";
 
-     }
 
-     else
 
-     {
 
-       baseDir = localizationFile.left(iSlash);
 
-     }
 
-     baseFileName = localizationFile + RESOURCE_FILE_CONN;
 
-     QStringList resources = _plugin->getResourceList(baseDir);
 
-     foreach(QString resourceName, resources)
 
-     {
 
-       QString resource = baseDir + DIRECTORY_SEP + resourceName;
 
-       if (resource.startsWith(baseFileName) && resource.toLower().endsWith(RESOURCE_FILE_EXT))
 
-       {
 
-         QString localeName = resource.mid(baseFileName.size(), resource.size() - baseFileName.size() - RESOURCE_FILE_EXT.length());
 
-         locales.push_back(QLocale(localeName));
 
-       }
 
-     }
 
-   }
 
-   _locales = locales;
 
-   return checkForDefault(_locales);
 
- }
 
- bool ctkMetaTypeProviderImpl::readMetaFiles(const QSharedPointer<ctkPlugin>& plugin)
 
- {
 
-   bool isThereMetaHere = false;
 
-   QStringList allFileKeys = plugin->getResourceList(ctkMetaTypeService::METATYPE_DOCUMENTS_LOCATION);
 
-   if (allFileKeys.isEmpty())
 
-     return isThereMetaHere;
 
-   foreach (QString fileName, allFileKeys)
 
-   {
 
-     bool _isMetaDataFile = false;
 
-     QHash<QString, ctkObjectClassDefinitionImplPtr> pidToOCD;
 
-     QByteArray resourceContent = plugin->getResource(ctkMetaTypeService::METATYPE_DOCUMENTS_LOCATION + "/" + fileName);
 
-     if (!resourceContent.isEmpty())
 
-     {
 
-       QBuffer metaData(&resourceContent);
 
-       try
 
-       {
 
-         // Assume all XML files are what we want by default.
 
-         _isMetaDataFile = true;
 
-         metaData.open(QIODevice::ReadOnly);
 
-         ctkMTDataParser parser(plugin, &metaData, logger);
 
-         pidToOCD = parser.doParse();
 
-         if (pidToOCD.isEmpty())
 
-         {
 
-           _isMetaDataFile = false;
 
-         }
 
-       }
 
-       catch (const std::exception& )
 
-       {
 
-         // Ok, looks like it is not what we want.
 
-         _isMetaDataFile = false;
 
-       }
 
-       if (_isMetaDataFile && !pidToOCD.isEmpty())
 
-       {
 
-         // We got some OCDs now.
 
-         QHash<QString, ctkObjectClassDefinitionImplPtr>::ConstIterator end(pidToOCD.end());
 
-         for (QHash<QString, ctkObjectClassDefinitionImplPtr>::ConstIterator it(pidToOCD.begin()); it != end; ++it)
 
-         {
 
-           QString pid = it.key();
 
-           ctkObjectClassDefinitionImplPtr ocd = it.value();
 
-           if (ocd->getType() == ctkObjectClassDefinitionImpl::PID)
 
-           {
 
-             isThereMetaHere = true;
 
-             _allPidOCDs.insert(pid, ocd);
 
-           }
 
-           else
 
-           {
 
-             isThereMetaHere = true;
 
-             _allFPidOCDs.insert(pid, ocd);
 
-           }
 
-         } // End of for
 
-       }
 
-     } // End of if(!resourceContent.isEmpty())
 
-   } // End of foreach
 
-   return isThereMetaHere;
 
- }
 
- QList<QLocale> ctkMetaTypeProviderImpl::checkForDefault(const QList<QLocale>& locales) const
 
- {
 
-   if (locales.isEmpty() || (locales.size() == 1 && QLocale() == locales[0]))
 
-     return QList<QLocale>();
 
-   return locales;
 
- }
 
 
  |