From aaa9509c6f4e5ac0edb308041d1ffa361b468a5f Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 2 Apr 2014 15:30:06 +0200 Subject: ResourceImportHandler interface to allow custom types or override the structure of standard ones. Specify with ResourceImportHandler. c2kprop. DefaultResourceImportHandler is used if not defined, which handled the 5 standard types (CA,EA,OD,SC,SM). Fixes #178 --- src/main/java/com/c2kernel/process/Bootstrap.java | 197 +++++++++++----------- 1 file changed, 97 insertions(+), 100 deletions(-) (limited to 'src/main/java/com/c2kernel/process/Bootstrap.java') diff --git a/src/main/java/com/c2kernel/process/Bootstrap.java b/src/main/java/com/c2kernel/process/Bootstrap.java index d472978..df8ced7 100644 --- a/src/main/java/com/c2kernel/process/Bootstrap.java +++ b/src/main/java/com/c2kernel/process/Bootstrap.java @@ -2,6 +2,8 @@ package com.c2kernel.process; import java.net.InetAddress; import java.util.Enumeration; +import java.util.HashMap; +import java.util.Set; import java.util.StringTokenizer; import org.custommonkey.xmlunit.Diff; @@ -27,6 +29,8 @@ import com.c2kernel.lookup.RolePath; import com.c2kernel.persistency.ClusterStorage; import com.c2kernel.persistency.outcome.Outcome; import com.c2kernel.persistency.outcome.Viewpoint; +import com.c2kernel.process.resource.DefaultResourceImportHandler; +import com.c2kernel.process.resource.ResourceImportHandler; import com.c2kernel.property.Property; import com.c2kernel.property.PropertyArrayList; import com.c2kernel.property.PropertyDescription; @@ -43,6 +47,7 @@ import com.c2kernel.utils.Logger; public class Bootstrap { static DomainPath thisServerPath; + static HashMap resHandlerCache = new HashMap(); /** * Run everything without timing-out the service wrapper @@ -98,10 +103,8 @@ public class Bootstrap String itemType = thisItem.substring(0,delim); String itemName = thisItem.substring(delim+1); try { - String data = Gateway.getResource().getTextResource(ns, "boot/"+thisItem+(itemType.equals("OD")?".xsd":".xml")); - if (data == null) - Logger.die("No data found for "+getDataType(itemType)+" "+itemName); - verifyResource(ns, itemName, 0, itemType, data, reset); + String location = "boot/"+thisItem+(itemType.equals("OD")?".xsd":".xml"); + verifyResource(ns, itemName, 0, itemType, location, reset); } catch (Exception e) { Logger.error(e); Logger.die("Error importing bootstrap items. Unsafe to continue."); @@ -110,97 +113,123 @@ public class Bootstrap } - public static void verifyResource(String ns, String itemName, Integer version, String itemType, String data, boolean reset) throws Exception { + public static DomainPath verifyResource(String ns, String itemName, Integer version, String itemType, String dataLocation, boolean reset) throws Exception { if (version == null) version = 0; - Logger.msg(1, "Bootstrap.verifyResource() - Verifying version "+version+" of "+getDataType(itemType)+" "+itemName); + ResourceImportHandler typeImpHandler = getHandler(itemType); + Logger.msg(1, "Bootstrap.verifyResource() - Verifying version "+version+" of "+typeImpHandler.getName()+" "+itemName); - Enumeration en = Gateway.getLDAPLookup().search(getTypeRoot(itemType), itemName); + // Find or create Item for Resource + DomainPath modDomPath = typeImpHandler.getPath(itemName, ns); ItemProxy thisProxy; - Outcome newOutcome = new Outcome(0, data, getDataType(itemType), 0); - + Enumeration en = Gateway.getLDAPLookup().search(typeImpHandler.getTypeRoot(), itemName); if (!en.hasMoreElements()) { - Logger.msg("Bootstrap.verifyResource() - "+getDataType(itemType)+" "+itemName+" not found. Creating new."); - thisProxy = createResourceItem(itemType, itemName, ns); + Logger.msg("Bootstrap.verifyResource() - "+typeImpHandler.getName()+" "+itemName+" not found. Creating new."); + thisProxy = createResourceItem(typeImpHandler, itemName, ns); } else { DomainPath path = (DomainPath)en.nextElement(); thisProxy = (ItemProxy)Gateway.getProxyManager().getProxy(path); - - DomainPath modDomPath = getResourceDomPath(itemType, ns, itemName); - String moduleName = (ns==null?"kernel":ns); - String itemModule; - try{ - itemModule = thisProxy.getProperty("Module"); - if (!itemModule.equals("") && !itemModule.equals("null") && !moduleName.equals(itemModule)) { - Logger.error("Bootstrap.verifyResource() - Resource '"+itemName+"' included in module "+moduleName+" but is assigned to '"+itemModule+"'. Not overwriting."); - return; - } - } catch (ObjectNotFoundException ex) { - itemModule = ""; - } - - if (!moduleName.equals(itemModule)) { // write module property - Gateway.getStorage().put(thisProxy.getSystemKey(), new Property("Module", moduleName, false), null); - } - - if (!modDomPath.equals(path)) { // move item to module subtree - Logger.msg("Module item "+itemName+" found with path "+path.toString()+". Moving to "+modDomPath.toString()); - modDomPath.setEntity(new EntityPath(thisProxy.getSystemKey())); - if (!modDomPath.exists()) - Gateway.getLDAPLookup().add(modDomPath); - Gateway.getLDAPLookup().delete(path); - } - - - try { - Viewpoint currentData = (Viewpoint)thisProxy.getObject(ClusterStorage.VIEWPOINT+"/"+getDataType(itemType)+"/"+version); + + // Verify module property and location + + String moduleName = (ns==null?"kernel":ns); + String itemModule; + try{ + itemModule = thisProxy.getProperty("Module"); + if (!itemModule.equals("") && !itemModule.equals("null") && !moduleName.equals(itemModule)) { + Logger.error("Bootstrap.verifyResource() - Module clash! Resource '"+itemName+"' included in module "+moduleName+" but is assigned to '"+itemModule+"'. Not overwriting."); + return path; + } + } catch (ObjectNotFoundException ex) { + itemModule = ""; + } + + if (!moduleName.equals(itemModule)) { // write module property + Gateway.getStorage().put(thisProxy.getSystemKey(), new Property("Module", moduleName, false), thisProxy); + } + + if (!modDomPath.equals(path)) { // move item to module subtree + Logger.msg("Module item "+itemName+" found with path "+path.toString()+". Moving to "+modDomPath.toString()); + modDomPath.setEntity(new EntityPath(thisProxy.getSystemKey())); + if (!modDomPath.exists()) + Gateway.getLDAPLookup().add(modDomPath); + Gateway.getLDAPLookup().delete(path); + } + } + + // Verify/Import Outcomes, creating events and views as necessary + Set impList = typeImpHandler.getResourceOutcomes(itemName, ns, dataLocation, version); + for (Outcome newOutcome : impList) { + try { + Viewpoint currentData = (Viewpoint)thisProxy.getObject(ClusterStorage.VIEWPOINT+"/"+newOutcome.getSchemaType()+"/"+version); Outcome oldData = currentData.getOutcome(); XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreComments(true); Diff xmlDiff = new Diff(newOutcome.getDOM(), oldData.getDOM()); if (xmlDiff.identical()) { Logger.msg(5, "Bootstrap.verifyResource() - Data identical, no update required"); - return; + continue; } else { Logger.msg("Difference found in "+itemName+": "+xmlDiff.toString()); if (!reset && !currentData.getEvent().getStepPath().equals("Bootstrap")) { Logger.msg("Version "+version+" was not set by Bootstrap, and reset not requested. Not overwriting."); - return; + continue; } } } catch (ObjectNotFoundException ex) { - Logger.error("Bootstrap.verifyResource() - Item "+itemName+" exists but version "+version+" not found! Attempting to insert new."); + Logger.msg("Bootstrap.verifyResource() - Item "+itemName+" exists but version "+version+" not found! Attempting to insert new."); } + + // data was missing or doesn't match + Logger.msg("Bootstrap.verifyResource() - Writing new "+newOutcome.getSchemaType()+"version "+version+" to "+typeImpHandler.getName()+" "+itemName); + History hist = new History(thisProxy.getSystemKey(), thisProxy); + Transition predefDone = new Transition(0, "Done", 0, 0); + Event newEvent = hist.addEvent("system", "Admin", "Bootstrap", "Bootstrap", "Bootstrap", newOutcome.getSchemaType(), 0, "PredefinedStep", 0, predefDone, String.valueOf(version)); + newOutcome.setID(newEvent.getID()); + Viewpoint newLastView = new Viewpoint(thisProxy.getSystemKey(), newOutcome.getSchemaType(), "last", 0, newEvent.getID()); + Viewpoint newNumberView = new Viewpoint(thisProxy.getSystemKey(), newOutcome.getSchemaType(), String.valueOf(version), 0, newEvent.getID()); + Gateway.getStorage().put(thisProxy.getSystemKey(), newOutcome, thisProxy); + Gateway.getStorage().put(thisProxy.getSystemKey(), newLastView, thisProxy); + Gateway.getStorage().put(thisProxy.getSystemKey(), newNumberView, thisProxy); } - // data was missing or doesn't match - Logger.msg("Bootstrap.verifyResource() - Writing new version "+version+" to "+getDataType(itemType)+" "+itemName); - History hist = new History(thisProxy.getSystemKey(), thisProxy); - Transition predefDone = new Transition(0, "Done", 0, 0); - Event newEvent = hist.addEvent("system", "Admin", "Bootstrap", "Bootstrap", "Bootstrap", getDataType(itemType), 0, "PredefinedStep", 0, predefDone, String.valueOf(version)); - newOutcome.setID(newEvent.getID()); - Viewpoint newLastView = new Viewpoint(thisProxy.getSystemKey(), getDataType(itemType), "last", 0, newEvent.getID()); - Viewpoint newZeroView = new Viewpoint(thisProxy.getSystemKey(), getDataType(itemType), String.valueOf(version), 0, newEvent.getID()); - Gateway.getStorage().put(thisProxy.getSystemKey(), newOutcome, thisProxy); - Gateway.getStorage().put(thisProxy.getSystemKey(), newLastView, thisProxy); - Gateway.getStorage().put(thisProxy.getSystemKey(), newZeroView, thisProxy); - Gateway.getStorage().commit(thisProxy); + Gateway.getStorage().commit(thisProxy); + return modDomPath; + } + + private static ResourceImportHandler getHandler(String resType) throws Exception { + if (resHandlerCache.containsKey(resType)) + return resHandlerCache.get(resType); + ResourceImportHandler handler; + Object handlerProp = Gateway.getProperties().get("ResourceImportHandler."+resType); + if (handlerProp instanceof ResourceImportHandler) + handler = (ResourceImportHandler)handlerProp; + else if (handlerProp instanceof String) { //class name + try { + Class handlerClass = Class.forName((String)handlerProp); + handler = (ResourceImportHandler) handlerClass.newInstance(); + } catch (ClassNotFoundException e) { + throw new Exception("Handler class "+handlerProp+" for importing "+resType+" resources not found"); + } catch (ClassCastException e) { + throw new Exception(handlerProp+" for importing "+resType+" was not a ResourceImportHandler"); + } + } + else + handler = new DefaultResourceImportHandler(resType); + + resHandlerCache.put(resType, handler); + return handler; } - - private static DomainPath getResourceDomPath(String itemType, String ns, - String itemName) throws Exception { - return new DomainPath(getTypeRoot(itemType).toString()+"/system/"+(ns==null?"kernel":ns)+"/"+itemName); - } /** * @param itemType * @param itemName * @param data */ - private static ItemProxy createResourceItem(String itemType, String itemName, String ns) throws Exception { + private static ItemProxy createResourceItem(ResourceImportHandler impHandler, String itemName, String ns) throws Exception { // create props - PropertyDescriptionList pdList = (PropertyDescriptionList)Gateway.getMarshaller().unmarshall(Gateway.getResource().getTextResource(null, "boot/property/"+itemType+"Prop.xml")); + PropertyDescriptionList pdList = impHandler.getPropDesc(); PropertyArrayList props = new PropertyArrayList(); for (int i = 0; i < pdList.list.size(); i++) { PropertyDescription pd = pdList.list.get(i); @@ -209,16 +238,11 @@ public class Bootstrap props.list.add(new Property(propName, propVal, pd.getIsMutable())); } - CompositeActivity ca = new CompositeActivity(); - if (ns!=null && Gateway.getProperties().getBoolean("Module.debug", false)) { - String wf; - if (itemType.equals("CA")) wf = "ManageCompositeActDef"; - else if (itemType.equals("EA")) wf = "ManageElementaryActDef"; - else if (itemType.equals("OD")) wf = "ManageSchema"; - else if (itemType.equals("SC")) wf = "ManageScript"; - else throw new Exception("Unknown bootstrap item type: "+itemType); - ca = (CompositeActivity) ((CompositeActivityDef)LocalObjectLoader.getActDef(wf, 0)).instantiate(); - } + CompositeActivity ca; + if (ns!=null && Gateway.getProperties().getBoolean("Module.debug", false)) + ca = (CompositeActivity) ((CompositeActivityDef)LocalObjectLoader.getActDef(impHandler.getWorkflowName(), 0)).instantiate(); + else + ca = new CompositeActivity(); EntityPath entityPath = Gateway.getLDAPLookup().getNextKeyManager().generateNextEntityKey(); TraceableEntity newItem = (TraceableEntity)Gateway.getCorbaServer().createEntity(entityPath); @@ -227,39 +251,12 @@ public class Bootstrap 1, Gateway.getMarshaller().marshall(props), Gateway.getMarshaller().marshall(ca)); - DomainPath newDomPath = getResourceDomPath(itemType, ns, itemName); + DomainPath newDomPath = impHandler.getPath(itemName, ns); newDomPath.setEntity(entityPath); Gateway.getLDAPLookup().add(newDomPath); return (ItemProxy)Gateway.getProxyManager().getProxy(entityPath); } - public static DomainPath getTypeRoot(String type) throws Exception { - if (type.equals("CA") || type.equals("EA")) - return new DomainPath("/desc/ActivityDesc/"); - if (type.equals("SC")) - return new DomainPath("/desc/Script/"); - if (type.equals("OD")) - return new DomainPath("/desc/OutcomeDesc/"); - if (type.equals("SM")) - return new DomainPath("/desc/StateMachine"); - throw new Exception("Unknown bootstrap item type: "+type); - } - - private static String getDataType(String type) throws Exception { - if (type.equals("CA")) - return "CompositeActivityDef"; - if (type.equals("EA")) - return "ElementaryActivityDef"; - if (type.equals("OD")) - return "Schema"; - if (type.equals("SC")) - return "Script"; - if (type.equals("SM")) - return "StateMachine"; - throw new Exception("Unknown bootstrap item type: "+type); - - } - /************************************************************************** * Checks for the existence of the admin users so you can use Cristal **************************************************************************/ -- cgit v1.2.3