00001 /* 00002 * IssueFactory.cxx 00003 * ers 00004 * 00005 * Created by Matthias Wiesmann on 30.11.04. 00006 * Copyright 2004 CERN. All rights reserved. 00007 * 00008 */ 00009 00010 #include <iostream> 00011 #include <cstdlib> 00012 #include "ers/IssueFactory.h" 00013 #include "ers/Issue.h" 00014 #include "ers/DefaultIssue.h" 00015 #include "ers/Precondition.h" 00016 #include "ers/IssueFactoryIssue.h" 00017 #include "ers/InvalidReferenceIssue.h" 00018 00019 ers::IssueFactory *ers::IssueFactory::s_factory = 0 ; 00020 00021 ers::IssueFactory::IssueFactory() {} 00022 00028 ers::IssueFactory *ers::IssueFactory::instance() { 00029 if (0==s_factory) { 00030 s_factory = new IssueFactory(); 00031 } // creation needed 00032 return s_factory ; 00033 } // instance 00034 00035 void ers::IssueFactory::print_registered() { 00036 IssueFactory *factory = instance() ; 00037 std::cerr << *factory; 00038 } //print_registered_issues 00039 00040 00047 bool ers::IssueFactory::register_issue(const std::string &name, CreateIssueCallback creator) { 00048 return m_factory_map.insert(CallbackMap::value_type(name,creator)).second; 00049 } // register_Issue 00050 00057 ers::Issue *ers::IssueFactory::build(const std::string &name) const { 00058 CallbackMap::const_iterator i = m_factory_map.find(name); 00059 if (i == m_factory_map.end()) { 00060 // throw ERS_ISSUE_FACTORY_ERROR(name,"issue not registred") ; 00061 return new DefaultIssue(name); 00062 } // Not found 00063 ers::Issue *issue = (i->second)() ; 00064 if (0==issue) { 00065 throw ERS_ISSUE_FACTORY_ERROR(name,"factory function returned null"); 00066 } // issue null 00067 return issue ; 00068 } // build 00069 00076 ers::Issue *ers::IssueFactory::build(const std::string &name, const ers::string_map_type *values) const { 00077 Issue *i = build(name); 00078 if (i) { 00079 i->set_values(*values); 00080 } // if i 00081 return i ; 00082 } // build 00083 00091 ers::Issue *ers::IssueFactory::build(const Issue *original) { 00092 ERS_PRE_CHECK_PTR(original); 00093 const std::string name = original->get_class_name() ; 00094 const ers::string_map_type *values = original->get_value_table(); 00095 ERS_ASSERT(values!=0,"null value table for original"); 00096 ers::Issue *clone_issue = build(name,values); 00097 return clone_issue ; 00098 }// build 00099 00100 void ers::IssueFactory::write_to(std::ostream& stream) const { 00101 stream << "Issue factory - registered issues\n" ; 00102 stream << "---------------------------------\n" ; 00103 int i = 0 ; 00104 for(CallbackMap::const_iterator pos=m_factory_map.begin();pos!=m_factory_map.end();++pos) { 00105 std::string name = pos->first; 00106 stream << i << ")\t" << name << std::endl; 00107 i++ ; 00108 } // for 00109 stream << "---------------------------------\n" ; 00110 } // 00111 00112 std::ostream& ers::operator<<(std::ostream& stream, const IssueFactory& factory) { 00113 factory.write_to(stream); 00114 return stream ; 00115 } // operator 00116 00117 00118