]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkFactory.cxx
#2536 BBTK Feature New Normal - wt-version Package
[bbtk.git] / kernel / src / bbtkFactory.cxx
index 6b4079344912f2c976bba2e3e209c044990f6d7e..d541db35b9203e89b984a63daa7c2dd1a7760eb5 100644 (file)
@@ -1,22 +1,40 @@
-/*=========================================================================
-                                                                                
-Program:   bbtk
-Module:    $RCSfile: bbtkFactory.cxx,v $
-Language:  C++
+/*
+ # ---------------------------------------------------------------------
+ #
+ # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+ #                        pour la SantÈ)
+ # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+ # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+ # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+ #
+ #  This software is governed by the CeCILL-B license under French law and
+ #  abiding by the rules of distribution of free software. You can  use,
+ #  modify and/ or redistribute the software under the terms of the CeCILL-B
+ #  license as circulated by CEA, CNRS and INRIA at the following URL
+ #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ #  or in the file LICENSE.txt.
+ #
+ #  As a counterpart to the access to the source code and  rights to copy,
+ #  modify and redistribute granted by the license, users are provided only
+ #  with a limited warranty  and the software's author,  the holder of the
+ #  economic rights,  and the successive licensors  have only  limited
+ #  liability.
+ #
+ #  The fact that you are presently reading this means that you have had
+ #  knowledge of the CeCILL-B license and that you accept its terms.
+ # ------------------------------------------------------------------------ */
 
-Date:      $Date: 2008/03/11 12:27:21 $
-Version:   $Revision: 1.30 $
-                                                                                
 
-Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
-l'Image). All rights reserved. See doc/license.txt or
-http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
+/*=========================================================================
+  Program:   bbtk
+  Module:    $RCSfile: bbtkFactory.cxx,v $
+  Language:  C++
+  Date:      $Date: 2012/11/16 08:49:01 $
+  Version:   $Revision: 1.55 $
+=========================================================================*/
 
-This software is distributed WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE.  See the above copyright notices for more information.
+                                                                       
 
-=========================================================================*/
 /**
  *\file
  *\brief  Class bbtk::Factory : can load and unload dynamic libraries containing 
@@ -28,6 +46,7 @@ PURPOSE.  See the above copyright notices for more information.
 #include "bbtkConnection.h"
 #include "bbtkConfigurationFile.h"
 #include "bbtkUtilities.h"
+#include "bbtkConfigurationFile.h"
 
 #include <sys/stat.h> // for struct stat stFileInfo
 
@@ -37,19 +56,26 @@ PURPOSE.  See the above copyright notices for more information.
 
 #include <cctype>    // std::toupper
 
+#include <time.h>
 
 namespace bbtk
 {
-  typedef Package* (*PackageAccessor)();
-  typedef void (*PackageDeleteFunction)();
 
+  //===================================================================
+  /// Default ctor
+  Factory::Pointer Factory::New()
+  {
+    bbtkDebugMessage("kernel",9,"Factory::New()"<<std::endl);
+    return MakePointer(new Factory());
+  }
+  //===================================================================
 
   //===================================================================
   /// Default ctor
   Factory::Factory()
-    : mExecuter(0)
+    : mExecuter()
   {
-    bbtkDebugMessage("Kernel",7,"Factory::Factory()"<<std::endl);
+    bbtkDebugMessage("kernel",7,"Factory()"<<std::endl);
   }
   //===================================================================
 
@@ -57,40 +83,20 @@ namespace bbtk
   /// Dtor
   Factory::~Factory()
   {
-    bbtkDebugMessageInc("Kernel",7,"Factory::~Factory()"<<std::endl);
+    bbtkDebugMessage("kernel",7,"==> ~Factory()"<<std::endl);
     CloseAllPackages();
-    bbtkDebugDecTab("Kernel",7);
+    bbtkDebugMessage("kernel",7,"<== ~Factory()"<<std::endl);
   }
   //===================================================================
 
 
-  //===================================================================
-  void Factory::CloseAllPackages()
-  {
-    bbtkDebugMessageInc("Kernel",7,"Factory::CloseAllPackages()"<<std::endl);
-    while (mPackageMap.begin() != mPackageMap.end())
-      {
-        PackageMapType::iterator i = mPackageMap.begin();
-        ClosePackage(i);
-      }
-    bbtkDebugDecTab("Kernel",7);
-  }
-  //===================================================================
 
   //===================================================================
   void Factory::Reset()
   {
-    /*
-printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
-printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
-printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
-printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
-printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
-printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
-    */
-    bbtkDebugMessageInc("Kernel",7,"Factory::Reset()"<<std::endl);
+    bbtkDebugMessage("kernel",7,"==> Factory::Reset()"<<std::endl);
     CloseAllPackages();
-    bbtkDebugDecTab("Kernel",7);
+    bbtkDebugMessage("kernel",7,"<== Factory::Reset()"<<std::endl);
   }
   //===================================================================
 
