AsapBindingUtilitiesImpl.java :  » Workflow-Engines » shark » org » enhydra » shark » asap » Java Open Source

Java Open Source » Workflow Engines » shark 
shark » org » enhydra » shark » asap » AsapBindingUtilitiesImpl.java
/* AsapBindingUtiltiesImpl.java */

package org.enhydra.shark.asap;

import java.net.ConnectException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.rmi.RemoteException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.xml.rpc.holders.StringHolder;

import org.apache.axis.MessageContext;
import org.apache.axis.message.MessageElement;
import org.apache.axis.types.URI;
import org.apache.axis.types.URI.MalformedURIException;
import org.enhydra.shark.api.client.timebase.UtcT;
import org.enhydra.shark.api.client.wfmodel.SourceNotAvailable;
import org.enhydra.shark.api.client.wfmodel.WfActivity;
import org.enhydra.shark.api.client.wfmodel.WfDataEventAudit;
import org.enhydra.shark.api.client.wfmodel.WfEventAudit;
import org.enhydra.shark.api.client.wfmodel.WfExecutionObject;
import org.enhydra.shark.api.client.wfmodel.WfProcess;
import org.enhydra.shark.api.client.wfmodel.WfStateEventAudit;
import org.enhydra.shark.api.client.wfservice.SharkConnection;
import org.enhydra.shark.api.common.SharkConstants;
import org.enhydra.shark.asap.types.CompletedRq;
import org.enhydra.shark.asap.types.CompletedRqResultData;
import org.enhydra.shark.asap.types.CreateInstanceRqContextData;
import org.enhydra.shark.asap.types.Event;
import org.enhydra.shark.asap.types.EventEventType;
import org.enhydra.shark.asap.types.Request;
import org.enhydra.shark.asap.types.Response;
import org.enhydra.shark.asap.types.SchemaType;
import org.enhydra.shark.asap.types.SetPropertiesRqData;
import org.enhydra.shark.asap.types.StateChangedRq;
import org.enhydra.shark.asap.types.StateType;
import org.enhydra.shark.asap.types.YesNoIfError;
import org.enhydra.shark.asap.types.holders.ResponseHolder;
import org.enhydra.shark.client.utilities.SharkInterfaceWrapper;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * ASAP utility methods
 * 
 * @author V.Puskas, S.Bojanic
 * @version 0.1
 */
public abstract class AsapBindingUtilitiesImpl {

   public static String[] allowedJavaTypes = new String[] {
         "java.lang.Long",
         "java.lang.Boolean",
         "java.lang.Double",
         "java.util.Date",
         "java.lang.String"
   };

   public static String[] allowedXMLTypes = new String[] {
         "xsd:long",
         "xsd:int",
         "xsd:boolean",
         "xsd:float",
         "xsd:double",
         "xsd:date",
         "xsd:string"
   };

   public static Object xmlTypeToDefaultValue(String xmlType) {
      Object val = null;

      if (xmlType.equals("xsd:long") || xmlType.equals("xsd:int")) {
         val = new Long(0);
      } else if (xmlType.equals("xsd:boolean")) {
         val = new Boolean(false);
      } else if (xmlType.equals("xsd:double") || xmlType.equals("xsd:float")) {
         val = new Double(0);
      } else if (xmlType.equals("xsd:date")) {
         val = new Date();
      } else if (xmlType.equals("xsd:string")) {
         val = new String();
      }
      return val;
   }

