coliver     2003/02/23 14:51:31

  Modified:    src/java/org/apache/cocoon/components/xmlform Form.java
  Log:
  removed println's
  
  Revision  Changes    Path
  1.18      +671 -672  
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.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- Form.java 23 Feb 2003 19:21:32 -0000      1.17
  +++ Form.java 23 Feb 2003 22:51:30 -0000      1.18
  @@ -99,100 +99,100 @@
    */
   public class Form {
   
  -     public static String SCOPE_REQUEST = "request";
  -     public static String SCOPE_SESSION = "session";
  +        public static String SCOPE_REQUEST = "request";
  +        public static String SCOPE_SESSION = "session";
   
  -     public static String FORM_VIEW_PARAM = "cocoon-xmlform-view";
  +        public static String FORM_VIEW_PARAM = "cocoon-xmlform-view";
   
  -     public static String VIOLATION_MESSAGE_DATA_FORMAT_ERROR =
  -             "Invalid data format";
  +        public static String VIOLATION_MESSAGE_DATA_FORMAT_ERROR =
  +                "Invalid data format";
   
  -     /**
  -      * an XMLForm is only usable when it has an id and an underlying model
  -      */
  -     public Form(String id, Object model) {
  -
  -             if ((id == null) || (model == null))
  -                     throw new java.lang.IllegalStateException(
  -                             "Form cannot be created with null id or null model ");
  -             setId(id);
  -             setModel(model);
  -     }
  -
  -     public String getId() {
  -             return id_;
  -     }
  -
  -     public void setId(String newId) {
  -             id_ = newId;
  -     }
  -
  -     public Object getModel() {
  -             return model_;
  -     }
  -
  -     public void setModel(Object newModel) {
  -             model_ = newModel;
  -             jxcontext_ = JXPathContext.newContext(model_);
  -             jxcontext_.setLenient(false);
  -     }
  -
  -     public Validator getValidator() {
  -             return validator_;
  -     }
  -
  -     public void setValidator(Validator newValidator) {
  -             validator_ = newValidator;
  -     }
  -
  -     public List getViolations() {
  -             return violations_;
  -     }
  -
  -     /**
  -      * 
  -      * This method allows custom validations to be added
  -      * after population and after a call to validate
  -      * (either automatic or explicit).
  -      * Usually used from within the perform method of 
  -      * a concrete XMLFormAction.
  -      * 
  -      * @param newViolations
  -      *   
  -      */
  -     public void addViolations(List newViolations) {
  -
  -             if (violations_ != null)
  -                     violations_.addAll(newViolations);
  -             else
  -                     violations_ = newViolations;
  -             updateViolationsAsSortedSet();
  -
  -     }
  -
  -     public SortedSet getViolationsAsSortedSet() {
  -             return violationsAsSortedSet_;
  -     }
  -
  -     public void clearViolations() {
  -             violations_ = null;
  -             violationsAsSortedSet_ = null;
  -     }
  -
  -     /**
  -      * Encapsulates access to the model
  -      *
  -      * @param xpath to the model attribute
  -      * @param value to be set
  -      */
  -     public void setValue(String xpath, Object value) {
  -             if (model_ == null)
  -                     throw new IllegalStateException("Form model not set");
  -             jxcontext_.setValue(xpath, value);
  -     }
  +        /**
  +         * an XMLForm is only usable when it has an id and an underlying model
  +         */
  +        public Form(String id, Object model) {
  +
  +                if ((id == null) || (model == null))
  +                        throw new java.lang.IllegalStateException(
  +                                "Form cannot be created with null id or null model 
");
  +                setId(id);
  +                setModel(model);
  +        }
  +
  +        public String getId() {
  +                return id_;
  +        }
  +
  +        public void setId(String newId) {
  +                id_ = newId;
  +        }
  +
  +        public Object getModel() {
  +                return model_;
  +        }
  +
  +        public void setModel(Object newModel) {
  +                model_ = newModel;
  +                jxcontext_ = JXPathContext.newContext(model_);
  +                jxcontext_.setLenient(false);
  +        }
  +
  +        public Validator getValidator() {
  +                return validator_;
  +        }
  +
  +        public void setValidator(Validator newValidator) {
  +                validator_ = newValidator;
  +        }
  +
  +        public List getViolations() {
  +                return violations_;
  +        }
  +
  +        /**
  +         * 
  +         * This method allows custom validations to be added
  +         * after population and after a call to validate
  +         * (either automatic or explicit).
  +         * Usually used from within the perform method of 
  +         * a concrete XMLFormAction.
  +         * 
  +         * @param newViolations
  +         *   
  +         */
  +        public void addViolations(List newViolations) {
  +
  +                if (violations_ != null)
  +                        violations_.addAll(newViolations);
  +                else
  +                        violations_ = newViolations;
  +                updateViolationsAsSortedSet();
  +
  +        }
  +
  +        public SortedSet getViolationsAsSortedSet() {
  +                return violationsAsSortedSet_;
  +        }
  +
  +        public void clearViolations() {
  +                violations_ = null;
  +                violationsAsSortedSet_ = null;
  +        }
  +
  +        /**
  +         * Encapsulates access to the model
  +         *
  +         * @param xpath to the model attribute
  +         * @param value to be set
  +         */
  +        public void setValue(String xpath, Object value) {
  +                if (model_ == null)
  +                        throw new IllegalStateException("Form model not set");
  +                jxcontext_.setValue(xpath, value);
  +        }
   
           public void setValue(String xpath, Object[] values) {
  -         Pointer ptr = jxcontext_.getPointer(xpath);
  +            Pointer ptr = jxcontext_.getPointer(xpath);
   
                   //    // Dmitri Plotnikov's patch
                   //    
  @@ -234,605 +234,604 @@
                           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
  -      *
  -      * @param xpath of the model attribute
  -      *
  -      * @throws RuntimeException if the xpath value 
  -      * has invalid XPath syntax or it doesn't point 
  -      * to an attribute of the model
  -      *
  -      */
  -     public Object getValue(String xpath) {
  -             if (model_ == null)
  -                     throw new IllegalStateException("Form model not set");
  -             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 result;
  -     }
  -
  -     /**
  -      * Resolves a nodeset selector
  -      * into a list of concrete node locations
  -      * @param xpathSelector the nodeset selector
  -      *
  -      * @return a Set of XPath strings pointing to 
  -      * each nodeset satisfying the nodeset selector
  -      *
  +                } 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
  +         *
  +         * @param xpath of the model attribute
  +         *
  +         * @throws RuntimeException if the xpath value 
  +         * has invalid XPath syntax or it doesn't point 
  +         * to an attribute of the model
  +         *
  +         */
  +        public Object getValue(String xpath) {
  +                if (model_ == null)
  +                        throw new IllegalStateException("Form model not set");
  +                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 result;
  +        }
  +
  +        /**
  +         * Resolves a nodeset selector
  +         * into a list of concrete node locations
  +         * @param xpathSelector the nodeset selector
  +         *
  +         * @return a Set of XPath strings pointing to 
  +         * each nodeset satisfying the nodeset selector
  +         *
        * <p>
  -      * TODO: the Collection return type should be replaced with a Set.
  -      * LinkedHashSet implementation should be used. All resolved 
  -      * nodes are unique in the resulting set, therefore Set is more appropriate.
  -      * Since LinkedHashSet is only available in JDK 1.4 or later, it is not
  -      * appropriate to make the change immediately.
  -      */
  -     public Collection locate(String xpathSelector) {
  -             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();
  -                 String path = nextPointer.asPath();
  -                 nodeset.add(path);
  -             }
  -             return nodeset;
  -     }
  -
  -     /**
  -      * Performs complete validation
  -      * of the form model
  -      */
  -     public boolean validate() {
  -             return validate(null);
  -     }
  -
  -     /**
  -      *
  -      * @param phase the validation phase
  -      *
  -      * @return
  -      * if validation finishes without any violations, 
  -      * return true otherwise return false and save all violations
  -      *
  -      */
  -     public boolean validate(String phase) {
  -             if (validator_ == null)
  -                     return true;
  -
  -             validator_.setProperty(Validator.PROPERTY_PHASE, phase);
  -             List vs = validator_.validate(model_);
  -             if (vs != null) {
  -                 if (violations_ != null) {
  -                     violations_.addAll(vs);
  -                 } else {
  -                     if (!vs.isEmpty())
  -                         violations_ = vs;
  -                 }
  -             }
  -             if (violations_ == null)
  -                     return true;
  -             else {
  -                     updateViolationsAsSortedSet();
  -                     return false;
  -             }
  -     }
  -
  -     /**
  -      * Populates an HTML Form POST into the XMLForm model (JavaBean or DOM node).
  -      *
  +         * TODO: the Collection return type should be replaced with a Set.
  +         * LinkedHashSet implementation should be used. All resolved 
  +         * nodes are unique in the resulting set, therefore Set is more appropriate.
  +         * Since LinkedHashSet is only available in JDK 1.4 or later, it is not
  +         * appropriate to make the change immediately.
  +         */
  +        public Collection locate(String xpathSelector) {
  +                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();
  +                    String path = nextPointer.asPath();
  +                    nodeset.add(path);
  +                }
  +                return nodeset;
  +        }
  +
  +        /**
  +         * Performs complete validation
  +         * of the form model
  +         */
  +        public boolean validate() {
  +                return validate(null);
  +        }
  +
  +        /**
  +         *
  +         * @param phase the validation phase
  +         *
  +         * @return
  +         * if validation finishes without any violations, 
  +         * return true otherwise return false and save all violations
  +         *
  +         */
  +        public boolean validate(String phase) {
  +                if (validator_ == null)
  +                        return true;
  +
  +                validator_.setProperty(Validator.PROPERTY_PHASE, phase);
  +                List vs = validator_.validate(model_);
  +                if (vs != null) {
  +                    if (violations_ != null) {
  +                        violations_.addAll(vs);
  +                    } else {
  +                        if (!vs.isEmpty())
  +                            violations_ = vs;
  +                    }
  +                }
  +                if (violations_ == null)
  +                        return true;
  +                else {
  +                        updateViolationsAsSortedSet();
  +                        return false;
  +                }
  +        }
  +
  +        /**
  +         * Populates an HTML Form POST into the XMLForm model (JavaBean or DOM 
node).
  +         *
        * <p>
  -      * Expects that all request parameter names are XPath expressions
  -      * to attributes of the model.
  -      * For each request parameter, finds and assigns its value to the
  -      * JavaBean property corresponding to the parameter's name
  +         * Expects that all request parameter names are XPath expressions
  +         * to attributes of the model.
  +         * For each request parameter, finds and assigns its value to the
  +         * JavaBean property corresponding to the parameter's name
        * </p>
  -      *
  -      * TODO: provide a more sophisticated examples with checkboxes, multi choice,
  -      * radio button, text area, file upload, etc.
  -      */
  -     public void populate(Map sitemapObjectModel) {
  -             // clean violations_ set
  -             clearViolations();
  -
  -             // let listeners know that 
  -             // population is about to start
  -             reset();
  -
  -             // data format violations
  -             // gathered during population
  -             // For example when 
  -             // a request parameter value is "saymyname"
  -             // while the request parameter name points to an int attribute
  -             List pviolations = new ArrayList();
  -
  -             Map filteredParameters =
  -                     getFilteredRequestParameters(sitemapObjectModel);
  -             Iterator iter = filteredParameters.entrySet().iterator();
  -             while (iter.hasNext()) {
  -                     Map.Entry entry = (Map.Entry) iter.next();
  -
  -                     String path = (String) entry.getKey();
  -
  -                     // filter custom request parameter
  -                     // not refering to the model
  -                     if (filterRequestParameter(path))
  -                             continue;
  -
  -                     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(ex.getMessage());
  -                             pviolations.add(v);
  -                     }
  -             } // while
  -
  -             // validate form model
  -             autoValidate(sitemapObjectModel);
  -
  -             // merge violation sets
  -             if (violations_ != null) {
  -                     violations_.addAll(pviolations);
  -             } else {
  -                     if (!pviolations.isEmpty())
  -                             violations_ = pviolations;
  -             }
  -             if (violations_ != null) {
  -                     updateViolationsAsSortedSet();
  -             }
  -     }
  -
  -     /**
  -      * 
  -      * Filters request parameters which are not references to model properties.
  -      * Sets default values for parameters which were expected in the request, 
  -      * but did not arrive (e.g. check boxes).
  -      * 
  -      * @return filtered request parameters
  -      * 
  -      */
  -     protected Map getFilteredRequestParameters(Map sitemapObjectModel) {
  -
  -             Request request = getRequest(sitemapObjectModel);
  -
  -             Map filteredParameters = new HashMap();
  -
  -             // first filter out request parameters which do not refer to model 
properties
  -             Enumeration enum = request.getParameterNames();
  -             while (enum.hasMoreElements()) {
  -                     String path = (String) enum.nextElement();
  -
  -                     // filter custom request parameter
  -                     // not refering to the model
  -                     if (filterRequestParameter(path))
  -                             continue;
  -
  -                     Object[] values = request.getParameterValues(path);
  -
  -                     filteredParameters.put(path, values);
  -             }
  -
  -             // now, find expected parameters which did not arrive 
  -             // and set default values for them
  -             String viewName = getFormView(sitemapObjectModel);
  -             Map expectedReferences =
  -                     getFormViewState(viewName).getModelReferenceMap();
  -
  -             Iterator iter = expectedReferences.entrySet().iterator();
  -             while (iter.hasNext()) {
  -                     Map.Entry entry = (Map.Entry) iter.next();
  -                     String propertyReference = (String) entry.getKey();
  -
  -                     // check if the expected parameter actually arrived in the 
request
  -                     if (filteredParameters.get(propertyReference) == null) {
  -                             // Since it is not there, try to provide a default 
value
  -                             String inputType = (String) entry.getValue();
  -
  -                             Object defaultValue = null;
  -                             if 
(inputType.equals(XMLFormTransformer.TAG_SELECTBOOLEAN)) {
  -                                     // false for boolean type (usually, single 
check-box)
  -                                     defaultValue = new Object[] { Boolean.FALSE };
  -                             } else if (
  -                                     
inputType.equals(XMLFormTransformer.TAG_SELECTMANY)) {
  -                                     // empty array for select many (usually, multi 
check-box)
  -                                     defaultValue = new Object[0];
  -                             } else {
  -                                     // for all the rest, use a blank value and 
hope for the best
  -                                     defaultValue = new Object[] { "" };
  -                             }
  -
  -                             filteredParameters.put(propertyReference, 
defaultValue);
  -
  -                     }
  -
  -             } // iterate over expectedReferences.entrySet()
  -
  -             return filteredParameters;
  -
  -     } // getFilteredRequestParameters
  -
  -     /** create a SortedSet view of the violations collection
  -     * for convenience of processors down the pipeline
  -     * protected void updateViolationsAsSortedSet()
  -     */
  -     protected void updateViolationsAsSortedSet() {
  -             violationsAsSortedSet_ = new TreeSet(violations_);
  -     }
  -
  -     /**
  -     *
  -     * Convenience method invoked after populate()
  -     * By default it performs Form model validation.
  -     *
  -     * <br>
  -     * - If default validation is not necessary
  -     * setAutoValidate( false ) should be used
  -     *
  -     * <br>
  -     * If the validation
  -     * criteria needs to be different, subclasses can override
  -     * this method to change the behaviour.
  -     *
  -     */
  -     protected void autoValidate(Map sitemapObjectModel) {
  -             if (!autoValidateEnabled_)
  -                     return;
  -             // perform validation for the phase 
  -             // which matches the name of the current form view
  -             // if one is available
  -             String formView = getFormView(sitemapObjectModel);
  -             if (formView != null) {
  -                     validate(formView);
  -             }
  -     }
  -
  -     /**
  -     * Filters custom request parameter not refering to the model
  -     *
  +         *
  +         * TODO: provide a more sophisticated examples with checkboxes, multi 
choice,
  +         * radio button, text area, file upload, etc.
  +         */
  +        public void populate(Map sitemapObjectModel) {
  +                // clean violations_ set
  +                clearViolations();
  +
  +                // let listeners know that 
  +                // population is about to start
  +                reset();
  +
  +                // data format violations
  +                // gathered during population
  +                // For example when 
  +                // a request parameter value is "saymyname"
  +                // while the request parameter name points to an int attribute
  +                List pviolations = new ArrayList();
  +
  +                Map filteredParameters =
  +                        getFilteredRequestParameters(sitemapObjectModel);
  +                Iterator iter = filteredParameters.entrySet().iterator();
  +                while (iter.hasNext()) {
  +                        Map.Entry entry = (Map.Entry) iter.next();
  +
  +                        String path = (String) entry.getKey();
  +
  +                        // filter custom request parameter
  +                        // not refering to the model
  +                        if (filterRequestParameter(path))
  +                                continue;
  +
  +                        Object[] values = (Object[]) entry.getValue();
  +
  +                        try {
  +                            setValue(path, values);
  +                        } catch (JXPathException ex) {
  +                                Violation v = new Violation();
  +                                v.setPath(path);
  +                                String message = 
VIOLATION_MESSAGE_DATA_FORMAT_ERROR;
  +                                v.setMessage(ex.getMessage());
  +                                pviolations.add(v);
  +                        }
  +                } // while
  +
  +                // validate form model
  +                autoValidate(sitemapObjectModel);
  +
  +                // merge violation sets
  +                if (violations_ != null) {
  +                        violations_.addAll(pviolations);
  +                } else {
  +                        if (!pviolations.isEmpty())
  +                                violations_ = pviolations;
  +                }
  +                if (violations_ != null) {
  +                        updateViolationsAsSortedSet();
  +                }
  +        }
  +
  +        /**
  +         * 
  +         * Filters request parameters which are not references to model properties.
  +         * Sets default values for parameters which were expected in the request, 
  +         * but did not arrive (e.g. check boxes).
  +         * 
  +         * @return filtered request parameters
  +         * 
  +         */
  +        protected Map getFilteredRequestParameters(Map sitemapObjectModel) {
  +
  +                Request request = getRequest(sitemapObjectModel);
  +
  +                Map filteredParameters = new HashMap();
  +
  +                // first filter out request parameters which do not refer to model 
properties
  +                Enumeration enum = request.getParameterNames();
  +                while (enum.hasMoreElements()) {
  +                        String path = (String) enum.nextElement();
  +
  +                        // filter custom request parameter
  +                        // not refering to the model
  +                        if (filterRequestParameter(path))
  +                                continue;
  +
  +                        Object[] values = request.getParameterValues(path);
  +
  +                        filteredParameters.put(path, values);
  +                }
  +
  +                // now, find expected parameters which did not arrive 
  +                // and set default values for them
  +                String viewName = getFormView(sitemapObjectModel);
  +                Map expectedReferences =
  +                        getFormViewState(viewName).getModelReferenceMap();
  +
  +                Iterator iter = expectedReferences.entrySet().iterator();
  +                while (iter.hasNext()) {
  +                        Map.Entry entry = (Map.Entry) iter.next();
  +                        String propertyReference = (String) entry.getKey();
  +
  +                        // check if the expected parameter actually arrived in the 
request
  +                        if (filteredParameters.get(propertyReference) == null) {
  +                                // Since it is not there, try to provide a default 
value
  +                                String inputType = (String) entry.getValue();
  +
  +                                Object defaultValue = null;
  +                                if 
(inputType.equals(XMLFormTransformer.TAG_SELECTBOOLEAN)) {
  +                                        // false for boolean type (usually, single 
check-box)
  +                                        defaultValue = new Object[] { Boolean.FALSE 
};
  +                                } else if (
  +                                        
inputType.equals(XMLFormTransformer.TAG_SELECTMANY)) {
  +                                        // empty array for select many (usually, 
multi check-box)
  +                                        defaultValue = new Object[0];
  +                                } else {
  +                                        // for all the rest, use a blank value and 
hope for the best
  +                                        defaultValue = new Object[] { "" };
  +                                }
  +
  +                                filteredParameters.put(propertyReference, 
defaultValue);
  +
  +                        }
  +
  +                } // iterate over expectedReferences.entrySet()
  +
  +                return filteredParameters;
  +
  +        } // getFilteredRequestParameters
  +
  +        /** create a SortedSet view of the violations collection
  +        * for convenience of processors down the pipeline
  +        * protected void updateViolationsAsSortedSet()
  +        */
  +        protected void updateViolationsAsSortedSet() {
  +                violationsAsSortedSet_ = new TreeSet(violations_);
  +        }
  +
  +        /**
  +        *
  +        * Convenience method invoked after populate()
  +        * By default it performs Form model validation.
  +        *
  +        * <br>
  +        * - If default validation is not necessary
  +        * setAutoValidate( false ) should be used
  +        *
  +        * <br>
  +        * If the validation
  +        * criteria needs to be different, subclasses can override
  +        * this method to change the behaviour.
  +        *
  +        */
  +        protected void autoValidate(Map sitemapObjectModel) {
  +                if (!autoValidateEnabled_)
  +                        return;
  +                // perform validation for the phase 
  +                // which matches the name of the current form view
  +                // if one is available
  +                String formView = getFormView(sitemapObjectModel);
  +                if (formView != null) {
  +                        validate(formView);
  +                }
  +        }
  +
  +        /**
  +        * Filters custom request parameter not refering to the model
  +        *
       * <p>
  -     * TODO: implement default filtering
  -     * for standard Cocoon parameters
  -     * like cocoon-action[-suffix]
  -     *
  -     */
  -     protected boolean filterRequestParameter(String name) {
  -             // filter standard cocoon-* parameters
  -             if (filterDefaultRequestParameter(name))
  -                     return true;
  -
  -             // then consult with FormListeners
  -             Set ls = new HashSet();
  -             ls.addAll(Collections.synchronizedSet(formListeners_));
  -             Iterator iter = ls.iterator();
  -             while (iter.hasNext()) {
  -                     FormListener fl = (FormListener) iter.next();
  -                     // if any of the listeners wants this parameter filtered
  -                     // then filter it (return true)
  -                     if (fl.filterRequestParameter(this, name))
  -                             return true;
  -             }
  -             // if none of the listeners wants this parameter filtered
  -             // then don't filter it
  -             return false;
  -     }
  -
  -     /**
  -     * Filters the standard cocoon request parameters.
  -     * If default filtering needs to be different,
  -     * subclasses can override this method.
  -     * It is invoked before all listeners are asked to filter the parameter
  -     */
  -     protected boolean filterDefaultRequestParameter(String paramName) {
  -             if (paramName.startsWith(Constants.ACTION_PARAM_PREFIX)
  -                     || paramName.startsWith(Constants.VIEW_PARAM))
  -                     return true;
  -             if (paramName.equals(FORM_VIEW_PARAM))
  -                     return true;
  -             else
  -                     return false;
  -     }
  -
  -     /**
  -      * Try to extract from the request
  -      * and return the current form view
  -      */
  -     public String getFormView(Map sitemapObjectModel) {
  -             return 
getRequest(sitemapObjectModel).getParameter(Form.FORM_VIEW_PARAM);
  -     }
  -
  -     /**
  -      * This method is called before
  -      * the form is populated with request parameters.
  -      *
  -      * Semantically similar to that of the 
  -      * ActionForm.reset() in Struts
  -      *
  -      * Can be used for clearing checkbox fields,
  -      * because the browser will not send them when
  -      * not checked.
  -      *
  -      * Calls reset on all FormListeners
  -      */
  -     protected void reset() {
  -             // notify FormListeners
  -             Set ls = new HashSet();
  -             ls.addAll(Collections.synchronizedSet(formListeners_));
  -             Iterator iter = ls.iterator();
  -             while (iter.hasNext()) {
  -                     FormListener fl = (FormListener) iter.next();
  -                     fl.reset(this);
  -             }
  -             return;
  -     }
  -
  -     /**
  -      * Loads a form from the request or session
  -      *
  -      * @param sitemapObjectModel
  -      * @param id the form id
  -      */
  -     public static Form lookup(Map sitemapObjectModel, String id) {
  -             Request request = getRequest(sitemapObjectModel);
  -             Form form = (Form) request.getAttribute(id);
  -             if (form != null)
  -                     return form;
  -             else {
  -                     Session session = request.getSession(false);
  -                     if (session != null)
  -                             form = (Form) session.getAttribute(id);
  -                     return form;
  -             }
  -     }
  -
  -     /**
  -      * Removes a form from the request and session.
  -      * This method will remove the attribute bindings
  -      * correspoding to the form id from both request
  -      * and session to ensure that a subsequent 
  -      * Form.lookup will not succeed.
  -      *
  -      * @param sitemapObjectModel
  -      * @param id the form id
  -      */
  -     public static void remove(Map sitemapObjectModel, String id) {
  -             Request request = getRequest(sitemapObjectModel);
  -             request.removeAttribute(id);
  -
  -             Session session = request.getSession(false);
  -             if (session != null)
  -                     session.removeAttribute(id);
  -     }
  -
  -     /**
  -      * Saves the form in the request or session
  -      *
  -      * @param sitemapObjectModel
  -      * @param scope if true the form will be bound in the session, otherwise 
request
  -      */
  -     public void save(Map sitemapObjectModel, String scope) {
  -             Request request = getRequest(sitemapObjectModel);
  -
  -             if (lookup(sitemapObjectModel, id_) != null)
  -                     throw new java.lang.IllegalStateException(
  -                             "Form [id=" + id_ + "] already bound in request or 
session ");
  -
  -             if (SCOPE_REQUEST.equals(scope)) {
  -                     request.setAttribute(id_, this);
  -             } else // session scope
  -                     {
  -                     Session session = request.getSession(true);
  -                     session.setAttribute(id_, this);
  -             }
  -
  -     }
  -
  -     /**
  -      * Add another FormListener
  -      *
  -      */
  -     public synchronized void addFormListener(FormListener formListener) {
  -             formListeners_.add(formListener);
  -     }
  -
  -     /**
  -      * Add another FormListener
  -      *
  -      */
  -     public synchronized void removeFormListener(FormListener formListener) {
  -             formListeners_.remove(formListener);
  -     }
  -
  -     protected final static Request getRequest(Map sitemapObjectModel) {
  -             return (Request) sitemapObjectModel.get(
  -                     ObjectModelHelper.REQUEST_OBJECT);
  -     }
  -
  -     public void setAutoValidate(boolean newAVFlag) {
  -             autoValidateEnabled_ = newAVFlag;
  -     }
  -
  -     /**
  -      * <pre>
  -      * When the transformer renders a form view,
  -      * it lets the form wrapper know about each referenced model property.
  -      * This allows a precise tracking and can be used for multiple reasons:
  -      *   1) Verify that the client does not temper with the input fields as 
specified by the 
  -      *      form view author
  -      *   2) Allow default values to be used for properties which were expected to 
be send by the client,
  -      *      but for some reason were not. A typical example is a check box. When 
unchecked, the browser
  -      *      does not send any request parameter, leaving it to the server to 
handle the situation.
  -      *      This proves to be a very error prone problem when solved on a case by 
case basis.
  -      *      By having a list of expected property references, the model populator 
can detect
  -      *      a checkbox which was not send and set the property value to false.
  -      * 
  -      * NOTE: This added functionality is ONLY useful for SESSION scope forms.
  -      * Request scope forms are constructed anew for every request and therefore
  -      * cannot benefit from this extra feature.
  -      * With the high performance CPUs and cheap memory used in today's servers,
  -      * session scope forms are a safe choice.
  -      * 
  -      * </pre>
  -      * 
  -      */
  -     public void saveExpectedModelReferenceForView(
  -             String currentFormView,
  -             String ref,
  -             String inputType) {
  -             // if the form view is null, we are not interested in saving any 
references
  -             if (currentFormView == null)
  -                     return;
  -
  -             FormViewState formViewState = getFormViewState(currentFormView);
  -             formViewState.addModelReferenceAndInputType(ref, inputType);
  -     }
  -
  -     /**
  -      * When the transformer starts rendering a new form element
  -      * It needs to reset previously saved references for another 
  -      * transformation of the same view.
  -      */
  -     public void clearSavedModelReferences(String currentFormView) {
  -             FormViewState formViewState = getFormViewState(currentFormView);
  -             formViewState.clear();
  -     }
  -
  -     /**
  -      * We keep a map of ViewState objects which store 
  -      * all references to model properties in a particular form view
  -      * which were rendered by the 
  -      * XMLFormTansformer in the most recent transformation.
  -      */
  -     protected FormViewState getFormViewState(String viewName) {
  -             FormViewState formViewState =
  -                     (FormViewState) viewStateMap_.get(viewName);
  -             if (formViewState == null) {
  -                     formViewState = new FormViewState();
  -                     viewStateMap_.put(viewName, formViewState);
  -             }
  -             return formViewState;
  -     }
  -
  -     /**
  -      * Internal class used for keeping state information
  -      * during the life cycle of a form.
  -      * 
  -      * <p>Used only for session scoped forms
  -      */
  -     class FormViewState {
  +        * TODO: implement default filtering
  +        * for standard Cocoon parameters
  +        * like cocoon-action[-suffix]
  +        *
  +        */
  +        protected boolean filterRequestParameter(String name) {
  +                // filter standard cocoon-* parameters
  +                if (filterDefaultRequestParameter(name))
  +                        return true;
  +
  +                // then consult with FormListeners
  +                Set ls = new HashSet();
  +                ls.addAll(Collections.synchronizedSet(formListeners_));
  +                Iterator iter = ls.iterator();
  +                while (iter.hasNext()) {
  +                        FormListener fl = (FormListener) iter.next();
  +                        // if any of the listeners wants this parameter filtered
  +                        // then filter it (return true)
  +                        if (fl.filterRequestParameter(this, name))
  +                                return true;
  +                }
  +                // if none of the listeners wants this parameter filtered
  +                // then don't filter it
  +                return false;
  +        }
  +
  +        /**
  +        * Filters the standard cocoon request parameters.
  +        * If default filtering needs to be different,
  +        * subclasses can override this method.
  +        * It is invoked before all listeners are asked to filter the parameter
  +        */
  +        protected boolean filterDefaultRequestParameter(String paramName) {
  +                if (paramName.startsWith(Constants.ACTION_PARAM_PREFIX)
  +                        || paramName.startsWith(Constants.VIEW_PARAM))
  +                        return true;
  +                if (paramName.equals(FORM_VIEW_PARAM))
  +                        return true;
  +                else
  +                        return false;
  +        }
  +
  +        /**
  +         * Try to extract from the request
  +         * and return the current form view
  +         */
  +        public String getFormView(Map sitemapObjectModel) {
  +                return 
getRequest(sitemapObjectModel).getParameter(Form.FORM_VIEW_PARAM);
  +        }
  +
  +        /**
  +         * This method is called before
  +         * the form is populated with request parameters.
  +         *
  +         * Semantically similar to that of the 
  +         * ActionForm.reset() in Struts
  +         *
  +         * Can be used for clearing checkbox fields,
  +         * because the browser will not send them when
  +         * not checked.
  +         *
  +         * Calls reset on all FormListeners
  +         */
  +        protected void reset() {
  +                // notify FormListeners
  +                Set ls = new HashSet();
  +                ls.addAll(Collections.synchronizedSet(formListeners_));
  +                Iterator iter = ls.iterator();
  +                while (iter.hasNext()) {
  +                        FormListener fl = (FormListener) iter.next();
  +                        fl.reset(this);
  +                }
  +                return;
  +        }
  +
  +        /**
  +         * Loads a form from the request or session
  +         *
  +         * @param sitemapObjectModel
  +         * @param id the form id
  +         */
  +        public static Form lookup(Map sitemapObjectModel, String id) {
  +                Request request = getRequest(sitemapObjectModel);
  +                Form form = (Form) request.getAttribute(id);
  +                if (form != null)
  +                        return form;
  +                else {
  +                        Session session = request.getSession(false);
  +                        if (session != null)
  +                                form = (Form) session.getAttribute(id);
  +                        return form;
  +                }
  +        }
  +
  +        /**
  +         * Removes a form from the request and session.
  +         * This method will remove the attribute bindings
  +         * correspoding to the form id from both request
  +         * and session to ensure that a subsequent 
  +         * Form.lookup will not succeed.
  +         *
  +         * @param sitemapObjectModel
  +         * @param id the form id
  +         */
  +        public static void remove(Map sitemapObjectModel, String id) {
  +                Request request = getRequest(sitemapObjectModel);
  +                request.removeAttribute(id);
  +
  +                Session session = request.getSession(false);
  +                if (session != null)
  +                        session.removeAttribute(id);
  +        }
  +
  +        /**
  +         * Saves the form in the request or session
  +         *
  +         * @param sitemapObjectModel
  +         * @param scope if true the form will be bound in the session, otherwise 
request
  +         */
  +        public void save(Map sitemapObjectModel, String scope) {
  +                Request request = getRequest(sitemapObjectModel);
  +
  +                if (lookup(sitemapObjectModel, id_) != null)
  +                        throw new java.lang.IllegalStateException(
  +                                "Form [id=" + id_ + "] already bound in request or 
session ");
  +
  +                if (SCOPE_REQUEST.equals(scope)) {
  +                        request.setAttribute(id_, this);
  +                } else // session scope
  +                        {
  +                        Session session = request.getSession(true);
  +                        session.setAttribute(id_, this);
  +                }
  +
  +        }
  +
  +        /**
  +         * Add another FormListener
  +         *
  +         */
  +        public synchronized void addFormListener(FormListener formListener) {
  +                formListeners_.add(formListener);
  +        }
  +
  +        /**
  +         * Add another FormListener
  +         *
  +         */
  +        public synchronized void removeFormListener(FormListener formListener) {
  +                formListeners_.remove(formListener);
  +        }
  +
  +        protected final static Request getRequest(Map sitemapObjectModel) {
  +                return (Request) sitemapObjectModel.get(
  +                        ObjectModelHelper.REQUEST_OBJECT);
  +        }
  +
  +        public void setAutoValidate(boolean newAVFlag) {
  +                autoValidateEnabled_ = newAVFlag;
  +        }
  +
  +        /**
  +         * <pre>
  +         * When the transformer renders a form view,
  +         * it lets the form wrapper know about each referenced model property.
  +         * This allows a precise tracking and can be used for multiple reasons:
  +         *   1) Verify that the client does not temper with the input fields as 
specified by the 
  +         *      form view author
  +         *   2) Allow default values to be used for properties which were expected 
to be send by the client,
  +         *      but for some reason were not. A typical example is a check box. 
When unchecked, the browser
  +         *      does not send any request parameter, leaving it to the server to 
handle the situation.
  +         *      This proves to be a very error prone problem when solved on a case 
by case basis.
  +         *      By having a list of expected property references, the model 
populator can detect
  +         *      a checkbox which was not send and set the property value to false.
  +         * 
  +         * NOTE: This added functionality is ONLY useful for SESSION scope forms.
  +         * Request scope forms are constructed anew for every request and therefore
  +         * cannot benefit from this extra feature.
  +         * With the high performance CPUs and cheap memory used in today's servers,
  +         * session scope forms are a safe choice.
  +         * 
  +         * </pre>
  +         * 
  +         */
  +        public void saveExpectedModelReferenceForView(
  +                String currentFormView,
  +                String ref,
  +                String inputType) {
  +                // if the form view is null, we are not interested in saving any 
references
  +                if (currentFormView == null)
  +                        return;
  +
  +                FormViewState formViewState = getFormViewState(currentFormView);
  +                formViewState.addModelReferenceAndInputType(ref, inputType);
  +        }
  +
  +        /**
  +         * When the transformer starts rendering a new form element
  +         * It needs to reset previously saved references for another 
  +         * transformation of the same view.
  +         */
  +        public void clearSavedModelReferences(String currentFormView) {
  +                FormViewState formViewState = getFormViewState(currentFormView);
  +                formViewState.clear();
  +        }
  +
  +        /**
  +         * We keep a map of ViewState objects which store 
  +         * all references to model properties in a particular form view
  +         * which were rendered by the 
  +         * XMLFormTansformer in the most recent transformation.
  +         */
  +        protected FormViewState getFormViewState(String viewName) {
  +                FormViewState formViewState =
  +                        (FormViewState) viewStateMap_.get(viewName);
  +                if (formViewState == null) {
  +                        formViewState = new FormViewState();
  +                        viewStateMap_.put(viewName, formViewState);
  +                }
  +                return formViewState;
  +        }
  +
  +        /**
  +         * Internal class used for keeping state information
  +         * during the life cycle of a form.
  +         * 
  +         * <p>Used only for session scoped forms
  +         */
  +        class FormViewState {
           private Map modelReferences_ = new HashMap();
   
  -             FormViewState() {
  +                FormViewState() {
           }
   
  -             /**
  -              * 
  -              * @return Map of (String modelPropertyReference, String inputType) 
pairs 
  -              */
  -             Map getModelReferenceMap() {
  -                     return modelReferences_;
  -             }
  +                /**
  +                 * 
  +                 * @return Map of (String modelPropertyReference, String inputType) 
pairs 
  +                 */
  +                Map getModelReferenceMap() {
  +                        return modelReferences_;
  +                }
   
  -             void addModelReferenceAndInputType(String modelPropertyReference,
  +                void addModelReferenceAndInputType(String modelPropertyReference,
                                              String inputType) {
               modelReferences_.put(modelPropertyReference, inputType);
  -             }
  +                }
   
  -             void clear() {
  -                     modelReferences_.clear();
  -             }
  -     }
  +                void clear() {
  +                        modelReferences_.clear();
  +                }
  +        }
   
  -     /** the set of violations the model commited during validation */
  -     private List violations_ = null;
  +        /** the set of violations the model commited during validation */
  +        private List violations_ = null;
   
  -     /** another view of the violations_ collection */
  -     private SortedSet violationsAsSortedSet_ = null;
  +        /** another view of the violations_ collection */
  +        private SortedSet violationsAsSortedSet_ = null;
   
  -     /** flag allowing control over automatic validation on populate() */
  -     private boolean autoValidateEnabled_ = true;
  +        /** flag allowing control over automatic validation on populate() */
  +        private boolean autoValidateEnabled_ = true;
   
  -     /** The data model this form encapsulates */
  -     private Object model_ = null;
  +        /** The data model this form encapsulates */
  +        private Object model_ = null;
   
  -     /** The list of FormListeners */
  -     private Set formListeners_ = new HashSet();
  +        /** The list of FormListeners */
  +        private Set formListeners_ = new HashSet();
   
  -     /** 
  -      * The unique identifier for this form. Used when form is stored in request 
  -      * or session for reference by other components
  +        /** 
  +         * The unique identifier for this form. Used when form is stored in request 
  +         * or session for reference by other components
        *
  -      * <p>
  -      * TODO: a centralized form registry would be helpful to prevent from id 
collision
  -      */
  -     private String id_ = null;
  -
  -     /**
  -      * The JXPath context associated with the model
  -      * Used to traverse the model with XPath expressions
  -      */
  -     private JXPathContext jxcontext_ = null;
  -
  -     /**
  -      * Used to validate the content of the model
  -      * at various phases
  -      *
  -      */
  -     private Validator validator_ = null;
  -
  -     /**
  -      * Keeps a state information for
  -      * each form view that has been processed
  -      * 
  -      */
  -     private Map viewStateMap_ = new HashMap();
  +         * <p>
  +         * TODO: a centralized form registry would be helpful to prevent from id 
collision
  +         */
  +        private String id_ = null;
  +
  +        /**
  +         * The JXPath context associated with the model
  +         * Used to traverse the model with XPath expressions
  +         */
  +        private JXPathContext jxcontext_ = null;
  +
  +        /**
  +         * Used to validate the content of the model
  +         * at various phases
  +         *
  +         */
  +        private Validator validator_ = null;
  +
  +        /**
  +         * Keeps a state information for
  +         * each form view that has been processed
  +         * 
  +         */
  +        private Map viewStateMap_ = new HashMap();
   }
  
  
  

Reply via email to