@@ -101,144 +107,26 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
                               std::string path)
   {
     
-#if defined(__GNUC__)
-    
-    void *handler;
-    handler = dlopen(libname.c_str(),
-                    BBTK_RTLD_TIME | BBTK_RTLD_SCOPE );
-    if (!handler)
-      {
-        // The following is *NOT* a debug time message :
-        // It's a user intended message.
-        // Please don't remove it.
-       bbtkError("Could not open shared library [" <<libname<<"] : "
-                 <<dlerror() << std::endl);
-       
-       return false; // try next path
-      }
-    
-    // The following is *NOT* a debug time message :
-    // It's a user intended message.
-    // Please don't remove it.
-    bbtkMessage("Output",2,"   -->[" <<libname<<"] found" << std::endl);
-    
-    // Loads the Package accessor
-    
-    std::string getpackname(pkgname);
-    getpackname += "GetPackage";
-    void *getpack = dlsym(handler, getpackname.c_str());
-    if (!getpack)
-      {
-       dlclose(handler);
-       bbtkError("Shared library ["<<libname<<"] is not a valid bbtk package."
-                 <<" Symbol ["<<getpackname<<"] :"<<dlerror());
-      }
-    
-    // Verifies that the Package delete function is present
-    std::string delfname(pkgname);
-    delfname += "DeletePackage";
-    void *delf = dlsym(handler, delfname.c_str());
-    if (!delf)
-      {
-       dlclose(handler);
-       bbtkError("Shared library ["<<libname<<"] is not a valid bbtk package."
-                 <<" Symbol ["<<delfname<<"] :"<<dlerror());
-      }
-    
-#elif defined(_WIN32)
-    
-    HINSTANCE handler;
-    
-    SetErrorMode(0);
-    handler = LoadLibrary(libname.c_str());
-    if (!handler)
+    Package::Pointer p = Package::CreateFromDynamicLibrary(libname,
+                                                          pkgname,
+                                                          path);
+    if (p!=0)
       {
-       // The following is *NOT* a debug time message :
-       // It's a user intended message.
-       // Please don't remove it.
-       bbtkError("Error loading library [" <<libname<<"]" << std::endl);
-       return false;// Problem with the found library
+       //===================================================================
+       bbtkMessage("output",2,p->GetName()<<" "
+                   <<p->GetVersion()
+                   <<" "
+                   <<p->GetAuthor() << " Category(s) :"
+                   <<p->GetCategory()
+                   <<std::endl);
+       bbtkMessage("output",2,p->GetDescription()<<std::endl);
+       //===================================================================
+       p->AddFactory(GetThisPointer<Factory>());
+       mPackageMap[pkgname] = p;
+       return true;
       }
+    return false;
     
-    bbtkMessage("Output",2,"   --->[" <<libname<<"] found" << std::endl);
-    
-    // Loads the Package accessor
-    
-    std::string getpackname(pkgname);
-    getpackname += "GetPackage";
-    void *getpack = GetProcAddress(handler, getpackname.c_str());
-    if (!getpack)
-      {
-       FreeLibrary(handler);
-       bbtkError("[1] Could not load package \""<<pkgname
-                 <<"\" : "<<getpackname<<" symbol not found (is it a bbtk package lib ?)");
-       // look how to get the error message on win
-       //<<dlerror());
-      }
-    // Verifies that the Package delete function is present
-    std::string delfname(pkgname);
-    delfname += "DeletePackage";
-    void *delf = GetProcAddress(handler, delfname.c_str());
-    if (!delf)
-      {
-       FreeLibrary(handler);
-       bbtkError("[2] Could not load package \""<<pkgname
-                 <<"\" : "<<delfname<<" symbol not found (is it a bbtk package lib ?)");
-       // look how to get the error message on win
-       //<<dlerror());
-      }
-#else
-    bbtkError("neither __GNUC__ nor _WIN32 ?!? How did you compile ?");
-#endif
-    
-    // Stores the package
-    PackageInfoType pack;
-    pack.mDynamicLibraryHandler = handler;
-    // Invokes the accessor to the PackageUnit pointer
-    pack.mPackage = ((PackageAccessor)getpack)();
-    
-    // Test bbtk build version ok
-    if ( pack.mPackage->GetBBTKVersion() != bbtk::GetVersion() )
-      {
-       std::string v(pack.mPackage->GetBBTKVersion());
-       UnLoadPackage(pkgname);
-       bbtkError("Cannot load package ["<<libname<<"]. "
-                 <<"Package build with bbtk version "
-                 << v
-                 << " whereas application build with version "
-                 << bbtk::GetVersion());
-      }
-
-    pack.mPackage->AddFactory(this);
-    mPackageMap[pkgname] = pack;
-    
-    std::string separator =
-      ConfigurationFile::GetInstance().Get_file_separator ();
-    //BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH)
-    std::string docreldoc = 
-      separator + "bbdoc" + separator + pkgname + separator + "index.html";
-    std::string reldoc = 
-      ".." + separator + ".." + docreldoc;
-    std::string doc = path + separator + ".." + separator
-      + BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH)
-      + docreldoc;
-    
-    pack.mPackage->SetDocURL(doc);
-    pack.mPackage->SetDocRelativeURL(reldoc);
-    
-    //===================================================================
-    bbtkMessage("Output",2,pack.mPackage->GetName()<<" "
-               <<pack.mPackage->GetVersion()
-               <<" (bbtk "
-               <<pack.mPackage->GetBBTKVersion()<<") "
-               <<pack.mPackage->GetAuthor() << " Category(s) :"
-               <<pack.mPackage->GetCategory()
-               <<std::endl);
-    bbtkMessage("Output",2,pack.mPackage->GetDescription()<<std::endl);
-    //===================================================================
-    
-    bbtkDebugDecTab("Kernel",7);
-    return true;
   }
   
   //===================================================================