   public static String parseFactoryReceiverKey(URI rqReceiverKey) throws Exception {
      String qString = rqReceiverKey.getQueryString();
      String procMgr = null;
      if (null != qString) {
         String procDef = null;
         String packageId = null;
         int n = qString.indexOf(SharkServiceImpl.QSPN_PROCESS_DEFINITION);
         int i;
         if (n >= 0) {
            procDef = qString.substring(n
                                        + SharkServiceImpl.QSPN_PROCESS_DEFINITION.length());
            i = procDef.indexOf('&');
            if (i > 0) {
               procDef = procDef.substring(0, i);
            }
            n = qString.indexOf(SharkServiceImpl.QSPN_PACKAGE_ID);
            if (n >= 0) {
               packageId = qString.substring(n
                                             + SharkServiceImpl.QSPN_PACKAGE_ID.length());
               i = packageId.indexOf('&');
               if (i > 0) {
                  packageId = packageId.substring(0, i);
               }
            }
            SharkConnection sc = SharkInterfaceWrapper.getDefaultSharkConnection(null);
            procMgr = sc.getProcessMgr(SharkInterfaceWrapper.getShark()
               .getXPDLBrowser()
               .getUniqueProcessDefinitionName(sc.getSessionHandle(),
                                               packageId,
                                               "",
                                               procDef)).name();
         } else {
            n = qString.indexOf(SharkServiceImpl.QSPN_PROCESS_MANAGER);
            if (n >= 0) {
               procMgr = qString.substring(n
                                           + SharkServiceImpl.QSPN_PROCESS_MANAGER.length());
               i = procMgr.indexOf('&');
               if (i > 0) {
                  procMgr = procMgr.substring(0, i);
               }
               procMgr = URLDecoder.decode(procMgr, "UTF-8");
            }
         }
      }

      return procMgr;
   }

   protected static void completeActivity(URI rqReceiverKey, CompletedRqResultData rd) {
      String qString = rqReceiverKey.getQueryString();
      if (null != qString) {
         String procId = null;
         String actId = null;
         String varId = null;
         String procIdStr = "procId=";
         String actIdStr = "actId=";
         String varIdStr = "varId=";
         int n = qString.indexOf(procIdStr);
         int i;
         if (n >= 0) {
            procId = qString.substring(n + procIdStr.length());
            i = procId.indexOf('&');
            if (i > 0) {
               procId = procId.substring(0, i);
            }
            n = qString.indexOf(actIdStr);
            if (n >= 0) {
               actId = qString.substring(n + actIdStr.length());
               i = actId.indexOf('&');
               if (i > 0) {
                  actId = actId.substring(0, i);
               }
            }
            n = qString.indexOf(varIdStr);
            if (n >= 0) {
               varId = qString.substring(n + varIdStr.length());
               i = varId.indexOf('&');
               if (i > 0) {
                  varId = varId.substring(0, i);
               }
            }
            try {
               System.out.println("Searching for activity [" + procId + "," + actId + "]");
               WfActivity act = SharkInterfaceWrapper.getDefaultSharkConnection(null)
                  .getActivity(procId, actId);
               Map r;
               if (null != varId) {
                  HashMap res = retrieveContextVariables(rd.get_any());
                  r = new HashMap();
                  System.out.println("Putting results " + res + "in variable " + varId);
                  r.put(varId, res);
               } else {
                  System.out.println("Putting results into activity context " + actId);
                  r = parseContext(rd.get_any(), act.container()
                     .manager()
                     .context_signature());
               }
               act.set_result(r);
               act.complete();
            } catch (Exception ex) {
               ex.printStackTrace();
            }

         }
      }

   }

   protected static Map parseContext(CreateInstanceRqContextData rqContextData,
                                     WfProcess p) throws Exception {
      if (null != rqContextData && null != rqContextData.get_any()) {
         return parseContext(rqContextData.get_any(), p.manager().context_signature());
      }
      return new HashMap();
   }

   protected static Map parseContext(SetPropertiesRqData rqContextData, WfProcess p)
      throws Exception {
      if (null != rqContextData && null != rqContextData.get_any()) {
         return parseContext(rqContextData.get_any(), p.manager().context_signature());
      }
      return new HashMap();
   }

