You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ms...@apache.org on 2007/01/03 06:19:42 UTC
svn commit: r492044 - in
/incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel:
engine/BpelProcess.java runtime/InvalidContextException.java
runtime/InvalidProcessException.java runtime/PICK.java
Author: mszefler
Date: Tue Jan 2 21:19:40 2007
New Revision: 492044
URL: http://svn.apache.org/viewvc?view=rev&rev=492044
Log:
Runtime sanity checks.
Added:
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidContextException.java
Modified:
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/PICK.java
Modified: incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
URL: http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java?view=diff&rev=492044&r1=492043&r2=492044
==============================================================================
--- incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java (original)
+++ incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java Tue Jan 2 21:19:40 2007
@@ -398,7 +398,7 @@
mex.setFailure(FailureType.UNKNOWN_OPERATION, mex.getOperationName(), null);
return;
}
-
+
mex.getDAO().setPartnerLinkModelId(_plinkDef.getId());
mex.setPortOp(_plinkDef.myRolePortType, operation);
mex.setPattern(operation.getOutput() == null ? MessageExchangePattern.REQUEST_ONLY
Added: incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidContextException.java
URL: http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidContextException.java?view=auto&rev=492044
==============================================================================
--- incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidContextException.java (added)
+++ incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidContextException.java Tue Jan 2 21:19:40 2007
@@ -0,0 +1,31 @@
+package org.apache.ode.bpel.runtime;
+
+/**
+ * Exception used by the runtime to indicate a problem with the execution context. This
+ * is for dealing with conditions where the runtime expects certain things of the context
+ * and the context does not oblige. These are what one might call "internal errors", for
+ * example if a message is received and it does not have the required parts, this execption
+ * is thrown, since the runtime expects received messages to be of the correct form.
+ *
+ * @author Maciej Szefler - m s z e f l e r @ g m a i l . c o m
+ *
+ */
+public class InvalidContextException extends RuntimeException {
+
+ public InvalidContextException() {
+ super();
+ }
+
+ public InvalidContextException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public InvalidContextException(String message) {
+ super(message);
+ }
+
+ public InvalidContextException(Throwable cause) {
+ super(cause);
+ }
+
+}
Modified: incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java
URL: http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java?view=diff&rev=492044&r1=492043&r2=492044
==============================================================================
--- incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java (original)
+++ incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java Tue Jan 2 21:19:40 2007
@@ -21,52 +21,54 @@
/**
* A run-time exception indicating that the process is invalid. This should not
* normally occur: that is, a process should be found to be invalid before it is
- * executed. Therefore, this can be viewed as a rather rare and serious condition.
+ * executed. Therefore, this can be viewed as a rather rare and serious
+ * condition.
*/
public class InvalidProcessException extends RuntimeException {
private static final long serialVersionUID = 9184731070635430159L;
-
- public final static int DEFAULT_CAUSE_CODE = 0;
- public final static int RETIRED_CAUSE_CODE = 1;
-
- private final int causeCode;
-
- public InvalidProcessException(String msg, Throwable cause) {
- super(msg,cause);
- this.causeCode = DEFAULT_CAUSE_CODE;
- }
-
- public InvalidProcessException(String msg) {
- super(msg);
- this.causeCode = DEFAULT_CAUSE_CODE;
- }
-
- public InvalidProcessException(Exception cause) {
- super(cause);
- this.causeCode = DEFAULT_CAUSE_CODE;
- }
-
- /**
- * @param causeCode
- */
- public InvalidProcessException(final int causeCode) {
- super();
- this.causeCode = causeCode;
- }
-
- /**
- * @param message
- * @param causeCode
- */
- public InvalidProcessException(String message, final int causeCode) {
- super(message);
- this.causeCode = causeCode;
- }
-
- /**
- * @return the cause code
- */
- public int getCauseCode() {
- return causeCode;
- }
+
+ public final static int DEFAULT_CAUSE_CODE = 0;
+
+ public final static int RETIRED_CAUSE_CODE = 1;
+
+ private final int causeCode;
+
+ public InvalidProcessException(String msg, Throwable cause) {
+ super(msg, cause);
+ this.causeCode = DEFAULT_CAUSE_CODE;
+ }
+
+ public InvalidProcessException(String msg) {
+ super(msg);
+ this.causeCode = DEFAULT_CAUSE_CODE;
+ }
+
+ public InvalidProcessException(Exception cause) {
+ super(cause);
+ this.causeCode = DEFAULT_CAUSE_CODE;
+ }
+
+ /**
+ * @param causeCode
+ */
+ public InvalidProcessException(final int causeCode) {
+ super();
+ this.causeCode = causeCode;
+ }
+
+ /**
+ * @param message
+ * @param causeCode
+ */
+ public InvalidProcessException(String message, final int causeCode) {
+ super(message);
+ this.causeCode = causeCode;
+ }
+
+ /**
+ * @return the cause code
+ */
+ public int getCauseCode() {
+ return causeCode;
+ }
}
Modified: incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/PICK.java
URL: http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/PICK.java?view=diff&rev=492044&r1=492043&r2=492044
==============================================================================
--- incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/PICK.java (original)
+++ incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/PICK.java Tue Jan 2 21:19:40 2007
@@ -23,8 +23,12 @@
import org.apache.ode.bpel.common.CorrelationKey;
import org.apache.ode.bpel.common.FaultException;
import org.apache.ode.bpel.explang.EvaluationException;
+import org.apache.ode.bpel.o.OElementVarType;
+import org.apache.ode.bpel.o.OMessageVarType;
import org.apache.ode.bpel.o.OPickReceive;
import org.apache.ode.bpel.o.OScope;
+import org.apache.ode.bpel.o.OXsdTypeVarType;
+import org.apache.ode.bpel.o.OMessageVarType.Part;
import org.apache.ode.bpel.runtime.channels.FaultData;
import org.apache.ode.bpel.runtime.channels.PickResponseChannel;
import org.apache.ode.bpel.runtime.channels.PickResponseChannelListener;
@@ -34,9 +38,13 @@
import org.w3c.dom.Element;
import org.w3c.dom.Node;
+import com.sun.org.apache.xalan.internal.xsltc.DOM;
+
import java.util.Calendar;
+import java.util.Collection;
import java.util.Date;
+import javax.xml.namespace.QName;
/**
* Template for the BPEL <code>pick</code> activity.
@@ -54,10 +62,9 @@
public PICK(ActivityInfo self, ScopeFrame scopeFrame, LinkFrame linkFrame) {
super(self, scopeFrame, linkFrame);
- _opick= (OPickReceive) self.o;
+ _opick = (OPickReceive) self.o;
}
-
/**
* @see org.apache.ode.jacob.JacobRunnable#run()
*/
@@ -70,18 +77,23 @@
selectors = new Selector[_opick.onMessages.size()];
int idx = 0;
for (OPickReceive.OnMessage onMessage : _opick.onMessages) {
- CorrelationKey key = null; // this will be the case for the createInstance activity
+ CorrelationKey key = null; // this will be the case for the
+ // createInstance activity
PartnerLinkInstance pLinkInstance = _scopeFrame.resolve(onMessage.partnerLink);
if (onMessage.matchCorrelation == null && !_opick.createInstanceFlag) {
- // Adding a route for opaque correlation. In this case, correlation is on "out-of-band" session-id
+ // Adding a route for opaque correlation. In this case,
+ // correlation is on "out-of-band" session-id
String sessionId = getBpelRuntimeContext().fetchMySessionId(pLinkInstance);
- key = new CorrelationKey(-1, new String[]{sessionId});
+ key = new CorrelationKey(-1, new String[] { sessionId });
} else if (onMessage.matchCorrelation != null) {
- if (!getBpelRuntimeContext().isCorrelationInitialized(_scopeFrame.resolve(onMessage.matchCorrelation))) {
- // the following should really test if this is a "join" type correlation...
+ if (!getBpelRuntimeContext().isCorrelationInitialized(
+ _scopeFrame.resolve(onMessage.matchCorrelation))) {
+ // the following should really test if this is a "join"
+ // type correlation...
if (!_opick.createInstanceFlag)
- throw new FaultException(_opick.getOwner().constants.qnCorrelationViolation, "Correlation not initialized.");
+ throw new FaultException(_opick.getOwner().constants.qnCorrelationViolation,
+ "Correlation not initialized.");
} else {
key = getBpelRuntimeContext().readCorrelation(_scopeFrame.resolve(onMessage.matchCorrelation));
@@ -90,24 +102,25 @@
}
}
- selectors[idx] = new Selector(idx, pLinkInstance, onMessage.operation.getName(), onMessage.operation.getOutput() == null, onMessage.messageExchangeId, key);
+ selectors[idx] = new Selector(idx, pLinkInstance, onMessage.operation.getName(), onMessage.operation
+ .getOutput() == null, onMessage.messageExchangeId, key);
idx++;
}
timeout = null;
for (OPickReceive.OnAlarm onAlarm : _opick.onAlarms) {
- Date dt = onAlarm.forExpr != null
- ? offsetFromNow(getBpelRuntimeContext().getExpLangRuntime().evaluateAsDuration(onAlarm.forExpr, getEvaluationContext()))
- : getBpelRuntimeContext().getExpLangRuntime().evaluateAsDate(onAlarm.untilExpr, getEvaluationContext()).getTime();
+ Date dt = onAlarm.forExpr != null ? offsetFromNow(getBpelRuntimeContext().getExpLangRuntime()
+ .evaluateAsDuration(onAlarm.forExpr, getEvaluationContext())) : getBpelRuntimeContext()
+ .getExpLangRuntime().evaluateAsDate(onAlarm.untilExpr, getEvaluationContext()).getTime();
if (timeout == null || timeout.compareTo(dt) > 0) {
timeout = dt;
_alarm = onAlarm;
}
}
getBpelRuntimeContext().select(pickResponseChannel, timeout, _opick.createInstanceFlag, selectors);
- } catch(FaultException e){
+ } catch (FaultException e) {
__log.error(e);
- FaultData fault = createFault(e.getQName(), _opick,e.getMessage());
+ FaultData fault = createFault(e.getQName(), _opick, e.getMessage());
dpe(_opick.outgoingLinks);
_self.parent.completed(fault, CompensationHandler.emptySet());
return;
@@ -129,7 +142,9 @@
/**
* Calculate a duration offset from right now.
- * @param duration the offset
+ *
+ * @param duration
+ * the offset
* @return the resulting date.
*/
private static Date offsetFromNow(Duration duration) {
@@ -138,6 +153,66 @@
return cal.getTime();
}
+ @SuppressWarnings("unchecked")
+ private void initVariable(String mexId, OPickReceive.OnMessage onMessage) {
+ // This is allowed, if there is no parts in the message for example.
+ if (onMessage.variable == null)
+ return;
+
+ Element msgEl = getBpelRuntimeContext().getMyRequest(mexId);
+ Collection<String> partNames = (Collection<String>) onMessage.operation.getInput().getMessage().getParts()
+ .keySet();
+
+ // Let's do some sanity checks here so that we don't get weird errors in assignment later.
+ // The engine should have checked to make sure that the messages that are delivered conform
+ // to the correct format; but you know what they say, don't trust anyone.
+ if (!(onMessage.variable.type instanceof OMessageVarType)) {
+ String errmsg = "Non-message variable for receive: should have been picked up by static analysis.";
+ __log.fatal(errmsg);
+ throw new InvalidProcessException(errmsg);
+ }
+
+ OMessageVarType vartype = (OMessageVarType) onMessage.variable.type;
+
+ // Check that each part contains what we expect.
+ for (String pName : partNames) {
+ QName partName = new QName(null, pName);
+ Element msgPart = DOMUtils.findChildByName(msgEl, partName);
+ Part part = vartype.parts.get(pName);
+ if (part == null) {
+ String errmsg = "Inconsistent WSDL, part " + pName + " not found in message type " + vartype.messageType;
+ __log.fatal(errmsg);
+ throw new InvalidProcessException(errmsg);
+ }
+ if (msgPart == null) {
+ String errmsg = "Message missing part: " + msgPart;
+ __log.fatal(errmsg);
+ throw new InvalidContextException(errmsg);
+ }
+
+ if (part.type instanceof OElementVarType) {
+ OElementVarType ptype = (OElementVarType) part.type;
+ Element e = DOMUtils.getFirstChildElement(msgPart);
+ if (e == null) {
+ String errmsg = "Message (element) part " + pName + " did not contain child element.";
+ __log.fatal(errmsg);
+ throw new InvalidContextException(errmsg);
+ }
+
+ QName qn = new QName(e.getNamespaceURI(), e.getLocalName());
+ if(!qn.equals(ptype.elementType)) {
+ String errmsg = "Message (element) part " + pName + " did not contain correct child element: expected "
+ + ptype.elementType + " but got " + qn;
+ __log.fatal(errmsg);
+ throw new InvalidContextException(errmsg);
+ }
+ }
+
+ }
+
+ getBpelRuntimeContext().initializeVariable(_scopeFrame.resolve(onMessage.variable), msgEl);
+
+ }
private class WAITING extends BpelJacobRunnable {
private static final long serialVersionUID = 1L;
@@ -169,22 +244,18 @@
}
FaultData fault;
- Element msgEl = getBpelRuntimeContext().getMyRequest(mexId);
- try {
- getBpelRuntimeContext().initializeVariable(_scopeFrame.resolve(onMessage.variable),msgEl);
- } catch (Exception ex) {
- __log.error(ex);
- throw new RuntimeException(ex);
- }
+ initVariable(mexId, onMessage);
try {
for (OScope.CorrelationSet cset : onMessage.initCorrelations) {
initializeCorrelation(_scopeFrame.resolve(cset), _scopeFrame.resolve(onMessage.variable));
}
if (onMessage.partnerLink.hasPartnerRole()) {
- // Trying to initialize partner epr based on a message-provided epr/session.
+ // Trying to initialize partner epr based on a
+ // message-provided epr/session.
- if (!getBpelRuntimeContext().isPartnerRoleEndpointInitialized(_scopeFrame
- .resolve(onMessage.partnerLink)) || !onMessage.partnerLink.initializePartnerRole) {
+ if (!getBpelRuntimeContext().isPartnerRoleEndpointInitialized(
+ _scopeFrame.resolve(onMessage.partnerLink))
+ || !onMessage.partnerLink.initializePartnerRole) {
Node fromEpr = getBpelRuntimeContext().getSourceEPR(mexId);
if (fromEpr != null) {
@@ -198,8 +269,8 @@
String partnersSessionId = getBpelRuntimeContext().getSourceSessionId(mexId);
if (partnersSessionId != null)
- getBpelRuntimeContext().initializePartnersSessionId(_scopeFrame.resolve(onMessage.partnerLink),
- partnersSessionId);
+ getBpelRuntimeContext().initializePartnersSessionId(
+ _scopeFrame.resolve(onMessage.partnerLink), partnersSessionId);
}
} catch (FaultException e) {
@@ -211,22 +282,25 @@
}
// load 'onMessage' activity
- // Because we are done with all the DPE, we can simply re-use our control
+ // Because we are done with all the DPE, we can simply
+ // re-use our control
// channels for the child.
ActivityInfo child = new ActivityInfo(genMonotonic(), onMessage.activity, _self.self, _self.parent);
- instance(createChild(child,_scopeFrame,_linkFrame));
+ instance(createChild(child, _scopeFrame, _linkFrame));
}
public void onTimeout() {
- // Dead path all the onMessage activiites (the other alarms have already been DPE'ed)
+ // Dead path all the onMessage activiites (the other alarms
+ // have already been DPE'ed)
for (OPickReceive.OnMessage onMessage : _opick.onMessages) {
dpe(onMessage.activity);
}
- // Because we are done with all the DPE, we can simply re-use our control
+ // Because we are done with all the DPE, we can simply
+ // re-use our control
// channels for the child.
ActivityInfo child = new ActivityInfo(genMonotonic(), _alarm.activity, _self.self, _self.parent);
- instance(createChild(child,_scopeFrame,_linkFrame));
+ instance(createChild(child, _scopeFrame, _linkFrame));
}
public void onCancel() {