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 2008/01/04 15:19:47 UTC
svn commit: r608847 [1/2] - in /ode/branches/APACHE_ODE_1.1:
bpel-api/src/main/java/org/apche/ode/bpel/evar/
bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/
bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/
bpel-obj/src/main/java/...
Author: mszefler
Date: Fri Jan 4 06:19:42 2008
New Revision: 608847
URL: http://svn.apache.org/viewvc?rev=608847&view=rev
Log:
External variable re-jiggering. Used related-to variables.
Added:
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/ExternalVariableKeyMapSerializer.java (with props)
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/RowSubset.java (with props)
ode/branches/APACHE_ODE_1.1/bpel-test/src/test/java/org/apache/ode/test/ExternalVariableTest.java (with props)
Removed:
ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtVarKeyMapping.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/extvar/ExternalVariableKeyMapSerializer.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/evar/
Modified:
ode/branches/APACHE_ODE_1.1/bpel-api/src/main/java/org/apche/ode/bpel/evar/ExternalVariableModule.java
ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java
ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/CommonCompilationMessages.java
ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/BpelObjectFactory.java
ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java
ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/Variable.java
ode/branches/APACHE_ODE_1.1/bpel-obj/src/main/java/org/apache/ode/bpel/o/OExtVar.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/extvar/ExternalVariableManager.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/DbExternalVariable.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/JdbcExternalVariableModule.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ACTIVITY.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ACTIVITYGUARD.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EH_EVENT.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EventContextImpl.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ExprEvaluationContextImpl.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/FOREACH.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/INVOKE.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/PICK.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/REPLY.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/SCOPE.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ScopeFrame.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/THROW.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/test/java/org/apache/ode/bpel/extvar/jdbc/JdbcExternalVariableEngineTest.java
ode/branches/APACHE_ODE_1.1/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/CoreBpelTest.java
ode/branches/APACHE_ODE_1.1/bpel-test/src/test/resources/bpel/2.0/ExtVar/HelloWorld2.bpel
Modified: ode/branches/APACHE_ODE_1.1/bpel-api/src/main/java/org/apche/ode/bpel/evar/ExternalVariableModule.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-api/src/main/java/org/apche/ode/bpel/evar/ExternalVariableModule.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-api/src/main/java/org/apche/ode/bpel/evar/ExternalVariableModule.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-api/src/main/java/org/apche/ode/bpel/evar/ExternalVariableModule.java Fri Jan 4 06:19:42 2008
@@ -1,8 +1,6 @@
package org.apche.ode.bpel.evar;
import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
import javax.xml.namespace.QName;
@@ -83,7 +81,7 @@
* @author Maciej Szefler <mszefler at gmail dot com>
*
*/
- public class Locator extends HashMap<String, String>{
+ public class Locator {
private static final long serialVersionUID = 1L;
@@ -94,16 +92,19 @@
/** Process identifier. */
public final QName pid;
+
+ /** External-variable module-specific identifying information. */
+ public Node reference;
public Locator(String varId, QName pid, Long iid) {
+ this(varId, pid, iid, null);
+ }
+
+ public Locator(String varId, QName pid, Long iid, Node reference) {
this.varId = varId;
this.pid = pid;
this.iid = iid;
- }
-
- public Locator(String varId, QName pid, Long iid, Map<String,String> keys) {
- this(varId,pid,iid);
- putAll(keys);
+ this.reference = reference;
}
}
Modified: ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java Fri Jan 4 06:19:42 2008
@@ -18,6 +18,29 @@
*/
package org.apache.ode.bpel.compiler;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Stack;
+
+import javax.wsdl.Definition;
+import javax.wsdl.Message;
+import javax.wsdl.Operation;
+import javax.wsdl.Part;
+import javax.wsdl.PortType;
+import javax.wsdl.WSDLException;
+import javax.wsdl.xml.WSDLReader;
+import javax.xml.namespace.QName;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ode.bpel.compiler.api.CompilationException;
@@ -36,7 +59,6 @@
import org.apache.ode.bpel.compiler.bom.CorrelationSet;
import org.apache.ode.bpel.compiler.bom.Expression;
import org.apache.ode.bpel.compiler.bom.Expression11;
-import org.apache.ode.bpel.compiler.bom.ExtVarKeyMapping;
import org.apache.ode.bpel.compiler.bom.FaultHandler;
import org.apache.ode.bpel.compiler.bom.Import;
import org.apache.ode.bpel.compiler.bom.LinkSource;
@@ -86,39 +108,16 @@
import org.apache.ode.utils.GUID;
import org.apache.ode.utils.NSContext;
import org.apache.ode.utils.StreamUtils;
-import org.apache.ode.utils.xsd.XSUtils;
-import org.apache.ode.utils.xsd.XsdException;
import org.apache.ode.utils.fs.FileUtils;
import org.apache.ode.utils.msg.MessageBundle;
import org.apache.ode.utils.stl.CollectionsX;
import org.apache.ode.utils.stl.MemberOfFunction;
import org.apache.ode.utils.stl.UnaryFunction;
+import org.apache.ode.utils.xsd.XSUtils;
+import org.apache.ode.utils.xsd.XsdException;
import org.apache.xerces.xni.parser.XMLEntityResolver;
-import org.w3c.dom.Element;
import org.w3c.dom.Node;
-import javax.wsdl.Definition;
-import javax.wsdl.Message;
-import javax.wsdl.Operation;
-import javax.wsdl.Part;
-import javax.wsdl.PortType;
-import javax.wsdl.WSDLException;
-import javax.wsdl.xml.WSDLReader;
-import javax.xml.namespace.QName;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
/**
* Compiler for converting BPEL process descriptions (and their associated WSDL
* and XSD documents) into compiled representations suitable for execution by
@@ -1644,11 +1643,13 @@
OExtVar oextvar = new OExtVar(_oprocess);
oextvar.externalVariableId = src.getExternalId();
oextvar.debugInfo = createDebugInfo(src, null);
- for (ExtVarKeyMapping mapping : src.getExtVarMappings()) {
- String key = mapping.getKey();
- OExpression oexpr = compileExpr(mapping.getExpression());
- oextvar.keyDeclaration.put(key, oexpr);
- }
+
+ if (src.getExternalId() == null)
+ throw new CompilationException(__cmsgs.errMustSpecifyExternalVariableId(src.getName()));
+
+ if (src.getRelated() == null)
+ throw new CompilationException(__cmsgs.errMustSpecifyRelatedVariable(src.getName()));
+ oextvar.related = resolveVariable(src.getRelated());
return oextvar;
}
Modified: ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/CommonCompilationMessages.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/CommonCompilationMessages.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/CommonCompilationMessages.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/CommonCompilationMessages.java Fri Jan 4 06:19:42 2008
@@ -467,4 +467,12 @@
return this.formatCompilationMessage("Empty scopes are forbidden.");
}
+ public CompilationMessage errMustSpecifyRelatedVariable(String name) {
+ return this.formatCompilationMessage("The external variable declaration for \"{0}\" must specify a related variable.", name);
+ }
+
+ public CompilationMessage errMustSpecifyExternalVariableId(String name) {
+ return this.formatCompilationMessage("The external variable declaration for \"{0}\" must specify an external variable identifier.", name);
+ }
+
}
Modified: ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/BpelObjectFactory.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/BpelObjectFactory.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/BpelObjectFactory.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/BpelObjectFactory.java Fri Jan 4 06:19:42 2008
@@ -256,10 +256,6 @@
_mappings.put(ExtensibilityQNames.FAILURE_HANDLING_RETRY_DELAY, FailureHandling.RetryDelay.class);
_mappings.put(ExtensibilityQNames.FAILURE_HANDLING_FAULT_ON, FailureHandling.FaultOnFailure.class);
- //
- // External Variable Mappings
- //
- _mappings.put(ExtensibilityQNames.EXTVAR_MAPPING, ExtVarKeyMapping.class);
}
public static BpelObjectFactory getInstance() {
Modified: ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java Fri Jan 4 06:19:42 2008
@@ -43,8 +43,8 @@
/** Attribute name for external variable id. */
public static final QName EXTVAR_ATTR = new QName(EXTVAR_NS, "id");
- /** Element name of external variable key mapping. */
- public static final QName EXTVAR_MAPPING = new QName(EXTVAR_NS, "key-map");
+ /** Attribute holding the name of the "related" variable. */
+ public static final QName EXTVAR_RELATED = new QName(EXTVAR_NS, "related-to");
}
Modified: ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/Variable.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/Variable.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/Variable.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/Variable.java Fri Jan 4 06:19:42 2008
@@ -18,8 +18,6 @@
*/
package org.apache.ode.bpel.compiler.bom;
-import java.util.List;
-
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
@@ -109,10 +107,10 @@
}
/**
- * Get the external variable mappings.
+ * External variable support - get the "related" variable name.
* @return
*/
- public List<ExtVarKeyMapping> getExtVarMappings() {
- return getChildren(ExtVarKeyMapping.class);
+ public String getRelated() {
+ return getAttribute(ExtensibilityQNames.EXTVAR_RELATED, null);
}
}
Modified: ode/branches/APACHE_ODE_1.1/bpel-obj/src/main/java/org/apache/ode/bpel/o/OExtVar.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-obj/src/main/java/org/apache/ode/bpel/o/OExtVar.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-obj/src/main/java/org/apache/ode/bpel/o/OExtVar.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-obj/src/main/java/org/apache/ode/bpel/o/OExtVar.java Fri Jan 4 06:19:42 2008
@@ -34,12 +34,9 @@
*/
public String externalVariableId;
- /**
- * The declaration of keys, i.e. this specifies how the values that are avaialble to the external
- * engine for the purposes of locating the external contents of the variable.
- */
- public final HashMap<String, OExpression> keyDeclaration = new HashMap<String, OExpression>();
-
+ /** Related variable containing the identifying information. */
+ public OScope.Variable related;
+
public OExtVar(OProcess owner) {
super(owner);
}
Modified: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java Fri Jan 4 06:19:42 2008
@@ -18,6 +18,16 @@
*/
package org.apache.ode.bpel.engine;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+import javax.wsdl.Operation;
+import javax.xml.namespace.QName;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ode.bpel.common.CorrelationKey;
@@ -33,21 +43,28 @@
import org.apache.ode.bpel.dao.ProcessInstanceDAO;
import org.apache.ode.bpel.dao.ScopeDAO;
import org.apache.ode.bpel.dao.XmlDataDAO;
-import org.apache.ode.bpel.engine.extvar.ExternalVariableKeyMapSerializer;
-import org.apache.ode.bpel.evt.*;
+import org.apache.ode.bpel.evt.CorrelationSetWriteEvent;
+import org.apache.ode.bpel.evt.ProcessCompletionEvent;
+import org.apache.ode.bpel.evt.ProcessInstanceEvent;
+import org.apache.ode.bpel.evt.ProcessInstanceStateChangeEvent;
+import org.apache.ode.bpel.evt.ProcessMessageExchangeEvent;
+import org.apache.ode.bpel.evt.ProcessTerminationEvent;
+import org.apache.ode.bpel.evt.ScopeEvent;
import org.apache.ode.bpel.iapi.BpelEngineException;
import org.apache.ode.bpel.iapi.ContextException;
import org.apache.ode.bpel.iapi.Endpoint;
import org.apache.ode.bpel.iapi.EndpointReference;
import org.apache.ode.bpel.iapi.Message;
import org.apache.ode.bpel.iapi.MessageExchange;
-import org.apache.ode.bpel.iapi.MessageExchange.FailureType;
-import org.apache.ode.bpel.iapi.MessageExchange.MessageExchangePattern;
import org.apache.ode.bpel.iapi.MyRoleMessageExchange;
import org.apache.ode.bpel.iapi.PartnerRoleMessageExchange;
+import org.apache.ode.bpel.iapi.MessageExchange.FailureType;
+import org.apache.ode.bpel.iapi.MessageExchange.MessageExchangePattern;
import org.apache.ode.bpel.memdao.ProcessInstanceDaoImpl;
-import org.apache.ode.bpel.o.OMessageVarType.Part;
-import org.apache.ode.bpel.o.*;
+import org.apache.ode.bpel.o.OMessageVarType;
+import org.apache.ode.bpel.o.OPartnerLink;
+import org.apache.ode.bpel.o.OProcess;
+import org.apache.ode.bpel.o.OScope;
import org.apache.ode.bpel.runtime.BpelJacobRunnable;
import org.apache.ode.bpel.runtime.BpelRuntimeContext;
import org.apache.ode.bpel.runtime.CorrelationSetInstance;
@@ -69,21 +86,9 @@
import org.apache.ode.utils.Namespaces;
import org.apache.ode.utils.ObjectPrinter;
import org.apche.ode.bpel.evar.ExternalVariableModuleException;
-import org.apche.ode.bpel.evar.IncompleteKeyException;
+import org.apche.ode.bpel.evar.ExternalVariableModule.Value;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
-import org.w3c.dom.Document;
-
-import javax.wsdl.Operation;
-import javax.xml.namespace.QName;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
class BpelRuntimeContextImpl implements BpelRuntimeContext {
@@ -392,85 +397,7 @@
CorrelationSetDAO cs = scopeDAO.getCorrelationSet(cset.declaration.name);
return cs.getValue();
}
-
- /**
- * Save the external variable keys that are evaluated at the time of scope instantiation.
- */
- public void initializeExternalVariable(VariableInstance variable, HashMap<String, String> keys) {
- // Important to note here that the collection of keys that we are saving may not be
- // the whole set required to retrieve the object. If that's the case then the variable
- // will need to be assigned to before it can be read, at which point the keys will be
- // updated. However if the key set is complete, then the variable can be read even if it
- // was never written to in the process.
- Element el = ExternalVariableKeyMapSerializer.toXML(keys);
- ScopeDAO scopeDAO = _dao.getScope(variable.scopeInstance);
- XmlDataDAO dataDAO = scopeDAO.getVariable(variable.declaration.name);
- dataDAO.set(el);
- }
-
- public Node fetchVariableData(VariableInstance variable, boolean forWriting) throws FaultException {
-
- // Special case of messageType variables with no part
- if (variable.declaration.type instanceof OMessageVarType) {
- OMessageVarType msgType = (OMessageVarType) variable.declaration.type;
- if (msgType.parts.size() == 0) {
- Document doc = DOMUtils.newDocument();
- Element root = doc.createElement("message");
- doc.appendChild(root);
- return root;
- }
- }
-
- ScopeDAO scopeDAO = _dao.getScope(variable.scopeInstance);
- XmlDataDAO dataDAO = scopeDAO.getVariable(variable.declaration.name);
-
- if (dataDAO.isNull()) {
- throw new FaultException(_bpelProcess.getOProcess().constants.qnUninitializedVariable,
- "The variable " + variable.declaration.name + " isn't properly initialized.");
- }
-
-
- if (variable.declaration.extVar != null) {
- // Note, that when using external variables, the database will contain not the actual value of the
- // variable, but a name-value map used to uniquely identify the external variable instance.
- Map<String, String> keys = ExternalVariableKeyMapSerializer.toMap((Element)dataDAO.get());
- try {
- Node ret = _bpelProcess.getEVM().read(variable.declaration.extVar.externalVariableId, keys ,_iid);
- if (ret == null) {
- throw new FaultException(_bpelProcess.getOProcess().constants.qnUninitializedVariable,
- "The external variable \"" + variable.declaration.name + "\" has not been initialized.");
-
- }
- return ret;
- } catch (IncompleteKeyException ike) {
- // This indicates that the external variable needed to be written do, put has not been.
- __log.error("External variable could not be read due to incomplete key; the following key " +
- "components were missing: " + ike.getMissing());
- throw new FaultException(_bpelProcess.getOProcess().constants.qnUninitializedVariable,
- "The extenral variable \"" + variable.declaration.name + "\" has not been properly initialized;" +
- "the following key compoenents were missing:" + ike.getMissing());
- } catch (ExternalVariableModuleException e) {
- __log.error("Unexpected EVM error.", e);
- throw new BpelEngineException(e);
- }
-
- } else /* not external */ {
- return dataDAO.get();
- }
-
- }
-
- public Node fetchVariableData(VariableInstance var, OMessageVarType.Part part, boolean forWriting)
- throws FaultException {
- Node container = fetchVariableData(var, forWriting);
-
- // If we want a specific part, we will need to navigate through the
- // message/part structure
- if (var.declaration.type instanceof OMessageVarType && part != null) {
- container = getPartData((Element) container, part);
- }
- return container;
- }
+
public Element fetchPartnerRoleEndpointReferenceData(PartnerLinkInstance pLink) throws FaultException {
PartnerLinkDAO pl = fetchPartnerLinkDAO(pLink);
@@ -511,7 +438,7 @@
* in case of selection or other fault
*/
public String readProperty(VariableInstance variable, OProcess.OProperty property) throws FaultException {
- Node varData = fetchVariableData(variable, false);
+ Node varData = readVariable(variable.scopeInstance, variable.declaration.name, false);
OProcess.OPropertyAlias alias = property.getAlias(variable.declaration.type);
String val = _bpelProcess.extractProperty((Element) varData, alias, variable.declaration.getDescription());
@@ -524,42 +451,6 @@
return val;
}
- public Node initializeVariable(VariableInstance variable, Node initData) {
- ScopeDAO scopeDAO = _dao.getScope(variable.scopeInstance);
- XmlDataDAO dataDAO = scopeDAO.getVariable(variable.declaration.name);
-
-
- Node ret;
-
- if (variable.declaration.extVar != null) /*external variable */ {
- // Note, that when using external variables, the database will contain not the actual value of the
- // variable, but a name-value map used to uniquely identify the external variable instance. When
- // initializing the external variable, we need to:
- // 1) call the ext-var subystem to initialize the variable
- // 3) save the computed keys (modified by 1 above) in the database.
-
- Map<String, String> keys = ExternalVariableKeyMapSerializer.toMap((Element)dataDAO.get());
- // Note that keys gets modified by initExternalVariable
- try {
- ret = _bpelProcess.getEVM().write(variable.declaration.extVar.externalVariableId, keys, initData, _iid);
- } catch (ExternalVariableModuleException e) {
- __log.error("External variable initialization error.", e);
- // TODO: need to report this
- throw new BpelEngineException("External varaible initialization error", e);
- }
- Element xmlkey = ExternalVariableKeyMapSerializer.toXML(keys);
- dataDAO.set(xmlkey);
-
- } else /* normal variable */ {
- dataDAO.set(initData);
- ret = dataDAO.get();
- }
-
- writeProperties(variable, ret, dataDAO);
-
- return ret;
- }
-
public void writeEndpointReference(PartnerLinkInstance variable, Element data) throws FaultException {
if (__log.isDebugEnabled()) {
__log.debug("Writing endpoint reference " + variable.partnerLink.getName() + " with value "
@@ -586,12 +477,20 @@
return _bpelProcess._engine._contexts.eprContext.convertEndpoint(nodeQName, sourceNode).toXML();
}
- public void commitChanges(VariableInstance variable, Node changes) {
+
+ public Node readVariable(Long scopeInstanceId, String varname, boolean forWriting) throws FaultException {
+ ScopeDAO scopedao = _dao.getScope(scopeInstanceId);
+ XmlDataDAO var = scopedao.getVariable(varname);
+ return var.isNull() ? null : var.get();
+ }
+
+ public Node writeVariable(VariableInstance variable, Node changes) {
ScopeDAO scopeDAO = _dao.getScope(variable.scopeInstance);
XmlDataDAO dataDAO = scopeDAO.getVariable(variable.declaration.name);
dataDAO.set(changes);
writeProperties(variable, changes, dataDAO);
+ return dataDAO.get();
}
public void reply(final PartnerLinkInstance plinkInstnace, final String opName, final String mexId, Element msg,
@@ -1289,17 +1188,6 @@
dao.release();
}
- public Node getPartData(Element message, Part part) {
- // borrowed from ASSIGN.evalQuery()
- QName partName = new QName(null, part.name);
- Node ret = DOMUtils.findChildByName((Element) message, partName);
- if (part.type instanceof OElementVarType) {
- QName elName = ((OElementVarType) part.type).elementType;
- ret = DOMUtils.findChildByName((Element) ret, elName);
- }
-
- return ret;
- }
public Element getSourceEPR(String mexId) {
MessageExchangeDAO dao = _dao.getConnection().getMessageExchange(mexId);
@@ -1420,4 +1308,20 @@
}
}
+
+ public Node readExtVar(String externalVariableId, Node reference) throws ExternalVariableModuleException {
+ Value val = _bpelProcess.getEVM().read(externalVariableId, reference, _iid);
+ return val.value;
+ }
+
+ public ValueReferencePair writeExtVar(String externalVariableId, Node reference, Node value) throws ExternalVariableModuleException {
+ ValueReferencePair vrp = new ValueReferencePair();
+
+ Value val = _bpelProcess.getEVM().write(externalVariableId, reference, value, _iid);
+ vrp.reference = val.locator.reference;
+ vrp.value = val.value;
+
+ return vrp;
+ }
+
}
Modified: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/extvar/ExternalVariableManager.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/extvar/ExternalVariableManager.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/extvar/ExternalVariableManager.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/extvar/ExternalVariableManager.java Fri Jan 4 06:19:42 2008
@@ -25,14 +25,12 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.ode.bpel.common.FaultException;
import org.apache.ode.bpel.iapi.BpelEngineException;
import org.apache.ode.bpel.o.OBase;
import org.apache.ode.bpel.o.OProcess;
import org.apache.ode.bpel.o.OScope;
import org.apche.ode.bpel.evar.ExternalVariableModule;
import org.apche.ode.bpel.evar.ExternalVariableModuleException;
-import org.apche.ode.bpel.evar.IncompleteKeyException;
import org.apche.ode.bpel.evar.ExternalVariableModule.Locator;
import org.apche.ode.bpel.evar.ExternalVariableModule.Value;
import org.w3c.dom.Element;
@@ -131,38 +129,34 @@
* @return
* @throws BpelEngineException
*/
- public Node read(String externalVariableId, Map<String, String> keys, Long iid) throws ExternalVariableModuleException{
+ public Value read(String externalVariableId, Node reference, Long iid) throws ExternalVariableModuleException{
EVar evar = _externalVariables.get(externalVariableId);
if (evar == null) {
// Should not happen if constructor is working.
throw new BpelEngineException("InternalError: reference to unknown external variable " + externalVariableId);
}
- Locator locator = new Locator(externalVariableId, _pid,iid, keys);
+ Locator locator = new Locator(externalVariableId, _pid,iid, reference);
Value newval;
newval = evar._engine.readValue(locator );
if (newval == null)
return null;
- keys.clear();
- keys.putAll(newval.locator);
- return newval.value;
+ return newval;
}
- public Node write(String externalVariableId, Map<String,String> keys, Node val, Long iid) throws ExternalVariableModuleException {
+ public Value write(String externalVariableId, Node reference, Node val, Long iid) throws ExternalVariableModuleException {
EVar evar = _externalVariables.get(externalVariableId);
if (evar == null) {
// Should not happen if constructor is working.
throw new BpelEngineException("InternalError: reference to unknown external variable " + externalVariableId);
}
- Locator locator = new Locator(externalVariableId,_pid,iid,new HashMap<String,String>(keys));
+ Locator locator = new Locator(externalVariableId,_pid,iid,reference);
Value newval = new Value(locator,val,null);
newval = evar._engine.writeValue(newval );
-
- keys.clear();
- keys.putAll(newval.locator);
- return newval.value;
+
+ return newval;
}
Modified: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/DbExternalVariable.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/DbExternalVariable.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/DbExternalVariable.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/DbExternalVariable.java Fri Jan 4 06:19:42 2008
@@ -1,21 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
package org.apache.ode.bpel.extvar.jdbc;
import java.sql.Timestamp;
@@ -23,6 +5,8 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
import javax.sql.DataSource;
import javax.xml.namespace.QName;
@@ -31,15 +15,12 @@
import org.apache.ode.utils.GUID;
import org.apache.ode.utils.ISO8601DateParser;
import org.apche.ode.bpel.evar.ExternalVariableModuleException;
-import org.apche.ode.bpel.evar.IncompleteKeyException;
import org.apche.ode.bpel.evar.ExternalVariableModule.Locator;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
-import java.util.Collections;
-
/**
* Configuration for an external variable.
*
@@ -47,483 +28,473 @@
*/
class DbExternalVariable {
- private static final String XSI_NS = "http://www.w3.org/2001/XMLSchema-instance";
+ private static final String XSI_NS = "http://www.w3.org/2001/XMLSchema-instance";
+
+ EVarId evarId;
- EVarId evarId;
+ DataSource dataSource;
- DataSource dataSource;
+ final ArrayList<Column> _columns = new ArrayList<Column>();
- final ArrayList<Column> columns = new ArrayList<Column>();
+ private final HashMap<String, Column> _colmap = new HashMap<String, Column>();
+
+ final ArrayList<Column> _keycolumns = new ArrayList<Column>();
+
+ final ArrayList<Column> _inscolumns = new ArrayList<Column>();
+
+ final ArrayList<Column> _updcolumns = new ArrayList<Column>();
+
+ InitType _initType = InitType.update_insert;
+
+ public String[] _autoColNames;
+
+ String select;
+
+ String insert;
+
+ String update;
+
+ String table;
+
+ String schema;
+
+ /** Does the database support retrieval of generated keys? */
+ boolean generatedKeys;
+
+ QName rowname = new QName(null, "row");
+
+ DbExternalVariable(EVarId evar, DataSource ds) {
+ this.evarId = evar;
+ this.dataSource = ds;
+ }
+
+ Column getColumn(String key) {
+ return _colmap.get(key);
+ }
+
+ void addColumn(Column c) {
+ c.idx = _columns.size();
+ _colmap.put(c.name, c);
+ _columns.add(c);
+ if (c.key) {
+ _keycolumns.add(c);
+ _autoColNames = new String[_keycolumns.size()];
+ for (int i = 0; i < _autoColNames.length; ++i)
+ _autoColNames[i] = _keycolumns.get(i).colname;
+ }
+ createSelect();
+ createInsert();
+ createUpdate();
+ }
+
+ public int numColumns() {
+ return _columns.size();
+ }
+
+ /**
+ * Create a key from a locator.
+ *
+ * @param locator
+ * @return
+ */
+ RowKey keyFromLocator(Locator locator) throws ExternalVariableModuleException {
+ RowKey rc = new RowKey();
+ parseXmlRow(rc, locator.reference);
+
+ // Put in the static gooedies such as pid/iid
+ for (Column c : rc._columns) {
+ switch (c.genType) {
+ case iid:
+ case pid:
+ rc.put(c.name, c.getValue(c.name, null, locator.iid));
+ break;
+ }
+ }
+
+ return rc;
+ }
+
+ private void createSelect() {
+ StringBuilder sb = new StringBuilder("select ");
+ boolean first = true;
+ for (Column c : _columns) {
+ if (!first) {
+ sb.append(',');
+ }
+ first = false;
+
+ sb.append(c.colname);
+ }
+ sb.append(" from " + table);
+ if (_keycolumns.size() > 0) {
+ sb.append(" where ");
+ first = true;
+
+ for (Column kc : _keycolumns) {
+ if (!first) {
+ sb.append(" and ");
+ }
+ first = false;
+
+ sb.append(kc.colname);
+ sb.append(" = ?");
+ }
+ select = sb.toString();
+
+ } else {
+ select = null;
+ }
+ }
+
+ private void createUpdate() {
+ _updcolumns.clear();
+ StringBuilder sb = new StringBuilder("update ");
+ sb.append(table);
+ sb.append(" set ");
+ boolean first = true;
+ for (Column c : _columns) {
+ // Don't ever update keys or sequences or create time stamps
+ if (c.genType == GenType.sequence || c.key
+ || c.genType == GenType.ctimestamp)
+ continue;
+
+ if (!first)
+ sb.append(", ");
+ first = false;
+
+ sb.append(c.colname);
+ sb.append(" = ");
+ if (c.genType == GenType.expression)
+ sb.append(c.expression);
+ else {
+ sb.append(" ?");
+ _updcolumns.add(c);
+ }
+ }
+
+ if (_keycolumns.size() > 0) {
+ sb.append(" where ");
+ first = true;
+
+ for (Column kc : _keycolumns) {
+ if (!first) {
+ sb.append(" and ");
+ }
+ first = false;
+
+ sb.append(kc.colname);
+ sb.append(" = ?");
+ }
+
+ }
+
+ // If we have no key columns, we cannot do an update
+ if (_keycolumns.size() == 0)
+ update = null;
+ else
+ update = sb.toString();
+
+ }
+
+ private void createInsert() {
+ _inscolumns.clear();
+ StringBuilder sb = new StringBuilder("insert into ");
+ sb.append(table);
+ sb.append(" ( ");
+ boolean first = true;
+ for (Column c : _columns) {
+ if (c.genType == GenType.sequence)
+ continue;
+
+ if (!first)
+ sb.append(',');
+
+ first = false;
+ sb.append(c.colname);
+ }
+ sb.append(" ) ");
+
+ sb.append(" values ( ");
+
+ first = true;
+ for (Column c : _columns) {
+ if (c.genType == GenType.sequence)
+ continue;
+ if (!first)
+ sb.append(',');
+ first = false;
+
+ if (c.genType == GenType.expression)
+ sb.append(c.expression);
+ else {
+ sb.append(" ? ");
+ _inscolumns.add(c);
+ }
+ }
+ sb.append(" ) ");
+
+ insert = sb.toString();
+
+ }
+
+ <T extends RowSubset> Element renderXmlRow(T value) {
+ Document doc = DOMUtils.newDocument();
+ Element el = doc.createElementNS(rowname.getNamespaceURI(), rowname
+ .getLocalPart());
+ doc.appendChild(el);
+ for (Column c : value._columns) {
+ Object data = value.get(c.idx);
+ Element cel = doc.createElementNS(c.elname.getNamespaceURI(),
+ c.elname.getLocalPart());
+ String strdat = c.toText(data);
+ if (strdat != null)
+ cel.appendChild(doc.createTextNode(strdat));
+ else
+ cel.setAttributeNS(XSI_NS, "xsi:nil", "true");
+
+ el.appendChild(cel);
+ }
+
+ return el;
+ }
+
+ <T extends RowSubset> T parseXmlRow(T ret, Node rowel)
+ throws ExternalVariableModuleException {
+ if (rowel == null)
+ return ret;
+
+ NodeList nl = rowel.getChildNodes();
+ for (int i = 0; i < nl.getLength(); ++i) {
+ Node n = nl.item(i);
+ if (n.getNodeType() != Node.ELEMENT_NODE)
+ continue;
+ String key = n.getLocalName();
+ String val = n.getTextContent();
+
+ Column column = ret.getColumn(key);
+ if (column == null)
+ continue;
+
+ String nil = ((Element) n).getAttributeNS(XSI_NS, "nil");
+ if (nil != null && "true".equalsIgnoreCase(nil))
+ ret.put(key, null);
+ else
+ ret.put(key, column.fromText(val));
+ }
+ return ret;
+ }
+
+ class Column {
+
+ int idx;
+
+ /** name of the column */
+ String name;
+
+ /** database name of the column (in case we need to override */
+ String colname;
+
+ /** Is this a key column? */
+ boolean key;
+
+ /** Type of value generator to use for creating values for this column. */
+ GenType genType;
+
+ /** The (SQL) expression used to populate the column. */
+ String expression;
+
+ /** The SQL data type of this column, one of java.sql.Types */
+ int dataType;
+
+ /** Indicates NULL values are OK */
+ boolean nullok;
+
+ QName elname;
+
+ Column(String name, String colname, boolean key, GenType genType,
+ String expression) {
+ this.name = name;
+ this.colname = colname == null ? name : colname;
+ this.key = key;
+ this.genType = genType;
+ this.expression = expression;
+ elname = new QName(null, name);
+ }
+
+ public Object getValue(String name, RowVal values, Long iid) {
+ switch (genType) {
+ case ctimestamp:
+ case utimestamp:
+ return isTimeStamp() ? new Timestamp(new Date().getTime())
+ : new Date();
+ case uuid:
+ return new GUID().toString();
+ case pid:
+ return evarId.pid.toString();
+ case iid:
+ return iid;
+ case none:
+ default:
+ return values.get(name);
+ }
+ }
+
+ /**
+ * Return <code>true</code> if column is a date-like type.
+ *
+ * @return
+ */
+ boolean isDate() {
+ return dataType == Types.DATE;
+ }
+
+ boolean isTimeStamp() {
+ return dataType == Types.TIMESTAMP;
+ }
+
+ boolean isTime() {
+ return dataType == Types.TIME;
+ }
+
+ /**
+ * Is this column best represented as an integer?
+ *
+ * @return
+ */
+ boolean isInteger() {
+ switch (dataType) {
+ case Types.BIGINT:
+ case Types.INTEGER:
+ case Types.SMALLINT:
+ case Types.TINYINT:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Is this column best represented as a real number?
+ *
+ * @return
+ */
+ boolean isReal() {
+ switch (dataType) {
+ case Types.DECIMAL:
+ case Types.REAL:
+ case Types.NUMERIC:
+ return true;
+ default:
+ return false;
+ }
+
+ }
+
+ boolean isBoolean() {
+ switch (dataType) {
+ case Types.BIT:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ String toText(Object val) {
+ if (val == null)
+ return null;
+
+ if (isDate())
+ return ISO8601DateParser.format((Date) val);
+ else if (isTime())
+ return ISO8601DateParser.format((Date) val);
+ else if (isTimeStamp())
+ return ISO8601DateParser.format((Date) val);
+ else
+ return val.toString();
+ }
+
+ Object fromText(String val) throws ExternalVariableModuleException {
+ try {
+ // TODO: use xsd:date and xsd:time conversions
+ if (isDate())
+ return new java.sql.Date(ISO8601DateParser.parse(val)
+ .getTime());
+ else if (isTime())
+ return new java.sql.Time(ISO8601DateParser.parse(val)
+ .getTime());
+ else if (isTimeStamp())
+ return new java.sql.Timestamp(ISO8601DateParser.parse(val)
+ .getTime());
+ else if (isInteger())
+ return Long.valueOf(val);
+ else if (isReal())
+ return Double.valueOf(val);
+ else if (isBoolean())
+ return Boolean.valueOf(val);
+
+ return val;
+ } catch (Exception ex) {
+ throw new ExternalVariableModuleException(
+ "Unable to convert value \"" + val + "\" for column \""
+ + name + "\" !", ex);
+ }
+ }
+ }
+
+ /**
+ *
+ * Key used to identify a row.
+ *
+ * @author Maciej Szefler <mszefler at gmail dot com>
+ *
+ */
+ class RowKey extends RowSubset {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Create empty row key.
+ */
+ RowKey() {
+ super(_keycolumns);
+ }
+
+ /**
+ * Write the key to a locator.
+ *
+ * @param locator
+ */
+ void write(Locator locator) {
+ locator.reference = renderXmlRow(this);
+ }
+
+ public Set<String> getMissing() {
+ HashSet<String> missing = new HashSet<String>();
+ for (Column c : _keycolumns) {
+ if (get(c.idx) ==null)
+ missing.add(c.name);
+ }
+ return missing;
+ }
+
+
+
+ }
+
+ /**
+ * Row values.
+ *
+ * @author Maciej Szefler <mszefler at gmail dot com>
+ *
+ */
+ class RowVal extends RowSubset {
+
+ private static final long serialVersionUID = 1L;
+
+ RowVal() {
+ super(DbExternalVariable.this._columns);
+ }
- private final HashMap<String, Column> colmap = new HashMap<String, Column>();
-
- final ArrayList<Column> keycolumns = new ArrayList<Column>();
-
- final ArrayList<Column> inscolumns = new ArrayList<Column>();
-
- final ArrayList<Column> updcolumns = new ArrayList<Column>();
-
- InitType initType = InitType.update_insert;
-
- public String[] autoColNames;
-
- String select;
-
- String insert;
-
- String update;
-
- String table;
-
- String schema;
-
- /** Does the database support retrieval of generated keys? */
- boolean generatedKeys;
-
- QName rowname = new QName(null, "row");
-
- DbExternalVariable(EVarId evar, DataSource ds) {
- this.evarId = evar;
- this.dataSource = ds;
- }
-
- Column getColumn(String key) {
- return colmap.get(key);
- }
-
- void addColumn(Column c) {
- c.idx = columns.size();
- colmap.put(c.name, c);
- columns.add(c);
- if (c.key) {
- keycolumns.add(c);
- autoColNames = new String[keycolumns.size()];
- for (int i = 0; i < autoColNames.length; ++i)
- autoColNames[i] = keycolumns.get(i).colname;
- }
- createSelect();
- createInsert();
- createUpdate();
- }
-
- public int numColumns() {
- return columns.size();
- }
-
- /**
- * Create a key from a locator.
- *
- * @param locator
- * row locator
- * @param rowval
- * (optional) row value
- * @return
- */
- RowKey generateKey(Locator locator, RowVal rowval) throws ExternalVariableModuleException {
- RowKey rc = new RowKey();
- for (Column kc : keycolumns) {
- String s;
- switch (kc.genType) {
- case pid:
- s = locator.pid.toString();
- break;
- case iid:
- s = locator.iid.toString();
- break;
- default:
- s = locator.get(kc.name);
- }
-
- Object rv = rowval == null ? null : kc.getValue(rowval, locator.iid);
- if (s == null && rv == null) {
- throw new IncompleteKeyException(Collections.singleton(kc.name));
- } else if (s != null && rv != null) {
- // TODO: make sure the keys don't conflict with the rows.
- rc.add(kc.fromText(s));
- } else if (s != null) {
- rc.add(kc.fromText(s));
- } else {
- rc.add(rv);
- }
-
- }
-
- return rc;
- }
-
- private void createSelect() {
- StringBuilder sb = new StringBuilder("select ");
- boolean first = true;
- for (Column c : columns) {
- if (!first) {
- sb.append(',');
- }
- first = false;
-
- sb.append(c.colname);
- }
- sb.append(" from " + table);
- if (keycolumns.size() > 0) {
- sb.append(" where ");
- first = true;
-
- for (Column kc : keycolumns) {
- if (!first) {
- sb.append(" and ");
- }
- first = false;
-
- sb.append(kc.colname);
- sb.append(" = ?");
- }
- select = sb.toString();
-
- } else {
- select = null;
- }
- }
-
- private void createUpdate() {
- updcolumns.clear();
- StringBuilder sb = new StringBuilder("update ");
- sb.append(table);
- sb.append(" set ");
- boolean first = true;
- for (Column c : columns) {
- // Don't ever update keys or sequences or create time stamps
- if (c.genType == GenType.sequence || c.key || c.genType == GenType.ctimestamp)
- continue;
-
- if (!first)
- sb.append(", ");
- first = false;
-
- sb.append(c.colname);
- sb.append(" = ");
- if (c.genType == GenType.expression)
- sb.append(c.expression);
- else {
- sb.append(" ?");
- updcolumns.add(c);
- }
- }
-
- if (keycolumns.size() > 0) {
- sb.append(" where ");
- first = true;
-
- for (Column kc : keycolumns) {
- if (!first) {
- sb.append(" and ");
- }
- first = false;
-
- sb.append(kc.colname);
- sb.append(" = ?");
- }
-
- }
-
- // If we have no key columns, we cannot do an update
- if (keycolumns.size() == 0)
- update = null;
- else
- update = sb.toString();
-
- }
-
- private void createInsert() {
- inscolumns.clear();
- StringBuilder sb = new StringBuilder("insert into ");
- sb.append(table);
- sb.append(" ( ");
- boolean first = true;
- for (Column c : columns) {
- if (c.genType == GenType.sequence)
- continue;
-
- if (!first)
- sb.append(',');
-
- first = false;
- sb.append(c.colname);
- }
- sb.append(" ) ");
-
- sb.append(" values ( ");
-
- first = true;
- for (Column c : columns) {
- if (c.genType == GenType.sequence)
- continue;
- if (!first)
- sb.append(',');
- first = false;
-
- if (c.genType == GenType.expression)
- sb.append(c.expression);
- else {
- sb.append(" ? ");
- inscolumns.add(c);
- }
- }
- sb.append(" ) ");
-
- insert = sb.toString();
-
- }
-
- class Column {
-
- int idx;
-
- /** name of the column */
- String name;
-
- /** database name of the column (in case we need to override */
- String colname;
-
- /** Is this a key column? */
- boolean key;
-
- /** Type of value generator to use for creating values for this column. */
- GenType genType;
-
- /** The (SQL) expression used to populate the column. */
- String expression;
-
- /** The SQL data type of this column, one of java.sql.Types */
- int dataType;
-
- /** Indicates NULL values are OK */
- boolean nullok;
-
- QName elname;
-
- Column(String name, String colname, boolean key, GenType genType, String expression) {
- this.name = name;
- this.colname = colname == null ? name : colname;
- this.key = key;
- this.genType = genType;
- this.expression = expression;
- elname = new QName(null, name);
- }
-
- public Object getValue(RowVal values, Long iid) {
- switch (genType) {
- case ctimestamp:
- case utimestamp:
- return isTimeStamp() ? new Timestamp(new Date().getTime()) : new Date();
- case uuid:
- return new GUID().toString();
- case pid:
- return evarId.pid.toString();
- case iid:
- return iid;
- case none:
- default:
- return values.get(name);
- }
- }
-
- /**
- * Return <code>true</code> if column is a date-like type.
- *
- * @return
- */
- boolean isDate() {
- return dataType == Types.DATE;
- }
-
- boolean isTimeStamp() {
- return dataType == Types.TIMESTAMP;
- }
-
- boolean isTime() {
- return dataType == Types.TIME;
- }
-
- /**
- * Is this column best represented as an integer?
- *
- * @return
- */
- boolean isInteger() {
- switch (dataType) {
- case Types.BIGINT:
- case Types.INTEGER:
- case Types.SMALLINT:
- case Types.TINYINT:
- return true;
- default:
- return false;
- }
- }
-
- /**
- * Is this column best represented as a real number?
- *
- * @return
- */
- boolean isReal() {
- switch (dataType) {
- case Types.DECIMAL:
- case Types.REAL:
- case Types.NUMERIC:
- return true;
- default:
- return false;
- }
-
- }
-
- boolean isBoolean() {
- switch (dataType) {
- case Types.BIT:
- return true;
- default:
- return false;
- }
- }
-
- String toText(Object val) {
- if (val == null)
- return null;
-
- if (isDate())
- return ISO8601DateParser.format((Date) val);
- else if (isTime())
- return ISO8601DateParser.format((Date) val);
- else if (isTimeStamp())
- return ISO8601DateParser.format((Date) val);
- else
- return val.toString();
- }
-
- Object fromText(String val) throws ExternalVariableModuleException {
- try {
- // TODO: use xsd:date and xsd:time conversions
- if (isDate())
- return new java.sql.Date(ISO8601DateParser.parse(val).getTime());
- else if (isTime())
- return new java.sql.Time(ISO8601DateParser.parse(val).getTime());
- else if (isTimeStamp())
- return new java.sql.Timestamp(ISO8601DateParser.parse(val).getTime());
- else if (isInteger())
- return Long.valueOf(val);
- else if (isReal())
- return Double.valueOf(val);
- else if (isBoolean())
- return Boolean.valueOf(val);
-
- return val;
- } catch (Exception ex) {
- throw new ExternalVariableModuleException("Unable to convert value \"" + val + "\" for column \"" + name + "\" !",
- ex);
- }
- }
- }
-
- /**
- *
- * Key used to identify a row.
- *
- * @author Maciej Szefler <mszefler at gmail dot com>
- *
- */
- class RowKey extends ArrayList<Object> {
-
- /**
- * Create empty row key.
- */
- RowKey() {
- }
-
- /**
- * Write the key to a locator.
- *
- * @param locator
- */
- void write(Locator locator) {
- locator.clear();
- int idx = 0;
- for (Column kc : keycolumns)
- locator.put(kc.name, kc.toText(get(idx++)));
- }
-
- }
-
- /**
- * Row values.
- *
- * @author Maciej Szefler <mszefler at gmail dot com>
- *
- */
- class RowVal extends ArrayList<Object> {
- RowVal() {
- super(columns.size());
- for (int i = 0; i < columns.size(); ++i)
- add(null);
- }
-
- Object get(String name) {
- Column c = colmap.get(name);
- if (c == null)
- return null;
- int idx = columns.indexOf(c);
- return get(idx);
- }
-
- public void put(String name, Object val) {
- Column c = colmap.get(name);
- if (c == null)
- return;
-
- int idx = columns.indexOf(c);
- this.set(idx, val);
- }
- }
-
- Element renderXmlRow(RowVal value) {
- Document doc = DOMUtils.newDocument();
- Element el = doc.createElementNS(rowname.getNamespaceURI(), rowname.getLocalPart());
- doc.appendChild(el);
- for (Column c : columns) {
- Object data = value.get(c.idx);
- Element cel = doc.createElementNS(c.elname.getNamespaceURI(), c.elname.getLocalPart());
- String strdat = c.toText(data);
- if (strdat != null)
- cel.appendChild(doc.createTextNode(strdat));
- else
- cel.setAttributeNS(XSI_NS, "xsi:nil", "true");
-
- el.appendChild(cel);
- }
-
- return el;
- }
-
- RowVal parseXmlRow(Element rowel) throws ExternalVariableModuleException {
- RowVal ret = new RowVal();
- NodeList nl = rowel.getChildNodes();
- for (int i = 0; i < nl.getLength(); ++i) {
- Node n = nl.item(i);
- if (n.getNodeType() != Node.ELEMENT_NODE)
- continue;
- String key = n.getLocalName();
- String val = n.getTextContent();
-
- Column column = getColumn(key);
- if (column == null)
- continue;
-
- String nil = ((Element) n).getAttributeNS(XSI_NS, "nil");
- if (nil != null && "true".equalsIgnoreCase(nil))
- ret.put(key, null);
- else
- ret.put(key, column.fromText(val));
- }
- return ret;
- }
+ }
-}
+}
\ No newline at end of file
Added: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/ExternalVariableKeyMapSerializer.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/ExternalVariableKeyMapSerializer.java?rev=608847&view=auto
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/ExternalVariableKeyMapSerializer.java (added)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/ExternalVariableKeyMapSerializer.java Fri Jan 4 06:19:42 2008
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ode.bpel.extvar.jdbc;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.ode.utils.DOMUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Provides methods to serialize (into XML) the name-value pairs of an external-variable key map.
+ *
+ * @author Maciej Szefler <mszefler at gmail dot com>
+ *
+ */
+public class ExternalVariableKeyMapSerializer {
+
+ /**
+ * Convert to XML from map.
+ * @param map
+ * @return
+ */
+ public static Element toXML(Map<String,String> map) {
+ Document doc = DOMUtils.newDocument();
+ Element el = doc.createElementNS(null,"external-variable-ref");
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ Element nvel = doc.createElementNS(null,"nvpair");
+ nvel.setAttribute("key", entry.getKey());
+ if (entry.getValue() != null)
+ nvel.setAttribute("value", entry.getValue());
+ el.appendChild(nvel);
+ }
+ return el;
+
+ }
+
+ /**
+ * Convert to map from XML.
+ * @param el
+ * @return
+ */
+ public static Map<String, String> toMap(Element el) {
+ HashMap<String,String> ret = new HashMap<String,String>();
+ if (el == null)
+ return ret;
+ NodeList nvs = el.getChildNodes();
+ for (int i = 0; i < nvs.getLength(); ++i) {
+ Node n = nvs.item(i);
+ if (n.getNodeType() != Node.ELEMENT_NODE)
+ continue;
+ if (!n.getLocalName().equals("nvpair"))
+ continue;
+ String key = ((Element)n).getAttribute("key");
+ String val = ((Element)n).getAttribute("value");
+ ret.put(key, val);
+ }
+ return ret;
+ }
+
+}
Propchange: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/ExternalVariableKeyMapSerializer.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/JdbcExternalVariableModule.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/JdbcExternalVariableModule.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/JdbcExternalVariableModule.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/JdbcExternalVariableModule.java Fri Jan 4 06:19:42 2008
@@ -39,6 +39,7 @@
import org.apache.ode.utils.DOMUtils;
import org.apche.ode.bpel.evar.ExternalVariableModule;
import org.apche.ode.bpel.evar.ExternalVariableModuleException;
+import org.apche.ode.bpel.evar.IncompleteKeyException;
import org.w3c.dom.Element;
public class JdbcExternalVariableModule implements ExternalVariableModule {
@@ -119,7 +120,7 @@
DbExternalVariable dbev = new DbExternalVariable(evarId, ds);
if (initMode != null)
try {
- dbev.initType = InitType.valueOf(initMode.getTextContent().trim());
+ dbev._initType = InitType.valueOf(initMode.getTextContent().trim());
} catch (Exception ex) {
throw new ExternalVariableModuleException("Invalid <init-mode> value: " + initMode.getTextContent().trim());
}
@@ -242,26 +243,26 @@
if (evar == null)
throw new ExternalVariableModuleException("No such variable. "); // todo
- RowVal val = evar.parseXmlRow((Element) newval.value);
- RowKey key = evar.generateKey(newval.locator, val);
+ RowVal val = evar.parseXmlRow(evar.new RowVal(), (Element) newval.value);
+ RowKey key = evar.keyFromLocator(newval.locator);
- if (key != null && evar.initType == InitType.delete_insert) {
+ if (key.isComplete() && evar._initType == InitType.delete_insert) {
// do delete...
// TODO
}
// should we try an update first? to do this we need to have all the required keys
// and there should be some keys
- boolean tryupdatefirst = (evar.initType == InitType.update || evar.initType == InitType.update_insert)
- && !evar.keycolumns.isEmpty() && key != null;
+ boolean tryupdatefirst = (evar._initType == InitType.update || evar._initType == InitType.update_insert)
+ && !evar._keycolumns.isEmpty() && key.isComplete();
- boolean insert = evar.initType != InitType.update;
+ boolean insert = evar._initType != InitType.update;
try {
if (tryupdatefirst)
insert = execUpdate(evar, val) == 0;
if (insert) {
- key = execInsert(evar, val);
+ key = execInsert(evar, newval.locator, val);
// Transfer the keys obtained from the db.
key.write(newval.locator);
}
@@ -282,8 +283,6 @@
Element val;
try {
RowVal rowval = execSelect(evar, locator);
- if (rowval == null)
- return null;
val = evar.renderXmlRow(rowval);
} catch (SQLException se) {
throw new ExternalVariableModuleException("SQL Error.", se);
@@ -294,7 +293,7 @@
}
/**
- * Manually register a data source. Handy if you don't want to use JDBC to look these up.
+ * Manually register a data source. Handy if you don't want to use JNDI to look these up.
*
* @param dsName
* @param ds
@@ -308,13 +307,13 @@
try {
PreparedStatement stmt = conn.prepareStatement(dbev.update);
int idx = 1;
- for (Column c : dbev.updcolumns) {
+ for (Column c : dbev._updcolumns) {
Object val = values.get(c.name);
stmt.setObject(idx, val);
idx++;
}
- for (Column ck : dbev.keycolumns) {
+ for (Column ck : dbev._keycolumns) {
Object val = values.get(ck.name);
stmt.setObject(idx, val);
idx++;
@@ -329,7 +328,12 @@
}
RowVal execSelect(DbExternalVariable dbev, Locator locator) throws SQLException, ExternalVariableModuleException {
- RowKey rowkey = dbev.generateKey(locator, null);
+ RowKey rowkey = dbev.keyFromLocator(locator);
+
+ if (!rowkey.isComplete()) {
+ throw new IncompleteKeyException(rowkey.getMissing());
+ }
+
RowVal ret = dbev.new RowVal();
Connection conn = dbev.dataSource.getConnection();
try {
@@ -341,7 +345,7 @@
ResultSet rs = stmt.executeQuery();
try {
if (rs.next()) {
- for (Column cr : dbev.columns)
+ for (Column cr : dbev._columns)
ret.set(cr.idx,rs.getObject(cr.idx+1));
} else
@@ -356,15 +360,15 @@
return ret;
}
- RowKey execInsert(DbExternalVariable dbev, RowVal values) throws SQLException {
+ RowKey execInsert(DbExternalVariable dbev, Locator locator, RowVal values) throws SQLException {
RowKey keys = dbev.new RowKey();
Connection conn = dbev.dataSource.getConnection();
try {
- PreparedStatement stmt = dbev.generatedKeys ? conn.prepareStatement(dbev.insert, dbev.autoColNames) : conn
+ PreparedStatement stmt = dbev.generatedKeys ? conn.prepareStatement(dbev.insert, dbev._autoColNames) : conn
.prepareStatement(dbev.insert);
int idx = 1;
- for (Column c : dbev.inscolumns) {
- Object val = c.getValue(values, null);
+ for (Column c : dbev._inscolumns) {
+ Object val = c.getValue(c.name, values, locator.iid);
values.put(c.name, val);
stmt.setObject(idx, val);
idx++;
@@ -376,13 +380,12 @@
// With JDBC 3, we can get the values of the key columns (if the db supports it)
ResultSet keyRS = stmt.getResultSet();
keyRS.next();
- for (Column ck : dbev.keycolumns)
- keys.add(keyRS.getObject(ck.colname));
+ for (Column ck : keys._columns)
+ keys.put(ck.name, keyRS.getObject(ck.colname));
} else {
- for (Column ck : dbev.keycolumns) {
+ for (Column ck : keys._columns) {
Object val = values.get(ck.name);
- if (val != null)
- keys.add(val);
+ keys.put(ck.name,val);
}
}
Added: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/RowSubset.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/RowSubset.java?rev=608847&view=auto
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/RowSubset.java (added)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/RowSubset.java Fri Jan 4 06:19:42 2008
@@ -0,0 +1,66 @@
+/**
+ *
+ */
+package org.apache.ode.bpel.extvar.jdbc;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.ode.bpel.extvar.jdbc.DbExternalVariable.Column;;
+
+class RowSubset extends ArrayList<Object> {
+ protected List<Column> _columns;
+
+ /* Name --> Column mapping. */
+ protected HashMap<String, Column> _colmap = new HashMap<String,Column>();
+
+
+ RowSubset(List<Column> columns) {
+ _columns = columns;
+
+ for(Column c : columns) {
+ add(null);
+ _colmap.put(c.name,c);
+ }
+ }
+
+ /**
+ * Return <code>true</code> if all entries are non-null.
+ * @return
+ */
+ boolean isComplete() {
+
+ for (Object o : this)
+ if (o == null)
+ return false;
+
+ return true;
+ }
+
+
+ Column getColumn(String name) {
+ return _colmap.get(name);
+ }
+
+ Column getColumn(int idx) {
+ return _columns.get(idx);
+ }
+
+ Object get(String name) {
+ Column c = _colmap.get(name);
+ if (c == null)
+ return null;
+ int idx = _columns.indexOf(c);
+ return get(idx);
+ }
+
+ void put(String name, Object val) {
+ Column c = _colmap.get(name);
+ if (c == null)
+ return;
+
+ int idx = _columns.indexOf(c);
+ this.set(idx, val);
+ }
+}
\ No newline at end of file
Propchange: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/RowSubset.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ACTIVITY.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ACTIVITY.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ACTIVITY.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ACTIVITY.java Fri Jan 4 06:19:42 2008
@@ -18,23 +18,41 @@
*/
package org.apache.ode.bpel.runtime;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ode.bpel.common.FaultException;
import org.apache.ode.bpel.evt.ActivityEvent;
import org.apache.ode.bpel.evt.EventContext;
import org.apache.ode.bpel.evt.ScopeEvent;
import org.apache.ode.bpel.evt.VariableReadEvent;
import org.apache.ode.bpel.explang.EvaluationContext;
+import org.apache.ode.bpel.iapi.BpelEngineException;
import org.apache.ode.bpel.o.OActivity;
+import org.apache.ode.bpel.o.OConstants;
+import org.apache.ode.bpel.o.OElementVarType;
import org.apache.ode.bpel.o.OLink;
+import org.apache.ode.bpel.o.OMessageVarType;
+import org.apache.ode.bpel.o.OMessageVarType.Part;
+import org.apache.ode.bpel.runtime.BpelRuntimeContext.ValueReferencePair;
import org.apache.ode.jacob.IndexedObject;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Iterator;
+import org.apache.ode.utils.DOMUtils;
+import org.apche.ode.bpel.evar.ExternalVariableModuleException;
+import org.apche.ode.bpel.evar.IncompleteKeyException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
/**
* Base template for activities.
*/
abstract class ACTIVITY extends BpelJacobRunnable implements IndexedObject {
+ private static final Log __log = LogFactory.getLog(ACTIVITY.class);
protected ActivityInfo _self;
/**
@@ -61,6 +79,7 @@
return new Key(_self.o,_self.aId);
}
+
protected void sendVariableReadEvent(VariableInstance var) {
VariableReadEvent vre = new VariableReadEvent();
vre.setVarName(var.declaration.name);
@@ -104,6 +123,10 @@
for (Iterator<OLink> i = links.iterator(); i.hasNext();)
_linkFrame.resolve(i.next()).pub.linkStatus(false);
}
+
+ protected OConstants getConstants() {
+ return _self.o.getOwner().constants;
+ }
/**
* Perform dead-path elimination on an activity that was
@@ -128,6 +151,36 @@
return -1;
}
+ //
+ // Syntactic sugar for methods that used to be on BpelRuntimeContext..
+ //
+
+ Node fetchVariableData(VariableInstance variable, boolean forWriting) throws FaultException {
+ return _scopeFrame.fetchVariableData(getBpelRuntimeContext(), variable, forWriting);
+ }
+
+ Node fetchVariableData(VariableInstance var, OMessageVarType.Part part, boolean forWriting)
+ throws FaultException {
+ return _scopeFrame.fetchVariableData(getBpelRuntimeContext(), var, part, forWriting);
+ }
+
+ Node initializeVariable(VariableInstance lvar, Node val) {
+ return _scopeFrame.initializeVariable(getBpelRuntimeContext(), lvar, val);
+ }
+
+ void commitChanges(VariableInstance lval, Node lvalue) {
+ _scopeFrame.commitChanges(getBpelRuntimeContext(),lval, lvalue);
+ }
+
+ Node getPartData(Element message, Part part) {
+ return _scopeFrame.getPartData(message, part);
+ }
+
+
+ //
+ // End syntactic sugar.
+ //
+
public static final class Key implements Serializable {
private static final long serialVersionUID = 1L;
Modified: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ACTIVITYGUARD.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ACTIVITYGUARD.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ACTIVITYGUARD.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ACTIVITYGUARD.java Fri Jan 4 06:19:42 2008
@@ -163,7 +163,7 @@
try {
return getBpelRuntimeContext().getExpLangRuntime().evaluateAsBoolean(_oactivity.joinCondition,
- new ExprEvaluationContextImpl(null,null,_linkVals));
+ new ExprEvaluationContextImpl(null, null,_linkVals));
} catch (Exception e) {
String msg = "Unexpected error evaluating a join condition: " + _oactivity.joinCondition;
__log.error(msg,e);
Modified: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java Fri Jan 4 06:19:42 2008
@@ -117,14 +117,14 @@
val = tempwrapper;
} else
doc.appendChild(val);
- lval = getBpelRuntimeContext().initializeVariable(lvar, val);
+ lval = initializeVariable(lvar, val);
} else
- lval = napi.fetchVariableData(lvar, true);
+ lval = fetchVariableData(lvar, true);
}
return lval;
}
- /**
+ /**
* Get the r-value. There are several possibilities:
* <ul>
* <li>a message is selected - an element representing the whole message is
@@ -158,21 +158,19 @@
if (from instanceof DirectRef) {
OAssign.DirectRef dref = (OAssign.DirectRef) from;
sendVariableReadEvent(_scopeFrame.resolve(dref.variable));
- Node data = getBpelRuntimeContext().fetchVariableData(
+ Node data = fetchVariableData(
_scopeFrame.resolve(dref.variable), false);
retVal = DOMUtils.findChildByName((Element)data, dref.elName);
} else if (from instanceof OAssign.VariableRef) {
OAssign.VariableRef varRef = (OAssign.VariableRef) from;
sendVariableReadEvent(_scopeFrame.resolve(varRef.variable));
- Node data = getBpelRuntimeContext().fetchVariableData(
- _scopeFrame.resolve(varRef.variable), false);
+ Node data = fetchVariableData(_scopeFrame.resolve(varRef.variable), false);
retVal = evalQuery(data, varRef.part, varRef.location,
getEvaluationContext());
} else if (from instanceof OAssign.PropertyRef) {
OAssign.PropertyRef propRef = (OAssign.PropertyRef) from;
sendVariableReadEvent(_scopeFrame.resolve(propRef.variable));
- Node data = getBpelRuntimeContext().fetchVariableData(
- _scopeFrame.resolve(propRef.variable), false);
+ Node data = fetchVariableData(_scopeFrame.resolve(propRef.variable), false);
retVal = evalQuery(data, propRef.propertyAlias.part,
propRef.propertyAlias.location, getEvaluationContext());
@@ -320,7 +318,7 @@
return retVal;
}
- private void copy(OAssign.Copy ocopy) throws FaultException {
+ private void copy(OAssign.Copy ocopy) throws FaultException {
if (__log.isDebugEnabled())
__log.debug("Assign.copy(" + ocopy + ")");
@@ -344,8 +342,8 @@
.getVariable());
final VariableInstance rval = _scopeFrame
.resolve(((VariableRef) ocopy.from).getVariable());
- Element lvalue = (Element) napi.fetchVariableData(rval, false);
- napi.initializeVariable(lval, lvalue);
+ Element lvalue = (Element) fetchVariableData(rval, false);
+ initializeVariable(lval, lvalue);
se = new VariableModificationEvent(lval.declaration.name);
((VariableModificationEvent)se).setNewValue(lvalue);
} else {
@@ -425,7 +423,7 @@
if (__log.isDebugEnabled())
__log.debug("ASSIGN Writing variable '" + lval.declaration.name +
"' value '" + DOMUtils.domToString(lvalue) +"'");
- napi.commitChanges(lval, lvalue);
+ commitChanges(lval, lvalue);
se = new VariableModificationEvent(lval.declaration.name);
((VariableModificationEvent)se).setNewValue(lvalue);
}
@@ -436,7 +434,7 @@
sendEvent(se);
}
- private void replaceEndpointRefence(PartnerLinkInstance plval, Node rvalue) throws FaultException {
+ private void replaceEndpointRefence(PartnerLinkInstance plval, Node rvalue) throws FaultException {
// Eventually wrapping with service-ref element if we've been directly assigned some
// value that isn't wrapped.
if (rvalue.getNodeType() == Node.TEXT_NODE ||
Modified: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java Fri Jan 4 06:19:42 2008
@@ -31,6 +31,8 @@
import org.apache.ode.bpel.runtime.channels.PickResponseChannel;
import org.apache.ode.bpel.runtime.channels.TimerResponseChannel;
import org.apache.ode.bpel.runtime.channels.ActivityRecoveryChannel;
+import org.apche.ode.bpel.evar.ExternalVariableModuleException;
+import org.apche.ode.bpel.evar.IncompleteKeyException;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -85,12 +87,10 @@
* @param var variable to read
* @return
*/
- Node fetchVariableData(VariableInstance var, boolean forWriting)
- throws FaultException;
-
- Node fetchVariableData(VariableInstance var, OMessageVarType.Part partname, boolean forWriting)
+ Node readVariable(Long scopeInstanceId, String varname, boolean forWriting)
throws FaultException;
+
/**
* Fetches the my-role endpoint reference data.
* @param pLink
@@ -141,7 +141,6 @@
String readProperty(VariableInstance var, OProcess.OProperty property)
throws FaultException;
- Node initializeVariable(VariableInstance var, Node initData) ;
/**
* Writes a partner EPR.
@@ -154,7 +153,7 @@
Node convertEndpointReference(Element epr, Node targetNode);
- void commitChanges(VariableInstance var, Node changes);
+ Node writeVariable(VariableInstance var, Node changes);
boolean isCorrelationInitialized(CorrelationSetInstance cset);
@@ -242,8 +241,6 @@
QName getPartnerResponseType(String mexId);
- Node getPartData(Element message, Part part);
-
Element getSourceEPR(String mexId);
void registerActivityForRecovery(ActivityRecoveryChannel channel, long activityId, String reason,
@@ -257,5 +254,26 @@
void releasePartnerMex(String mexId);
- void initializeExternalVariable(VariableInstance instance, HashMap<String, String> keymap);
+ /**
+ * Read an external variable.
+ * @param externalVariableId identifier
+ * @param reference variable reference
+ * @return external variable value
+ * @throws ExternalVariableModuleException
+ */
+ Node readExtVar(String externalVariableId, Node reference) throws ExternalVariableModuleException;
+
+ /**
+ * Write an external variable.
+ * @param externalVariableId external variable id
+ * @param value new value
+ * @return update reference
+ * @throws ExternalVariableModuleException
+ */
+ ValueReferencePair writeExtVar(String externalVariableId, Node reference, Node value) throws ExternalVariableModuleException ;
+
+ public class ValueReferencePair {
+ public Node value;
+ public Node reference;
+ }
}
Modified: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EH_EVENT.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EH_EVENT.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EH_EVENT.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EH_EVENT.java Fri Jan 4 06:19:42 2008
@@ -231,7 +231,7 @@
if (msgEl != null) {
try {
VariableInstance vinst = ehScopeFrame.resolve(_oevent.variable);
- getBpelRuntimeContext().initializeVariable(vinst, msgEl);
+ getBpelRuntimeContext().writeVariable(vinst, msgEl);
VariableModificationEvent se = new VariableModificationEvent(vinst.declaration.name);
se.setNewValue(msgEl);
Modified: ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EventContextImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EventContextImpl.java?rev=608847&r1=608846&r2=608847&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EventContextImpl.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EventContextImpl.java Fri Jan 4 06:19:42 2008
@@ -70,7 +70,7 @@
{
Variable var = __scope.getVisibleVariable(varName);
VariableInstance varInstance = new VariableInstance(__scopeInstanceId, var);
- Node varNode = __runtimeContext.fetchVariableData(varInstance, false);
+ Node varNode = __runtimeContext.readVariable(varInstance.scopeInstance, varInstance.declaration.name, false);
value = DOMUtils.domToString(varNode);
}
catch(Throwable e)