]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #356: plugins dependency mechanism implemented
authorsbh <sergey.belash@opencascade.com>
Thu, 15 Jan 2015 15:51:07 +0000 (18:51 +0300)
committersbh <sergey.belash@opencascade.com>
Thu, 15 Jan 2015 15:51:07 +0000 (18:51 +0300)
CMakeLists.txt
src/Config/Config_Keywords.h
src/Config/Config_ModuleReader.cpp
src/Config/Config_ModuleReader.h
src/Config/plugins.xml
src/NewGeom/NewGeom_Module.cpp
src/NewGeom/NewGeom_Module.h

index 468e790f4832237b40df49db1b959a42eda4a966..0ce69fcb8f4acc7b6bf8c92b7baabd728a07f1dd 100644 (file)
@@ -60,11 +60,11 @@ ADD_SUBDIRECTORY (src/XGUI)
 ADD_SUBDIRECTORY (src/GeomApp)
 ADD_SUBDIRECTORY (src/ExchangePlugin)
 ADD_SUBDIRECTORY (src/GeomValidators)
-ADD_SUBDIRECTORY (src/ConnectorPlugin)
 
 
 IF(${HAVE_SALOME})
        ADD_SUBDIRECTORY (src/NewGeom)
+    ADD_SUBDIRECTORY (src/ConnectorPlugin)
 ENDIF(${HAVE_SALOME})
 
 ENABLE_TESTING()
index 9fe94e769dc6cbd07a3c6da72937277dcafa1c6f..a00d770804a3ad5b1d62cb454c457a1e4d7ffc63 100644 (file)
@@ -84,7 +84,7 @@ const static char* PLUGINS_MODULE = "module";
 const static char* PLUGIN_CONFIG = "configuration";
 const static char* PLUGIN_LIBRARY = "library";
 const static char* PLUGIN_SCRIPT = "script";
-const static char* PLUGIN_PLATFORM = "platform";
+const static char* PLUGIN_DEPENDENCY = "dependency";
 
 const static char* PLUGIN_PLATFORM_SALOME = "salome";
 const static char* PLUGIN_PLATFORM_NEWGEOM = "openparts";
index 526b9965f51aebc1b97b482991fa5d2a1fa2da66..0b0245c5ad926af7399c7785dd04ed6f654bd65d 100644 (file)
 #endif
 
 std::map<std::string, Config_ModuleReader::PluginType> Config_ModuleReader::myPluginTypes;
+std::set<std::string> Config_ModuleReader::myDependencyModules;
 
 Config_ModuleReader::Config_ModuleReader(const char* theEventGenerated)
     : Config_XMLReader(PLUGIN_FILE),
       myEventGenerated(theEventGenerated)
 {
-  myHaveSalome = false;
-  char* anEnv = getenv("SALOME_ROOT_DIR");
-  std::string value = normalize(anEnv);
-  if (!value.empty()) {
-    myHaveSalome = true;
-  }
-
 }
 
 Config_ModuleReader::~Config_ModuleReader()
