/* * 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.change; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.onecmdb.core.utils.bean.AttributeBean; import org.onecmdb.core.utils.bean.CiBean; import org.onecmdb.core.utils.bean.ValueBean; import org.onecmdb.core.utils.xml.XmlGenerator; import org.onecmdb.core.utils.xml.XmlParser; import org.onecmdb.ui.gwt.desktop.client.service.change.ChangeItem; import org.onecmdb.ui.gwt.desktop.client.service.content.Config; import org.onecmdb.ui.gwt.desktop.client.service.content.ContentFile; import org.onecmdb.ui.gwt.desktop.client.service.content.ContentFolder; import org.onecmdb.ui.gwt.desktop.server.service.content.ContentParserFactory; import org.onecmdb.ui.gwt.desktop.server.service.content.ContentServiceImpl; import org.onecmdb.ui.gwt.desktop.server.service.model.CMDBWebServiceFactory; import org.onecmdb.ui.gwt.desktop.server.service.model.ConfigurationFactory; import com.sun.corba.se.impl.transport.CorbaInboundConnectionCacheImpl; public class ChangeStoreImpl implements IChangeStore { private ContentFile config; private ICIMDR remoteService; private Log log = LogFactory.getLog(this.getClass()); private String getRoot() { String path = ConfigurationFactory.get(Config.ChangeStoreRootPath); if (path != null) { File contentRoot = ContentParserFactory.get().getRootPath(); try { return(contentRoot.getCanonicalPath() + "/" + path); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } throw new IllegalArgumentException("No ChangeStoreRootPath specified!"); } public ChangeStoreImpl() { } public void commit(String token, ICIMDR local, List<ChangeItem> items) throws Exception { /* if (local instanceof CIMDRCollection) { CIMDRCollection col = (CIMDRCollection)local; CIMDRCollection result = new CIMDRCollection(); for (ICIMDR mdr : col.getMDRs()) { commit(token, mdr, items); } return; } */ XmlGenerator gen = new XmlGenerator(); File path = new File(getRoot(), local.getID()); if (!path.exists()) { path.mkdirs(); } File base = new File(path, "base.xml"); String output = base.getCanonicalPath(); gen.setOutput(output); List<CiBean> beans = local.getCI(token); List<CiBean> storeBeans = new ArrayList<CiBean>(); // Update id's.... ICIMDR remoteMDR = getRemote(); List<String> aliases = new ArrayList<String>(); for (CiBean bean : beans) { aliases.add(bean.getAlias()); } List<CiBean> remotes = remoteMDR.getCIs(token, aliases); for (CiBean remote : remotes) { CiBean bean = local.getCI(token, remote.getAlias()); if (bean == null) { continue; } // Remove Attributes/Values not defined here. for (AttributeBean aBean : remote.getAttributes()) { if (bean.getAttribute(aBean.getAlias()) == null) { remote.removeAttribute(aBean); } } for (ValueBean vBean : remote.getAttributeValues()) { boolean found = false; List<ValueBean> localValues = bean.fetchAttributeValueBeans(vBean.getAlias()); for (ValueBean localValue : localValues) { if (localValue.getValue() == null) { if (vBean.getValue() == null) { found = true; break; } } if (localValue.getValue().equals(vBean.getValue())) { found = true; break; } } if (!found) { remote.removeAttributeValue(vBean); } } storeBeans.add(remote); } // Filter Change items gen.setBeans(storeBeans); gen.process(); } public ICIMDR getBase(ICIMDR localMDR) { ICIMDR base = new CIMDRCollection(localMDR.getID()); File path = new File(getRoot(), localMDR.getID()); if (!path.exists()) { return(base); } File file = new File(path, "base.xml"); if (!file.exists()) { return(base); } try { XmlParser provider = new XmlParser(); provider.setURL(file.toURL().toExternalForm()); CIMDRBeanProvider mdr = new CIMDRBeanProvider(); mdr.setProvider(provider); return(mdr); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return(base); /* if (localMDR instanceof CIMDRCollection) { CIMDRCollection col = (CIMDRCollection)localMDR; CIMDRCollection result = new CIMDRCollection(); for (ICIMDR mdr : col.getMDRs()) { ICIMDR b = getBase(mdr); if (b != null) { result.add(b); } } base = result; } else { // Try to open the latest for this File path = new File(getRoot(), localMDR.getID()); if (path.exists()) { try { XmlParser provider = new XmlParser(); provider.setURL(path.toURL().toExternalForm()); CIMDRBeanProvider mdr = new CIMDRBeanProvider(); mdr.setProvider(provider); base = mdr; } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return(base); */ } public ICIMDR getRemote() throws Exception { return(new OneCMDBWebServiceMDR(CMDBWebServiceFactory.get().getOneCMDBWebService())); } public void reset(String token, CIMDRCollection local, List<ChangeItem> items) throws IOException { XmlGenerator gen = new XmlGenerator(); File path = new File(getRoot(), local.getID()); if (!path.exists()) { path.mkdirs(); } File base = new File(path, "base.xml"); String output = base.getCanonicalPath(); gen.setOutput(output); List<CiBean> storeBeans = new ArrayList<CiBean>(); // Filter Change items gen.setBeans(storeBeans); gen.process(); } }