/* * 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.adapter; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.apache.ojb.broker.util.factory.ConfigurableFactory; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.onecmdb.ui.gwt.desktop.client.service.content.ContentData; import org.onecmdb.ui.gwt.desktop.client.service.model.CMDBDesktopConfig; import org.onecmdb.ui.gwt.desktop.client.service.model.CMDBDesktopMenuItem; import org.onecmdb.ui.gwt.desktop.client.service.model.CMDBDesktopShortcut; import org.onecmdb.ui.gwt.desktop.client.service.model.CMDBDesktopWindowItem; import org.onecmdb.ui.gwt.desktop.client.service.model.UserPreference; import org.onecmdb.ui.gwt.desktop.client.service.model.grid.AttributeColumnConfig; import org.onecmdb.ui.gwt.desktop.client.service.model.grid.GridModelConfig; import org.onecmdb.ui.gwt.desktop.client.utils.GXTModel2XML; import org.onecmdb.ui.gwt.desktop.server.service.content.ContentParserFactory; import org.onecmdb.ui.gwt.desktop.server.service.content.IContentDataAware; import org.onecmdb.ui.gwt.desktop.server.service.model.ConfigurationFactory; import com.extjs.gxt.ui.client.data.BaseModel; public class GXTModelContentAdapter implements IAdaptable, IContentDataAware { private Properties classMap; private BaseModel model; public GXTModelContentAdapter() { classMap = new Properties(); classMap.setProperty("OneCMDBDesktopConfig", CMDBDesktopConfig.class.getName()); classMap.setProperty("menuitem", CMDBDesktopMenuItem.class.getName()); classMap.setProperty("shortcut", CMDBDesktopShortcut.class.getName()); classMap.setProperty("widget", CMDBDesktopWindowItem.class.getName()); classMap.setProperty("GridModelConfig", GridModelConfig.class.getName()); classMap.setProperty("ColumnConfig", AttributeColumnConfig.class.getName()); classMap.setProperty("UserPreference", UserPreference.class.getName()); } public void setContentData(ContentData data) { try { load(data); } catch (Throwable e) { throw new IllegalArgumentException("Adapter GXTModelContentAdataper failed for data " + data.getPath(), e); } } protected void load(ContentData data) throws Exception { InputStream in = null; try { in = ContentParserFactory.get().getInputStream(data); SAXReader reader = new SAXReader(); Document document = reader.read(in); Element el = document.getRootElement(); this.model = updateModel(el, null); } finally { if (in != null) { try { in.close(); } catch (Throwable t) { // Ignore... } } } } public BaseModel updateModel(Element el, BaseModel parent) throws Exception { //System.out.println(el.getName()); String className = classMap.getProperty(el.getName()); if (className == null) { className = ConfigurationFactory.get("gxtadapter." + el.getName() + ".class"); if (className == null) { className = BaseModel.class.getName(); } //throw new IllegalArgumentException(el.getName() + " has no class definition"); } Class clazz = Class.forName(className); Object object = clazz.newInstance(); if (!(object instanceof BaseModel)) { throw new IllegalArgumentException(el.getName() + " class " + className + " is not implementing BaseModel"); } BaseModel model = (BaseModel)object; if (parent == null) { parent = model; } model.set("tag", el.getName()); for (Attribute a : (List<Attribute>)el.attributes()) { updateModelValue(model, a.getName(), a.getText(), false); } for (Element e : (List<Element>)el.elements()) { boolean asList = false; Attribute a = e.attribute("asList"); if (a != null) { asList = true; } boolean simpleList = false; a = e.attribute("asSimpleList"); if (a != null) { asList = true; simpleList = true; } if (isSimpleElement(e) || simpleList) { updateModelValue(model, e.getName(), e.getTextTrim(), asList); } else { updateModelValue(model, e.getName(), updateModel(e, model), asList); } } return(model); } private boolean isSimpleElement(Element e) { if (e.elements().size() > 0) { return(false); } if (e.attributeCount() > 0) { return(false); } return true; } private void updateModelValue(BaseModel m, String name, Object text, boolean asList) { //System.out.println("Update<" + m + ">( " + asList + ")" + name + "=" + text); if (asList) { Object o = m.get(name); if (o == null || !(o instanceof List)) { o = new ArrayList(); m.set(name, o); } ((List)o).add(text); } else { m.set(name, text); } } public Object getAdapter(Class clazz) { if (clazz.isInstance(this.model)) { return(model); } return(null); } public static void main(String argv[]) { GXTModelContentAdapter ad = new GXTModelContentAdapter(); ContentData d = new ContentData(); d.setPath(argv[0]); ad.setContentData(d); Object config = ad.getAdapter( GridModelConfig.class); System.out.println(GXTModel2XML.toXML(config.getClass().getSimpleName(), config, 0)); System.out.println("========================================="); /* List<CMDBDesktopMenuItem> items = config.getMenuItems(); for (CMDBDesktopMenuItem item : items) { dumpMenuItem(item); } */ } public static void dumpMenuItem(CMDBDesktopMenuItem item) { item.getWindowItem(); } }