]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkFactory.cxx
=== MAJOR RELEASE ====
[bbtk.git] / kernel / src / bbtkFactory.cxx
index 9a6010bf19175e56278914e92d34e15a81d08715..c024617d59d01416250563110db678ffe8f2855b 100644 (file)
@@ -4,8 +4,8 @@ Program:   bbtk
 Module:    $RCSfile: bbtkFactory.cxx,v $
 Language:  C++
 
-Date:      $Date: 2008/03/10 06:24:12 $
-Version:   $Revision: 1.29 $
+Date:      $Date: 2008/04/18 12:59:15 $
+Version:   $Revision: 1.33 $
                                                                                 
 
 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
@@ -40,14 +40,20 @@ PURPOSE.  See the above copyright notices for more information.
 
 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);
   }
@@ -64,28 +70,10 @@ namespace bbtk
   //===================================================================
 
 
-  //===================================================================
-  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);
     CloseAllPackages();
     bbtkDebugDecTab("Kernel",7);
@@ -99,144 +87,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)
-      {
-       // 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,"   --->[" <<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() )
+    Package::Pointer p = Package::CreateFromDynamicLibrary(libname,
+                                                          pkgname,
+                                                          path);
+    if (p!=0)
       {
-       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());
+       //===================================================================
+       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;
       }
-
-    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;
+    return false;
     
-    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;
   }
   
   //===================================================================
@@ -436,6 +306,19 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
   //===================================================================
 
 
+  //===================================================================
+  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);
+  }
+  //===================================================================
+
   //===================================================================
   /// \brief Close the package referenced by the iterator 
  ///
@@ -451,67 +334,18 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
  void Factory::ClosePackage(PackageMapType::iterator& i) 
   {   
      bbtkDebugMessageInc("Kernel",7,"Factory::ClosePackage(\""
-                         <<i->second.mPackage->GetName()
+                         <<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())
-       {
-        // 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;
-          }
-       }
-     
-     // in any cases remove the entry in the map
+     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()) Package::Release(p);
+
 
      bbtkDebugDecTab("Kernel",7);
   }
@@ -530,7 +364,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
     {
       bbtkMessage("Help",1, i->first << std::endl);
       if (details) {
-         i->second.mPackage->PrintBlackBoxes(false,adaptors);
+         i->second->PrintBlackBoxes(false,adaptors);
       }
     }
 
@@ -550,22 +384,22 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
       {
       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) 
+      bbtkMessage("Help",1,i->second->GetDescription()<<std::endl);
+      if (i->second->GetNumberOfBlackBoxes()>0) 
         {
           bbtkMessage("Help",1, "Black boxes : "<<std::endl);
-          i->second.mPackage->PrintBlackBoxes(true,adaptors);
+          i->second->PrintBlackBoxes(true,adaptors);
         }
       else 
         {
@@ -597,10 +431,10 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
     PackageMapType::const_iterator i;
     for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
       {
-      if (i->second.mPackage->ContainsBlackBox(name)) 
+      if (i->second->ContainsBlackBox(name)) 
         {
-          i->second.mPackage->HelpBlackBox(name,full);
-             package = i->second.mPackage->GetName();
+          i->second->HelpBlackBox(name,full);
+             package = i->second->GetName();
           found = true;
         }
       }
@@ -617,16 +451,17 @@ 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(\""<<
                         p->GetName()<<"\")"<<std::endl);
 
-    p->AddFactory(this);
-    PackageInfoType pack;
-    pack.mDynamicLibraryHandler = 0;
-    pack.mPackage = p;
-    mPackageMap[p->GetName()] = pack;
+    std::cout << p.use_count() <<std::endl;
+
+    p->AddFactory(GetThisPointer<Factory>());
+    mPackageMap[p->GetName()] = p;
+
+    std::cout << p.use_count() <<std::endl;
 
     bbtkDebugDecTab("Kernel",9);
   }
@@ -634,7 +469,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
   
   //=================================================================== 
   /// 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(\""<<
                         p->GetName()<<"\")"<<std::endl);
