You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by bo...@apache.org on 2008/04/02 07:16:59 UTC

svn commit: r643743 - in /ode/branches/APACHE_ODE_1.1: bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/ bpel-test/src/test/resources/bpel/2.0/ExtVar2/

Author: boisvert
Date: Tue Apr  1 22:16:57 2008
New Revision: 643743

URL: http://svn.apache.org/viewvc?rev=643743&view=rev
Log:
Fix ODE-258: Accessing non-existent database external variable in 'update-insert' mode should create variable structure

Modified:
    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/extvar/jdbc/RowSubset.java
    ode/branches/APACHE_ODE_1.1/bpel-test/src/test/resources/bpel/2.0/ExtVar2/ExtVar2.bpel

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=643743&r1=643742&r2=643743&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 Tue Apr  1 22:16:57 2008
@@ -252,26 +252,37 @@
 
 	}
 
-    <T extends RowSubset> Element renderXmlRow(QName varType, T value) {
+    <T extends RowSubset> Element renderXmlRow(Locator locator, QName varType, T value) throws ExternalVariableModuleException {
 		Document doc = DOMUtils.newDocument();
         Element el = doc.createElementNS(varType.getNamespaceURI(), varType.getLocalPart());
 		doc.appendChild(el);
         if (value != null) {
-		for (Column c : value._columns) {
-			Object data = value.get(c.idx);
-	            Element cel = doc.createElementNS(varType.getNamespaceURI(), c.name);
-			String strdat = c.toText(data);
-			if (strdat != null)
-				cel.appendChild(doc.createTextNode(strdat));
-			else
-				cel.setAttributeNS(XSI_NS, "xsi:nil", "true");
-
-			el.appendChild(cel);
-		}
+            for (Column c : value._columns) {
+                Object data = value.get(c.idx);
+                addElement(el, varType, c, data);
+            }
+        } else {
+            // initialize variable with default/generated values
+            RowKey keys = keyFromLocator(locator);
+            for (Column c : _columns) {
+                Object data = c.getValue(c.name, keys, new RowVal(), locator.iid);
+                addElement(el, varType, c, data);
+            }
         }
 		return el;
 	}
 
+    private void addElement(Element parent, QName varType, Column c, Object data) {
+        Document doc = parent.getOwnerDocument();
+        Element cel = doc.createElementNS(varType.getNamespaceURI(), c.name);
+        String strdat = c.toText(data);
+        if (strdat != null)
+            cel.appendChild(doc.createTextNode(strdat));
+        else
+            cel.setAttributeNS(XSI_NS, "xsi:nil", "true");
+        parent.appendChild(cel);
+    }
+
 	<T extends RowSubset> T parseXmlRow(T ret, Node rowel)
 			throws ExternalVariableModuleException {
 		if (rowel == null)
@@ -294,7 +305,7 @@
             }
 
 			String nil = ((Element) n).getAttributeNS(XSI_NS, "nil");
-            if (nil != null && "true".equalsIgnoreCase(nil)) {
+            if (nil != null && "true".equalsIgnoreCase(nil) && (val == null)) {
                 if (__log.isDebugEnabled()) __log.debug("Extvar key: "+key+" is null (xsi:nil)");
 				ret.put(key, null);
             } else {
@@ -351,10 +362,10 @@
 				return iid;
 			case none:
 			default:
-            	if (key && keys.get(name) != null) 
-            		return keys.get(name);
-            	else
-				return values.get(name);
+                if (key && keys.get(name) != null)
+                    return keys.get(name);
+                else
+                    return values.get(name);
 			}
 		}
 
@@ -452,6 +463,15 @@
 								+ name + "\" !", ex);
 			}
 		}
+        
+        public String toString() {
+            return "Column {idx="+idx
+                +",name="+name
+                +",colname="+colname
+                +",key="+key
+                +",genType="+genType
+                +")";
+        }
 	}
 
 	/**
@@ -470,8 +490,8 @@
 		/**
 		 * Write the key to a locator.
 		 */
