// ApplicationBuilder.cxx #include "dial_app/ApplicationBuilder.h" #include #include "dataset_util/WorkingDirectory.h" #include "dataset_xml/XmlParser.h" #include "dial_app/ApplicationRepository.h" #include "dial_app/ApplicationSelectionCatalog.h" using std::string; using std::vector; using dial::Application; using dial::ApplicationRepository; using dial::ApplicationSelectionCatalog; using dial::ApplicationBuilder; //********************************************************************** // Implementation class. //********************************************************************** // Definition. class ApplicationBuilder::Imp { public: XmlParser parser; ApplicationRepository& rep; ApplicationSelectionCatalog& sc; vector managed_objs; public: Imp(); ~Imp(); }; //********************************************************************** // Constructor. ApplicationBuilder::Imp::Imp() : rep(ApplicationRepository::default_instance()), sc(ApplicationSelectionCatalog::default_instance()) { } //********************************************************************** // Destructor. ApplicationBuilder::Imp::~Imp() { for ( vector::const_iterator iobj=managed_objs.begin(); iobj!=managed_objs.end(); ++iobj ) { delete *iobj; } } //********************************************************************** // Member functions. //********************************************************************** // Constructor. ApplicationBuilder::ApplicationBuilder() : m_pimp(new Imp) { } //********************************************************************** // Destructor. ApplicationBuilder::~ApplicationBuilder() { delete m_pimp; } //********************************************************************** // Return the xml parser. XmlParser& ApplicationBuilder::parser() { return m_pimp->parser; } //********************************************************************** // Return the repository. ApplicationRepository& ApplicationBuilder::repository() { return m_pimp->rep; } //********************************************************************** // Return the selection catalog. ApplicationSelectionCatalog& ApplicationBuilder::selection_catalog() { return m_pimp->sc; } //********************************************************************** // Get. const Application& ApplicationBuilder::get(string sobj) { static Application badobj; bool manage = false; const Application* pobj; // Parse as XML. const XmlElement* pxobj = parser().parse(sobj); if ( pxobj != 0 ) { pobj = new Application(*pxobj); delete pxobj; manage = true; } else { // Construct ID either from string or SC and extract from repository. ApplicationId id(sobj); if ( ! id.is_valid() ) { id = selection_catalog().id(sobj); } if ( id.is_valid() ) { pobj = repository().extract(id); } else { // Finally treat as a directory name. WorkingDirectory wd(sobj); if ( wd.size() == 2 ) { //FileDirectory fd("."); //Application* pobj = new Application(fd.files()); Application::NameList fnames; fnames.push_back("build_task"); fnames.push_back("run"); pobj = new Application(fnames); wd.up(); manage = true; } } } if ( pobj == 0 || ! pobj->is_valid() ) { if ( manage ) { delete pobj; } pobj = &badobj; } else { if ( manage ) { m_pimp->managed_objs.push_back(pobj); } } return *pobj; } //**********************************************************************