@@ -642,7 +477,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
     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())
@@ -662,17 +497,17 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
 
   //===================================================================
   /// 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(\""
                         <<type<<"\",\""<<name<<"\")"<<std::endl);
 
-    BlackBox* b = 0
+    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->NewBlackBox(type,name);
       if (b) break; 
       }
     if (!b) 
@@ -687,29 +522,27 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
 
   //===================================================================
   /// 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::NewAdaptor(const DataInfo& typein,
+                               const DataInfo& typeout,
+                               const std::string& name) const
   {
-    bbtkDebugMessageInc("Kernel",8,"Factory::NewAdaptor(<"
-                        <<TypeName(typein)<<">,<"
-                        <<TypeName(typeout)<<">,\""
+    bbtkDebugMessageInc("Kernel",8,"Factory::NewAdaptor("
+                        <<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->NewAdaptor(typein,typeout,name);
       if (b) break; 
       }
     if (!b) 
       {
-      bbtkError("no <"
-          <<TypeName(typein)<<"> to <"
-          <<TypeName(typeout)
-          <<"> adaptor available");
+       bbtkError("no "<<typein<<" to "<<typeout
+                 <<" adaptor available");
       } 
     
     bbtkDebugDecTab("Kernel",7);
@@ -717,26 +550,186 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
   }
   //===================================================================
 
+
+  //===================================================================
+  /// Creates an instance of a black box of type <type> with name <name>
+  BlackBox::Pointer Factory::NewWidgetAdaptor(const DataInfo& typein,
+                                     const DataInfo& typeout,
+                                     const std::string& name) const
+  {
+    bbtkDebugMessageInc("Kernel",8,"Factory::NewWidgetAdaptor(<"
+                        <<typein<<">,<"
+                        <<typeout<<">,\""
+                        <<name<<"\")"<<bbtkendl);
+
+
+    BlackBox::Pointer b; 
+    PackageMapType::const_iterator i;
+    for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+      {
+       b = i->second->NewWidgetAdaptor(typein,
+                                                typeout,
+                                                name);
+      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::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);
+    
+    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_WIDGET_ADAPTOR) &&
+                    //(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(\""
                       <<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<<"\")"
                          <<std::endl);
@@ -745,7 +738,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
     if ( i != mPackageMap.end() ) 
     {
       bbtkDebugDecTab("Kernel",9); 
-      return i->second.mPackage;
+      return i->second;
     }
     else 
     {
@@ -757,25 +750,19 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
   }
   //===================================================================
   
+
   //===================================================================
-  Package* Factory::GetPackage(const std::string& name) 
+  void Factory::CheckPackages() 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->CheckBoxes();
+      }
+    bbtkMessage("Debug",1,"****** Checking Factory "<<(void*)this
+               <<" ... OK"<<std::endl);
   }
   //===================================================================
 
@@ -813,7 +800,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
    PackageMapType::const_iterator i;
    for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
    {
-      if (i->second.mPackage->ContainsBlackBox(name)) 
+      if (i->second->ContainsBlackBox(name)) 
       {
          std::string separator = ConfigurationFile::GetInstance().Get_file_separator ();
 
@@ -832,11 +819,11 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
         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,"  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.mPackage->GetDocURL().c_str(),name.c_str() );
+        //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;
@@ -862,13 +849,14 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
     
     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;
+       Package::Pointer pack = i->second;
        if (pack->GetName()=="user") continue;
        Package::BlackBoxMapType::const_iterator j;
        for (j = pack->GetBlackBoxMap().begin(); 
@@ -924,7 +912,7 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
                  }
                else 
                  {
-                   std::vector<BlackBoxDescriptor*> v;
+                   std::vector<BlackBoxDescriptor::Pointer> v;
                    v.push_back(j->second);
                    index[*k] = v;
                  }
@@ -1003,7 +991,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();
@@ -1043,6 +1031,50 @@ printf("EED kkkkkkkkkkkkkkkkkkkkkkkk  Factory::Reset() \n");
     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;
+  }
+  //==========================================================================
 
 }