/* * Lokomo OneCMDB - An Open Source Software for Configuration * Management of Datacenter Resources * * Copyright (C) 2006 Lokomo Systems AB * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. * * Lokomo Systems AB can be contacted via e-mail: info@lokomo.com or via * paper mail: Lokomo Systems AB, Sv�rdv�gen 27, SE-182 33 * Danderyd, Sweden. * */ package org.onecmdb.ui.gwt.desktop.server.service.content; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.onecmdb.ui.gwt.desktop.client.service.content.ContentData; import org.onecmdb.ui.gwt.desktop.client.service.content.IContentService; import org.onecmdb.ui.gwt.desktop.server.service.ServiceLocator; import org.onecmdb.ui.gwt.desktop.server.service.content.adapter.IAdaptable; public class ContentParserFactory { private static Log log = LogFactory.getLog(ContentParserFactory.class); private static ContentParserFactory factory; public static ContentParserFactory get() { if (factory == null) { ContentParserFactory f = new ContentParserFactory(); Properties p = new Properties(); String repositoryHome = System.getProperty("ONECMDB_REPOSITORY_HOME"); File rHomeFile = null; if (repositoryHome != null) { rHomeFile = new File(repositoryHome); } String oneCMDBHome = System.getProperty("ONECMDB_HOME"); File etcRepFile = null; if (oneCMDBHome != null) { etcRepFile = new File(oneCMDBHome, "etc/repositry.cfg"); } InputStream in = null; try { if (rHomeFile != null && rHomeFile.exists() && rHomeFile.isFile()) { log.info("Use '" + rHomeFile.getPath() + "' repository config"); in = new FileInputStream(rHomeFile); } else if (etcRepFile != null && etcRepFile.exists() && rHomeFile.isFile()) { log.info("Use '" + etcRepFile.getPath() + "' repository config"); in = new FileInputStream(etcRepFile); } else { log.info("Use class resource repository config"); in = ContentParserFactory.class.getClassLoader().getResourceAsStream("repository.cfg"); } p.load(in); } catch (Throwable t) { log.fatal("No 'repository.cfg' found!", t); } finally { if (in != null) { try { in.close(); } catch (Exception e) { // Silently ignore } } } // Fetch Reposity root. try { String repositoryRoot = p.getProperty("repositoryRoot"); File rRoot = new File(repositoryRoot); if (!rRoot.exists()) { String msg = "'repository.cfg' is invalid. repositoryRoot=" + repositoryRoot + " don't exists!"; log.fatal(msg); throw new IllegalArgumentException(msg); } if (!rRoot.isDirectory()) { String msg = "'repository.cfg' is invalid. repositoryRoot=" + repositoryRoot + " is not a directory!"; log.fatal(msg); throw new IllegalArgumentException(msg); } log.info("Repository Root is set to '" + rRoot.getCanonicalPath() + "'"); f.setRootPath(rRoot); f.setFactory(f); } catch (IOException e) { log.fatal("No 'repository.cfg' found i class path!", e); } } return(factory); } private File rootPath; private HashMap<String, Object> adaptorCache = new HashMap<String, Object>(); public void setRootPath(File path) { this.rootPath = path; } public File getRootPath() { return rootPath; } public void setFactory(ContentParserFactory factory) { this.factory = factory; } public void stat(ContentData data) { IContentService cService = (IContentService) ServiceLocator.getService(IContentService.class); if (cService == null) { cService = new ContentServiceImpl(); } cService.stat(data); } public Object getCachedAdaptor(ContentData data, Class type) { Object o = adaptorCache .get(data.getPath()); if (o == null) { o = getAdaptor(data, type); adaptorCache.put(data.getPath(), o); } return(o); } public Object getAdaptor(ContentData data, Class type) { // Validate that all data have the same adaptor... data.setAllowNestedValues(false); String name = type.getName(); String impl = data.get(name); if (impl == null) { // Try to update metadata. IContentService cService = (IContentService) ServiceLocator.getService(IContentService.class); if (cService == null) { cService = new ContentServiceImpl(); } if (cService != null) { impl = cService.updateMetaData(data).get(name); } } log.info("Adapt file '" + data.getPath() + "' to '" + type.getName() + "' with '" + impl + "'"); if (impl == null) { throw new IllegalArgumentException("Name " + name + " has no impl class "); } Object instance = null; try { Class clazz = Class.forName(impl); instance = clazz.newInstance(); } catch (Throwable e) { e.printStackTrace(); throw new IllegalArgumentException("Can't adopt " + data.getName() + " to class " + type.getName(), e); } if (instance instanceof IContentDataAware) { ((IContentDataAware)instance).setContentData(data); } if (instance instanceof IAdaptable) { return(((IAdaptable)instance).getAdapter(type)); } return(instance); } public URL getURL(ContentData data) { try { File content = new File(getRootPath(), data.getPath()); return(content.toURL()); } catch (MalformedURLException e) { throw new IllegalArgumentException("URL not corret<" + data.getPath() + ">", e); } } public InputStream getInputStream(ContentData data) throws IOException { URL url = getURL(data); return(url.openStream()); } }