   public static Map parseContext(MessageElement[] a, Map csig) throws Exception {
      Map ret = new HashMap();
      for (int i = 0; i < a.length; i++) {
         String n = a[i].getName();
         if (!csig.containsKey(n)) {
            System.err.println("WARNING:Variable "
                               + n + " doesn't match context signiture!");
            continue;
            // throw new Exception("Variable " + n + " doesn't match
            // context signiture!");
         }
         String value = a[i].getValue();
         String t = (String) csig.get(n);
         try {
            if (t.equals("java.lang.String")) {
               if (value != null) {
                  ret.put(n, value);
               } else {
                  ret.put(n, "");
               }
            } else {
               if (value == null) {
                  value = "0";
               }
               if (t.equals("java.lang.Long")) {
                  ret.put(n, new Long(value));
               } else if (t.equals("java.lang.Boolean")) {
                  ret.put(n, new Boolean(value));
               } else if (t.equals("java.lang.Double")) {
                  ret.put(n, new Double(value));
               } else if (t.equals("java.util.Date")) {
                  java.util.Date dd;
                  try {
                     dd = DateFormat.getDateInstance().parse(value);
                  } catch (Exception _) {
                     dd = new Date(0L);
                  }
                  ret.put(n, dd);
               }
            }
         } catch (Exception ex) {
            ret.put(n, null);
            System.out.println("Value "
                               + a[i].getValue() + " can't be converted to type " + t
                               + " - setting null value");
         }
      }
      return ret;
   }

   public static SchemaType getContextDataSchema(Map contextSigniture) {
      SchemaType cdt = new SchemaType();
      MessageElement[] mes = new MessageElement[] {
         getSchemaElement("ContextDataType", contextSigniture)
      };
      cdt.set_any(mes);
      return cdt;
   }

   protected static SchemaType getResultDataSchema(Map resultSigniture) {
      SchemaType rdt = new SchemaType();
      MessageElement[] mes = new MessageElement[] {
         getSchemaElement("ResultDataType", resultSigniture)
      };
      rdt.set_any(mes);
      return rdt;
   }

   public static Map getContextSigniture(SchemaType cdt) {
      return getSigniture(cdt.get_any());
   }

   public static Map getResultSigniture(SchemaType rdt) {
      return getSigniture(rdt.get_any());
   }

   private static Map getSigniture(MessageElement[] mes) {
      Map m = new HashMap();

      try {
         System.out.println("mes-length=" + mes.length);
         MessageElement main = mes[0];
         // System.out.println("mes[0]="+main);
         Node sequence = main.getFirstChild().getFirstChild();
         NodeList cnodes = sequence.getChildNodes();
         // List allowedXMLT = Arrays.asList(allowedXMLTypes);
         for (int i = 0; i < cnodes.getLength(); i++) {
            Node n = cnodes.item(i);
            // System.out.println("CN="+n);
            NamedNodeMap nnm = n.getAttributes();
            String name = getAttributeValue(nnm, "name");
            String type = getAttributeValue(nnm, "type");
            m.put(name, xmlTypeToDefaultValue(type));
         }
      } catch (Exception ex) {
         ex.printStackTrace();
      }
      return m;
   }

   private static MessageElement getSchemaElement(String ctName, Map signiture) {
      MessageElement main = new MessageElement("schema",
                                               "xsd",
                                               "http://www.w3.org/2001/XMLSchema");
      main.setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
      main.setAttribute("targetNamespace", "http://shark.objectweb.org/");
      MessageElement main2 = new MessageElement("complexType",
                                                "xsd",
                                                "http://www.w3.org/2001/XMLSchema");
      main2.setAttribute("name", ctName);
      // main.setName("schema");
      // main.setNamespaceURI("http://www.w3.org/2001/XMLSchema");
      MessageElement sequence = new MessageElement("sequence",
                                                   "xsd",
                                                   "http://www.w3.org/2001/XMLSchema");
      // sequence.setName("sequence");
      try {
         main.addChild(main2);
         main2.addChild(sequence);
         Iterator it = signiture.entrySet().iterator();
         while (it.hasNext()) {
            Map.Entry me = (Map.Entry) it.next();
            String javaClass = me.getValue().toString();
            String xsdType = null;
            if (javaClass.equals("java.lang.Boolean")) {
               xsdType = "xsd:boolean";
            } else if (javaClass.equals("java.lang.String")) {
               xsdType = "xsd:string";
            } else if (javaClass.equals("java.lang.Long")) {
               xsdType = "xsd:long";
            } else if (javaClass.equals("java.lang.Double")) {
               xsdType = "xsd:double";
            } else if (javaClass.equals("java.util.Date")) {
               xsdType = "xsd:date";
            }
            if (xsdType != null) {
               MessageElement el = new MessageElement("element",
                                                      "xsd",
                                                      "http://www.w3.org/2001/XMLSchema");
               // el.setName("element");
               el.setAttribute("name", me.getKey().toString());
               el.setAttribute("type", xsdType);
               el.setAttribute("minOccurs", "0");
               sequence.addChild(el);
            }
         }
      } catch (Exception ex) {
      }
      return main;
   }

