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)