-        void write(QName varType, Locator locator) {
-            locator.reference = renderXmlRow(varType, this);
+        void write(QName varType, Locator locator) throws ExternalVariableModuleException {
+            locator.reference = renderXmlRow(locator, varType, this);
 		}
 
 		public Set<String> getMissing() {

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=643743&r1=643742&r2=643743&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 Tue Apr  1 22:16:57 2008
@@ -289,7 +289,7 @@
         Element val;
         try {
             RowVal rowval = execSelect(evar, locator);
-            val = evar.renderXmlRow(varType, rowval);
+            val = evar.renderXmlRow(locator, varType, rowval);
         } catch (SQLException se) {
             throw new ExternalVariableModuleException("SQL Error.", se);
         }
@@ -321,9 +321,9 @@
                 Object val = values.get(c.name);
                 if (__log.isDebugEnabled()) __log.debug("Set value parameter "+idx+": "+val);
                 if (val == null)
-                	stmt.setNull(idx, c.dataType);
+                    stmt.setNull(idx, c.dataType);
                 else
-                	stmt.setObject(idx, val);
+                    stmt.setObject(idx, val);
                 idx++;
             }
 
@@ -331,9 +331,9 @@
                 Object val = key.get(ck.name);
                 if (__log.isDebugEnabled()) __log.debug("Set key parameter "+idx+": "+val);
                 if (val == null)
-                	stmt.setNull(idx, ck.dataType);
+                    stmt.setNull(idx, ck.dataType);
                 else
-                	stmt.setObject(idx, val);
+                    stmt.setObject(idx, val);
                 idx++;
             }
             return stmt.executeUpdate();
@@ -348,7 +348,7 @@
         if (__log.isDebugEnabled()) __log.debug("execSelect: " + rowkey);
         
         if (!rowkey.isComplete()) {
-        	throw new IncompleteKeyException(rowkey.getMissing());
+            throw new IncompleteKeyException(rowkey.getMissing());
         }
         
         RowVal ret = dbev.new RowVal();