   public static CreateInstanceRqContextData getContextData(Map m, String schemaLocation) {
      CreateInstanceRqContextData cd = new CreateInstanceRqContextData();
      cd.set_any(prepareContextVariables(m, schemaLocation));
      return cd;
   }

   protected static MessageElement[] prepareContextVariables(Map m, String schemaLocation) {
      // MessageElement main = new MessageElement("ContextData", "asap",
      // "http://www.oasis-open.org/asap/0.9/asap.xsd");

      // main.setAttribute("xmlns:asap",
      // "http://www.oasis-open.org/asap/0.9/asap.xsd");
      List main = new ArrayList();
      try {
         Iterator it = m.entrySet().iterator();
         while (it.hasNext()) {
            Map.Entry me = (Map.Entry) it.next();
            String element = me.getKey().toString();

            Object value = me.getValue();
            String valueStr = String.valueOf(me.getValue());
            if (value instanceof java.util.Date) {
               valueStr = new SimpleDateFormat("yyyy-MM-dd").format(value);
               // Calendar c = Calendar.getInstance();
               // c.setTime((java.util.Date) value);
               // String year = String.valueOf(c.get(Calendar.YEAR));
               // String month = String.valueOf(c.get(Calendar.MONTH) + 1);
               // String day = String.valueOf(c.get(Calendar.DAY_OF_MONTH));
               // valueStr = year + "-" + month + "-" + day;
            }
            String _prefix = "";
            if (schemaLocation.length() > 0) {
               _prefix = "pd";
            }
            MessageElement el = new MessageElement(element, _prefix, schemaLocation);
            el.setValue(valueStr);
            // main.addChild(el);
            main.add(el);
         }
      } catch (Exception ex) {
         ex.printStackTrace();
      }
      System.out.println("main=" + main);
      //
      MessageElement[] els = new MessageElement[main.size()];
      main.toArray(els);
      return els;
      // return new MessageElement[] {main};
   }

   private static HashMap retrieveContextVariables(MessageElement[] mes) {
      HashMap m = new HashMap();

      if (mes != null) {
         try {
            System.out.println("mes-length=" + mes.length);
            for (int i = 0; i < mes.length; i++) {
               MessageElement me = mes[i];
               System.out.println("mes=" + me);
               String name = me.getName();
               String value = me.getValue();
               m.put(name, value);
            }
         } catch (Exception ex) {
            ex.printStackTrace();
         }
      }
      return m;
   }

   public static String parseState(StateType rqState) throws Exception {
      if (StateType.value1.equals(rqState)) {
         return SharkConstants.STATE_OPEN_NOT_RUNNING_NOT_STARTED;
      } else if (StateType.value2.equals(rqState)) {
         return SharkConstants.STATE_OPEN_NOT_RUNNING_SUSPENDED;
      } else if (StateType.value3.equals(rqState)) {
         return SharkConstants.STATE_OPEN_RUNNING;
      } else if (StateType.value4.equals(rqState)) {
         return SharkConstants.STATE_CLOSED_COMPLETED;
      } else if (StateType.value5.equals(rqState)) {
         return SharkConstants.STATE_CLOSED_TERMINATED;
      } else if (StateType.value6.equals(rqState)) {
         return SharkConstants.STATE_CLOSED_TERMINATED;
      } else if (StateType.value7.equals(rqState)) {
         return SharkConstants.STATE_CLOSED_ABORTED;
      } else {
         throw new Exception("Argh - don't know how to parse state "
                             + rqState.getValue() + "!");
      }
   }

