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 -->