You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by co...@apache.org on 2003/02/23 20:21:32 UTC
cvs commit: xml-cocoon2/src/java/org/apache/cocoon/components/xmlform Form.java
coliver 2003/02/23 11:21:32
Modified: src/java/org/apache/cocoon/components/xmlform Form.java
Log:
'Updated to support using the Cocoon flow layer with XMLForm'
Revision Changes Path
1.17 +104 -70 xml-cocoon2/src/java/org/apache/cocoon/components/xmlform/Form.java
Index: Form.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/xmlform/Form.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- Form.java 31 Jan 2003 22:51:40 -0000 1.16
+++ Form.java 23 Feb 2003 19:21:32 -0000 1.17
@@ -74,8 +74,15 @@
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.JXPathException;
import org.apache.commons.jxpath.Pointer;
+import org.apache.commons.jxpath.ri.model.NodePointer;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
+// Unfortunately I have to introduce this dependency on
+// org.mozilla.javascript classes to support using JavaScript
+// nodes in JXPath
+import org.mozilla.javascript.NativeArray;
+import org.mozilla.javascript.ScriptableObject;
+import org.mozilla.javascript.Context;
/**
* <p>
@@ -184,55 +191,77 @@
jxcontext_.setValue(xpath, value);
}
- public void setValue(String xpath, Object[] values) {
+ public void setValue(String xpath, Object[] values) {
+ Pointer ptr = jxcontext_.getPointer(xpath);
- // // Dmitri Plotnikov's patch
- //
- // // if there are multiple values to set
- // // (like in the selectMany case),
- // // iterate over the array and set individual values
- // if ( values.length > 1 )
- // {
- // Iterator iter = jxcontext_.iteratePointers(xpath);
- // for (int i = 0; i < values.length; i++ )
- // {
- // Pointer ptr = (Pointer)iter.next();
- // ptr.setValue(values[i]);
- // }
- // }
- // else
- // {
- // // This is supposed to do the right thing
- // jxcontext_.setValue(xpath, values);
- // }
- //
-
- Pointer pointer = jxcontext_.getPointer(xpath);
- Object property = pointer.getValue();
- // if there are multiple values to set
- // (like in the selectMany case),
- // iterate over the array and set individual values
-
- // when the instance property is array
- if (property != null && property.getClass().isArray()) {
- Class componentType = property.getClass().getComponentType();
- property =
- java.lang.reflect.Array.newInstance(
- componentType,
- values.length);
- java.lang.System.arraycopy(values, 0, property, 0, values.length);
- pointer.setValue(property);
- } else if (property instanceof Collection) {
- Collection cl = (Collection) property;
- cl.clear();
- cl.addAll(java.util.Arrays.asList(values));
- }
- // otherwise set the value of the first element
- // (and the only) from the values array
- else {
- pointer.setValue(values[0]);
- }
- }
+ // // Dmitri Plotnikov's patch
+ //
+ // // if there are multiple values to set
+ // // (like in the selectMany case),
+ // // iterate over the array and set individual values
+ // if ( values.length > 1 )
+ // {
+ // Iterator iter = jxcontext_.iteratePointers(xpath);
+ // for (int i = 0; i < values.length; i++ )
+ // {
+ // Pointer ptr = (Pointer)iter.next();
+ // ptr.setValue(values[i]);
+ // }
+ // }
+ // else
+ // {
+ // // This is supposed to do the right thing
+ // jxcontext_.setValue(xpath, values);
+ // }
+ //
+
+ Pointer pointer = jxcontext_.getPointer(xpath);
+ Object property = pointer.getNode();
+ // if there are multiple values to set
+ // (like in the selectMany case),
+ // iterate over the array and set individual values
+
+ // when the instance property is array
+ if (property != null && property.getClass().isArray()) {
+ Class componentType = property.getClass().getComponentType();
+ property =
+ java.lang.reflect.Array.newInstance(
+ componentType,
+ values.length);
+ java.lang.System.arraycopy(values, 0, property, 0, values.length);
+ pointer.setValue(property);
+ } else if (property instanceof Collection) {
+ Collection cl = (Collection) property;
+ cl.clear();
+ cl.addAll(java.util.Arrays.asList(values));
+ } else if (property instanceof NativeArray) {
+ Context.enter();
+ try {
+ NativeArray arr = (NativeArray)property;
+ ScriptableObject.putProperty(arr, "length",
+ new Integer(0));
+ ScriptableObject.putProperty(arr, "length",
+ new Integer(values.length));
+ for (int i = 0; i < values.length; i++) {
+ Object val = values[i];
+ if (!(val == null
+ || val instanceof String
+ || val instanceof Number
+ || val instanceof Boolean)) {
+ val = Context.toObject(val, arr);
+ }
+ ScriptableObject.putProperty(arr, i, val);
+ }
+ } catch (Exception willNotBeThrown) {
+ // shouldn't happen
+ willNotBeThrown.printStackTrace();
+ } finally {
+ Context.exit();
+ }
+ } else {
+ jxcontext_.setValue(xpath, values[0]);
+ }
+ }
/**
* Encapsulates access to the model
@@ -245,22 +274,24 @@
*
*/
public Object getValue(String xpath) {
-
if (model_ == null)
throw new IllegalStateException("Form model not set");
- Pointer pointer = jxcontext_.getPointer(xpath);
- Object property = pointer.getValue();
- if (property != null) {
- // handle DOM elements
- if (property instanceof Element) {
- String textPath = pointer.asPath() + "/text()";
- property = getValue(textPath);
- } else if (property instanceof Text) {
- Text node = (Text) property;
- property = node.getData();
+ Object result = jxcontext_.getValue(xpath);
+ if (result instanceof NativeArray) {
+ // Convert JavaScript array to Collection
+ NativeArray arr = (NativeArray)result;
+ int len = (int)arr.jsGet_length();
+ List list = new ArrayList(len);
+ for (int i = 0; i < len; i++) {
+ Object obj = arr.get(i, arr);
+ if (obj == Context.getUndefinedValue()) {
+ obj = null;
}
+ list.add(obj);
+ }
+ result = list;
}
- return property;
+ return result;
}
/**
@@ -282,10 +313,12 @@
if (model_ == null)
throw new IllegalStateException("Form model not set");
List nodeset = new LinkedList();
+ Pointer ptr = jxcontext_.getPointer(xpathSelector);
Iterator iter = jxcontext_.iteratePointers(xpathSelector);
while (iter.hasNext()) {
- Pointer nextPointer = (Pointer) iter.next();
- nodeset.add(nextPointer.asPath());
+ Pointer nextPointer = (Pointer) iter.next();
+ String path = nextPointer.asPath();
+ nodeset.add(path);
}
return nodeset;
}
@@ -313,14 +346,14 @@
validator_.setProperty(Validator.PROPERTY_PHASE, phase);
List vs = validator_.validate(model_);
-
- if (violations_ != null) {
+ if (vs != null) {
+ if (violations_ != null) {
violations_.addAll(vs);
- } else {
- if (vs != null && !vs.isEmpty())
- violations_ = vs;
+ } else {
+ if (!vs.isEmpty())
+ violations_ = vs;
+ }
}
-
if (violations_ == null)
return true;
else {
@@ -373,12 +406,13 @@
Object[] values = (Object[]) entry.getValue();
try {
+ System.out.println("attempting to set value of " + path + " to " + java.util.Arrays.asList(values));
setValue(path, values);
} catch (JXPathException ex) {
Violation v = new Violation();
v.setPath(path);
String message = VIOLATION_MESSAGE_DATA_FORMAT_ERROR;
- v.setMessage(message);
+ v.setMessage(ex.getMessage());
pviolations.add(v);
}
} // while