   public static StateType parseState(String rqState) throws Exception {
      if (SharkConstants.STATE_OPEN_NOT_RUNNING_NOT_STARTED.equals(rqState)) {
         return StateType.value1;
      } else if (SharkConstants.STATE_OPEN_NOT_RUNNING_SUSPENDED.equals(rqState)) {
         return StateType.value2;
      } else if (SharkConstants.STATE_OPEN_RUNNING.equals(rqState)) {
         return StateType.value3;
      } else if (SharkConstants.STATE_CLOSED_COMPLETED.equals(rqState)) {
         return StateType.value4;
      } else if (SharkConstants.STATE_CLOSED_TERMINATED.equals(rqState)) {
         return StateType.value6;
      } else if (SharkConstants.STATE_CLOSED_ABORTED.equals(rqState)) {
         return StateType.value7;
      } else {
         throw new Exception("Argh!");
      }
   }

   public static String parseWSStateToShkState(String rqState) throws Exception {
      if (StateType._value1.equals(rqState)) {
         return SharkConstants.STATE_OPEN_NOT_RUNNING_NOT_STARTED;
      } else if (StateType._value2.equals(rqState)) {
         return SharkConstants.STATE_OPEN_NOT_RUNNING_SUSPENDED;
      } else if (StateType._value3.equals(rqState)) {
         return SharkConstants.STATE_OPEN_RUNNING;
      } else if (StateType._value4.equals(rqState)) {
         return SharkConstants.STATE_CLOSED_COMPLETED;
      } else if (StateType._value5.equals(rqState)) {
         return SharkConstants.STATE_CLOSED_TERMINATED;
      } else if (StateType._value6.equals(rqState)) {
         return SharkConstants.STATE_CLOSED_TERMINATED;
      } else if (StateType._value7.equals(rqState)) {
         return SharkConstants.STATE_CLOSED_ABORTED;
      } else {
         throw new Exception("Argh!");
      }
   }

   public static URI instanceId2URI(URI rk, String procId) throws Exception {
      URI instanceURI = new URI(rk);
      String def = "wfxmlInstanceBinding";
      def = SharkInterfaceWrapper.getProperties()
         .getProperty("ASAP.InstanceBindingWSDDServiceName", def);
      String path = rk.getPath();
      int ind = path.lastIndexOf("/");
      path = path.substring(0, ind + 1) + def;
      instanceURI.setPath(path);
      // instanceURI.setHost(myAddress);
      imprintURI(instanceURI);
      instanceURI.setQueryString(SharkServiceImpl.QSPN_PROCESS_INSTANCE + procId);
      return instanceURI;
   }

   /**
    * @param factoryURI
    * @throws MalformedURIException
    */
   public static void imprintURI(URI factoryURI) throws MalformedURIException {
      String[] a = MessageContext.getCurrentContext()
         .getRequestMessage()
         .getMimeHeaders()
         .getHeader("X-Forwarded-Host");
      if (null != a && a.length > 0 && null != a[a.length - 1]) {
         URI tmp = new URI("http://" + a[a.length - 1]);
         factoryURI.setHost(tmp.getHost());
         factoryURI.setPort(tmp.getPort());
      }
   }

   public static String instanceURI2Id(URI instanceURI) throws Exception {
      String string = instanceURI.getQueryString();
      return string.substring(SharkServiceImpl.QSPN_PROCESS_INSTANCE.length());
   }

   protected static Event[] extractEvents(WfProcess p, URI rk) throws Exception {
      // if (true) return new Event[0];
      WfEventAudit[] q = p.get_sequence_history(0);
      List list = new ArrayList();
      for (int n = 0; n < q.length; ++n) {
         if (q[n] instanceof WfStateEventAudit
             && null != ((WfStateEventAudit) q[n]).old_state()) {
            Event e = new Event();
            e.setDetails(q[n].process_key());
            e.setEventType(parseEvent(q[n].event_type()));
            WfStateEventAudit sea = (WfStateEventAudit) q[n];
            e.setNewState(parseState(sea.new_state()));
            e.setOldState(parseState(sea.old_state()));
            e.setSourceKey(rk);
            Calendar c = Calendar.getInstance();
            c.setTimeInMillis(q[n].time_stamp().getTime());
            e.setTime(c);
            list.add(e);
         }
      }
      Event[] ret = new Event[list.size()];
      list.toArray(ret);
      return ret;
   }

