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