@@ -70,8 +64,7 @@ std::string Config_ModuleReader::getModuleName()
 void Config_ModuleReader::processNode(xmlNodePtr theNode)
 {
   if (isNode(theNode, NODE_PLUGIN, NULL)) {
-    bool isAvailable = isAvaliableOnThisPlatform(getProperty(theNode, PLUGIN_PLATFORM));
-    if (!isAvailable)
+    if (!hasRequiredModules(theNode))
       return;
     std::string aPluginConf = getProperty(theNode, PLUGIN_CONFIG);
     std::string aPluginLibrary = getProperty(theNode, PLUGIN_LIBRARY);
@@ -91,6 +84,18 @@ bool Config_ModuleReader::processChildren(xmlNodePtr theNode)
   return isNode(theNode, NODE_PLUGINS, NULL);
 }
 
+bool Config_ModuleReader::hasRequiredModules(xmlNodePtr theNode) const
+{
+  std::string aRequiredModule = normalize(getProperty(theNode, PLUGIN_DEPENDENCY));
+  if(aRequiredModule.empty())
+    return true;
+  std::set<std::string>::iterator it = myDependencyModules.begin();
+  for ( ; it != myDependencyModules.end(); it++ ) {
+    if (*it == aRequiredModule) return true;
+  }
+  return false;
+}
+
 std::list<std::string> Config_ModuleReader::importPlugin(const std::string& thePluginLibrary,
                                                          const std::string& thePluginXmlConf)
 {
@@ -124,11 +129,11 @@ std::string Config_ModuleReader::addPlugin(const std::string& aPluginLibrary,
   if(!aPluginName.empty()) {
     myPluginTypes[aPluginName] = aType;
   }
-
+  addDependencyModule(aPluginName);
   return aPluginName;
 }
 
-void Config_ModuleReader::loadPlugin(const std::string thePluginName)
+void Config_ModuleReader::loadPlugin(const std::string& thePluginName)
 {
   PluginType aType = Config_ModuleReader::Binary;
   if(myPluginTypes.find(thePluginName) != myPluginTypes.end()) {
@@ -146,30 +151,7 @@ void Config_ModuleReader::loadPlugin(const std::string thePluginName)
   }
 }
 
-bool Config_ModuleReader::isAvaliableOnThisPlatform(const std::string& thePluginPlatform)
-{
-  bool result = true;
-  PluginPlatform aPlatform = All;
-  std::string aPlatformName = normalize(thePluginPlatform) ;
-  if (aPlatformName == PLUGIN_PLATFORM_SALOME) {
-    aPlatform = Salome;
-  } else if (aPlatformName == PLUGIN_PLATFORM_NEWGEOM) {
-    aPlatform = OpenParts;
-  } else if (!thePluginPlatform.empty()) {
-    Events_Error::send("Unknown platform: " + thePluginPlatform);
-  }
-  if (aPlatform == All) {
-    result = true;
-  } else if (myHaveSalome) {
-    result = aPlatform == Salome;
-  } else {
-    result = aPlatform == OpenParts;
-  }
-  return result;
-
-}
-
-void Config_ModuleReader::loadScript(const std::string theFileName)
+void Config_ModuleReader::loadScript(const std::string& theFileName)
 {
   /* aquire python thread */
   PyGILState_STATE gstate = PyGILState_Ensure();
@@ -199,7 +181,7 @@ void Config_ModuleReader::loadScript(const std::string theFileName)
   PyGILState_Release(gstate);
 }
 
-void Config_ModuleReader::loadLibrary(const std::string theLibName)
+void Config_ModuleReader::loadLibrary(const std::string& theLibName)
 {
   std::string aFileName = library(theLibName);
   if (aFileName.empty())
@@ -219,3 +201,8 @@ void Config_ModuleReader::loadLibrary(const std::string theLibName)
   }
 }
 
+void Config_ModuleReader::addDependencyModule(const std::string& theModuleName)
+{
+  myDependencyModules.insert(normalize(theModuleName));
+}
+
index c32eb37d96f566b537068a45f614dbef66e513e9..cdfae0a43f46eaa6e8e2310a3c25a728708febbb 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <map>
 #include <list>
+#include <set>
 #include <string>
 
 class Config_ModuleReader : public Config_XMLReader
@@ -24,11 +25,6 @@ class Config_ModuleReader : public Config_XMLReader
     Intrenal = 1,
     Python = 2
   };
-  enum PluginPlatform {
-    All = 0,
-    OpenParts = 1,
-    Salome = 2
-  };
 
  public:
   CONFIG_EXPORT Config_ModuleReader(const char* theEventGenerated = 0);
@@ -38,17 +34,20 @@ class Config_ModuleReader : public Config_XMLReader
 
   CONFIG_EXPORT std::string getModuleName();
 
-  CONFIG_EXPORT static void loadPlugin(const std::string thePluginName);
+  CONFIG_EXPORT static void loadPlugin(const std::string& thePluginName);
   /// loads the library with specific name, appends "lib*.dll" or "*.so" depending on the platform
