/* * MetaServiceAI.java * * Created on ?? January 2015. * * Version 1.0 * * Copyright (c) */ package org.your_package.meta; import org.licas.autonomic.*; import org.licas.util.*; import org.licas_xml.abs.*; import java.util.*; import org.dcs.query_process.Script_Factory; import org.dcs.query_process.model.*; import org.dcs.query_process.util.Script_Const; import org.licas.meta.MetaFactory; import org.licas.parsers.Parsers; import org.licas.service.EmailService; import org.licas.service.model.EmailInfo; import org.licas_text.parser.QueryParser; import org.licas_text.search.QueryMediator; import org.licas_text.search.model.QueryModel; import org.licas_text.util.QueryConst; /** * This class can create metadata parts that can be used as part of service-related scripts, * with possibly an AI context, but relating to this package. The script creation is now very * closely linked to the {@code query_process} scripting package. * @author Kieran Greer */ public class MetaServiceAI { /** Create a new instance of MetaServiceAI */ public MetaServiceAI() {} /** * Create an admin document with a utility email service to load and invoke through * the autonomic manager. The service itself is added to the base service, as a utility one, * but would the be invoked, by the AM, through the base service when required. * @param emailInfo the email info the add. * @return a full admin document with the necessary sections for loading the email service. * @throws java.lang.Exception any error. */ public static Element adminAutoEmail(EmailInfo emailInfo) throws Exception { String nextID; //next id Element adminXml; //admin element Element autoXml; //base auto element Element moduleXml; //auto module element Element policyXml; //policy element Element servicesXml; //services element Element serviceXml; //service to load element Element serviceAdminXml; //service constructor admin Element serviceVarXml; //service variable iniialisers Element emailXml; //email service description Element replyXml; //reply element Element nextXml; //next element Script_Process scriptModel; //process model Script_Source scriptSource; //source object Script_Switch scriptEvent; //switch event Script_Case scriptCase; //switch case Script_Sequence scriptSequence; //sequence event Script_Invoke scriptInvoke; //invoke event Script_Target scriptTarget; //target link Script_Variable scriptVariable; //variable object Script_VariableInstance scriptVarInstance; //variable instance Script_Method scriptMethod; //method description Element queryXml; //query as xml Element methodXml; //method as xml ArrayList params; //parameters list QueryModel queryModel; //query model QueryParser queryParser; //query model parser queryParser = new QueryParser(); scriptModel = new Script_Process(Script_Const.PROCESS, "p1", null); adminXml = MetaFactory.createAdminXML(); autoXml = MetaFactory.getFactoryAI().createAutonomicManagerXML(AutonomicManagerDefault.class.getName(), null); policyXml = MetaFactory.createPolicyXML(); moduleXml = MetaFactory.getFactoryAI().createAM_ModuleXML(AiConst.MONITOR, null, null, policyXml); autoXml.addContent(moduleXml); adminXml.addContent(autoXml); //add email services section emailXml = (Element)Parsers.serialize(emailInfo, false, false); MetaFactory.parsedObjTypeAttr(emailXml, EmailInfo.class.getName()); serviceAdminXml = MetaFactory.createAdminXML(); serviceVarXml = MetaFactory.createMetaXML(Const.INSTANCEVALUES); nextXml = MetaFactory.createMetaXML(Const.INSTANCEVALUE); nextXml.setAttribute(Const.NAME, "emailInfo"); nextXml.addContent(emailXml); serviceVarXml.addContent(nextXml); serviceAdminXml.addContent(serviceVarXml); params = new ArrayList(); params.add(Const.ANON); params.add(Const.ANON); params.add(serviceAdminXml); serviceXml = MetaFactory.getFactoryService().createLoadServiceXML(ServiceConst.EMAIL, ServiceConst.EMAIL, EmailService.class.getName(), null, params); servicesXml = MetaFactory.createMetaXML(Const.SERVICES); serviceAdminXml = MetaFactory.createMetaXML(Const.SERVICESTOLOAD); serviceAdminXml.addContent(serviceXml); servicesXml.addContent(serviceAdminXml); adminXml.addContent(servicesXml); //add the sources scriptSource = (Script_Source)Script_Factory.createNewElement(Script_Const.SOURCE, "emailService", null); scriptSource.setType(Const.LICASSERVICE); scriptSource.setValue(ServiceConst.EMAIL); scriptModel.addSource(scriptSource); scriptSource = (Script_Source)Script_Factory.createNewElement(Script_Const.SOURCE, AiConst.QUERYMEDIATOR, null); scriptSource.setType(Const.OBJECT); scriptSource.setValue(QueryMediator.class.getName()); scriptModel.addSource(scriptSource); //add the variables scriptVariable = (Script_Variable)Script_Factory.createNewElement(Script_Const.VARIABLE, AiConst.QUERYMODEL, null); scriptVariable.setValue(Element.class.getName()); scriptModel.addVariable(scriptVariable); //add the variable instances nextID = (AiConst.QUERYMODEL + String.valueOf(1)); scriptVarInstance = (Script_VariableInstance)Script_Factory.createNewElement(Script_Const.VARIABLEINSTANCE, nextID, null); scriptVarInstance.setType(AiConst.QUERYMODEL); queryModel = new QueryModel(); queryModel.setQueryType(QueryConst.EXISTS); queryXml = queryParser.serialize(queryModel); scriptVarInstance.setValue(queryXml); scriptModel.addVariableInstance(scriptVarInstance); nextID = (AiConst.QUERYREPLY + String.valueOf(1)); scriptVarInstance = (Script_VariableInstance)Script_Factory.createNewElement(Script_Const.VARIABLEINSTANCE, nextID, null); scriptVarInstance.setType(Element.class.getName()); replyXml = XMLFactory.getInstance().createElement(QueryConst.OK); scriptVarInstance.setValue(replyXml); scriptModel.addVariableInstance(scriptVarInstance); //add the reflection method instances nextID = (AiConst.METHOD + String.valueOf(1)); scriptMethod = (Script_Method)Script_Factory.createNewElement(Script_Const.METHOD, nextID, null); scriptMethod.setType(Element.class.getName()); params = new Vector(); params.addElement(Const.QUERY); params.addElement(AiConst.MESSAGEOBJECT); methodXml = MetaFactory.createMethodXML(QueryMediator.class, "executeQuery", null, params); scriptMethod.setValue(methodXml); scriptModel.addReflection(scriptMethod); nextID = (AiConst.METHOD + String.valueOf(2)); scriptMethod = (Script_Method)Script_Factory.createNewElement(Script_Const.METHOD, nextID, null); scriptMethod.setType(Element.class.getName()); methodXml = MetaFactory.createMethodXML(EmailService.class, "sendEmail", null, 0); scriptMethod.setValue(methodXml); scriptModel.addReflection(scriptMethod); //add the switch event with cases nextID = (Script_Const.EVENT + String.valueOf(1)); scriptEvent = (Script_Switch)Script_Factory.createNewElement(Script_Const.SWITCH, nextID, null); scriptModel.addEvent(scriptEvent); nextID = (Script_Const.CASE + String.valueOf(1)); scriptCase = (Script_Case)Script_Factory.createNewElement(Script_Const.CASE, nextID, null); scriptCase.setCondition("method1:true", "queryModel1", "queryReply1", AiConst.QUERYMEDIATOR); scriptEvent.addEvent(scriptCase); nextID = (Script_Const.SEQUENCE + String.valueOf(1)); scriptSequence = (Script_Sequence)Script_Factory.createNewElement(Script_Const.SEQUENCE, nextID, null); scriptCase.addEvent(scriptSequence); nextID = (Script_Const.INVOKE + String.valueOf(1)); scriptInvoke = (Script_Invoke)Script_Factory.createNewElement(Script_Const.INVOKE, nextID, null); scriptInvoke.setOperation("method2"); scriptSequence.addEvent(scriptInvoke); nextID = (Script_Const.TARGET + String.valueOf(1)); scriptTarget = (Script_Target)Script_Factory.createNewElement(Script_Const.TARGET, nextID, null); scriptTarget.setLink("emailService"); scriptInvoke.addLink(scriptTarget); policyXml.addContent(scriptModel.toXml()); return adminXml; } /** * Create an policy script for invoking a single method on a web service. * @param wsdlAddress the full URI path to the WSDL document. * @param operation the operation to invoke. * @param varHash list of key-values representing any of the method parameter values. * @return a full admin document with the necessary sections for loading the email service. * @throws java.lang.Exception any error. */ public static Element policyWebServiceScript(String wsdlAddress, String operation, Hashtable varHash) throws Exception { int i; String nextID; //next id String nextKey; //next key Iterator allKeys; //all keys Element policyXml; //policy element Script_Process scriptModel; //process model Script_Source scriptSource; //source object Script_Sequence scriptSequence; //sequence event Script_Invoke scriptInvoke; //invoke event Script_Target scriptTarget; //target link Script_VarMap varMap; //variable-value map policyXml = MetaFactory.createPolicyXML(); scriptModel = new Script_Process(Script_Const.PROCESS, "p1", null); //add the sources scriptSource = (Script_Source)Script_Factory.createNewElement(Script_Const.SOURCE, "ws1", null); scriptSource.setType(Const.SERVICE); scriptSource.setValue(wsdlAddress); scriptModel.addSource(scriptSource); //add the variable instances varMap = (Script_VarMap)Script_Factory.createNewElement(Script_Const.VARMAP, "vm1", null); allKeys = varHash.keySet().iterator(); while (allKeys.hasNext()) { nextKey = (String)allKeys.next(); varMap.addValue(nextKey, (String)varHash.get(nextKey)); } scriptModel.addVariableInstance(varMap); //add the event sequence nextID = (Script_Const.SEQUENCE + String.valueOf(1)); scriptSequence = (Script_Sequence)Script_Factory.createNewElement(Script_Const.SEQUENCE, nextID, null); scriptModel.addEvent(scriptSequence); nextID = (Script_Const.INVOKE + String.valueOf(1)); scriptInvoke = (Script_Invoke)Script_Factory.createNewElement(Script_Const.INVOKE, nextID, null); scriptInvoke.setOperation(operation); scriptInvoke.setInput("vm1"); scriptSequence.addEvent(scriptInvoke); nextID = (Script_Const.TARGET + String.valueOf(1)); scriptTarget = (Script_Target)Script_Factory.createNewElement(Script_Const.TARGET, nextID, null); scriptTarget.setLink("ws1"); scriptInvoke.addLink(scriptTarget); policyXml.addContent(scriptModel.toXml()); return policyXml; } }