@@ -259,6 +147,8 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
   
   void Factory::LoadPackage( const std::string& name )
   {
+         
+         
   // Note : in the following :
   // name : the user supplied name
   //      - abreviated name    e.g.       pkg   pkg.so   libbpkg   libbbpkg.so
@@ -267,151 +157,168 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
   //          same for Windows, with      c:, d: ...
   //
   // lastname : string before the last / (if any), or user supplied name
+         
+        
+         
+       if(name != ""){
+               bbtkDebugMessageInc("kernel",7,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);
+               bbtkMessage("debug",1,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);
+
+               std::vector<std::string> package_paths;
+               std::string libname;  // full path library name
+               std::string pkgname;  // e.g. libbb<pkgname>.so
+
+               std::string upath;
+
+               pkgname = Utilities::ExtractPackageName(name,upath);
+                               
+               bbtkMessage("debug",1,"Package name ["<<pkgname<<"]"<<std::endl);
+               bbtkMessage("debug",1,"Package path ["<<upath<<"]"<<std::endl);
+
+               // no loading package if already loaded
+               PackageMapType::iterator iUnload;
+               iUnload = mPackageMap.find(pkgname);
+
+//EED Debuging message
+//     std::cout << "EED Factory::LoadPackage " <<  std::endl;
+//             PackageMapType::iterator it;
+//             for ( it=mPackageMap.begin() ; it != mPackageMap.end(); it++ )
+//                     std::cout << (*it).first << " ";
+//             std::cout << std::endl;
+
+               
+               if (iUnload != mPackageMap.end())
+               {
+                 bbtkMessage("output",2,"["<< pkgname <<"] already loaded" << std::endl);
+                 return;
+               }
+
+       // =================================================
+       // The following structure was checked to work
+       // with any type of relative/absolute path.
+       // Please don't modify it without checking
+       // *all* the cases. JP
+       //==================================================
+
+               bool ok = false;
+               bool foundFile = false;
+
+               // If path provided by user will be the first scanned :
+               // push it into vector of paths
+               if (upath.length()>0)   // ------------------------------------- check user supplied location
+               {
+                  if (name[0] != '.' && name[0] != '/' && name[1]!= ':')
+                  {
+                         bbtkError("Use absolute or relative path name! ["<<name<<"] is an illegal name");
+                         return;
+                  }
+
+                 // std::string path = Utilities::ExpandLibName(upath, false);
+
+                  std::string path = Utilities::ExpandLibName(name,false); // keep last item, here.
+                  if (path != "")
+                  {
+                         std::string p2;
+                         Utilities::ExtractPackageName(path,p2);
+                         //libname = Utilities::MakeLibnameFromPath(path, pkgname);
+                         libname = Utilities::MakeLibnameFromPath(p2, pkgname); // remove last item
+                         // Check if library exists
+                         if ( !Utilities::FileExists(libname) )
+                         {
+                         // The following is *NOT* a debug time message :
+                         // It's a user intended message.
+                         // Please don't remove it.
+                       bbtkMessage("output",3,"   [" <<libname 
+                               <<"] : doesn't exist" <<std::endl);
+                         }
+                         else
+                         {
+                                ok = DoLoadPackage( libname, pkgname, path);         
+                         }
+                  }
+                  else
+                  {
+                         bbtkError("Path ["<<upath<<"] doesn't exist");
+                         return;
+                  }
+               }
+               else     // ----------------------------------------------------- iterate on the paths  
+               {
+
+               std::string path = ".";
+               package_paths = ConfigurationFile::GetInstance().Get_package_paths();
+               std::vector<std::string>::iterator i;
+               for (i=package_paths.begin();i!=package_paths.end();++i)
+               {
+                       foundFile = false;
+                       path = *i;
+//std::cout<<"JCP bbtkFactory.cxx void Factory::LoadPackage = path "<<path<<std::endl;
+                       // we *really* want '.' to be the current working directory
+                       if (path == ".")
+                       {
+                         char buf[2048]; // for getcwd
+                         char * currentDir = getcwd(buf, 2048);
+                         std::string cwd(currentDir);
+//std::cout<<"JCP  bbtkFactory.cxx void Factory::LoadPackage = currentDir "<<currentDir<<std::endl;
+                         path = currentDir;
+                       }
+//std::cout<<"JCP bbtkFactory.cxx void Factory::LoadPackage = path "<<path<<" pkgnam="<<pkgname<<std::endl;             
+                       libname = Utilities::MakeLibnameFromPath(path, pkgname);
+
+                       bbtkMessage("debug",2,"-> Trying to load [" << libname << "]" <<std::endl);
+
+                 // Check if library exists           
+                       if ( !Utilities::FileExists(libname) )
+                       {
+                       // The following is *NOT* a debug time message :
+                       // It's a user intended message.
+                       // Please don't remove it.
+                         bbtkMessage("output",3,
+                                 "   [" <<libname <<"] : doesn't exist" <<std::endl);
+                          continue;  // try next path
+                       }
+                       foundFile = true; 
+
+                 // Try to Load the library
+
+                       ok = DoLoadPackage( libname, pkgname, path);
+                       if (ok)
+                       {
+                          bbtkMessage("debug",2,"   OK"<<std::endl);
+                       }
+               break; // we stop iterating even if error : have to signal it to user
+               } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
+
+       }
+
+               if( !ok )  // nothing was loaded
+               {
+                 if (!foundFile)
+                 {
+                       bbtkError("Could not find package ["<<pkgname<< "]");
+                 }
+                 else
+                 {
+       #if defined(__GNUC__)
+                       bbtkError("Could not load package ["<< pkgname
+                                         <<"] :" << std::endl 
+                         << "  Opening "<<libname<<" failed"
+                         << "  Reason: "<< dlerror());
+       #elif defined(_WIN32)
+                       bbtkError("Could not load package ["<<pkgname
+                         <<"] :"<< std::endl << "   Error loading " <<libname);
+
+               // look how to get the error message on win
+               //<<dlerror());
+               // it is the bordel !! (the bloody fucking bordel, you mean?)
+               // look : http://msdn2.microsoft.com/en-us/library/ms680582.aspx
+       #endif
+                 }
+               }       
+               bbtkMessage("output",2,"[" << libname << "] loaded" << std::endl);
+       }
 
-    bbtkDebugMessageInc("Kernel",7,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);
-    bbtkMessage("Debug",1,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);
-
-    std::vector<std::string> package_paths;
-    std::string libname;  // full path library name
-    std::string pkgname;  // e.g. libbb<pkgname>.so
-
-    std::string upath;
-    pkgname = Utilities::ExtractPackageName(name,upath);
-
-    bbtkMessage("Debug",1,"Package name ["<<pkgname<<"]"<<std::endl);
-    bbtkMessage("Debug",1,"Package path ["<<upath<<"]"<<std::endl);
-
-    // no loading package if already loaded
-    PackageMapType::iterator iUnload;
-    iUnload = mPackageMap.find(pkgname);
-    if (iUnload != mPackageMap.end())
-    {
-      bbtkMessage("Output",2,"["<< pkgname <<"] already loaded" << std::endl);
-      return;
-    }
-
-// =================================================
-// The following structure was checked to work
-// with any type of relative/absolute path.
-// Please don't modify it without checking
-// *all* the cases. JP
-//==================================================
-
-//std::cout << "upath [" << upath << "]" << std::endl;
-
-    bool ok = false;
-    bool foundFile = false;
-
-    // If path provided by user will be the first scanned :
-    // push it into vector of paths
-    if (upath.length()>0)   // ------------------------------------- check user supplied location
-    {
-       if (name[0] != '.' && name[0] != '/' && name[1]!= ':')
-       {
-          bbtkError("Use absolute or relative path name! ["<<name<<"] is an illegal name");
-          return;
-       }
-
-      // std::string path = Utilities::ExpandLibName(upath, false);
-       std::string path = Utilities::ExpandLibName(name,false); // keep last item, here.
-         
-       if (path != "")
-       {
-          std::string p2;
-          Utilities::ExtractPackageName(path,p2);
-          //libname = Utilities::MakeLibnameFromPath(path, pkgname);
-          libname = Utilities::MakeLibnameFromPath(p2, pkgname); // remove last item
-          // Check if library exists
-          if ( !Utilities::FileExists(libname) )
-          {
-          // The following is *NOT* a debug time message :
-          // It's a user intended message.
-          // Please don't remove it.
-           bbtkMessage("Output",3,"   [" <<libname 
-                       <<"] : doesn't exist" <<std::endl);
-          }
-          else
-          {
-             ok = DoLoadPackage( libname, pkgname, path);         
-          }
-       }
-       else
-       {
-          bbtkError("Path ["<<upath<<"] doesn't exist");
-          return;
-       }
-    }
-    else     // ----------------------------------------------------- iterate on the paths  
-    {
-
-    std::string path;
-    package_paths = ConfigurationFile::GetInstance().Get_package_paths();
-    std::vector<std::string>::iterator i;
-    for (i=package_paths.begin();i!=package_paths.end();++i)
-    {
-        foundFile = false;
-        path = *i;
-
-        // we *really* want '.' to be the current working directory
-        if (path == ".")
-        {
-          char buf[2048]; // for getcwd
-          char * currentDir = getcwd(buf, 2048);
-          std::string cwd(currentDir);
-          path = currentDir;
-        }
-
-        libname = Utilities::MakeLibnameFromPath(path, pkgname);
-
-        bbtkMessage("Debug",2,"-> Trying to load [" << libname << "]" <<std::endl);
-
-      // Check if library exists           
-        if ( !Utilities::FileExists(libname) )
-        {
-        // The following is *NOT* a debug time message :
-        // It's a user intended message.
-        // Please don't remove it.
-          bbtkMessage("Output",3,
-                     "   [" <<libname <<"] : doesn't exist" <<std::endl);
-           continue;  // try next path
-        }
-        foundFile = true; 
-
-      // Try to Load the library
-
-        ok = DoLoadPackage( libname, pkgname, path);
-        if (ok)
-        {
-           bbtkMessage("Debug",2,"   OK"<<std::endl);
-           break; // a package was found; we stop iterating
-        }
-    } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
-
-}
-
-    if( !ok )  // nothing was loaded
-    {
-      if (!foundFile)
-      {
-        bbtkError("Could not find package ["<<pkgname<< "]");
-      }
-      else
-      {
-#if defined(__GNUC__)
-        bbtkError("Could not load package ["<< pkgname
-                  <<"] :" << std::endl << "   " << dlerror());
-#elif defined(_WIN32)
-        bbtkError("Could not load package ["<<pkgname
-                 <<"] : " << std::endl << "   " <<libname<<" not found");
-
-    // look how to get the error message on win
-    //<<dlerror());
-    // it is the bordel !! (the bloody fucking bordel, you mean?)
-    // look : http://msdn2.microsoft.com/en-us/library/ms680582.aspx
-#endif
-      }
-    }
-    bbtkMessage("Output",2,"[" << libname << "] loaded" << std::endl);
+    
 
   }
 