   protected static EventEventType parseEvent(String string) {
      if (string.equals(SharkConstants.EVENT_PROCESS_CREATED)) {
         return EventEventType.InstanceCreated;
      } else if (string.equals(SharkConstants.EVENT_ACTIVITY_CONTEXT_CHANGED)) {
         return EventEventType.PropertiesSet;
      } else if (string.equals(SharkConstants.EVENT_PROCESS_CONTEXT_CHANGED)) {
         return EventEventType.PropertiesSet;
      } else if (string.equals(SharkConstants.EVENT_ACTIVITY_RESULT_CHANGED)) {
         return EventEventType.PropertiesSet;
      } else if (string.equals(SharkConstants.EVENT_ACTIVITY_STATE_CHANGED)) {
         return EventEventType.StateChanged;
      } else if (string.equals(SharkConstants.EVENT_PROCESS_STATE_CHANGED)) {
         return EventEventType.StateChanged;
      } else {
         new Throwable("Event not found " + string).printStackTrace();
         return EventEventType.Error;
      }
   }

   // need to set it differently depending if we deploy ASAP or WfXML
   protected static URI createFactoryKey(URI rk, String string) throws Exception {
      URI factoryURI = new URI(rk);
      String def = "wfxmlFactoryBinding";
      def = SharkInterfaceWrapper.getProperties()
         .getProperty("ASAP.FactoryBindingWSDDServiceName", def);
      String path = rk.getPath();
      int ind = path.lastIndexOf("/");
      path = path.substring(0, ind + 1) + def;
      factoryURI.setPath(path);
      // factoryURI.setHost(SharkServiceImpl.getMyAddress());
      imprintURI(factoryURI);
      factoryURI.setQueryString(SharkServiceImpl.QSPN_PROCESS_MANAGER
                                + URLEncoder.encode(string, "UTF-8"));
      return factoryURI;
   }

   public static MessageElement[] extractData(Map context, String prefix)
      throws Exception {
      List mels = new ArrayList();
      try {
         List allowedJTs = Arrays.asList(allowedJavaTypes);
         Iterator it = context.entrySet().iterator();
         System.out.println("Extracting data for context " + context);
         while (it.hasNext()) {
            // main[n].setNamespaceURI("http://www.w3.org/2001/XMLSchema");
            Map.Entry me = (Map.Entry) it.next();
            String varId = me.getKey().toString();
            Object varVal = me.getValue();
            if (allowedJTs.contains(varVal.getClass().getName())) {
               MessageElement mel = new MessageElement("http://shark.objectweb.org/",
                                                       varId,
                                                       varVal);
               // mel.setNamespaceURI("http://vidi/");
               // mel.setName(varId);
               // mel.setPrefix("p" + prefix);
               // mel.setObjectValue(varVal);
               // mel.setObjectValue("pohovani pilici");
               mels.add(mel);
            }
         }

      } catch (Exception ex) {
         ex.printStackTrace();
      }
      MessageElement[] main = new MessageElement[mels.size()];
      mels.toArray(main);
      System.out.println("Extracting data result is  " + mels);
      return main;
   }

   public static URI turnHeads(Request rqHead, ResponseHolder rsHead)
      throws RemoteException {
      URI rqReceiverKey = rqHead.getReceiverKey();
      if (null == rqReceiverKey || 0 == rqReceiverKey.toString().length()) {
         throw new RemoteException("Invalid receiver key!!!");
      }
      String rqRequestID = rqHead.getRequestID();
      // YesNoIfError rqResponseRequired = rqHead.getResponseRequired();
      // TODO: rqResponseRequired isn't being used here
      // what should we do about it ?
      URI rqSenderKey = rqHead.getSenderKey();

      rsHead.value = new Response(rqReceiverKey, rqSenderKey, rqRequestID);
      return rqReceiverKey;
   }

