package com.c2kernel.process; import java.io.StringReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Properties; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.InputSource; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.entity.proxy.ItemProxy; import com.c2kernel.events.Event; import com.c2kernel.events.History; import com.c2kernel.lifecycle.instance.predefined.entitycreation.Dependency; import com.c2kernel.lifecycle.instance.predefined.entitycreation.DependencyMember; import com.c2kernel.lifecycle.instance.predefined.entitycreation.NewAgent; import com.c2kernel.lifecycle.instance.predefined.entitycreation.NewItem; import com.c2kernel.lifecycle.instance.predefined.entitycreation.Property; import com.c2kernel.lifecycle.instance.stateMachine.States; import com.c2kernel.lifecycle.instance.stateMachine.Transitions; import com.c2kernel.lookup.DomainPath; import com.c2kernel.persistency.outcome.Outcome; import com.c2kernel.persistency.outcome.Viewpoint; import com.c2kernel.scripting.ErrorInfo; import com.c2kernel.scripting.Script; import com.c2kernel.scripting.ScriptingEngineException; import com.c2kernel.utils.CastorXMLUtility; import com.c2kernel.utils.Logger; import com.c2kernel.utils.Resource; public class Module { private final String ns, name, desc, version; private String resURL; private final ArrayList dependency = new ArrayList(); private final Properties clientProps = new Properties(); private final Properties serverProps = new Properties(); private final HashMap clientScripts = new HashMap(); private final HashMap serverScripts = new HashMap(); private final ArrayList imports = new ArrayList(); private static DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); private final DocumentBuilder parser; private Document moduleDOM; static { dbf.setValidating(false); dbf.setNamespaceAware(false); } public Module(String moduleXML) throws ModuleException { try { parser = dbf.newDocumentBuilder(); moduleDOM = parser.parse(new InputSource(new StringReader(moduleXML))); } catch (Exception e) { Logger.error(e); throw new ModuleException("Could not process modules. XML Parser exception"); } Element root = (Element)moduleDOM.getElementsByTagName("CristalModule").item(0); // Get module metadata ns = root.getAttribute("ns"); name = root.getAttribute("name"); Element info = (Element)moduleDOM.getElementsByTagName("Info").item(0); desc = ((Text)info.getElementsByTagName("Description").item(0).getFirstChild()).getData(); version = ((Text)info.getElementsByTagName("Version").item(0).getFirstChild()).getData(); NodeList nl = info.getElementsByTagName("Dependency"); for (int i=0; i0) { resURL = ((Text)nl.item(0).getFirstChild()).getData(); Resource.addModuleBaseURL(ns, resURL); } // Get config properties nl = root.getElementsByTagName("Config"); for (int i=0; i0) { Element impElem = (Element)nl.item(0); nl = impElem.getChildNodes(); for (int i=0; i scripts = isServer?serverScripts:clientScripts; Script thisScript = scripts.get(event); if (thisScript == null) return null; try { Object result = thisScript.execute(); if (result instanceof ErrorInfo) return (ErrorInfo)result; else return new ErrorInfo(result.toString()); } catch (ScriptingEngineException ex) { Logger.error(ex); return new ErrorInfo("Error running "+event+" script in module "+ns); } } public void importAll(ItemProxy serverEntity) { for (ModuleImport thisImp : imports) { if (thisImp instanceof ModuleResource) { ModuleResource thisRes = (ModuleResource)thisImp; try { Bootstrap.verifyResource(ns, thisRes.importName, thisRes.resourceType, Resource.getTextResource(ns, thisRes.resourceLocation)); } catch (Exception ex) { Logger.error(ex); } } else if (thisImp instanceof ModuleItem) { ModuleItem thisItem = (ModuleItem)thisImp; try { NewItem item = new NewItem(thisItem.importName, "/desc/"+ns, thisItem.workflow); item.propertyList = thisItem.props; DomainPath itemPath = new DomainPath(new DomainPath(item.initialPath), item.name); if (itemPath.exists()) continue; serverEntity.requestAction( Gateway.getLDAPLookup().getRoleManager().getAgentPath("system").getSysKey(), "workflow/predefined/CreateNewItem", Transitions.DONE, CastorXMLUtility.marshall(item)); Logger.msg("Module.importAll() - Created item: "+thisItem.importName); ItemProxy newProxy = (ItemProxy)Gateway.getProxyManager().getProxy(itemPath); History hist = new History(newProxy.getSystemKey(), newProxy); for (String thisView : thisItem.outcomes.keySet()) { String[] info = thisView.split(":"); int version = Integer.parseInt(info[1]); String data = Resource.getTextResource(ns, thisItem.outcomes.get(thisView)); Event newEvent = hist.addEvent("system", "Admin", Transitions.DONE, "Import", "Import", "Import", States.FINISHED); Outcome newOutcome = new Outcome(newEvent.getID(), data, info[0], version); Viewpoint newLastView = new Viewpoint(newProxy.getSystemKey(), info[0], info[2], version, newEvent.getID()); Gateway.getStorage().put(newProxy.getSystemKey(), newOutcome, newProxy); Gateway.getStorage().put(newProxy.getSystemKey(), newLastView, newProxy); } for (Dependency thisDep : thisItem.deps) { Gateway.getStorage().put(newProxy.getSystemKey(), thisDep.create(), newProxy); } Gateway.getStorage().commit(newProxy); } catch (Exception ex) { Logger.error("Error importing item "+thisItem.importName+" from module "+name); Logger.error(ex); } } else if (thisImp instanceof ModuleAgent) { ModuleAgent thisAgent = (ModuleAgent)thisImp; try { Gateway.getLDAPLookup().getRoleManager().getAgentPath(thisAgent.importName); Logger.msg(3, "Module.importAll() - User '"+thisAgent.importName+"' found."); return; } catch (ObjectNotFoundException ex) { } Logger.msg("Module.importAll() - User '"+thisAgent.importName+"' not found. Creating."); NewAgent agent = new NewAgent(thisAgent.importName, thisAgent.password); agent.roles = thisAgent.roles; try { serverEntity.requestAction( Gateway.getLDAPLookup().getRoleManager().getAgentPath("system").getSysKey(), "workflow/predefined/CreateNewAgent", Transitions.DONE, CastorXMLUtility.marshall(agent)); } catch (Exception ex) { Logger.error("Error importing agent "+thisAgent.importName+" from module "+name); Logger.error(ex); } } } } public Properties getClientProperties() { return clientProps; } public Properties getServerProperties() { return serverProps; } public String getNs() { return ns; } public String getName() { return name; } public String getDesc() { return desc; } public String getVersion() { return version; } public String getResURL() { return resURL; } public ArrayList getDependencies() { return dependency; } public boolean hasDependency(String dep) { return dependency.contains(dep); } public abstract class ModuleImport { String importName; } public class ModuleResource extends ModuleImport { String resourceType; String resourceLocation; } public class ModuleItem extends ModuleImport { ArrayList props = new ArrayList(); HashMap outcomes = new HashMap(); ArrayList deps = new ArrayList(); String workflow; } public class ModuleAgent extends ModuleImport { String password; ArrayList roles = new ArrayList(); } }