@@ -422,7 +329,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
   /// If the entry is found in the map, calls ClosePackage
  void Factory::UnLoadPackage( const std::string& name )
  {
-    bbtkDebugMessageInc("Kernel",7,"Factory::UnLoadPackage(\""
+    bbtkDebugMessageInc("kernel",7,"Factory::UnLoadPackage(\""
                        <<name<<"\")"<<std::endl);
   
     PackageMapType::iterator i;
@@ -433,11 +340,44 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
                 <<"\" : package not loaded !");
     }
     ClosePackage(i);
-    bbtkDebugDecTab("Kernel",7);
+    bbtkDebugDecTab("kernel",7);
   }
   //===================================================================
 
 
+  //===================================================================
+  void Factory::CloseAllPackages()
+  {
+    bbtkDebugMessageInc("kernel",7,"Factory::CloseAllPackages()"<<std::endl);
+    
+    std::vector< Package::WeakPointer > mAlive;  
+    do {
+      mAlive.clear();  
+      while (mPackageMap.begin() != mPackageMap.end())
+       {
+         PackageMapType::iterator i = mPackageMap.begin();
+         Package::WeakPointer p = i->second;
+         ClosePackage(i);
+         if (p.lock()) mAlive.push_back(p);
+       }
+      std::vector< Package::WeakPointer >::iterator i;
+      for (i=mAlive.begin();i!=mAlive.end();++i)
+       {
+         // If not dead : reinsert
+         if (i->lock())
+           {
+             bbtkDebugMessage("kernel",7,"Package "<<i->lock()->GetName()
+                              <<" still alive"<<std::endl);
+             // InsertPackage(i->lock());
+           }
+       }      
+    }
+    while (mPackageMap.size()>0);
+
+    bbtkDebugDecTab("kernel",7);
+  }
+  //===================================================================
+
   //===================================================================
   /// \brief Close the package referenced by the iterator 
  ///