   protected static void notifyObservers(final String procId,
                                         final Map result,
                                         final String new_state,
                                         final String old_state,
                                         final Set observers) throws Exception {
      Thread notifier = new Thread() {
         public void run() {
            // wait until transaction that calls receive_event method
            // finishes,
            // cause the process results can be invalid otherwise
            try {
               Thread.sleep(100);
            } catch (Exception ex) {
               ex.printStackTrace();
            }

            StateType n, o;
            CompletedRqResultData crrd;

            try {
               n = AsapBindingUtilitiesImpl.parseState(new_state);
               if (old_state != null) {
                  o = AsapBindingUtilitiesImpl.parseState(old_state);
               } else {
                  o = n;
               }
               crrd = (new_state.startsWith("closed")) ? new CompletedRqResultData(AsapBindingUtilitiesImpl.extractData(result,
                                                                                                                        procId))
                                                      : null;
            } catch (Exception e1) {
               e1.printStackTrace();
               return;
            }
            Request rqh = new Request();
            StateChangedRq srqb = new StateChangedRq();
            CompletedRq crqb = new CompletedRq();
            ResponseHolder rsh = new ResponseHolder();
            srqb.setState(n);
            srqb.setPreviousState(o);
            crqb.setResultData(crrd);
            StringHolder rsb = new StringHolder();
            boolean notified = false;
            boolean finished = null != crrd;
            System.err.println("finished:" + finished + " notified:" + notified);

            int maxCnt = 5;
            do {
               List obCopy = new ArrayList(observers);
               int cnt = 0;
               while (0 < obCopy.size()) {
                  for (Iterator iter = obCopy.iterator(); iter.hasNext();) {
                     boolean exc = false;
                     ObsInfo oi = (ObsInfo) iter.next();
                     try {
                        System.out.println("Notifying observer "
                                           + oi.getObsURI()
                                           + " about state change for proc URI "
                                           + oi.getProcURI());

                        AsapObserverBindingStub binding;
                        binding = (AsapObserverBindingStub) new SharkWebServiceLocator().getasapObserverBinding(new URL(oi.getObsURI()));
                        binding.setTimeout(60000);

                        rqh.setSenderKey(new URI(oi.getProcURI()));
                        rqh.setReceiverKey(new URI(oi.getObsURI()));
                        rqh.setRequestID("ObserverNotification");
                        rqh.setResponseRequired(YesNoIfError.Yes);

                        crqb.setInstanceKey(new URI(oi.getProcURI()));
                        if (!notified) {
                           binding.stateChanged(rqh, srqb, rsh, rsb);
                           System.out.println("Observer "
                                              + oi.getObsURI()
                                              + " notified about state change for proc URI "
                                              + oi.getProcURI());

                        } else if (finished) {
                           binding.completed(rqh, crqb, rsh, rsb);
                           System.out.println("Observer "
                                              + oi.getObsURI()
                                              + " notified about process complete event for proc URI "
                                              + oi.getProcURI());
                        }
                     } catch (Throwable e) {
                        e.printStackTrace();
                        if (e.getCause() instanceof ConnectException) {
                           exc = true;
                        } else {
                           System.err.println("Ignoring exception while notifying observer "
                                              + oi.getObsURI()
                                              + " about state change for proc URI "
                                              + oi.getProcURI());
                        }
                     } finally {
                        if (!exc || cnt >= maxCnt) {
                           iter.remove();
                        }
                     }
                  }
                  cnt++;
               }
               notified = !notified;
            } while (finished && notified);
            if (finished) {
               RequesterImpl.removeObservers(procId);
            }
         }
      };
      notifier.start();
   }

   public static URI[] createObservers(Set obsInfo) throws Exception {
      URI[] ret = new URI[obsInfo.size()];
      Iterator it = obsInfo.iterator();
      int i = 0;
      while (it.hasNext()) {
         ObsInfo oi = (ObsInfo) it.next();
         ret[i] = new URI(oi.getObsURI());
         i++;
      }

      return ret;
   }