@@ -383,16 +383,20 @@
     }
 
     RowKey execInsert(DbExternalVariable dbev, Locator locator, RowKey keys, RowVal values) throws SQLException {
-        // RowKey keys = dbev.new RowKey();
         Connection conn = dbev.dataSource.getConnection();
         try {
+            if (__log.isDebugEnabled()) {
+                __log.debug("execInsert: keys=" + keys + " values=" + values);
+                __log.debug("Prepare statement: " + dbev.insert);
+            }
             PreparedStatement stmt = dbev.generatedKeys 
-            		? conn.prepareStatement(dbev.insert, dbev._autoColNames) 
-            		: conn.prepareStatement(dbev.insert);
+                    ? conn.prepareStatement(dbev.insert, dbev._autoColNames) 
+                    : conn.prepareStatement(dbev.insert);
             int idx = 1;
             for (Column c : dbev._inscolumns) {
                 Object val = c.getValue(c.name, keys, values, locator.iid);
                 values.put(c.name, val);
+                if (__log.isDebugEnabled()) __log.debug("Set parameter "+idx+": "+val);
                 stmt.setObject(idx, val);
                 idx++;
             }
@@ -403,11 +407,14 @@
                 // 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 : keys._columns)
+                for (Column ck : keys._columns) {
+                    if (__log.isDebugEnabled()) __log.debug("Generated key "+ck.name+": "+keyRS.getObject(ck.colname));
                     keys.put(ck.name, keyRS.getObject(ck.colname));
+                }
             } else {
                 for (Column ck : keys._columns) {
                     Object val = values.get(ck.name);
+                    if (__log.isDebugEnabled()) __log.debug("Key "+ck.name+": "+val);
                     keys.put(ck.name,val);
                 }
             }

Modified: 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=643743&r1=643742&r2=643743&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/RowSubset.java (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-runtime/src/main/java/org/apache/ode/bpel/extvar/jdbc/RowSubset.java Tue Apr  1 22:16:57 2008
@@ -29,43 +29,45 @@
 import org.apache.ode.bpel.extvar.jdbc.DbExternalVariable.Column;;
 
 class RowSubset extends ArrayList<Object> {
-	protected List<Column> _columns;
+    private static final long serialVersionUID = 1L;
 
-	/* 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) {
+    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;
@@ -83,7 +85,8 @@
     }
     
     public String toString() {
-        StringBuffer buf = new StringBuffer("RowSubset(");
+        StringBuffer buf = new StringBuffer(getClass().getSimpleName());
+        buf.append("(");
         for (int i=0; i<size(); i++) {
             if (i>0) buf.append(", ");
             buf.append(_columns.get(i).name);

Modified: ode/branches/APACHE_ODE_1.1/bpel-test/src/test/resources/bpel/2.0/ExtVar2/ExtVar2.bpel
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/bpel-test/src/test/resources/bpel/2.0/ExtVar2/ExtVar2.bpel?rev=643743&r1=643742&r2=643743&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.1/bpel-test/src/test/resources/bpel/2.0/ExtVar2/ExtVar2.bpel (original)
+++ ode/branches/APACHE_ODE_1.1/bpel-test/src/test/resources/bpel/2.0/ExtVar2/ExtVar2.bpel Tue Apr  1 22:16:57 2008
@@ -129,7 +129,7 @@
         </if>
 
 
-        <!-- create another row -->
+        <!-- update another row -->
 
         <assign name="createAnotherRow">
             <copy>
@@ -143,22 +143,47 @@
         <assign name="updateRow">
             <copy>
                 <from>
-                    <literal>
-                        <foo:costPerCustomer>
-                            <foo:value0>v2-1</foo:value0>
-                        </foo:costPerCustomer>
-                    </literal>
+                    <literal>v2-1</literal>
                 </from>
-                <to>$costPerCustomer</to>
+                <to>$costPerCustomer/foo:value0</to>
             </copy>
+        </assign>
+
+        
+        <!-- insert a new row -->
+
+        <assign name="insertRow">
             <copy>
                 <from>
-                    <literal>v2-1</literal>
+                    <literal>k3</literal>
+                </from>
+                <to>$costPerCustomer-keys/foo:key1</to>
+            </copy>
+            <copy>
+                <from>
+                    <literal>v3</literal>
                 </from>
                 <to>$costPerCustomer/foo:value0</to>
             </copy>
         </assign>
 
+        <if>
+            <condition>$costPerCustomer/foo:key1 = 'k3'</condition>
+            <empty/>
+            <else>
+                <throw faultName="foo:insertKey"/>
+            </else>
+        </if>
+
+        <if>
+            <condition>$costPerCustomer/foo:value0 = 'v3'</condition>
+            <empty/>
+            <else>
+                <throw faultName="foo:insertValue"/>
+            </else>
+        </if>
+
+        
         <!-- go back to first row -->
 
         <assign name="goBack1">
@@ -178,6 +203,25 @@
             </else>
         </if>
 
+        <!-- go back to 3rd row -->
+
+        <assign name="goBack3">
+            <copy>
+                <from>
+                    <literal>k3</literal>
+                </from>
+                <to>$costPerCustomer-keys/foo:key1</to>
+            </copy>
+        </assign>
+
+        <if>
+            <condition>$costPerCustomer/foo:value0 = 'v3'</condition>
+            <empty/>
+            <else>
+                <throw faultName="foo:goBack3"/>
+            </else>
+        </if>
+
         <!-- go back to 2nd row -->
 
         <assign name="goBack2">
@@ -196,6 +240,7 @@
                 <throw faultName="foo:goBack2"/>
             </else>
         </if>
+
 
         <!-- send back response -->