@@ -452,162 +392,115 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
  /// Finally erases the package entry in the packages map
  void Factory::ClosePackage(PackageMapType::iterator& i) 
   {   
-     bbtkDebugMessageInc("Kernel",7,"Factory::ClosePackage(\""
-                         <<i->second.mPackage->GetName()
+     bbtkDebugMessageInc("kernel",7,"Factory::ClosePackage(\""
+                         <<i->second->GetName()
                         <<"\")"<<std::endl);
 
      
      // Removes this from the set of factories which use the package
-     i->second.mPackage->RemoveFactory(this);
-     
-     // If no more factory which use it 
-     if (i->second.mPackage->GetFactorySet().empty())
+     i->second->RemoveFactory(GetThisPointer<Factory>());
+     Package::WeakPointer p = i->second;
+     // remove the entry in the map
+     mPackageMap.erase(i);
+     // Release the package if not already destroyed
+     if (p.lock()) 
        {
-        // If it is a dynamically loaded package       
-        if (i->second.mDynamicLibraryHandler) 
-          {
-            
-            
-            // Loads the Package delete function
-            
-            std::string delfname(i->second.mPackage->GetName());
-            delfname += "DeletePackage";
-#if defined(__GNUC__)     
-            void *delf = dlsym(i->second.mDynamicLibraryHandler, delfname.c_str());
-            if (!delf)
-              {
-                bbtkError("could not close package \""
-                          <<i->second.mPackage->GetName()
-                          <<"\" :"<<dlerror());
-              }    
-#elif defined(_WIN32)
-            void *delf = GetProcAddress(i->second.mDynamicLibraryHandler, 
-                                        delfname.c_str());
-            if (!delf)
-              {  
-                bbtkError("could not close package \""
-                          <<i->second.mPackage->GetName()
-                          <<"\" : "<<delfname
-                          <<" symbol not found (how did you open it ???");
-                //<<"\" :"<<dlerror());
-              }    
-#endif     
-            
-            // deletes the package
-            ((PackageDeleteFunction)delf)();
-            
-            // closes the dl handler
-#if defined(__GNUC__)  
-            dlclose(i->second.mDynamicLibraryHandler);  
-#elif defined(_WIN32)
-            
-            FreeLibrary(i->second.mDynamicLibraryHandler);
-#endif
-          }
-
-        else 
-          {  
-            // If it is a manually inserted package : delete it normally
-            delete i->second.mPackage;
-          }
+        Package::Release(p);
        }
-     
-     // in any cases remove the entry in the map
-     mPackageMap.erase(i);
-
-     bbtkDebugDecTab("Kernel",7);
+     bbtkDebugDecTab("kernel",7);
   }
   //===================================================================
   
 
 
   //===================================================================  
-  /// Displays the list of packages loaded
-  void Factory::PrintPackages(bool details, bool adaptors) const
+  void Factory::PrintHelpListPackages(bool details, bool adaptors) const
   {
-    bbtkDebugMessageInc("Kernel",9,"Factory::PrintPackages"<<std::endl);
+    bbtkDebugMessageInc("kernel",9,"Factory::PrintPackages"<<std::endl);
 
     PackageMapType::const_iterator i;
     for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
     {
-      bbtkMessage("Help",1, i->first << std::endl);
+      bbtkMessage("help",1, i->first << std::endl);
       if (details) {
-         i->second.mPackage->PrintBlackBoxes(false,adaptors);
+         i->second->PrintHelpListDescriptors(false,adaptors);
       }
     }
 
-    bbtkDebugDecTab("Kernel",9);
+    bbtkDebugDecTab("kernel",9);
   }
   //===================================================================
 
   //===================================================================  
   /// Displays help on a package
-  void Factory::HelpPackage(const std::string& name, bool adaptors) const
+  void Factory::PrintHelpPackage(const std::string& name, bool adaptors) const
   {
-    bbtkDebugMessageInc("Kernel",9,"Factory::HelpPackage(\""<<name<<"\")"
+    bbtkDebugMessageInc("kernel",9,"Factory::PrintHelpPackage(\""
+                       <<name<<"\")"
                         <<std::endl);
 
     PackageMapType::const_iterator i = mPackageMap.find(name);
     if ( i != mPackageMap.end() ) 
       {
-      bbtkMessage("Help",1, "Package "<<i->first<<" ");
+      bbtkMessage("help",1, "Package "<<i->first<<" ");
       
-      if (i->second.mPackage->GetVersion().length()>0)
-        bbtkMessageCont("Help",1,"v" <<i->second.mPackage->GetVersion());
+      if (i->second->GetVersion().length()>0)
+        bbtkMessageCont("help",1,"v" <<i->second->GetVersion());
         
-      if (i->second.mPackage->GetAuthor().length()>0)
-        bbtkMessageCont("Help",1,"- "<<i->second.mPackage->GetAuthor());
+      if (i->second->GetAuthor().length()>0)
+        bbtkMessageCont("help",1,"- "<<i->second->GetAuthor());
         
-      if (i->second.mPackage->GetCategory().length()>0)
-        bbtkMessageCont("Help",1,"- "<<i->second.mPackage->GetCategory());        
+      if (i->second->GetCategory().length()>0)
+        bbtkMessageCont("help",1,"- "<<i->second->GetCategory());        
         
-      bbtkMessageCont("Help",1,std::endl);
-      bbtkIncTab("Help",1);
-      bbtkMessage("Help",1,i->second.mPackage->GetDescription()<<std::endl);
-      if (i->second.mPackage->GetNumberOfBlackBoxes()>0) 
+      bbtkMessageCont("help",1,std::endl);
+      bbtkIncTab("help",1);
+      bbtkMessage("help",1,i->second->GetDescription()<<std::endl);
+      if (i->second->GetNumberOfDescriptors()>0) 
         {
-          bbtkMessage("Help",1, "Black boxes : "<<std::endl);
-          i->second.mPackage->PrintBlackBoxes(true,adaptors);
+          bbtkMessage("help",1, "Black boxes : "<<std::endl);
+          i->second->PrintHelpListDescriptors(true,adaptors);
         }
       else 
         {
-          bbtkMessage("Help",1, "No black boxes"<<std::endl);
+          bbtkMessage("help",1, "No black boxes"<<std::endl);
         }
-      bbtkDecTab("Help",1);
+      bbtkDecTab("help",1);
       }
     else 
       {
-      bbtkDebugDecTab("Kernel",9);
+      bbtkDebugDecTab("kernel",9);
       bbtkError("package \""<<name<<"\" unknown");
       }
     
-    bbtkDebugDecTab("Kernel",9);
+    bbtkDebugDecTab("kernel",9);
   }
   //===================================================================
 
   //===================================================================
   /// Prints help on the black box of type <name>
   /// Returns the package to which it belongs
-  void Factory::HelpBlackBox(const std::string& name, 
+  void Factory::PrintHelpDescriptor(const std::string& name, 
                             std::string& package,
                             bool full) const
   {
-    bbtkDebugMessageInc("Kernel",9,"Factory::HelpBlackBox(\""<<name<<"\")"
+    bbtkDebugMessageInc("kernel",9,"Factory::PrintHelpDescriptor(\""
+                       <<name<<"\")"
                         <<std::endl);
 
     bool found = false;
     PackageMapType::const_iterator i;
     for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
       {
-      if (i->second.mPackage->ContainsBlackBox(name)) 
+      if (i->second->ContainsDescriptor(name)) 
         {
-          i->second.mPackage->HelpBlackBox(name,full);
-             package = i->second.mPackage->GetName();
+          i->second->PrintHelpDescriptor(name,full);
+             package = i->second->GetName();
           found = true;
         }
       }
     
-    bbtkDebugDecTab("Kernel",9);
+    bbtkDebugDecTab("kernel",9);
     if (!found) 
       {
       bbtkError("No package of the factory contains any black box <"
@@ -619,32 +512,28 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
 
   //=================================================================== 
   /// Inserts a package in the factory
-  void Factory::InsertPackage( Package* p )
+  void Factory::InsertPackage( Package::Pointer p )
   {
-    bbtkDebugMessageInc("Kernel",9,"Factory::InsertPackage(\""<<
+    bbtkDebugMessageInc("kernel",9,"Factory::InsertPackage(\""<<
                         p->GetName()<<"\")"<<std::endl);
 
-    p->AddFactory(this);
-    PackageInfoType pack;
-    pack.mDynamicLibraryHandler = 0;
-    pack.mPackage = p;
-    mPackageMap[p->GetName()] = pack;
-
-    bbtkDebugDecTab("Kernel",9);
+    p->AddFactory(GetThisPointer<Factory>());    
+    mPackageMap[p->GetName()] = p;
+    bbtkDebugDecTab("kernel",9);
   }
   //===================================================================
   
   //=================================================================== 
   /// Removes a package from the factory (and deletes it)
-  void Factory::RemovePackage( Package* p )
+  void Factory::RemovePackage( Package::Pointer p )
   {
-    bbtkDebugMessageInc("Kernel",9,"Factory::RemovePackage(\""<<
+    bbtkDebugMessageInc("kernel",9,"Factory::RemovePackage(\""<<
                         p->GetName()<<"\")"<<std::endl);
 
     PackageMapType::iterator i;
     for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
       {
-         if (i->second.mPackage == p) break;
+         if (i->second == p) break;
       };
     
     if (i!=mPackageMap.end())
@@ -657,127 +546,351 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
                  p->GetName()<<"\") : package absent from factory");
       }
 
-    bbtkDebugDecTab("Kernel",9);
+    bbtkDebugDecTab("kernel",9);
   }
-  //===================================================================
   
 
+  //===================================================================
+       std::string Factory::GetPackageNameOfaBlackBox(std::string boxType)
+       {
+               std::string packageName="<void bbtk package name>";
+               PackageMapType::const_iterator i;
+
+               std::size_t found = boxType.find(":");
+               if (found!=std::string::npos)
+               {
+                       packageName     = boxType.substr(0,found);
+               } else {
+                       for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+                       {
+                               if ( i->second->ifBoxExist( boxType ) == true)
+                               {
+                                       packageName = i->first;
+                               } // if ifBoxExist
+                       } // for i
+
+               } // if found
+               return packageName;
+       }
+
+  //===================================================================
+       std::string Factory::GetTypeNameOfaBlackBox(std::string boxType)
+       {
+               std::string typeName="<void bbtk type name>";
+
+               std::size_t found = boxType.find(":");
+               if (found!=std::string::npos)
+               {
+                       typeName                = boxType.substr(found+1);
+               } else {
+                       typeName=boxType;
+               } // if found
+               return typeName;
+       }
+
+
+       
+       
   //===================================================================
   /// Creates an instance of a black box of type <type> with name <name>
-  BlackBox* Factory::NewBlackBox(const std::string& type, 
+  BlackBox::Pointer Factory::NewBlackBox(const std::string& type, 
                                  const std::string& name) const
   {
-    bbtkDebugMessageInc("Kernel",7,"Factory::NewBlackBox(\""
+       bbtkDebugMessageInc("kernel",7,"Factory::NewBlackBox(\""
                         <<type<<"\",\""<<name<<"\")"<<std::endl);
 
-    BlackBox* b = 0; 
+    BlackBox::Pointer b; 
+    PackageMapType::const_iterator i;
+
+       std::string tmp = type;
+       std::string packageName = ((bbtk::Factory*)this)->GetPackageNameOfaBlackBox(tmp);
+       std::string type2               = ((bbtk::Factory*)this)->GetTypeNameOfaBlackBox(tmp);
+       i = mPackageMap.find(packageName);
+       if (i != mPackageMap.end())
+       {
+               b = i->second->NewBlackBox(type2,name);
+       } else {
+               b =BlackBox::Pointer();
+       }
+
+/*
+       std::size_t found = type.find(":");
+       if (found!=std::string::npos)
+       {
+               std::string packageName = type.substr(0,found);
+               std::string type2               = type.substr(found+1);
+               i = mPackageMap.find(packageName);
+               if (i != mPackageMap.end())
+               {
+               b = i->second->NewBlackBox(type2,name);
+               } else {
+                       b =BlackBox::Pointer();
+               }
+       } else {
+       for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+       {
+               b = i->second->NewBlackBox(type,name);
+               if (b) break; 
+       } // for i
+
+       } // if found :
+*/
+
+
+    if (!b) 
+    {
+       bbtkError("black box type \""<<type<<"\" unknown");
+    }  // if !b
+
+
+    bbtkDebugDecTab("kernel",7);
+    return b;
+  }
+  //===================================================================
+
+  //===================================================================
+  /// Creates an instance of a black box of type <type> with name <name>
+  BlackBox::Pointer Factory::NewAdaptor(const DataInfo& typein,
+                               const DataInfo& typeout,
+                               const std::string& name) const
+  {
+    bbtkDebugMessageInc("kernel",8,"Factory::NewAdaptor("
+                        <<typein<<","
+                        <<typeout<<",\""
+                        <<name<<"\")"<<bbtkendl);
+
+
+    BlackBox::Pointer b; 
     PackageMapType::const_iterator i;
     for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
       {
-      b = i->second.mPackage->NewBlackBox(type,name);
+      b = i->second->NewAdaptor(typein,typeout,name);
       if (b) break; 
       }
     if (!b) 
       {
-       bbtkError("black box type \""<<type<<"\" unknown");
+       bbtkError("no "<<typein<<" to "<<typeout
+                 <<" adaptor available");
       } 
-
-    bbtkDebugDecTab("Kernel",7);
-    return b;
+    
+    bbtkDebugDecTab("kernel",7);
+    return b; 
   }
   //===================================================================
 
+
   //===================================================================
   /// Creates an instance of a black box of type <type> with name <name>
-  BlackBox* Factory::NewAdaptor(TypeInfo typein,
-                     TypeInfo typeout,
-                     const std::string& name) const
+  BlackBox::Pointer Factory::NewWidgetAdaptor(const DataInfo& typein,
+                                     const DataInfo& typeout,
+                                     const std::string& name) const
   {
-    bbtkDebugMessageInc("Kernel",8,"Factory::NewAdaptor(<"
-                        <<TypeName(typein)<<">,<"
-                        <<TypeName(typeout)<<">,\""
+    bbtkDebugMessageInc("kernel",8,"Factory::NewWidgetAdaptor(<"
+                        <<typein<<">,<"
+                        <<typeout<<">,\""
                         <<name<<"\")"<<bbtkendl);
 
 
-    BlackBox* b = 0
+    BlackBox::Pointer b
     PackageMapType::const_iterator i;
     for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
       {
-      b = i->second.mPackage->NewAdaptor(typein,typeout,name);
+       b = i->second->NewWidgetAdaptor(typein,
+                                                typeout,
+                                                name);
       if (b) break; 
       }
     if (!b) 
       {
-      bbtkError("no <"
-          <<TypeName(typein)<<"> to <"
-          <<TypeName(typeout)
-          <<"> adaptor available");
+       bbtkError("no "<<typein<<" to "<<typeout
+                 <<"> widget adaptor available");
+      } 
+    
+    bbtkDebugDecTab("kernel",7);
+    return b; 
+  }
+  //===================================================================
+
+  //===================================================================
+  /// Creates an instance of a black box of type <type> with name <name>
+  bool Factory::FindAdaptor(const DataInfo& typein,
+                                 const DataInfo& typeout,
+                                 std::string& adaptor) const
+  {
+    bbtkDebugMessageInc("kernel",8,"Factory::FindAdaptor(<"
+                        <<typein<<">,<"
+                        <<typeout<<">)"<<bbtkendl);
+    
+    bool b = false;
+    PackageMapType::const_iterator i;
+    for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+      {
+       b = i->second->FindAdaptor(typein,
+                                           typeout,
+                                           adaptor);
+       if (b) break; 
+      }
+    /*
+    if (!b) 
+      {
+       bbtkError("no "<<typein<<" to "<<typeout
+                 <<"> widget adaptor available");
       } 
+    */
+
+    bbtkDebugDecTab("kernel",7);
+    return b; 
+  }
+  //===================================================================
+
+  //===================================================================
+  /// Creates an instance of a black box of type <type> with name <name>
+  bool Factory::FindWidgetAdaptor(const DataInfo& typein,
+                                 const DataInfo& typeout,
+                                 std::string& adaptor) const
+  {
+    bbtkDebugMessageInc("kernel",8,"Factory::FindWidgetAdaptor(<"
+                        <<typein<<">,<"
+                        <<typeout<<">)"<<bbtkendl);
     
-    bbtkDebugDecTab("Kernel",7);
+    bool b = false;
+    PackageMapType::const_iterator i;
+    for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+      {
+       b = i->second->FindWidgetAdaptor(typein,
+                                                 typeout,
+                                                 adaptor);
+       if (b) break; 
+      }
+    bbtkDebugDecTab("kernel",7);
+    return b; 
+  }
+  //===================================================================
+
+  //===================================================================
+  /// Creates an instance of a black box of type <type> with name <name>
+  bool Factory::FindWidgetAdaptor2(const DataInfo& typein,
+                                 const DataInfo& typeout,
+                                 std::string& widget,
+                                 std::string& adaptor) const
+  {
+    bbtkDebugMessageInc("kernel",8,"Factory::FindWidgetAdaptor(<"
+                        <<typein<<">,<"
+                        <<typeout<<">)"<<bbtkendl);
+    
+    bool b = false;
+    adaptor = widget = "";
+    PackageMapType::const_iterator i;
+    for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+      {
+       b = i->second->FindWidgetAdaptor(typein,
+                                                 typeout,
+                                                 widget);
+       if (b) break; 
+      }
+    if (!b) 
+      {
+       // Look for a widget adaptor with good nature out
+       bbtkMessage("kernel",5,
+                   "*** Looking for a two pieces widget adaptor for : "
+                   << typein << "->"<<typeout<<std::endl);
+       for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+         {
+           Package::AdaptorMapType::const_iterator j;
+           for (j=i->second->GetAdaptorMap().begin();
+                j!=i->second->GetAdaptorMap().end();
+                ++j)
+             {
+               if ( ( j->first.mKind ==  
+                      BlackBoxDescriptor::DEFAULT_GUI) &&
+                    //(j->first.mTypeIn == typein) &&
+                    (j->first.mTypeOut.GetNature() == typeout.GetNature() ) 
+                    )
+                 {
+                   widget = j->second.lock()->GetTypeName();
+                   bbtkMessage("kernel",5,
+                               "===> Found first part : "<<widget
+                               << " "<<j->first.mTypeIn<<"->"
+                               <<j->first.mTypeOut<<std::endl);
+                   DataInfo ti( j->first.mTypeOut.GetType(), "");
+                   DataInfo to( typeout.GetType(), "");
+                   b = FindAdaptor( ti, to, adaptor );
+                   if (b) 
+                     {
+                       bbtkMessage("kernel",5,
+                                   "===> Found second part : "<<adaptor
+                                   <<std::endl);
+                       break;
+                     }
+                   else
+                     {
+                       bbtkMessage("kernel",5,
+                                   "===> No second part found"<<std::endl);
+                     }
+                 }
+             }
+           if (b) break;
+         }
+      }
+    bbtkDebugDecTab("kernel",7);
     return b; 
   }
   //===================================================================
 
   //===================================================================
   /// Creates an instance of a connection
-  Connection* Factory::NewConnection(BlackBox* from,
-                                     const std::string& output,
-                                     BlackBox* to,
-                                     const std::string& input) const
+  Connection::Pointer Factory::NewConnection(BlackBox::Pointer from,
+                                            const std::string& output,
+                                            BlackBox::Pointer to,
+                                            const std::string& input) const
   {
-    bbtkDebugMessage("Kernel",7,"Factory::NewConnection(\""
+    bbtkDebugMessage("kernel",7,"Factory::NewConnection(\""
                       <<from->bbGetName()<<"\",\""<<output<<"\",\""
                       <<to->bbGetName()<<"\",\""<<input
                       <<"\")"<<std::endl);
     
-    return new Connection(from,output,to,input,this);
+    return Connection::New(from,output,to,input,
+                          GetThisPointer<Factory>());
   }
   //===================================================================
 
 
 
   //===================================================================
-  const Package* Factory::GetPackage(const std::string& name) const
+  Package::Pointer Factory::GetPackage(const std::string& name) const
   {
-    bbtkDebugMessageInc("Kernel",9,"Factory::GetPackage(\""<<name<<"\")"
+    bbtkDebugMessageInc("kernel",9,"Factory::GetPackage(\""<<name<<"\")"
                          <<std::endl);
 
     PackageMapType::const_iterator i = mPackageMap.find(name);
     if ( i != mPackageMap.end() ) 
     {
-      bbtkDebugDecTab("Kernel",9); 
-      return i->second.mPackage;
+      bbtkDebugDecTab("kernel",9); 
+      return i->second;
     }
     else 
     {
-       bbtkDebugDecTab("Kernel",9);
+       bbtkDebugDecTab("kernel",9);
        bbtkError("package \""<<name<<"\" unknown");
     }
     
-    bbtkDebugDecTab("Kernel",9);  
+    bbtkDebugDecTab("kernel",9);  
   }
   //===================================================================
   
+
   //===================================================================
-  Package* Factory::GetPackage(const std::string& name) 
+  void Factory::Check() const
   {
-    bbtkDebugMessageInc("Kernel",9,"Factory::GetPackage(\""<<name<<"\")"
-                         <<std::endl);
-
-    PackageMapType::const_iterator i = mPackageMap.find(name);
-    if ( i != mPackageMap.end() ) 
-    {
-      bbtkDebugDecTab("Kernel",9); 
-      return i->second.mPackage;
-    }
-    else 
-    {
-       bbtkDebugDecTab("Kernel",9);
-       bbtkError("package \""<<name<<"\" unknown");
-    }
-    
-    bbtkDebugDecTab("Kernel",9);  
+    bbtkMessage("debug",1,"****** Checking Factory "<<(void*)this
+                <<std::endl);
+    PackageMapType::const_iterator i;
+    for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+      {
+       i->second->Check();
+      }
+    bbtkMessage("debug",1,"****** Checking Factory "<<(void*)this
+               <<" ... OK"<<std::endl);
   }
   //===================================================================
 
@@ -785,7 +898,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
   void Factory::WriteDotFilePackagesList(FILE *ff)
   {
 
-    bbtkDebugMessageInc("Kernel",9,"Factory::WriteDotFilePackagesList()"
+    bbtkDebugMessageInc("kernel",9,"Factory::WriteDotFilePackagesList()"
                          <<std::endl);
 
     fprintf( ff , "\n");
@@ -803,53 +916,52 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
        fprintf(ff,"  %s [shape=ellipse, URL=\"%s\"]%s\n",i->first.c_str(),url.c_str(),";" );
     }
     fprintf( ff , "}\n\n");
-    bbtkDebugDecTab("Kernel",9);
+    bbtkDebugDecTab("kernel",9);
   }
   //===================================================================
 
 
  void Factory::ShowGraphTypes(const std::string& name) const
  {
-
    bool found = false;
    PackageMapType::const_iterator i;
    for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
    {
-      if (i->second.mPackage->ContainsBlackBox(name)) 
-      {
+     if (i->second->ContainsDescriptor(name)) 
+       {
          std::string separator = ConfigurationFile::GetInstance().Get_file_separator ();
-
-            // Don't pollute the file store with  "temp_dir" directories ...    
+        
+        // Don't pollute the file store with  "temp_dir" directories ...    
          std::string default_doc_dir = ConfigurationFile::GetInstance().Get_default_temp_dir();
          std::string directory = "\"" + default_doc_dir + separator + "temp_dir"  +separator + "\"";
          std::string filename2 =  default_doc_dir + separator + "temp_dir" + separator + "tmp.html"; 
-
+        
 #if defined(_WIN32)  
-        std::string command("start \"Titre\" /D ");
+        std::string command("start \"Titre\" /D ");
 #else 
-        std::string command("gnome-open ");
+        std::string command("gnome-open ");
 #endif
-        command=command + directory +" tmp.html";
-        FILE *ff;
-        ff=fopen(filename2.c_str(),"w");
-
-        fprintf(ff,"<html><head><title>TMP</title> <script type=\"text/javascript\"> <!--\n");
-        fprintf(ff,"  window.location=\"%s#%s\";\n" , i->second.mPackage->GetDocURL().c_str(),name.c_str() );
-        fprintf(ff,"//--></script></head><body></body></html>\n");
-
-
-        //fprintf(ff, "<a  href=\"%s#%s\">Link</a>\n", i->second.mPackage->GetDocURL().c_str(),name.c_str() );
-        fclose(ff);
-        system( command.c_str() );      
-        found = true;
-     }
+        command=command + directory +" tmp.html";
+        FILE *ff;
+        ff=fopen(filename2.c_str(),"w");
+        
+        fprintf(ff,"<html><head><title>TMP</title> <script type=\"text/javascript\"> <!--\n");
+        fprintf(ff,"  window.location=\"%s#%s\";\n" , i->second->GetDocURL().c_str(),name.c_str() );
+        fprintf(ff,"//--></script></head><body></body></html>\n");
+        
+        
+        //fprintf(ff, "<a  href=\"%s#%s\">Link</a>\n", i->second->GetDocURL().c_str(),name.c_str() );
+        fclose(ff);
+        system( command.c_str() );      
+        found = true;
+       }
    }
-    
-   bbtkDebugDecTab("Kernel",9);
+   
+   bbtkDebugDecTab("kernel",9);
    if (!found) 
    {
-      bbtkError("No package of the factory contains any black box <"
-                <<name<<">");
+     bbtkError("No package of the factory contains any black box <"
+              <<name<<">");
    }
  }
     
@@ -859,81 +971,80 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
   void Factory::CreateHtmlIndex(IndexEntryType type, 
                                const std::string& filename)
   {
-    bbtkDebugMessageInc("Kernel",9,"Factory::CreateHtmlIndex(\""
+    bbtkDebugMessageInc("kernel",9,"Factory::CreateHtmlIndex(\""
                        <<filename<<"\")"<<bbtkendl);
     
     std::string title;
 
-    typedef std::map<std::string, std::vector<BlackBoxDescriptor*> > IndexType;
+    typedef std::map<std::string, 
+                     std::vector<BlackBoxDescriptor::Pointer> > IndexType;
     IndexType index;
     // Builds the index map
     PackageMapType::const_iterator i;
     for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
-      {
-       Package* pack = i->second.mPackage;
-       if (pack->GetName()=="user") continue;
-       Package::BlackBoxMapType::const_iterator j;
-       for (j = pack->GetBlackBoxMap().begin(); 
-            j!= pack->GetBlackBoxMap().end(); 
-            ++j)
-         {
+       {
+               Package::Pointer pack = i->second;
+               if (pack->GetName()=="user") continue;
+               Package::DescriptorMapType::const_iterator j;
+               for (j = pack->GetDescriptorMap().begin(); 
+                       j!= pack->GetDescriptorMap().end(); 
+                       ++j)
+               {
            
            // Skip adaptors 
-           if ( type==Adaptors )
-             {  
-               if (j->second->GetKind() == BlackBoxDescriptor::STANDARD )
-                 continue;
-             }
-           else 
-             if (j->second->GetKind() != BlackBoxDescriptor::STANDARD )
-               continue;
-
-           std::vector<std::string> keys;
-           if (type==Packages)
-             {
-               std::string k("");
-               k += pack->GetName();
-               keys.push_back(k);
-               title = "Boxes by package";
-             }
-           else if ((type==Initials) || (type==Adaptors))
-             {
-               std::string init(" ");
-               init[0] =  std::toupper(j->second->GetTypeName()[0]);
-               keys.push_back(init);
-               title = "Alphabetical list";
-             }
-           else if (type==Categories)
-             {
-               // Split the category string 
-               std::string delimiters = ";,";
-               Utilities::SplitString(j->second->GetCategory(),
-                                      delimiters,keys);
-               if (keys.size()==0) 
-                 keys.push_back(" NONE");
-               title = "Boxes by category";
-             }
-    
-           
-           std::vector<std::string>::const_iterator k;
-           for (k=keys.begin(); k!=keys.end(); ++k )
-             {
-               IndexType::iterator p;
-               p = index.find(*k);
-               if (p != index.end()) 
-                 {
-                   p->second.push_back(j->second);
-                 }
-               else 
-                 {
-                   std::vector<BlackBoxDescriptor*> v;
-                   v.push_back(j->second);
-                   index[*k] = v;
-                 }
-             }
-           
-         }
-      }   
+                       if ( type==Adaptors )
+                       {  
+                               if (j->second->GetKind() == BlackBoxDescriptor::STANDARD )
+                               continue;
+                       }
+                       else 
+                               if (j->second->GetKind() != BlackBoxDescriptor::STANDARD )
+                               continue;
+
+                       std::vector<std::string> keys;
+                       if (type==Packages)
+                       {
+                               std::string k("");
+                               k += pack->GetName();
+                               keys.push_back(k);
+                               title = "Boxes by package";
+                       }
+                       else if ((type==Initials) || (type==Adaptors))
+                       {
+                               std::string init(" ");
+                               init[0] =  std::toupper(j->second->GetTypeName()[0]);
+                               keys.push_back(init);
+                               title = "Alphabetical list";
+                       }
+                       else if (type==Categories)
+                       {
+                       // Split the category string 
+                       std::string delimiters = ";,";
+                       Utilities::SplitString(j->second->GetCategory(),
+                                          delimiters,keys);
+                       if (keys.size()==0) 
+                               keys.push_back(" NONE");
+                               title = "Boxes by category";
+                       }
+
+                       std::vector<std::string>::const_iterator k;
+                       for (k=keys.begin(); k!=keys.end(); ++k )
+                       {
+                               IndexType::iterator p;
+                               p = index.find(*k);
+                               if (p != index.end()) 
+                               {
+                                       p->second.push_back(j->second);
+                               }
+                               else 
+                               {
+                                       std::vector<BlackBoxDescriptor::Pointer> v;
+                                       v.push_back(j->second);
+                                       index[*k] = v;
+                               }
+                       }
+               }
+       }   
     // Creates the file 
     //---------------------
     // Open output file
@@ -978,7 +1089,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
     IndexType::iterator ii;
     for (ii=index.begin();ii!=index.end();++ii)
       {
-       s << "<a href=\"#"<<ii->first<<"\">"<<ii->first<<"</a>&nbsp;&nbsp;";    
+               s << "<a href=\"#"<<ii->first<<"\">"<<ii->first<<"</a>&nbsp;&nbsp;";    
       }
 
     for (ii=index.begin();ii!=index.end();++ii)
@@ -994,7 +1105,14 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
            s << "&nbsp;&nbsp;-&nbsp;&nbsp;\n"; 
 
            s << "<a name=\"doxygen\"></a>\n"; 
-           s << "<a href=..\\doxygen\\" << ii->first << "/main.html>(Doxygen documentation of the source)</a>\n"; 
+
+//EED 26Mars2009
+       /*JCP 19 Nov 2009
+               std::string bin_path = bbtk::ConfigurationFile::GetInstance().Get_bin_path();
+           s << "<a href=" << bin_path <<"/../share/bbtk/doc/doxygen/" << ii->first << "/main.html>(Doxygen documentation of the source)</a>\n"; 
+       JCP 19 Nov 2009*/
+               std::string bin_path = bbtk::ConfigurationFile::GetInstance().Get_bin_path();           
+           s << "<a href=" << bin_path <<"/../share/bbtk/doc/doxygen/" << ii->first << "/main.html>(Doxygen documentation of the source)</a>\n"; 
          }
        else 
          {
@@ -1005,7 +1123,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
 
        s << "<p><TABLE cellspacing=0  cellpadding=3>\n";
 
-       std::vector<BlackBoxDescriptor*>::iterator di;
+       std::vector<BlackBoxDescriptor::Pointer>::iterator di;
        for (di=ii->second.begin();di!=ii->second.end();++di)
          {
            std::string pack = (*di)->GetPackage()->GetName();
@@ -1034,7 +1152,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
     ptm = gmtime ( &rawtime );
 
     s << "<p><hr>\n";
-    s << "Automatically generated by <b>bbi</b> on "
+    s << "Automatically generated by <b>bbtk</b> on "
       << ptm->tm_mday << "/" << ptm->tm_mon << "/" << ptm->tm_year+1900 
       << " - " << ptm->tm_hour << ":" << ptm->tm_min << " GMT\n";
     s << "</body></html>\n"; 
@@ -1042,9 +1160,53 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
     //----------------------
 
     // End
-    bbtkDebugDecTab("Kernel",9);
+    bbtkDebugDecTab("kernel",9);
   }
 
+ //==========================================================================
+  std::string Factory::GetObjectName() const
+  {
+    return std::string("Factory");
+  }
+  //==========================================================================
+  
+  //==========================================================================
+  std::string  Factory::GetObjectInfo() const 
+  {
+    std::stringstream i;
+    return i.str();
+  }
+  //==========================================================================
+
+  //==========================================================================
+size_t  Factory::GetObjectSize() const 
+{
+  size_t s = Superclass::GetObjectSize();
+  s += Factory::GetObjectInternalSize();
+  return s;
+  }
+  //==========================================================================
+  //==========================================================================
+size_t  Factory::GetObjectInternalSize() const 
+{
+  size_t s = sizeof(Factory);
+  return s;
+  }
+  //==========================================================================
+  //==========================================================================
+  size_t  Factory::GetObjectRecursiveSize() const 
+  {
+    size_t s = Superclass::GetObjectRecursiveSize();
+    s += Factory::GetObjectInternalSize();
+
+    PackageMapType::const_iterator i;
+    for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+    {
+      s += i->second->GetObjectRecursiveSize();
+    }
+    return s;
+  }
+  //==========================================================================
 
 }