   private static String getAttributeValue(NamedNodeMap nnm, String attrName) {
      try {
         Node attrib = nnm.getNamedItem(attrName);
         if (attrib.hasChildNodes()) {
            return attrib.getChildNodes().item(0).getNodeValue();
         }
         return attrib.getNodeValue();
      } catch (Exception ex) {
         return "";
      }
   }

   public static boolean sendEventToActivity(URI rqReceiverKey,
                                             final String rqInstanceUri,
                                             CompletedRqResultData rqResultData,
                                             final String oldState,
                                             final String newState) {
      try {
         WfActivity act = findActivityFromURI(rqReceiverKey);
         final UtcT now = new UtcT(System.currentTimeMillis(), 0, (short) 0, (short) 0);
         if (null != rqResultData) {
            final Map data = retrieveContextVariables(rqResultData.get_any());
            /**/
            WfEventAudit a = new WfDataEventAudit() {

               public Map old_data() throws Exception {
                  return null;
               }

               public Map new_data() throws Exception {
                  return data;
               }

               public WfExecutionObject source() throws Exception, SourceNotAvailable {
                  // TODO Auto-generated method stub
                  return null;
               }

               public UtcT time_stamp() throws Exception {
                  return now;
               }

               public String event_type() throws Exception {
                  // TODO Auto-generated method stub
                  return null;
               }

               public String activity_key() throws Exception {
                  return "";
               }

               public String activity_name() throws Exception {
                  // TODO Auto-generated method stub
                  return "";
               }

               public String process_key() throws Exception {
                  // TODO Auto-generated method stub
                  return "";
               }

               public String process_name() throws Exception {
                  // TODO Auto-generated method stub
                  return rqInstanceUri;
               }

               public String process_mgr_name() throws Exception {
                  return "";
               }

               public String process_mgr_version() throws Exception {
                  return "";
               }
            };
            act.receive_event(a);
            /**/
            // act.set_process_context(data);
         }
         if (null != newState) {
            /**/
            if (newState.startsWith(SharkConstants.STATEPREFIX_CLOSED)
                && !act.state().startsWith(SharkConstants.STATEPREFIX_CLOSED)) {
               WfEventAudit b = new WfStateEventAudit() {
                  public String old_state() throws Exception {
                     return oldState;
                  }

                  public String new_state() throws Exception {
                     return newState;
                  }

                  public WfExecutionObject source() throws Exception, SourceNotAvailable {
                     return null;
                  }

                  public UtcT time_stamp() throws Exception {
                     return now;
                  }

                  public String event_type() throws Exception {
                     return null;
                  }

                  public String activity_key() throws Exception {
                     return "";
                  }

                  public String activity_name() throws Exception {
                     return "";
                  }

                  public String process_key() throws Exception {
                     return "";
                  }

                  public String process_name() throws Exception {
                     return rqInstanceUri;
                  }

                  public String process_mgr_name() throws Exception {
                     return "";
                  }

                  public String process_mgr_version() throws Exception {
                     return "";
                  }
               };
               act.receive_event(b);
            }
            /**/
            // act.change_state(newState);
         }
      } catch (Throwable _) {
         // _.printStackTrace();
         return false;
      }
      return true;
   }

   protected static WfActivity findActivityFromURI(URI anUri) throws Exception {
      String qString = anUri.getQueryString();
      String procId = "";
      String actId = "";
      if (null != qString) {
         String procIdStr = "procId=";
         String actIdStr = "actId=";
         int n = qString.indexOf(procIdStr);
         int i;
         if (n >= 0) {
            procId = qString.substring(n + procIdStr.length());
            i = procId.indexOf('&');
            if (i > 0) {
               procId = procId.substring(0, i);
            }
            n = qString.indexOf(actIdStr);
            if (n >= 0) {
               actId = qString.substring(n + actIdStr.length());
               i = actId.indexOf('&');
               if (i > 0) {
                  actId = actId.substring(0, i);
               }
            }
         }
      }
      return SharkInterfaceWrapper.getDefaultSharkConnection(null).getActivity(procId, actId);
   }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.