You are viewing a plain text version of this content. The canonical link for it is here.
Posted to agila-commits@incubator.apache.org by mr...@apache.org on 2006/01/04 21:21:04 UTC
svn commit: r365997 [2/3] - in /incubator/agila/trunk/modules/bpel: ./
client/api/src/java/org/apache/agila/bpel/client/
client/web/src/java/org/apache/agila/bpel/web/common/
client/web/src/java/org/apache/agila/bpel/web/deployer/action/
client/web/src...
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/definition/impl/dao/ActivityDAO.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/definition/impl/dao/ActivityDAO.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/definition/impl/dao/ActivityDAO.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/definition/impl/dao/ActivityDAO.java Wed Jan 4 13:19:47 2006
@@ -58,6 +58,12 @@
// "WHERE event.partnerLink = (:partner) AND event.portType = (:portType) " +
// "AND event.operation = (:operation)";
+ private static String FIND_ACTIVITYS_BY_CONTAINER =
+ "FROM org.apache.agila.bpel.engine.priv.core.definition.impl.ActivityImpl as activity " +
+ "INNER JOIN pick.activityContainer as container WHERE container.id = (:id)";
+
+
+
public static StructuredActivityImpl findContainer(Long containerId) throws DBSessionException {
Session session = DBSessionManager.getActiveSession();
@@ -140,6 +146,28 @@
results = byInvoker.list();
} catch (HibernateException e) {
log.error("Problem when finding receives by invoker.", e);
+ throw new DBSessionException(e);
+ }
+ return results;
+ }
+
+ /**
+ * finds all activities for the given container activity
+ *
+ * @param container structured activity which may or may not contains activities
+ * @return list of activities or null if nothing was found
+ * @throws DBSessionException
+ */
+ public static List findActivitiesByContainer(StructuredActivityImpl container) throws DBSessionException {
+ Session session = DBSessionManager.getActiveSession();
+
+ List results = null;
+ try {
+ Query byInvoker = session.createQuery(FIND_ACTIVITYS_BY_CONTAINER);
+ byInvoker.setParameter(PARTNER_PARAM, container.getId());
+ results = byInvoker.list();
+ } catch (HibernateException e) {
+ log.error("Problem when finding activities by container.", e);
throw new DBSessionException(e);
}
return results;
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ExecutionContext.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ExecutionContext.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ExecutionContext.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ExecutionContext.java Wed Jan 4 13:19:47 2006
@@ -97,6 +97,8 @@
public Collection getEvents();
public void execute();
+
+ public void terminate();
/**
* Gets this execution context initial activity (the one whose execution
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ProcessInstance.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ProcessInstance.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ProcessInstance.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ProcessInstance.java Wed Jan 4 13:19:47 2006
@@ -73,6 +73,8 @@
public void notifyExecution(ExecutionContext ec);
public void notifyTermination(ExecutionContext ec);
+
+ public void terminate();
Audit audit() throws Exception;
}
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ProcessInstanceFactory.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ProcessInstanceFactory.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ProcessInstanceFactory.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/ProcessInstanceFactory.java Wed Jan 4 13:19:47 2006
@@ -17,15 +17,23 @@
import org.apache.agila.bpel.engine.common.persistence.CreationException;
import org.apache.agila.bpel.engine.common.persistence.DBSessionException;
+import org.apache.agila.bpel.engine.common.persistence.DeletionException;
import org.apache.agila.bpel.engine.common.persistence.FinderException;
import org.apache.agila.bpel.engine.common.persistence.XMLSessionException;
import org.apache.agila.bpel.engine.exception.CorrelationViolationException;
+import org.apache.agila.bpel.engine.priv.core.definition.Activity;
import org.apache.agila.bpel.engine.priv.core.definition.CorrelationSet;
import org.apache.agila.bpel.engine.priv.core.definition.AgilaProcess;
+import org.apache.agila.bpel.engine.priv.core.definition.impl.CorrelationSetImpl;
+import org.apache.agila.bpel.engine.priv.core.definition.impl.InvokeImpl;
+import org.apache.agila.bpel.engine.priv.core.definition.impl.ReceiveImpl;
+import org.apache.agila.bpel.engine.priv.core.definition.impl.ReplyImpl;
+import org.apache.agila.bpel.engine.priv.core.definition.impl.StructuredActivityImpl;
import org.apache.agila.bpel.engine.priv.core.dynamic.impl.ProcessInstanceImpl;
import org.apache.agila.bpel.engine.priv.core.dynamic.impl.ValuedPropertyImpl;
import org.apache.agila.bpel.engine.priv.core.dynamic.impl.dao.ProcessInstanceDAO;
import org.apache.agila.bpel.engine.priv.core.dynamic.impl.xao.CorrelationXAO;
+import org.apache.agila.bpel.engine.priv.core.dynamic.impl.xao.VariableXAO;
import java.util.ArrayList;
import java.util.Collection;
@@ -125,6 +133,106 @@
return ProcessInstanceDAO.findInstanceByStatus(status);
}
+/**
+ * deletes a process instance as well as it's variable and correlation instances
+ *
+ * @param instanceId a process instance id
+ * @throws FinderException
+ * @throws DeletionException
+ */
+ public static void deleteInstance(Long instanceId) throws FinderException, DeletionException {
+ ProcessInstance instance = ProcessInstanceDAO.findById(instanceId);
+ deleteReferencedVariables(instance);
+ deleteReferencedCorrelations(instance);
+ ProcessInstanceDAO.remove(instance);
+ }
+
+ /**
+ * removes all correlations referenced by the given process instance
+ *
+ * @param processInstance process instance object
+ */
+ private static void deleteReferencedCorrelations(ProcessInstance processInstance) {
+ Collection cor = processInstance.getProcess().getCorrelationSets();
+ if(cor != null)
+ {
+ for (Iterator iter = cor.iterator(); iter.hasNext();) {
+ CorrelationSetImpl element = (CorrelationSetImpl) iter.next();
+ VariableXAO.removeProcessDocument(
+ element.getName(),
+ VariableXAO.CORRELATION,
+ processInstance.getId(),
+ processInstance.getProcess().getName());
+ }
+ }
+ }
+
+ /**
+ * removes all variables referenced by the given process instance
+ *
+ * @param processInstance process instance object
+ */
+ public static void deleteReferencedVariables(ProcessInstance processInstance)
+ {
+ deleteReferencedVariables(
+ processInstance.getProcess().getActivity(),
+ processInstance.getId(),
+ processInstance.getProcess().getName());
+ }
+
+ /**
+ * removes all variables referenced by the given activity (receive,reply,invoke)
+ *
+ * @param activity the activity to test for referenced variables
+ * @param instanceId process instance ID
+ * @param processName process name
+ */
+ public static void deleteReferencedVariables(Activity activity, Long instanceId, String processName)
+ {
+ if(activity instanceof StructuredActivityImpl)
+ {
+ StructuredActivityImpl structured = (StructuredActivityImpl)activity;
+ for (Iterator iter = structured.getActivities().iterator(); iter.hasNext();) {
+ deleteReferencedVariables((Activity) iter.next(),instanceId, processName);
+ }
+ }
+ else if(activity instanceof ReceiveImpl)
+ {
+ ReceiveImpl receive = (ReceiveImpl)activity;
+ VariableXAO.removeProcessDocument(
+ receive.getVariable(), VariableXAO.VARIABLE, instanceId, processName);
+ }
+ else if (activity instanceof ReplyImpl)
+ {
+ ReplyImpl reply = (ReplyImpl)activity;
+ VariableXAO.removeProcessDocument(
+ reply.getVariable(), VariableXAO.VARIABLE, instanceId, processName);
+ }
+ else if (activity instanceof InvokeImpl)
+ {
+ InvokeImpl invoke = (InvokeImpl)activity;
+ VariableXAO.removeProcessDocument(
+ invoke.getInputVariable(), VariableXAO.VARIABLE, instanceId, processName);
+ VariableXAO.removeProcessDocument(
+ invoke.getOutputVariable(), VariableXAO.VARIABLE, instanceId, processName);
+ }
+
+ }
+
+
+ /**
+ * terminates a process instance if it still exists
+ *
+ * @param instanceId instance id of process instance to terminate
+ * @throws FinderException
+ */
+ public static void terminateInstance(Long instanceId) throws FinderException {
+ ProcessInstance instance = ProcessInstanceDAO.findById(instanceId);
+ if (instance != null) {
+ instance.terminate();
+ }
+ }
+
private static void attachCorrelation(ProcessInstanceImpl instance, String correlationSetName, Map propertyValues, boolean create)
throws DBSessionException, CorrelationViolationException {
// If a process instance can be found with the same correlation there's a correlation error
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/BasicECImpl.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/BasicECImpl.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/BasicECImpl.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/BasicECImpl.java Wed Jan 4 13:19:47 2006
@@ -15,10 +15,20 @@
*/
package org.apache.agila.bpel.engine.priv.core.dynamic.impl;
+import org.apache.agila.bpel.engine.common.persistence.PersistentDataAccess;
import org.apache.agila.bpel.engine.priv.core.dynamic.BasicEC;
+import org.apache.agila.bpel.engine.priv.core.dynamic.ExecutionContext;
/**
* Please put some JavaDoc here.
*/
public abstract class BasicECImpl extends ExecutionContextImpl implements BasicEC {
+
+ public void terminate() {
+ if (getStatus() == ExecutionContext.ACTIVE) {
+ this.setStatus(ExecutionContext.CANCELED);
+ PersistentDataAccess.update(this);
+ }
+ }
+
}
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/ProcessInstanceImpl.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/ProcessInstanceImpl.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/ProcessInstanceImpl.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/ProcessInstanceImpl.java Wed Jan 4 13:19:47 2006
@@ -40,7 +40,7 @@
private ExecutionContext childExecutionContext;
private Collection properties = new HashSet();
-
+
// This map contains contextual data shared among several execution
// contexts, it's not persisted yet.
private Map contextualData = new HashMap();
@@ -102,61 +102,69 @@
public void putContextualData(String key, Object value) {
contextualData.put(key, value);
}
-
+
public Object getContextualData(String key) {
return contextualData.get(key);
}
-
+
public void notifyExecution(ExecutionContext ec) {
this.setStatus(ACTIVE);
- PersistentDataAccess.update(this);
+ PersistentDataAccess.update(this);
}
public void notifyTermination(ExecutionContext ec) {
- this.setStatus(COMPLETED);
- PersistentDataAccess.update(this);
+ this.setStatus(COMPLETED);
+ PersistentDataAccess.update(this);
+ }
+
+ public void terminate() {
+ if (this.getStatus() == ProcessInstance.ACTIVE) {
+ this.setStatus(CANCELED);
+ PersistentDataAccess.update(this);
+ getChildExecutionContext().terminate();
+ }
}
public Audit audit() throws Exception {
- Audit audit = new Audit();
- audit.setState(ProcessInstanceState.getInstance(this.getStatus()).getText());
- audit.setTitle(this.getProcess().getName() + " (v. " + this.getProcess().getVersion() + ")");
- audit.setProcessInstanceId(this.getId().longValue());
- audit.setEvents(ExecutionEventFactory.findExecutionEvents(ExecutionEvent.REF_TYPE_PROCESS_INSTANCE, getId()));
-
- ExecutionContext ec = this.getChildExecutionContext();
- if (ec != null) {
- audit.addEntry(ec.audit());
- }
- return audit;
- }
-
- public String toString() {
- final StringBuffer buf = new StringBuffer();
- buf.append("ProcessInstanceImpl");
- buf.append("{id=").append(id);
- buf.append(",status=").append(status);
- buf.append("\n,process=");
- if (process != null) {
- buf.append("{version=").append(process.getVersion());
- buf.append(",name=").append(process.getName());
- buf.append(",namespace=").append(process.getNamespace());
- buf.append('}');
- }
-
- buf.append("properties=");
- ValuedProperty property = null;
- for (Iterator propIter = properties.iterator(); propIter.hasNext();) {
- property = (ValuedProperty) propIter.next();
- buf.append("\n,property=").append(property);
- }
-
- buf.append(",childExecutionContext=");
- if (childExecutionContext != null) {
- buf.append(childExecutionContext);
- }
-
- buf.append('}');
- return buf.toString();
- }
+ Audit audit = new Audit();
+ audit.setState(ProcessInstanceState.getInstance(this.getStatus()).getText());
+ audit.setTitle(this.getProcess().getName() + " (v. " + this.getProcess().getVersion() + ")");
+ audit.setProcessInstanceId(this.getId().longValue());
+ audit.setEvents(ExecutionEventFactory.findExecutionEvents(ExecutionEvent.REF_TYPE_PROCESS_INSTANCE, getId()));
+
+ ExecutionContext ec = this.getChildExecutionContext();
+ if (ec != null) {
+ audit.addEntry(ec.audit());
+ }
+ return audit;
+ }
+
+ public String toString() {
+ final StringBuffer buf = new StringBuffer();
+ buf.append("ProcessInstanceImpl");
+ buf.append("{id=").append(id);
+ buf.append(",status=").append(status);
+ buf.append("\n,process=");
+ if (process != null) {
+ buf.append("{version=").append(process.getVersion());
+ buf.append(",name=").append(process.getName());
+ buf.append(",namespace=").append(process.getNamespace());
+ buf.append('}');
+ }
+
+ buf.append("properties=");
+ ValuedProperty property = null;
+ for (Iterator propIter = properties.iterator(); propIter.hasNext();) {
+ property = (ValuedProperty) propIter.next();
+ buf.append("\n,property=").append(property);
+ }
+
+ buf.append(",childExecutionContext=");
+ if (childExecutionContext != null) {
+ buf.append(childExecutionContext);
+ }
+
+ buf.append('}');
+ return buf.toString();
+ }
}
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/StructuredECImpl.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/StructuredECImpl.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/StructuredECImpl.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/StructuredECImpl.java Wed Jan 4 13:19:47 2006
@@ -34,49 +34,49 @@
*/
public abstract class StructuredECImpl extends ExecutionContextImpl implements StructuredEC {
- private StructuredActivity activity;
- private Set executionContextsSet = new HashSet();
+ private StructuredActivity activity;
+ private Set executionContextsSet = new HashSet();
- public StructuredActivity getActivity() {
- return activity;
- }
-
- public void setActivity(StructuredActivity activity) {
- this.activity = activity;
- }
-
- /**
- * Do not use this method, its doesn't maintain activity indexes properly, use
- * the addActivity method instead.
- * @param exectutionContextsSet
- */
- public void setExecutionContextsSet(Set exectutionContextsSet) {
- this.executionContextsSet = exectutionContextsSet;
- }
-
- public Set getExecutionContextsSet() {
- return executionContextsSet;
- }
-
- public List getExecutionContexts() {
- // Making sure the set is ordered before using it to create the List.
- SortedSet sortedSet = new TreeSet(executionContextsSet);
- return new ArrayList(sortedSet);
- }
-
- public void addExecutionContext(ExecutionContext ec) {
- ExecutionContextImpl impl = (ExecutionContextImpl) ec;
- impl.setIndex(nextECIndex());
- getExecutionContextsSet().add(ec);
- impl.setContainer(this);
- }
+ public StructuredActivity getActivity() {
+ return activity;
+ }
+
+ public void setActivity(StructuredActivity activity) {
+ this.activity = activity;
+ }
+
+ /**
+ * Do not use this method, its doesn't maintain activity indexes properly, use
+ * the addActivity method instead.
+ * @param exectutionContextsSet
+ */
+ public void setExecutionContextsSet(Set exectutionContextsSet) {
+ this.executionContextsSet = exectutionContextsSet;
+ }
+
+ public Set getExecutionContextsSet() {
+ return executionContextsSet;
+ }
+
+ public List getExecutionContexts() {
+ // Making sure the set is ordered before using it to create the List.
+ SortedSet sortedSet = new TreeSet(executionContextsSet);
+ return new ArrayList(sortedSet);
+ }
+
+ public void addExecutionContext(ExecutionContext ec) {
+ ExecutionContextImpl impl = (ExecutionContextImpl) ec;
+ impl.setIndex(nextECIndex());
+ getExecutionContextsSet().add(ec);
+ impl.setContainer(this);
+ }
/**
* Returns the origin activity of the passed child execution context.
* @param ec the execution context to get origin activity for
* @return
*/
- public abstract Activity getActivityForChildContext(ExecutionContext ec);
+ public abstract Activity getActivityForChildContext(ExecutionContext ec);
/**
* Returns the execution context created in this structured execution from
@@ -97,45 +97,54 @@
*/
public abstract void notifyTermination(ExecutionContext ec);
- private int nextECIndex() {
- int index = 0;
- for (Iterator ecIterator = getExecutionContextsSet().iterator(); ecIterator.hasNext();) {
- ExecutionContextImpl ecImpl = (ExecutionContextImpl) ecIterator.next();
- if (ecImpl.getIndex() > index)
- index = ecImpl.getIndex();
- }
- return index + 1;
- }
-
- public AuditEntry audit() throws Exception {
- AuditEntry auditEntry = super.audit();
- ExecutionContext executionContext = null;
- List executionContexts = this.getExecutionContexts();
- for (Iterator ecIter = executionContexts.iterator(); ecIter.hasNext();) {
- executionContext = (ExecutionContext) ecIter.next();
- auditEntry.addEntry(executionContext.audit());
- }
- return auditEntry;
- }
-
- public String toString() {
- final StringBuffer buf = new StringBuffer();
- buf.append(super.toString()).append(" ::: ");
- buf.append("StructuredECImpl");
- buf.append("{");
- if (activity != null) {
- buf.append("(ref)activity=" + activity);
- }
- buf.append("}");
-
- buf.append(",childExecContexts=");
- ExecutionContext executionContext = null;
- List executionContexts = this.getExecutionContexts();
- for (Iterator ecIter = executionContexts.iterator(); ecIter.hasNext();) {
- executionContext = (ExecutionContext) ecIter.next();
- buf.append("\n,executionContext=").append(executionContext);
+ public void terminate() {
+ for (Iterator ecIterator = getExecutionContexts().iterator(); ecIterator.hasNext();) {
+ ExecutionContextImpl ecImpl = (ExecutionContextImpl) ecIterator.next();
+ if (ecImpl.getStatus() == ExecutionContext.ACTIVE) {
+ ecImpl.terminate();
+ }
+ }
+ }
+
+ private int nextECIndex() {
+ int index = 0;
+ for (Iterator ecIterator = getExecutionContextsSet().iterator(); ecIterator.hasNext();) {
+ ExecutionContextImpl ecImpl = (ExecutionContextImpl) ecIterator.next();
+ if (ecImpl.getIndex() > index)
+ index = ecImpl.getIndex();
+ }
+ return index + 1;
}
- return buf.toString();
- }
+ public AuditEntry audit() throws Exception {
+ AuditEntry auditEntry = super.audit();
+ ExecutionContext executionContext = null;
+ List executionContexts = this.getExecutionContexts();
+ for (Iterator ecIter = executionContexts.iterator(); ecIter.hasNext();) {
+ executionContext = (ExecutionContext) ecIter.next();
+ auditEntry.addEntry(executionContext.audit());
+ }
+ return auditEntry;
+ }
+
+ public String toString() {
+ final StringBuffer buf = new StringBuffer();
+ buf.append(super.toString()).append(" ::: ");
+ buf.append("StructuredECImpl");
+ buf.append("{");
+ if (activity != null) {
+ buf.append("(ref)activity=" + activity);
+ }
+ buf.append("}");
+
+ buf.append(",childExecContexts=");
+ ExecutionContext executionContext = null;
+ List executionContexts = this.getExecutionContexts();
+ for (Iterator ecIter = executionContexts.iterator(); ecIter.hasNext();) {
+ executionContext = (ExecutionContext) ecIter.next();
+ buf.append("\n,executionContext=").append(executionContext);
+ }
+
+ return buf.toString();
+ }
}
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/dao/ExecutionContextDAO.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/dao/ExecutionContextDAO.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/dao/ExecutionContextDAO.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/dao/ExecutionContextDAO.java Wed Jan 4 13:19:47 2006
@@ -15,7 +15,10 @@
*/
package org.apache.agila.bpel.engine.priv.core.dynamic.impl.dao;
+import java.io.Serializable;
+import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Query;
@@ -23,8 +26,11 @@
import org.apache.agila.bpel.engine.common.persistence.DBSessionException;
import org.apache.agila.bpel.engine.common.persistence.DBSessionManager;
+import org.apache.agila.bpel.engine.common.persistence.DeletionException;
import org.apache.agila.bpel.engine.common.persistence.PersistentDataAccess;
import org.apache.agila.bpel.engine.priv.core.definition.impl.ActivityImpl;
+import org.apache.agila.bpel.engine.priv.core.dynamic.impl.ExecutionContextImpl;
+import org.apache.agila.bpel.engine.priv.core.dynamic.impl.StructuredECImpl;
/**
* Please put some JavaDoc here.
@@ -68,5 +74,34 @@
throw new DBSessionException(e);
}
return ecs;
+ }
+
+ /**
+ * Remove structured execution context's childs execution context, it's own
+ * execution context an refresh the cache
+ *
+ * @param executionContext ec to remove
+ * @throws DeletionException
+ */
+ public static void remove(ExecutionContextImpl executionContext) throws DeletionException {
+ if (executionContext instanceof StructuredECImpl) {
+ StructuredECImpl structuredECImpl = (StructuredECImpl) executionContext;
+ Set executionContexts = structuredECImpl.getExecutionContextsSet();
+ for (Iterator iter = executionContexts.iterator(); iter
+ .hasNext();) {
+ ExecutionContextImpl child = (ExecutionContextImpl) iter.next();
+ remove(child);
+ }
+ structuredECImpl.getActivity().getExecutionContexts().remove(structuredECImpl);
+ try {
+ Serializable activityId = ((ActivityImpl) structuredECImpl.getActivity()).getId();
+ DBSessionManager.getActiveSession().getSessionFactory().evictCollection("org.apache.agila.bpel.engine.priv.core.definition.impl.StructuredActivityImpl.executionContexts", activityId);
+ } catch (HibernateException e) {
+ throw new DeletionException(e);
+ } catch (DBSessionException e) {
+ throw new DeletionException(e);
+ }
+ }
+ PersistentDataAccess.remove(executionContext);
}
}
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/dao/ProcessInstanceDAO.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/dao/ProcessInstanceDAO.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/dao/ProcessInstanceDAO.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/dao/ProcessInstanceDAO.java Wed Jan 4 13:19:47 2006
@@ -15,22 +15,28 @@
*/
package org.apache.agila.bpel.engine.priv.core.dynamic.impl.dao;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Query;
import net.sf.hibernate.Session;
import org.apache.agila.bpel.engine.common.persistence.DBSessionException;
import org.apache.agila.bpel.engine.common.persistence.DBSessionManager;
+import org.apache.agila.bpel.engine.common.persistence.DeletionException;
import org.apache.agila.bpel.engine.common.persistence.FinderException;
import org.apache.agila.bpel.engine.common.persistence.PersistentDataAccess;
-import org.apache.agila.bpel.engine.priv.core.dynamic.ValuedProperty;
+import org.apache.agila.bpel.engine.priv.core.definition.impl.ProcessImpl;
import org.apache.agila.bpel.engine.priv.core.dynamic.ProcessInstance;
+import org.apache.agila.bpel.engine.priv.core.dynamic.ValuedProperty;
+import org.apache.agila.bpel.engine.priv.core.dynamic.impl.ExecutionContextImpl;
import org.apache.agila.bpel.engine.priv.core.dynamic.impl.ProcessInstanceImpl;
+import org.apache.agila.bpel.engine.priv.core.dynamic.impl.ValuedPropertyImpl;
public class ProcessInstanceDAO extends PersistentDataAccess {
@@ -109,7 +115,6 @@
Query byStatus = session.createQuery(FINDBY_STATUS);
byStatus.setParameterList("status", status);
-
instances = byStatus.list();
} catch (net.sf.hibernate.HibernateException e) {
throw new DBSessionException(e);
@@ -120,4 +125,33 @@
public static ProcessInstance findById(Long id) throws FinderException {
return (ProcessInstance) PersistentDataAccess.findById(id, ProcessInstanceImpl.class);
}
+
+
+ /**
+ * deletes a process instance DAO Object and all persistent references permanently
+ * @param processInstance process instance to delete
+ * @throws DeletionException
+ */
+ public static void remove(ProcessInstance processInstance) throws DeletionException {
+ ExecutionContextImpl executionContext = (ExecutionContextImpl) processInstance.getChildExecutionContext();
+ if (executionContext != null) {
+ ExecutionContextDAO.remove(executionContext);
+ }
+ Collection properties = processInstance.getProperties();
+ for (Iterator iter = properties.iterator(); iter
+ .hasNext();) {
+ ValuedPropertyImpl property = (ValuedPropertyImpl) iter.next();
+ PersistentDataAccess.remove(property);
+ }
+
+ PersistentDataAccess.remove(processInstance);
+ try {
+ Serializable processId = ((ProcessImpl) processInstance.getProcess()).getId();
+ DBSessionManager.getActiveSession().getSessionFactory().evictCollection("org.apache.agila.bpel.engine.priv.core.definition.impl.ProcessImpl.instances", processId);
+ } catch (HibernateException e) {
+ throw new DeletionException(e);
+ } catch (DBSessionException e) {
+ throw new DeletionException(e);
+ }
+ }
}
Added: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/AbstractXAO.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/AbstractXAO.java?rev=365997&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/AbstractXAO.java (added)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/AbstractXAO.java Wed Jan 4 13:19:47 2006
@@ -0,0 +1,32 @@
+package org.apache.agila.bpel.engine.priv.core.dynamic.impl.xao;
+
+import org.apache.agila.bpel.engine.common.persistence.XMLDataAccess;
+import org.apache.agila.bpel.engine.common.persistence.XMLSessionException;
+import org.xmldb.api.base.Collection;
+
+public abstract class AbstractXAO extends XMLDataAccess{
+
+ public static final String VARIABLE = "variable";
+ public static final String CORRELATION = "correlation";
+ public static final String ADDRESSING = "addressing";
+
+ protected static Collection initializeCollection(String processName, String collectionName) throws XMLSessionException {
+ // Testing if the process collection already exist (doesn't if first execution)
+ Collection result = getCollection("/" + processName + "/" + collectionName);
+ if (result == null) {
+ Collection processColl = null;
+ try {
+ processColl = getCollection("/" + processName);
+ } catch (XMLSessionException e) { }
+ if (processColl == null) {
+ // When it doesn't exist, creating it
+ Collection rootColl = getRootCollection();
+ processColl = createCollection(rootColl, processName);
+ }
+ result = createCollection(processColl, collectionName);
+ }
+ return result;
+ }
+
+
+}
Added: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/AddressingXAO.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/AddressingXAO.java?rev=365997&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/AddressingXAO.java (added)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/AddressingXAO.java Wed Jan 4 13:19:47 2006
@@ -0,0 +1,65 @@
+package org.apache.agila.bpel.engine.priv.core.dynamic.impl.xao;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.agila.bpel.engine.common.persistence.XMLSessionException;
+import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.xmldb.api.base.Collection;
+
+/**
+ * TODO : s.h. implementation not yet finished
+ * Class responsible for the addressing information
+ *
+ * all asynchronous send messages should write their callback
+ * information to be able to find the target for incoming
+ * messages. The either messageId or correlationSet
+ * will be used for correlation
+ *
+ * <br>
+ * Document format:
+ * <p>
+ * <code>
+ * <addressing> <br>
+ * <msgId> </msgId> <br>
+ * <partner> </partner> <br>
+ * <namespace></namespace> <br>
+ * <port> </port> <br>
+ * <operation></operation> <br>
+ * </addressing>
+ * </code>
+ *
+ *
+ *
+ * @author steffen.horlacher@pansoft.de
+ *
+ */
+public class AddressingXAO extends AbstractXAO {
+
+ public static void createAddressing(String processName,
+ String targetPort, Long instanceId, Map properyValues)
+ throws XMLSessionException {
+
+ Collection correlColl = initializeCollection(processName, ADDRESSING);
+
+ // Preparing the correlation document
+ Document document = DocumentHelper.createDocument();
+ Element root = document.addElement("addressing").addAttribute(
+ "instanceid", "" + instanceId.longValue());
+ for (Iterator propValuesIter = properyValues.keySet().iterator(); propValuesIter
+ .hasNext();) {
+ String property = (String) propValuesIter.next();
+ root
+ .addElement("property")
+ .addAttribute("name", property)
+ .addAttribute("value", (String) properyValues.get(property));
+ }
+
+ // Inserting the document
+ insertDocument(correlColl, targetPort + instanceId.longValue(),
+ document);
+ }
+
+}
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/CorrelationXAO.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/CorrelationXAO.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/CorrelationXAO.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/CorrelationXAO.java Wed Jan 4 13:19:47 2006
@@ -18,34 +18,23 @@
import java.util.Iterator;
import java.util.Map;
+import org.apache.agila.bpel.engine.common.persistence.XMLSessionException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
-import org.apache.agila.bpel.engine.common.persistence.XMLDataAccess;
-import org.apache.agila.bpel.engine.common.persistence.XMLSessionException;
import org.xmldb.api.base.Collection;
/**
* An XML Access Object specialized for correlations.
*/
-public class CorrelationXAO extends XMLDataAccess {
+public class CorrelationXAO extends AbstractXAO {
public static void createCorrelation(String processName, String correlationName, Long instanceId, Map properyValues)
throws XMLSessionException {
-
- Collection correlColl = getCollection("/" + processName + "/correlation/");
- if (correlColl == null) {
- // Testing if the process collection already exist (doesn't if first execution)
- Collection processColl = getCollection("/" + processName + "/");
- if (processColl == null) {
- // When it doesn't exist, creating it
- Collection rootColl = getRootCollection();
- processColl = createCollection(rootColl, processName);
- }
- correlColl = createCollection(processColl, "correlation");
- }
-
- // Preparing the correlation document
+
+ Collection correlColl = initializeCollection(processName,CORRELATION);
+
+ // Preparing the correlation document
Document document = DocumentHelper.createDocument();
Element root = document.addElement("correlation")
.addAttribute("instanceid", ""+instanceId.longValue());
Added: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/PartnerLinkXAO.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/PartnerLinkXAO.java?rev=365997&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/PartnerLinkXAO.java (added)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/PartnerLinkXAO.java Wed Jan 4 13:19:47 2006
@@ -0,0 +1,14 @@
+package org.apache.agila.bpel.engine.priv.core.dynamic.impl.xao;
+
+
+/**
+ * TODO : s.h. implement me
+ *
+ *
+ * @author steffen.horlacher@pansoft.de
+ *
+ */
+public class PartnerLinkXAO extends AbstractXAO {
+
+
+}
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/VariableXAO.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/VariableXAO.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/VariableXAO.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/core/dynamic/impl/xao/VariableXAO.java Wed Jan 4 13:19:47 2006
@@ -20,27 +20,27 @@
import java.util.Map;
import java.util.StringTokenizer;
+import org.apache.agila.bpel.common.util.XMLUtil;
+import org.apache.agila.bpel.engine.common.persistence.FinderException;
+import org.apache.agila.bpel.engine.common.persistence.XMLSessionException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.IllegalAddException;
-import org.dom4j.Node;
import org.dom4j.Namespace;
+import org.dom4j.Node;
import org.dom4j.tree.DefaultElement;
+import org.jaxen.JaxenException;
import org.jaxen.SimpleNamespaceContext;
import org.jaxen.dom4j.Dom4jXPath;
import org.jaxen.expr.DefaultAbsoluteLocationPath;
import org.jaxen.expr.DefaultNameStep;
-import org.apache.agila.bpel.common.util.XMLUtil;
-import org.apache.agila.bpel.engine.common.persistence.FinderException;
-import org.apache.agila.bpel.engine.common.persistence.XMLDataAccess;
-import org.apache.agila.bpel.engine.common.persistence.XMLSessionException;
import org.xmldb.api.base.Collection;
-import org.jaxen.JaxenException;
/**
* An XML Access Object specialized for variable processing.
*/
-public class VariableXAO extends XMLDataAccess {
+public class VariableXAO extends AbstractXAO {
+
public static Document getVariable(String processName, String variableName, Long instanceId) throws XMLSessionException, FinderException {
Document varDoc = getDocument("/" + processName + "/variable", variableName + instanceId.longValue());
@@ -182,7 +182,7 @@
if (!"message".equals(msg.getRootElement().getName())) {
throw new IllegalArgumentException("The provided message element must be named 'message");
}
- Collection varColl = initializeVariableCollection(processName);
+ Collection varColl = initializeCollection(processName,VARIABLE);
// Inserting the document
insertDocument(varColl, variableName + instanceId.longValue(), msg);
@@ -202,7 +202,7 @@
if (part != null && part.length() > 0) {
msgPart = "message/" + msgPart;
}
- Collection processVariables = initializeVariableCollection(processName);
+ Collection processVariables = initializeCollection(processName,VARIABLE);
Document sourceDoc = null;
try {
@@ -315,7 +315,7 @@
if (part != null && part.length() > 0) {
msgPart = "message/" + msgPart;
}
- Collection processVariables = initializeVariableCollection(processName);
+ Collection processVariables = initializeCollection(processName,VARIABLE);
Document sourceDoc = null;
try {
@@ -377,24 +377,6 @@
}
}
- private static Collection initializeVariableCollection(String processName) throws XMLSessionException {
- // Testing if the process collection already exist (doesn't if first execution)
- Collection result = getCollection("/" + processName + "/variable");
- if (result == null) {
- Collection processColl = null;
- try {
- processColl = getCollection("/" + processName);
- } catch (XMLSessionException e) { }
- if (processColl == null) {
- // When it doesn't exist, creating it
- Collection rootColl = getRootCollection();
- processColl = createCollection(rootColl, processName);
- }
- result = createCollection(processColl, "variable");
- }
- return result;
- }
-
/**
* Build a document creating the elements described by the provided part and XPath
* query, placing the provided Node inside the final path.
@@ -612,4 +594,25 @@
if (str.indexOf("[") >= 0) return str.substring(0, str.indexOf("["));
else return str;
}
+
+ /**
+ * removes an process instance variable if it exists
+ *
+ * @param variableName variable to delete
+ * @param collectionName collection of the variable
+ * @param instanceId process instance id
+ * @param processName process name of which the variable is instance of
+ * @throws XMLSessionException
+ */
+ public static void removeProcessDocument(String variableName, String collectionName, Long instanceId, String processName) {
+ try {
+ Collection col = getCollection("/" + processName + "/" + collectionName);
+ if(col != null)
+ {
+ deleteDocumentIfExists(col,variableName + instanceId.longValue());
+ }
+ } catch (XMLSessionException e) {
+ // TODO: failure handling
+ }
+ }
}
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/MessageBroker.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/MessageBroker.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/MessageBroker.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/MessageBroker.java Wed Jan 4 13:19:47 2006
@@ -384,7 +384,7 @@
buf.append(SEPARATOR);
buf.append(operation);
if (message != null) {
- messages.put(buf.toString(), message);
+ messages.put (buf.toString(), message.clone());
} else {
Document nullDoc = DocumentHelper.createDocument();
nullDoc.addElement("null");
Added: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/impl/AddressingWSMessageBroker.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/impl/AddressingWSMessageBroker.java?rev=365997&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/impl/AddressingWSMessageBroker.java (added)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/impl/AddressingWSMessageBroker.java Wed Jan 4 13:19:47 2006
@@ -0,0 +1,493 @@
+package org.apache.agila.bpel.engine.priv.messaging.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.rmi.RemoteException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.wsdl.Binding;
+import javax.wsdl.BindingOperation;
+import javax.wsdl.Definition;
+import javax.wsdl.Service;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.soap.SOAPBinding;
+import javax.wsdl.extensions.soap.SOAPBody;
+import javax.wsdl.extensions.soap.SOAPOperation;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+import javax.xml.namespace.QName;
+import javax.xml.rpc.ServiceException;
+
+import org.apache.agila.bpel.common.configuration.DeployerConfiguration;
+import org.apache.agila.bpel.engine.common.event.EventManager;
+import org.apache.agila.bpel.engine.common.persistence.FinderException;
+import org.apache.agila.bpel.engine.common.persistence.XMLDataAccess;
+import org.apache.agila.bpel.engine.common.persistence.XMLSessionException;
+import org.apache.agila.bpel.engine.exception.EngineRuntimeException;
+import org.apache.agila.bpel.engine.priv.core.definition.Activity;
+import org.apache.agila.bpel.engine.priv.core.definition.AgilaProcess;
+import org.apache.agila.bpel.engine.priv.core.definition.PartnerLink;
+import org.apache.agila.bpel.engine.priv.core.definition.PartnerLinkRole;
+import org.apache.agila.bpel.engine.priv.messaging.FilterException;
+import org.apache.agila.bpel.engine.priv.messaging.InvocationException;
+import org.apache.agila.bpel.engine.priv.messaging.MessageBroker;
+import org.apache.agila.bpel.engine.priv.messaging.MessageFilter;
+import org.apache.axis.MessageContext;
+import org.apache.axis.client.Call;
+import org.apache.axis.message.MessageElement;
+import org.apache.axis.message.SOAPBodyElement;
+import org.apache.axis.message.addressing.AddressingHeaders;
+import org.apache.axis.message.addressing.Constants;
+import org.apache.axis.message.addressing.EndpointReference;
+import org.apache.axis.message.addressing.ReferencePropertiesType;
+import org.apache.axis.server.AxisServer;
+import org.apache.axis.types.URI.MalformedURIException;
+import org.apache.axis.utils.XMLUtils;
+import org.apache.log4j.Logger;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.io.DOMReader;
+import org.dom4j.io.DOMWriter;
+import org.dom4j.io.SAXReader;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import EDU.oswego.cs.dl.util.concurrent.BoundedBuffer;
+import EDU.oswego.cs.dl.util.concurrent.PooledExecutor;
+
+/**
+ * Invokes a web service from a WSDL definition.
+ *
+ * @author mriou
+ * @author norsch
+ * @author chudick
+ */
+public class AddressingWSMessageBroker extends MessageBroker {
+
+ private static Logger log = Logger.getLogger(WSMessageBroker.class);
+
+ /**
+ * @TODO parameterize this
+ */
+
+ private static final String SOAP_NS = "http://schemas.xmlsoap.org/wsdl/soap/";
+
+ private static final String AGILA_NS = "http://www.apache.org/agila";
+
+ private static DOMReader domReader = null;
+
+ private static DOMWriter domWriter = null;
+
+ protected void asyncSend(Activity sender, String partner, String portType, String operation, Document message) {
+ AgilaProcess process = sender.fetchProcess();
+ PartnerLink partnerLink = process.getPartnerLink(partner);
+
+ org.w3c.dom.Document wsdlDoc = getWSDLDesc(process.getNamespace(), process.getName());
+ Definition def = readWSDL(wsdlDoc);
+
+ String wsdlStringDoc = getDOMReader().read(wsdlDoc).asXML();
+ String nameSpaceURI = def.getTargetNamespace();
+ QName serviceName = getService(def, portType);
+ String[] wsdlAdditionalInfo = getWSDLAdditionalInfo(def, portType, operation);
+ String soapAction = wsdlAdditionalInfo[0];
+ String msgNS = null;
+ if (wsdlAdditionalInfo[1] != null && wsdlAdditionalInfo[1].length() > 0) {
+ msgNS = wsdlAdditionalInfo[1];
+ } else {
+ msgNS = nameSpaceURI;
+ }
+ String encoding = wsdlAdditionalInfo[2];
+ String operationStyle = wsdlAdditionalInfo[3];
+ InputStream wsdlDesc = new ByteArrayInputStream(wsdlStringDoc.getBytes());
+
+ Document preparedMsg = prepareMessage(message, operation, msgNS, encoding);
+
+ try {
+ sendMessageAsync(nameSpaceURI, serviceName, portType, operation, soapAction, wsdlDesc, preparedMsg,
+ operationStyle, partnerLink);
+
+ } catch (ServiceException e) {
+ log.error("Could not send message to " + portType + " : " + preparedMsg.asXML(), e);
+ EventManager.fireError(new Exception("Could not send message to " + portType + ". Reason:\n"
+ + (e.getMessage() == null ? "unknown" : e.getMessage()) + "\nMessage:\n" + preparedMsg.asXML()));
+ throw new EngineRuntimeException(e);
+ } catch (RemoteException e) {
+ log.error("Could not send message to " + portType + " : " + preparedMsg.asXML(), e);
+ EventManager.fireError(new Exception("Could not send message to " + portType + ". Reason:\n"
+ + (e.getMessage() == null ? "unknown" : e.getMessage()) + "\nMessage:\n" + preparedMsg.asXML()));
+ throw new EngineRuntimeException(e);
+ }
+ }
+
+ protected void asyncSend(Activity sender, String partner, String namespace, String portType, String operation,
+ Document message) {
+
+ asyncSend(sender, partner, portType, operation, message);
+ }
+
+ protected Document syncSend(Activity sender, String partner, String portType, String operation, Document message) {
+ AgilaProcess process = sender.fetchProcess();
+ org.w3c.dom.Document wsdlDoc = getWSDLDesc(process.getNamespace(), process.getName());
+ Definition def = readWSDL(wsdlDoc);
+
+ String wsdlStringDoc = getDOMReader().read(wsdlDoc).asXML();
+ String nameSpaceURI = def.getTargetNamespace();
+ QName serviceName = getService(def, portType);
+ String[] wsdlAdditionalInfo = getWSDLAdditionalInfo(def, portType, operation);
+ String soapAction = wsdlAdditionalInfo[0];
+ String msgNS = null;
+ if (wsdlAdditionalInfo[1] != null && wsdlAdditionalInfo[1].length() > 0) {
+ msgNS = wsdlAdditionalInfo[1];
+ } else {
+ msgNS = nameSpaceURI;
+ }
+ String encoding = wsdlAdditionalInfo[2];
+ String operationStyle = wsdlAdditionalInfo[3];
+ InputStream wsdlDesc = new ByteArrayInputStream(wsdlStringDoc.getBytes());
+
+ Document preparedMsg = prepareMessage(message, operation, msgNS, encoding);
+
+ Document result = null;
+ try {
+ result = sendMessage(nameSpaceURI, serviceName, portType, operation, soapAction, wsdlDesc, preparedMsg,
+ operationStyle);
+
+ MessageFilter.filterMessage(result);
+
+ result.getRootElement().setName("message");
+ } catch (ServiceException e) {
+ log.error("Could not send message to " + portType + " : " + preparedMsg.asXML(), e);
+ EventManager.fireError(new Exception("Could not send message to " + portType + ". Reason:\n"
+ + (e.getMessage() == null ? "unknown" : e.getMessage()) + "\nMessage:\n" + preparedMsg.asXML()));
+ throw new EngineRuntimeException(e);
+ } catch (RemoteException e) {
+ log.error("Could not send message to " + portType + " : " + preparedMsg.asXML(), e);
+ EventManager.fireError(new Exception("Could not send message to " + portType + ". Reason:\n"
+ + (e.getMessage() == null ? "unknown" : e.getMessage()) + "\nMessage:\n" + preparedMsg.asXML()));
+ throw new EngineRuntimeException(e);
+ } catch (FilterException e) {
+ log.error("Could not send message to " + portType + " : " + preparedMsg.asXML(), e);
+ EventManager.fireError(new Exception("Could not send message to " + portType + ". Reason:\n"
+ + (e.getMessage() == null ? "unknown" : e.getMessage()) + "\nMessage:\n" + preparedMsg.asXML()));
+ throw new EngineRuntimeException(e);
+ }
+ log.debug("Received message : " + result.asXML());
+ return result;
+ }
+
+ protected Document syncSend(Activity sender, String partner, String namespace, String portType, String operation,
+ Document message) {
+ return syncSend(sender, partner, portType, operation, message);
+ }
+
+ private static org.dom4j.Document prepareMessage(Document doc, String elmtName, String namespace, String encoding) {
+ org.dom4j.QName qName = null;
+ if ("literal".equals(encoding)) {
+ qName = org.dom4j.QName.get(elmtName, "", namespace);
+ } else {
+ qName = org.dom4j.QName.get(elmtName, "ns1", namespace);
+ }
+ Document resultDoc = DocumentHelper.createDocument();
+ org.dom4j.Element root = DocumentHelper.createElement(qName);
+ resultDoc.add(root);
+ List elmtList = doc.getRootElement().elements();
+ for (int m = 0; m < elmtList.size(); m++) {
+ org.dom4j.Element detachedElmt = (org.dom4j.Element) ((org.dom4j.Element) elmtList.get(m)).detach();
+ detachedElmt.setQName(org.dom4j.QName.get(detachedElmt.getName(), "", namespace));
+ root.add(detachedElmt);
+ }
+ return resultDoc;
+ }
+
+ private static Definition readWSDL(org.w3c.dom.Document wsdlDesc) {
+ WSDLFactory factory = null;
+ try {
+ factory = WSDLFactory.newInstance();
+ } catch (WSDLException e) {
+ throw new InvocationException("Could not find WSDL factory.", e);
+ }
+ WSDLReader reader = factory.newWSDLReader();
+ reader.setFeature("javax.wsdl.verbose", true);
+ reader.setFeature("javax.wsdl.importDocuments", false);
+
+ Definition def = null;
+ try {
+ def = reader.readWSDL(null, wsdlDesc);
+ } catch (WSDLException e) {
+ throw new InvocationException("Could not read a WSDL document.", e);
+ }
+ return def;
+ }
+
+ private static org.w3c.dom.Document getWSDLDesc(String processNS, String processName) {
+ org.w3c.dom.Document document = null;
+ try {
+ document = XMLDataAccess.getDOMDocument("/process/def", "" + (processNS + processName).hashCode());
+ } catch (XMLSessionException e) {
+ throw new InvocationException(e);
+ } catch (FinderException e) {
+ throw new InvocationException(e);
+ }
+ return document;
+ }
+
+ private static String[] getWSDLAdditionalInfo(Definition def, String portTypeName, String operationName) {
+ Map bindings = def.getBindings();
+ Binding portBinding = null;
+ if (bindings != null) {
+ for (Iterator bindingsIter = bindings.keySet().iterator(); bindingsIter.hasNext();) {
+ QName bindingName = (QName) bindingsIter.next();
+ Binding binding = (Binding) bindings.get(bindingName);
+ if (binding == null) {
+ throw new InvocationException("Service " + def.getTargetNamespace() + " with port " + portTypeName
+ + " doesn't have any " + bindingName + " binding declared.");
+ }
+ if (binding.getPortType().getQName().getLocalPart().equals(portTypeName)) {
+ if (binding.getBindingOperation(operationName, null, null) == null) {
+ throw new InvocationException("Service " + def.getTargetNamespace() + " with port "
+ + portTypeName + " doesn't have the operation " + operationName
+ + " declared in the port binding.");
+ }
+ portBinding = binding;
+ break;
+ }
+ }
+ }
+ if (portBinding == null) {
+ throw new InvocationException("Could not find a binding for port " + portTypeName + " in service "
+ + def.getTargetNamespace());
+ }
+
+ // Extracting operation style (message or rpc)
+ String operationStyle = null;
+ List portBindingExts = portBinding.getExtensibilityElements();
+ for (int m = 0; m < portBindingExts.size(); m++) {
+ ExtensibilityElement extElmt = (ExtensibilityElement) portBindingExts.get(m);
+ if (SOAP_NS.equals(extElmt.getElementType().getNamespaceURI())) {
+ operationStyle = ((SOAPBinding) extElmt).getStyle();
+ }
+ }
+ if (operationStyle == null || (!"rpc".equals(operationStyle) && !"document".equals(operationStyle))) {
+ throw new InvocationException("Could not get the operation style associated with the binding, please "
+ + "make sure that you have a soap:binding element in your binding "
+ + "declaration defining a style (rpc/document)");
+ }
+
+ String soapAction = null;
+ BindingOperation bindingOperation = portBinding.getBindingOperation(operationName, null, null);
+ List extensibilityElmts = bindingOperation.getExtensibilityElements();
+ for (int m = 0; m < extensibilityElmts.size(); m++) {
+ ExtensibilityElement extensibilityElement = (ExtensibilityElement) extensibilityElmts.get(m);
+ if (SOAP_NS.equals(extensibilityElement.getElementType().getNamespaceURI())) {
+ soapAction = ((SOAPOperation) extensibilityElement).getSoapActionURI();
+ break;
+ }
+ }
+
+ String msgUrl = null;
+ String encoding = null;
+ List bindingInputExt = bindingOperation.getBindingInput().getExtensibilityElements();
+ for (int m = 0; m < bindingInputExt.size(); m++) {
+ ExtensibilityElement extensibilityElement = (ExtensibilityElement) bindingInputExt.get(m);
+ extensibilityElement.getElementType().getNamespaceURI();
+ if (SOAP_NS.equals(extensibilityElement.getElementType().getNamespaceURI())) {
+ SOAPBody soapBodyExt = (SOAPBody) extensibilityElement;
+
+ msgUrl = soapBodyExt.getNamespaceURI();
+ encoding = soapBodyExt.getUse();
+ }
+
+ }
+
+ if (soapAction == null) {
+ log.info("No SOAPAction could be found for service " + def.getTargetNamespace() + " no SOAPAction element "
+ + "will be included in the message.");
+ }
+
+ String[] result = new String[4];
+ result[0] = soapAction;
+ result[1] = msgUrl;
+ result[2] = encoding;
+ result[3] = operationStyle;
+
+ return result;
+ }
+
+ private static QName getService(Definition def, String port) {
+ Map services = def.getServices();
+ for (Iterator serviceIter = services.keySet().iterator(); serviceIter.hasNext();) {
+ QName serviceQName = (QName) serviceIter.next();
+ Service service = (Service) services.get(serviceQName);
+ if (service.getPort(port) != null) {
+ return service.getQName();
+ }
+ }
+ throw new InvocationException("No service have been defined for portType " + port);
+ }
+
+ private static Document sendMessage(String nameSpaceURI, QName serviceQName, String portType, String operation,
+ String soapAction, InputStream wsdlDesc, Document sentDoc, String operationStyle) throws ServiceException,
+ RemoteException {
+
+ org.w3c.dom.Document domDoc = getDomDoc(sentDoc);
+
+ Call call = createCall(nameSpaceURI, serviceQName, portType, operation, soapAction, wsdlDesc);
+
+ SOAPBodyElement[] input = setupInput(sentDoc, operationStyle, domDoc);
+
+ Vector results = (Vector) call.invoke(input);
+
+ // TODO (maybe protocol/log it)
+ MessageContext mc = call.getMessageContext();
+ log.info("============= Response ==============");
+ try {
+ XMLUtils.PrettyElementToStream(mc.getResponseMessage().getSOAPEnvelope().getAsDOM(), System.out);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ org.w3c.dom.Document result = null;
+ try {
+ result = ((SOAPBodyElement) results.get(0)).getAsDocument();
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ return getDOMReader().read(result);
+ }
+
+ private static org.w3c.dom.Document getDomDoc(Document sentDoc) throws ServiceException {
+ org.w3c.dom.Document domDoc = null;
+ try {
+ domDoc = getDOMWriter().write(sentDoc);
+ } catch (DocumentException e) {
+ throw new ServiceException(e);
+ }
+ return domDoc;
+ }
+
+ private static Call createCall(String nameSpaceURI, QName serviceQName, String portType, String operation,
+ String soapAction, InputStream wsdlDesc) throws ServiceException {
+ org.apache.axis.client.Service service = new org.apache.axis.client.Service(wsdlDesc, serviceQName);
+ QName portQName = new QName(nameSpaceURI, portType);
+ Call call = (Call) service.createCall(portQName, operation);
+ call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true));
+ if (soapAction != null && soapAction.trim().length() > 0) {
+ call.setProperty(Call.SOAPACTION_URI_PROPERTY, soapAction);
+ }
+ return call;
+ }
+
+ private static SOAPBodyElement[] setupInput(Document sentDoc, String operationStyle, org.w3c.dom.Document domDoc) {
+ SOAPBodyElement[] input;
+ if ("rpc".equals(operationStyle)) {
+ input = new SOAPBodyElement[1];
+ input[0] = new SOAPBodyElement(domDoc.getDocumentElement());
+ } else {
+ input = new SOAPBodyElement[sentDoc.getRootElement().elements().size()];
+ NodeList nodeList = domDoc.getDocumentElement().getChildNodes();
+ int elmtCount = 0;
+ for (int m = 0; m < nodeList.getLength(); m++) {
+ if (nodeList.item(m).getNodeType() == Node.ELEMENT_NODE) {
+ input[elmtCount] = new SOAPBodyElement((Element) nodeList.item(m));
+ }
+ }
+ }
+ return input;
+ }
+
+ private void sendMessageAsync(String nameSpaceURI, QName serviceQName, String portType, String operation,
+ String soapAction, InputStream wsdlDesc, Document sentDoc, String operationStyle, PartnerLink partnerLink)
+ throws ServiceException, RemoteException {
+
+ org.w3c.dom.Document domDoc = null;
+ try {
+ domDoc = getDOMWriter().write(sentDoc);
+ } catch (DocumentException e) {
+ throw new ServiceException(e);
+ }
+
+ Call call = createCall(nameSpaceURI, serviceQName, portType, operation, soapAction, wsdlDesc);
+
+ AxisServer.getCurrentMessageContext();
+
+ SOAPBodyElement[] input = setupInput(sentDoc, operationStyle, domDoc);
+
+ PartnerLinkRole role = partnerLink.getMyRole();
+ if (role != null) {
+
+ AddressingHeaders headers;
+ try {
+ headers = setUpAddressing(partnerLink.getName(), role.getPortType(), "onResult", role.getNamespace());
+ call.setProperty(Constants.ENV_ADDRESSING_REQUEST_HEADERS, headers);
+ } catch (MalformedURIException e1) {
+ log.error("Could not send message to " + portType + " : " + sentDoc.asXML(), e1);
+ EventManager.fireError(new Exception("Could not send message to " + portType + ". Reason:\n"
+ + (e1.getMessage() == null ? "unknown" : e1.getMessage()) + "\nMessage:\n" + sentDoc.asXML()));
+ throw new EngineRuntimeException(e1);
+
+ }
+
+ }
+
+ call.invokeOneWay(input);
+
+ }
+
+ private static DOMReader getDOMReader() {
+ if (domReader == null) {
+ domReader = new DOMReader();
+ }
+ return domReader;
+ }
+
+ private static DOMWriter getDOMWriter() {
+ if (domWriter == null) {
+ domWriter = new DOMWriter();
+ }
+ return domWriter;
+ }
+
+ private static AddressingHeaders setUpAddressing(String callbackPartner, String callbackPort,
+ String callbackOperation, String callbackPortNamespace) throws MalformedURIException {
+
+ String replyToURL = DeployerConfiguration.getAxisUrl();
+ if (!replyToURL.endsWith("/")) {
+ replyToURL += "/";
+ }
+ replyToURL += "services/";
+ replyToURL += "AgilaEngine";
+
+ MessageElement partner = createHeaderElement("partner", callbackPartner);
+ MessageElement port = createHeaderElement("port", callbackPort);
+ MessageElement operation = createHeaderElement("operation", callbackOperation);
+ MessageElement namespace = createHeaderElement("namespace", callbackPortNamespace);
+
+ ReferencePropertiesType refType = new ReferencePropertiesType();
+ refType.set_any(new MessageElement[] { partner, port, operation, namespace });
+
+ EndpointReference replyTo = new EndpointReference(replyToURL);
+ replyTo.setProperties(refType);
+
+ AddressingHeaders headers = new AddressingHeaders();
+ headers.setReplyTo(replyTo);
+
+ return headers;
+ }
+
+ private static MessageElement createHeaderElement(String name, String value) {
+ MessageElement element = new MessageElement();
+ element.setNamespaceURI(AGILA_NS);
+ element.setName(name);
+ element.setValue(value);
+ element.setPrefix("agila");
+ return element;
+ }
+
+}
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/impl/PickECAsReceiveEC.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/impl/PickECAsReceiveEC.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/impl/PickECAsReceiveEC.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/java/org/apache/agila/bpel/engine/priv/messaging/impl/PickECAsReceiveEC.java Wed Jan 4 13:19:47 2006
@@ -65,7 +65,11 @@
public void execute() {
pickEC.execute();
}
-
+
+ public void terminate() {
+ pickEC.terminate();
+ }
+
public AuditEntry audit() throws Exception {
return pickEC.audit();
}
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/agila-configuration.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/agila-configuration.xml?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/agila-configuration.xml (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/agila-configuration.xml Wed Jan 4 13:19:47 2006
@@ -9,7 +9,9 @@
<resource>org.apache.agila.bpel.engine.common.persistence.XMLSessionManager</resource>
</transaction>
<event-listeners>
+ <!--
<listener>org.apache.agila.bpel.engine.common.event.DebuggingListener</listener>
+ -->
</event-listeners>
<tools>
<xindice>
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/hibernate.cfg.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/hibernate.cfg.xml?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/hibernate.cfg.xml (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/hibernate.cfg.xml Wed Jan 4 13:19:47 2006
@@ -45,6 +45,8 @@
<mapping resource="org/apache/agila/bpel/engine/executionevent.hbm.xml"/>
<mapping resource="org/apache/agila/bpel/engine/link.hbm.xml"/>
<mapping resource="org/apache/agila/bpel/engine/messageevent.hbm.xml"/>
+ <mapping resource="org/apache/agila/bpel/engine/partnerlinkrole.hbm.xml"/>
+ <mapping resource="org/apache/agila/bpel/engine/partnerlink.hbm.xml"/>
<mapping resource="org/apache/agila/bpel/engine/process.hbm.xml"/>
<mapping resource="org/apache/agila/bpel/engine/processinstance.hbm.xml"/>
<mapping resource="org/apache/agila/bpel/engine/property.hbm.xml"/>
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/loop-defs.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/loop-defs.xml?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/loop-defs.xml (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/loop-defs.xml Wed Jan 4 13:19:47 2006
@@ -1,8 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="http://www.apache.org/agila/examples/loop/service/"
xmlns:bpel="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
- xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/">
+ xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
+ xmlns:test="http://test.test.de"
+ xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/">
+
<bpel:property name="counterId" type="xsd:string"/>
<bpel:propertyAlias propertyName="counterId" messageType="counterMsg" part="main" query="/counterId"/>
<bpel:propertyAlias propertyName="counterId" messageType="otherMsg" part="main" query="/counterId"/>
+
+ <plnk:partnerLinkType name="loopPartnerLinkType">
+ <plnk:role name="loopService">
+ <plnk:portType name="test:loopPortType" />
+ </plnk:role>
+ </plnk:partnerLinkType>
+
+
+ <plnk:partnerLinkType name="snoopPartnerLinkType">
+ <plnk:role name="snoopService">
+ <plnk:portType name="snoopPortType" />
+ </plnk:role>
+ <plnk:role name="snoopServicePartner">
+ <plnk:portType name="snoopCallbackPortType" />
+ </plnk:role>
+ </plnk:partnerLinkType>
+
</definitions>
Modified: incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/loop.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/loop.xml?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/loop.xml (original)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/loop.xml Wed Jan 4 13:19:47 2006
@@ -11,9 +11,11 @@
<correlationSet name="counterCorrel" properties="def:counterId"/>
</correlationSets>
<partnerLinks>
- <partnerLink name="loopPartner" partnerLinkType="lns:loopPartnerLinkType" myRole="loopService"/>
- </partnerLinks>
+ <partnerLink name="loopPartner" partnerLinkType="def:loopPartnerLinkType" myRole="loopService"/>
+ <partnerLink name="snoopPartner" partnerLinkType="def:snoopPartnerLinkType" myRole="snoopService" partnerRole="snoopServicePartner"/>
+ </partnerLinks>
+
<sequence>
<receive partnerLink="loopPartner" portType="loopPort" operation="loopOp" variable="loopVar" createInstance="yes">
<correlations>
Added: incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate-defs.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate-defs.xml?rev=365997&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate-defs.xml (added)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate-defs.xml Wed Jan 4 13:19:47 2006
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions targetNamespace="http://www.apache.org/agila/test/terminate/service/"
+ xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/">
+
+</definitions>
Added: incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate-msg.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate-msg.xml?rev=365997&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate-msg.xml (added)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate-msg.xml Wed Jan 4 13:19:47 2006
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<agila-msg xmlns="http://www.apache.org/agila/types/message">
+ <partner>admin</partner>
+ <port>requestDocPT</port>
+ <operation>requestDoc</operation>
+ <message>
+ <amount>5000</amount>
+ </message>
+</agila-msg>
Added: incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate.xml?rev=365997&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate.xml (added)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-terminate.xml Wed Jan 4 13:19:47 2006
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<process name="test-wait"
+ targetNamespace="http://www.apache.org/agila/test/terminate/process/"
+ xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
+ xmlns:wsdl="http://www.apache.org/agila/test/terminate/service/"
+ abstractProcess="no">
+
+<partnerLinks>
+ <partnerLink name="admin" partnerLinkType="wsdl:requestDocPLT" myRole="docApprovalService"/>
+</partnerLinks>
+
+<variables>
+ <variable name="someVar" messageType="wsdl:someVarType"/>
+</variables>
+
+<sequence>
+ <receive partnerLink="admin" portType="requestDocPT" operation="requestDoc" variable="someVar" createInstance="yes"/>
+
+ <terminate/>
+
+</sequence>
+</process>
Added: incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait-defs.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait-defs.xml?rev=365997&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait-defs.xml (added)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait-defs.xml Wed Jan 4 13:19:47 2006
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions targetNamespace="http://www.apache.org/agila/test/wait/service/"
+ xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/">
+
+</definitions>
Added: incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait-msg.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait-msg.xml?rev=365997&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait-msg.xml (added)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait-msg.xml Wed Jan 4 13:19:47 2006
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<agila-msg xmlns="http://www.apache.org/agila/types/message">
+ <partner>admin</partner>
+ <port>requestDocPT</port>
+ <operation>requestDoc</operation>
+ <message>
+ <amount>5000</amount>
+ </message>
+</agila-msg>
Added: incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait.xml?rev=365997&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait.xml (added)
+++ incubator/agila/trunk/modules/bpel/engine/core/src/test/resources/test-wait.xml Wed Jan 4 13:19:47 2006
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<process name="test-wait"
+ targetNamespace="http://www.apache.org/agila/test/wait/process/"
+ xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
+ xmlns:wsdl="http://www.apache.org/agila/test/wait/service/"
+ abstractProcess="no">
+
+<partnerLinks>
+ <partnerLink name="admin" partnerLinkType="wsdl:requestDocPLT" myRole="docApprovalService"/>
+</partnerLinks>
+
+<variables>
+ <variable name="someVar" messageType="wsdl:someVarType"/>
+</variables>
+
+<sequence>
+ <receive partnerLink="admin" portType="requestDocPT" operation="requestDoc" variable="someVar" createInstance="yes"/>
+
+ <wait until="2005-05-14T23:45:00+02:00"/>
+
+ <invoke partnerLink="admin" portType="somePort" operation="someOp" inputVariable="someVar"/>
+
+ <pick>
+ <onMessage partnerLink="admin" portType="requestDocPT" operation="requestDoc" variable="someVar">
+ <invoke partnerLink="admin" portType="somePort" operation="someOp" inputVariable="someVar"/>
+ </onMessage>
+ <onAlarm until="2005-05-14T23:45:30+02:00">
+ <invoke partnerLink="admin" portType="somePort" operation="someOp" inputVariable="someVar"/>
+ </onAlarm>
+ </pick>
+
+</sequence>
+</process>
Modified: incubator/agila/trunk/modules/bpel/engine/deployer/src/java/org/apache/agila/bpel/deployer/priv/AgilaDeployerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpel/engine/deployer/src/java/org/apache/agila/bpel/deployer/priv/AgilaDeployerImpl.java?rev=365997&r1=365996&r2=365997&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpel/engine/deployer/src/java/org/apache/agila/bpel/deployer/priv/AgilaDeployerImpl.java (original)
+++ incubator/agila/trunk/modules/bpel/engine/deployer/src/java/org/apache/agila/bpel/deployer/priv/AgilaDeployerImpl.java Wed Jan 4 13:19:47 2006
@@ -23,7 +23,6 @@
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
-import java.util.ArrayList;
import org.apache.axis.client.AdminClient;
import org.apache.axis.utils.Options;
@@ -49,11 +48,13 @@
import org.apache.agila.bpel.engine.common.persistence.XMLDataAccess;
import org.apache.agila.bpel.engine.common.transaction.TransactionException;
import org.apache.agila.bpel.engine.common.transaction.TransactionManager;
+import org.apache.agila.bpel.engine.priv.core.definition.PartnerLinkRole;
import org.apache.agila.bpel.engine.priv.core.definition.ProcessFactory;
import org.apache.agila.bpel.engine.priv.core.definition.Property;
import org.apache.agila.bpel.engine.priv.core.definition.AgilaProcess;
import org.apache.agila.bpel.engine.priv.AgilaEngineAdminImpl;
+
import org.xmldb.api.base.Collection;
/**
@@ -113,7 +114,7 @@
*/
public class AgilaDeployerImpl implements AgilaDeployer {
- public static final String NS_SEPARATOR = ":";
+
public static final String SPACE = " ";
public static final String XMLNS = "xmlns";
public static final String DEFINITIONS = "definitions";
@@ -121,6 +122,7 @@
private Logger log = Logger.getLogger(AgilaDeployerImpl.class);
private static final String TILD = "~";
private static final String BPEL_NS = "http://schemas.xmlsoap.org/ws/2003/03/business-process/";
+ private static final String PLNK_NS = "http://schemas.xmlsoap.org/ws/2003/05/partner-link/";
private WSDLValidator wsdlValidator = null;
private BPELValidator bpelValidator = null;
@@ -362,8 +364,7 @@
deployDefinitions(defDoc, tp);
deployVariables(processElement.element("variables"), tp);
deployCorrelationSets(processElement.element("correlationSets"), tp);
-
- // todo implements 'partnerLinks' elements
+ deployPartnerLinks(processElement.element("partnerLinks"), defDoc, tp);
// todo implements 'partners' elements
// todo implements 'faultHandlers' elements
// todo implements 'compensationHandlers' elements
@@ -390,7 +391,9 @@
}
}
- private void saveProcess(Document processDoc, Document defDoc, String processName) throws DeploymentException {
+
+
+ private void saveProcess(Document processDoc, Document defDoc, String processName) throws DeploymentException {
try {
Collection processColl = XMLDataAccess.getCollection("/process");
Collection processDefColl = XMLDataAccess.getCollection("/process/def");
@@ -615,12 +618,159 @@
}
}
}
+
+ /**
+ * Deployment of the PartnerLink element
+ * <p/>
+ * <partnerLink name="ncname" partnerLinkType="qname"
+ * myRole="ncname"? partnerRole="ncname"?>+
+ * </partnerLink>
+ *
+ * @param element the partnerLinks DOM element.
+ * @param wsdlDoc the WSDL Document
+ * @param tp the parent process
+ * @throws DeploymentException
+ */
+ private void deployPartnerLinks(Element element, Document wsdlDoc, AgilaProcess tp) throws DeploymentException{
+ try{
+ if(element != null)
+ {
+ for (Iterator partnerLinkIter = element.elementIterator("partnerLink"); partnerLinkIter.hasNext();) {
+ Element partnerLinkElement = (Element) partnerLinkIter.next();
+ String name = partnerLinkElement.valueOf("@name");
+ String partnerLinkType = partnerLinkElement.valueOf("@partnerLinkType");
+ String myRole = partnerLinkElement.valueOf("@myRole");
+ String partnerRole = partnerLinkElement.valueOf("@partnerRole");
+
+ // plnkType namespace from bpel file
+ String partnerLinkTypeNS = NSUtil.findAsQname(partnerLinkType,partnerLinkElement).getNamespaceURI();
+
+ partnerLinkType = NSUtil.extractElementName(partnerLinkType);
+ HashMap nsMap = new HashMap(1);
+ nsMap.put("plnk", PLNK_NS);
+
+ PartnerLinkRole myRoleObj = null;
+ PartnerLinkRole partnerRoleObj = null;
+ Namespace plnk = new Namespace("plnk",PLNK_NS);
+ Iterator plnkTypeIterator = wsdlDoc.getRootElement().elementIterator(new QName("partnerLinkType",plnk));
+ Element partnerLinkTypeElement = null;
+ for (Iterator iter = plnkTypeIterator; iter.hasNext();) {
+ Element plnkType = (Element) iter.next();
+ if(plnkType.valueOf("@name").equals(partnerLinkType))
+ {
+ // TODO: s.h. test namespace of name attribute to match with bpel file
+ partnerLinkTypeElement = plnkType;
+ break;
+ }
+
+ }
+
+ if(partnerLinkElement != null)
+ {
+ QName myRoleQname = null;
+
+ if(myRole != null && !"".equalsIgnoreCase(myRole))
+ {
+ Element myRolePortTypeElement = null;
+ for (Iterator iter = partnerLinkTypeElement.elementIterator(new QName("role",plnk)); iter.hasNext();) {
+ Element role = (Element) iter.next();
+ if(role.valueOf("@name").equals(myRole))
+ {
+ myRolePortTypeElement = role.element(new QName("portType",plnk));
+ String myRolePortType = myRolePortTypeElement.valueOf("@name");
+ myRoleQname = NSUtil.findAsQname(myRolePortType,myRolePortTypeElement);
+ break;
+ }
+ }
+ myRoleObj = ProcessFactory.addPartnerLinkRole(myRole,myRoleQname.getName(),myRoleQname.getNamespaceURI());
+ }
+
+ if(partnerRole != null && !"".equalsIgnoreCase(partnerRole))
+ {
+ QName pRoleQname = null;
+
+ Element partnerRolePortTypeElement = null;
+ for (Iterator iter = partnerLinkTypeElement.elementIterator(new QName("role",plnk)); iter.hasNext();) {
+ Element role = (Element) iter.next();
+ if(role.valueOf("@name").equals(partnerRole))
+ {
+ partnerRolePortTypeElement = role.element(new QName("portType",plnk));
+ String partnerRolePortType = partnerRolePortTypeElement.valueOf("@name");
+ pRoleQname = NSUtil.findAsQname(partnerRolePortType,partnerRolePortTypeElement);
+ break;
+ }
+
+ }
+ partnerRoleObj = ProcessFactory.addPartnerLinkRole(partnerRole,pRoleQname.getName(),pRoleQname.getNamespaceURI());
+ }
+
+
+ }else
+ {
+ throw new DeploymentException("partnerLinkType element not found in WSDL. Definition in BPEL: " + partnerLinkTypeNS + ":" + partnerLinkType);
+ }
+
+ ProcessFactory.addPartnerLink(tp,name,partnerLinkType,myRoleObj,partnerRoleObj);
+
+
+
+ }
+ }
+ }catch(Exception e)
+ {
+ throw new DeploymentException(e);
+ }
+ }
+
+//
+//
+// Element rootElement = wsdlDoc.element("correlationSets").getRootElement();
+// Iterator propertyAlias = rootElement.elementIterator("propertyAlias");
+// Map addedProperty = new HashMap();
+// try {
+// while (propertyAlias.hasNext()) {
+// Element e = (Element) propertyAlias.next();
+// String propertyName = e.valueOf("@propertyName");
+//
+// XPath xpathSelector = DocumentHelper.createXPath("//*/defaultNS:property[@name=\"" + propertyName + "\"]");
+// HashMap nsMap = new HashMap(1);
+// nsMap.put("defaultNS", BPEL_NS);
+// xpathSelector.setNamespaceURIs(nsMap);
+// Node propNode = xpathSelector.selectSingleNode(doc);
+//
+// Property prop = (Property) addedProperty.get(propertyName);
+// if (propNode != null && prop == null) {
+// prop = ProcessFactory.addProperty(tp,
+// propertyName, propNode.valueOf("@type"));
+// addedProperty.put(propertyName, prop);
+// }
+// if (prop != null) {
+// ProcessFactory.addPropertyAlias(prop, e.valueOf("@messageType"),
+// e.valueOf("@part"), e.valueOf("@query"));
+// } else {
+// log.error("A propertyAlias is defined without property : " + propertyName);
+// throw new DeploymentException("a propertyAlias is defined without property : " + propertyName);
+// }
+// }
+// Iterator properties = rootElement.elementIterator("property");
+// while (properties.hasNext()) {
+// Element e = (Element) properties.next();
+// String name = e.valueOf("@name");
+// if (addedProperty.containsKey(name) == false) {
+// ProcessFactory.addProperty(tp, name, e.valueOf("@type"));
+// }
+// }
+// } catch (Exception e) {
+// throw new DeploymentException(e);
+// }
+
+
private String truncNamespace(String nsProps) {
StringBuffer properties = new StringBuffer();
for (StringTokenizer nsTokenizer = new StringTokenizer(nsProps); nsTokenizer.hasMoreTokens();) {
String nsProp = nsTokenizer.nextToken();
- int index = nsProp.lastIndexOf(NS_SEPARATOR);
+ int index = nsProp.lastIndexOf(NSUtil.NS_SEPARATOR);
properties.append(nsProp.substring(index + 1));
if (nsTokenizer.hasMoreTokens()) {
properties.append(SPACE);