-  CONFIG_EXPORT static void loadLibrary(const std::string theLibName);
+  CONFIG_EXPORT static void loadLibrary(const std::string& theLibName);
   /// loads the python module with specified name
-  CONFIG_EXPORT static void loadScript(const std::string theFileName);
+  CONFIG_EXPORT static void loadScript(const std::string& theFileName);
+  // extends set of modules, which will be used for dependency 
+  // checking (if there is no required module in the set, a plugin will not be loaded)
+  CONFIG_EXPORT static void addDependencyModule(const std::string& theModuleName);
 
  protected:
   void processNode(xmlNodePtr aNode);
   bool processChildren(xmlNodePtr aNode);
 
-  bool isAvaliableOnThisPlatform(const std::string& thePluginPlatform);
+  bool hasRequiredModules(xmlNodePtr aNode) const;
   std::list<std::string> importPlugin(const std::string& thePluginLibrary,
                                       const std::string& thePluginFile);
   std::string addPlugin(const std::string& aPluginLibrary,
@@ -58,9 +57,8 @@ class Config_ModuleReader : public Config_XMLReader
  private:
   std::map<std::string, std::string> myFeaturesInFiles;
   static std::map<std::string, PluginType> myPluginTypes;
+  static std::set<std::string> myDependencyModules;
   const char* myEventGenerated;
-  bool myHaveSalome;
-
 };
 
 #endif /* CONFIG_XMLMODULEREADER_H_ */
index 0f4a255863c57a284c85359a9f0025f3b850b54f..e8d43ed022a5ef39b45c1d4462b06fd55edf69db 100644 (file)
@@ -6,7 +6,7 @@
   <plugin library="ConstructionPlugin" configuration="plugin-Construction.xml"/>
   <plugin library="FeaturesPlugin" configuration="plugin-Features.xml"/>
   <plugin library="ExchangePlugin" configuration="plugin-Exchange.xml"/>
-  <plugin script="ConnectorPlugin" configuration="plugin-Connector.xml" platform="Salome"/>
+  <plugin script="ConnectorPlugin" configuration="plugin-Connector.xml" dependency="Geometry"/>
   <plugin library="SketchSolver"/>
   <plugin library="GeomValidators"/>
   <plugin library="DFBrowser" internal="true"/>
index c9d875f1373ed6781255f440c61e6cfbdc2e6a38..96929555506646e0cfe7a76af28ae7985c1b489b 100644 (file)
@@ -30,6 +30,7 @@
 #include <QtxResourceMgr.h>
 
 #include <Config_PropManager.h>
+#include <Config_ModuleReader.h>
 
 #include <QDockWidget>
 #include <QAction>
@@ -102,6 +103,7 @@ NewGeom_Module::~NewGeom_Module()
 void NewGeom_Module::initialize(CAM_Application* theApp)
 {
   LightApp_Module::initialize(theApp);
+  inspectSalomeModules();
 
   myWorkshop->startApplication();
   LightApp_Application* anApp = dynamic_cast<LightApp_Application*>(theApp);
@@ -452,3 +454,12 @@ void NewGeom_Module::preferencesChanged(const QString& theSection, const QString
   aProp->setValue(aValue);
 
 }
+
+void NewGeom_Module::inspectSalomeModules()
+{
+  QStringList aModuleNames;
+  getApp()->modules(aModuleNames, false);
+  foreach(QString eachModule, aModuleNames) {
+    Config_ModuleReader::addDependencyModule(eachModule.toStdString());
+  }
+}
index 800d6b168957f26eaf83e805436f6a82598d469d..83719845e9498086f1905a9b8718cd91976f8328 100644 (file)
@@ -92,6 +92,8 @@ Q_OBJECT
 
   void setIsOpened(bool theOpened) { myIsOpened = theOpened; }
 
+  void inspectSalomeModules();
+
  public slots:
   virtual bool activateModule(SUIT_Study* theStudy);
   virtual bool deactivateModule(SUIT_Study* theStudy);