Davanum,

On 19.Jun.2001 -- 05:19 AM, Davanum Srinivas wrote:
> 1. Checked in your docs. Please take a look.

fine.

> 2. XSP should be working now.

indeed, no problem here anymore.

> 3. Did you try using "context:///" (note the extra '/') instead of context://. If 
>this does not
> work, please let me know.

Yes, I had a problem using it from a sub sitemap. I have been
reluctant to report that problem and well, it has been fixed anyway :-) 

Attached you find a sample for the form validation taglib. New files
are in the archive, changes in the patch.

In addition the patch fixes some minor glitches I caused last time and
adds a tag to xsp-formval to retrieve all validation results in a
java.util.Map.

More noteworthy is, that it also patches
AbstractComplementaryConfigurableAction in a way that configuration
files are reread when they change. This is done exactly like it was
done in XSPFormValidatorHelper by using the Source and
ConfigurationHelper Classes. I have suggested this a while back and no
one commented it, so I reckon it's OK to do so :-)

This entails a API change, since
AbstractCom....Action.getConfiguration now takes an additional
argument, whether reloads should occur or not. This is controlled by a
new parameter "<map:parameter name="reloadable" value="true"/>" for
each invocation of an action in the sitemap. Consequently, all Actions
that call getConfiguration are patched as well.

To keep compatible an additional method is there with the old
signature that calls the modified method with reloadable=true.

You might want to either remove that method or not modify the other
actions. Of course you could also apply the patch as is :-)

        Chris.

-- 
C h r i s t i a n       H a u l
[EMAIL PROTECTED]
    fingerprint: 99B0 1D9D 7919 644A 4837  7D73 FEF9 6856 335A 9E08
Index: src/org/apache/cocoon/acting/AbstractComplementaryConfigurableAction.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/acting/AbstractComplementaryConfigurableAction.java,v
retrieving revision 1.3
diff -u -r1.3 AbstractComplementaryConfigurableAction.java
--- src/org/apache/cocoon/acting/AbstractComplementaryConfigurableAction.java   
2001/05/31 15:38:51     1.3
+++ src/org/apache/cocoon/acting/AbstractComplementaryConfigurableAction.java   
+2001/06/21 17:15:46
@@ -15,8 +15,10 @@
 import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.configuration.SAXConfigurationHandler;
 import org.apache.cocoon.Roles;
+import org.apache.cocoon.acting.ConfigurationHelper;
 import org.apache.cocoon.components.parser.Parser;
 import org.apache.cocoon.components.url.URLFactory;
+import org.apache.cocoon.environment.Source;
 import org.xml.sax.InputSource;
 
 /**
@@ -37,54 +39,83 @@
      * multiple Actions can share the same configurations.  By using
      * this approach, we can limit the number of config files.
      * Also note that the configuration file does not have to be a file.
+     *
+     * Defaults to reload configuration file it has changed.
      */
     protected Configuration getConfiguration(String descriptor) throws 
ConfigurationException {
-        Configuration conf = null;
+       return this.getConfiguration(descriptor, true);
+    }
 
+    /**
+     * Set up the complementary configuration file.  Please note that
+     * multiple Actions can share the same configurations.  By using
+     * this approach, we can limit the number of config files.
+     * Also note that the configuration file does not have to be a file.
+     */
+    protected Configuration getConfiguration(String descriptor, boolean reloadable) 
+throws ConfigurationException {
+        ConfigurationHelper conf = null;
+
         if (descriptor == null) {
             throw new ConfigurationException("The form descriptor is not set!");
         }
 
         synchronized (AbstractComplementaryConfigurableAction.configurations) {
-            conf = (Configuration) 
AbstractComplementaryConfigurableAction.configurations.get(descriptor);
+            conf = (ConfigurationHelper) 
+AbstractComplementaryConfigurableAction.configurations.get(descriptor);
 
-            if (conf == null) {
-                URLFactory urlFactory = null;
-                Parser parser = null;
-                URL resource = null;
-
-                try {
-                    urlFactory = (URLFactory) this.manager.lookup(Roles.URL_FACTORY);
-                    resource = urlFactory.getURL(descriptor);
-
-                    parser = (Parser)this.manager.lookup(Roles.PARSER);
-                    SAXConfigurationHandler builder = new SAXConfigurationHandler();
-                    InputSource inputSource = new InputSource(resource.openStream());
-                    inputSource.setSystemId(resource.toExternalForm());
-
-                    parser.setContentHandler(builder);
-                    parser.parse(inputSource);
-
-                    conf = builder.getConfiguration();
-                } catch (Exception e) {
-                    getLogger().error("Could not configure Database mapping 
environment", e);
-                    throw new ConfigurationException("Error trying to load 
configurations for resource: " + resource.toExternalForm());
-                } finally {
-                    if (urlFactory != null) this.manager.release((Component) 
urlFactory);
-                    if (parser != null) this.manager.release(parser);
-                }
+           if ( reloadable || conf==null) {
 
-                this.cacheConfiguration(descriptor, conf);
-            }
+               URLFactory urlFactory = null;
+               Parser parser = null;
+               URL resource = null;
+               Source source = null;
+               
+               try {
+                   urlFactory = (URLFactory) this.manager.lookup(Roles.URL_FACTORY);
+                   resource = urlFactory.getURL(descriptor);
+                   source = new Source(resource);
+                   
+                   if (conf == null || conf.lastModified < source.getLastModified()) {
+                       getLogger().debug("(Re)Loading " + descriptor);
+                       
+                       if (conf == null) 
+                           conf = new ConfigurationHelper();
+                       
+                       parser = (Parser)this.manager.lookup(Roles.PARSER);
+                       SAXConfigurationHandler builder = new 
+SAXConfigurationHandler();
+                       InputSource inputSource = source.getInputSource();
+                       inputSource.setSystemId(source.getSystemId());
+                       
+                       parser.setContentHandler(builder);
+                       parser.parse(inputSource);
+                       
+                       
+                       conf.lastModified = source.getLastModified();
+                       conf.configuration = builder.getConfiguration();
+                       
+                       this.cacheConfiguration(descriptor, conf);
+                   } else {
+                       getLogger().debug("Using cached configuration for " + 
+descriptor);
+                   }
+                   
+               } catch (Exception e) {
+                   getLogger().error("Could not configure Database mapping 
+environment", e);
+                   throw new ConfigurationException("Error trying to load 
+configurations for resource: " + resource.toExternalForm());
+               } finally {
+                   if (urlFactory != null) this.manager.release((Component) 
+urlFactory);
+                   if (parser != null) this.manager.release(parser);
+               }
+           } else {
+               getLogger().debug("Using fixed cached configuration for " + 
+descriptor);
+           }
         }
-
-        return conf;
+       
+        return conf.configuration;
     }
 
     /**
      * Cache the configuration so that we can use it later.
      */
-    private void cacheConfiguration(String descriptor, Configuration conf) {
+    private void cacheConfiguration(String descriptor, ConfigurationHelper conf) {
         synchronized (AbstractComplementaryConfigurableAction.configurations) {
             AbstractComplementaryConfigurableAction.configurations.put(descriptor, 
conf);
         }
Index: src/org/apache/cocoon/acting/AbstractValidatorAction.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/acting/AbstractValidatorAction.java,v
retrieving revision 1.5
diff -u -r1.5 AbstractValidatorAction.java
--- src/org/apache/cocoon/acting/AbstractValidatorAction.java   2001/06/15 11:49:19    
 1.5
+++ src/org/apache/cocoon/acting/AbstractValidatorAction.java   2001/06/21 17:15:46
@@ -189,7 +189,6 @@
             getLogger().debug ("VALIDATOR: string parameter "
                     + name + " is null");
            if ( !nullable ){
-               ValidatorActionHelper vah = new ValidatorActionHelper ( value, 
ValidatorActionResult.ISNULL );
                    return new ValidatorActionHelper ( value, 
ValidatorActionResult.ISNULL );}
            else 
                value = dflt;
@@ -352,7 +351,7 @@
            }
 
            // Validate wheter param is at most max
-           if (!"".equals (max)) {
+           if (max != null) {
                getLogger().debug ("VALIDATOR: long parameter "
                                   + name + " should be at most " + max);
                if (max.compareTo(value)<0) {
Index: src/org/apache/cocoon/acting/DatabaseAddAction.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/acting/DatabaseAddAction.java,v
retrieving revision 1.6
diff -u -r1.6 DatabaseAddAction.java
--- src/org/apache/cocoon/acting/DatabaseAddAction.java 2001/06/05 21:36:20     1.6
+++ src/org/apache/cocoon/acting/DatabaseAddAction.java 2001/06/21 17:15:46
@@ -61,7 +61,8 @@
         Map results = new HashMap();
 
         try {
-            Configuration conf = 
this.getConfiguration(param.getParameter("form-descriptor", null));
+            Configuration conf = 
+this.getConfiguration(param.getParameter("form-descriptor", null), 
+                                                      
+param.getParameterAsBoolean("reloadable",true));
 
             datasource = this.getDataSource(conf);
             conn = datasource.getConnection();
Index: src/org/apache/cocoon/acting/DatabaseAuthenticatorAction.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/acting/DatabaseAuthenticatorAction.java,v
retrieving revision 1.3
diff -u -r1.3 DatabaseAuthenticatorAction.java
--- src/org/apache/cocoon/acting/DatabaseAuthenticatorAction.java       2001/06/05 
21:36:20     1.3
+++ src/org/apache/cocoon/acting/DatabaseAuthenticatorAction.java       2001/06/21 
+17:15:47
@@ -65,7 +65,8 @@
 
         try {
             Configuration conf = this.getConfiguration (
-                    parameters.getParameter ("descriptor", null));
+                    parameters.getParameter ("descriptor", null), 
+                   parameters.getParameterAsBoolean("reloadable",true));
             boolean cs = true;
             String create_session = parameters.getParameter ("create-session", null);
             if (create_session != null &&
Index: src/org/apache/cocoon/acting/DatabaseDeleteAction.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/acting/DatabaseDeleteAction.java,v
retrieving revision 1.3
diff -u -r1.3 DatabaseDeleteAction.java
--- src/org/apache/cocoon/acting/DatabaseDeleteAction.java      2001/06/05 21:36:20    
 1.3
+++ src/org/apache/cocoon/acting/DatabaseDeleteAction.java      2001/06/21 17:15:47
@@ -55,7 +55,8 @@
         int currentIndex = 0;
 
         try {
-            Configuration conf = 
this.getConfiguration(param.getParameter("form-descriptor", null));
+            Configuration conf = 
+this.getConfiguration(param.getParameter("form-descriptor", null), 
+                                                      
+param.getParameterAsBoolean("reloadable",true));
             String query = this.getDeleteQuery(conf);
             datasource = this.getDataSource(conf);
             conn = datasource.getConnection();
Index: src/org/apache/cocoon/acting/DatabaseUpdateAction.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/acting/DatabaseUpdateAction.java,v
retrieving revision 1.3
diff -u -r1.3 DatabaseUpdateAction.java
--- src/org/apache/cocoon/acting/DatabaseUpdateAction.java      2001/06/05 21:36:20    
 1.3
+++ src/org/apache/cocoon/acting/DatabaseUpdateAction.java      2001/06/21 17:15:47
@@ -52,7 +52,8 @@
         int currentIndex = 0;
 
         try {
-            Configuration conf = 
this.getConfiguration(param.getParameter("form-descriptor", null));
+            Configuration conf = 
+this.getConfiguration(param.getParameter("form-descriptor", null), 
+                                                      
+param.getParameterAsBoolean("reloadable",true));
             String query = this.getUpdateQuery(conf);
             datasource = this.getDataSource(conf);
             conn = datasource.getConnection();
Index: src/org/apache/cocoon/acting/FormValidatorAction.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/acting/FormValidatorAction.java,v
retrieving revision 1.5
diff -u -r1.5 FormValidatorAction.java
--- src/org/apache/cocoon/acting/FormValidatorAction.java       2001/06/15 11:49:20    
 1.5
+++ src/org/apache/cocoon/acting/FormValidatorAction.java       2001/06/21 17:15:47
@@ -77,7 +77,8 @@
 
         try {
             Configuration conf = this.getConfiguration (
-                    parameters.getParameter ("descriptor", null));
+                    parameters.getParameter ("descriptor", null), 
+                   parameters.getParameterAsBoolean("reloadable",true));
             String valstr = parameters.getParameter ("validate", "");
             String valsetstr = parameters.getParameter ("validate-set", "");
             Configuration[] desc = conf.getChildren ("parameter");
Index: src/org/apache/cocoon/acting/SessionValidatorAction.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/acting/SessionValidatorAction.java,v
retrieving revision 1.4
diff -u -r1.4 SessionValidatorAction.java
--- src/org/apache/cocoon/acting/SessionValidatorAction.java    2001/06/15 11:49:20    
 1.4
+++ src/org/apache/cocoon/acting/SessionValidatorAction.java    2001/06/21 17:15:48
@@ -79,7 +79,8 @@
 
         try {
             Configuration conf = this.getConfiguration (
-                    parameters.getParameter ("descriptor", null));
+                    parameters.getParameter ("descriptor", null), 
+                   pcvs server: Diffing src/org/apache/cocoon/caching
arameters.getParameterAsBoolean("reloadable",true));
             String valstr = parameters.getParameter ("validate", "");
             String valsetstr = parameters.getParameter ("validate-set", "");
             Configuration[] desc = conf.getChildren ("parameter");
Index: src/org/apache/cocoon/components/language/markup/xsp/XSPFormValidatorHelper.java
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/components/language/markup/xsp/XSPFormValidatorHelper.java,v
retrieving revision 1.2
diff -u -r1.2 XSPFormValidatorHelper.java
--- src/org/apache/cocoon/components/language/markup/xsp/XSPFormValidatorHelper.java   
 2001/06/15 11:49:22     1.2
+++ src/org/apache/cocoon/components/language/markup/xsp/XSPFormValidatorHelper.java   
+ 2001/06/21 17:16:07
@@ -146,7 +146,7 @@
     {
        ValidatorActionResult result = ValidatorActionResult.NOTPRESENT;
        Map param_result = (Map) getResults(objectModel);
-       if (param_result != null ) {
+       if (param_result != null && param_result.containsKey(name)) {
            result = (ValidatorActionResult) param_result.get(name);
        }
        return result;
@@ -164,12 +164,7 @@
                                              Map objectModel
                                              )
     {
-       ValidatorActionResult result = ValidatorActionResult.NOTPRESENT;
-       Map param_result = (Map) getResults(objectModel);
-       if (param_result != null ) {
-           result = (ValidatorActionResult) param_result.get(current_parameter);
-       }
-       return result;
+       return getParamResult(objectModel, current_parameter);
     }
 
 
@@ -464,42 +459,47 @@
 
         synchronized (XSPFormValidatorHelper.configurations) {
             conf = (ConfigurationHelper) 
XSPFormValidatorHelper.configurations.get(descriptor);
-           Source source = null;
-           Parser parser = null;
-           URLFactory urlFactory = null;
-           try {
-               urlFactory = (URLFactory) manager.lookup(Roles.URL_FACTORY);
-               URL resource = urlFactory.getURL(descriptor);
-               source = new Source(resource);
-               
-               if (conf == null || ( reloadable && conf.lastModified < 
source.getLastModified())) {
-                   logger.debug("XSPFormValidatorHelper.getConfiguration: (Re)Loading 
" + descriptor);
-                   
-                   if (conf == null) 
-                       conf = new ConfigurationHelper();
 
-                   parser = (Parser) manager.lookup(Roles.PARSER);
-                   SAXConfigurationHandler builder = new SAXConfigurationHandler();
-                   
-                   InputSource inputSource = source.getInputSource();
-                   inputSource.setSystemId(source.getSystemId());
-                   
-                   parser.setContentHandler(builder);
-                   parser.parse(inputSource);
-                   
-                   conf.lastModified = source.getLastModified();
-                   conf.configuration = builder.getConfiguration();
+           if ( reloadable || conf==null ) {
+               Source source = null;
+               Parser parser = null;
+               URLFactory urlFactory = null;
+               try {
+                   urlFactory = (URLFactory) manager.lookup(Roles.URL_FACTORY);
+                   URL resource = urlFactory.getURL(descriptor);
+                   source = new Source(resource);
                    
-                   XSPFormValidatorHelper.cacheConfiguration(descriptor, conf);
-               } else {
-                   logger.debug("XSPFormValidatorHelper.getConfiguration: Using 
cached configuration for " + descriptor);
+                   if (conf == null || ( reloadable && conf.lastModified < 
+source.getLastModified())) {
+                       logger.debug("XSPFormValidatorHelper.getConfiguration: 
+(Re)Loading " + descriptor);
+                       
+                       if (conf == null) 
+                           conf = new ConfigurationHelper();
+                       
+                       parser = (Parser) manager.lookup(Roles.PARSER);
+                       SAXConfigurationHandler builder = new 
+SAXConfigurationHandler();
+                       
+                       InputSource inputSource = source.getInputSource();
+                       inputSource.setSystemId(source.getSystemId());
+                       
+                       parser.setContentHandler(builder);
+                       parser.parse(inputSource);
+                       
+                       conf.lastModified = source.getLastModified();
+                       conf.configuration = builder.getConfiguration();
+                       
+                       XSPFormValidatorHelper.cacheConfiguration(descriptor, conf);
+                   } else {
+                       logger.debug("XSPFormValidatorHelper.getConfiguration: Using 
+cached configuration for " + descriptor);
+                   }
+               } catch (Exception e) {
+                   logger.error("XSPFormValidatorHelper.getConfiguration: Could not 
+configure Database mapping environment", e);
+                   throw new ConfigurationException("Error trying to load 
+configurations for resource: " + source.getSystemId());
+               } finally {
+                   if (urlFactory != null) manager.release((Component) urlFactory);
+                   if (parser != null) manager.release(parser);
                }
-           } catch (Exception e) {
-               logger.error("XSPFormValidatorHelper.getConfiguration: Could not 
configure Database mapping environment", e);
-               throw new ConfigurationException("Error trying to load configurations 
for resource: " + source.getSystemId());
-           } finally {
-               if (urlFactory != null) manager.release((Component) urlFactory);
-               if (parser != null) manager.release(parser);
+           } else {
+               logger.debug("XSPFormValidatorHelper.getConfiguration: Using fixed 
+cached configuration for " + descriptor);
            }
         }
 
Index: src/org/apache/cocoon/components/language/markup/xsp/java/form-validator.xsl
===================================================================
RCS file: 
/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/components/language/markup/xsp/java/form-validator.xsl,v
retrieving revision 1.2
diff -u -r1.2 form-validator.xsl
--- src/org/apache/cocoon/components/language/markup/xsp/java/form-validator.xsl       
 2001/06/15 11:49:24     1.2
+++ src/org/apache/cocoon/components/language/markup/xsp/java/form-validator.xsl       
+ 2001/06/21 17:16:09
@@ -158,6 +158,12 @@
 
 
   <xspdoc:desc>
+    Returns a Map containg all validation results.
+  </xspdoc:desc>
+  <xsl:template 
+match="xsp-formval:results">XSPFormValidatorHelper.getResults(objectModel)</xsl:template>
+
+
+  <xspdoc:desc>
     Returns a boolean whether validation of this parameter was
     successful.
 
Index: webapp/sitemap.xmap
===================================================================
RCS file: /home/cvspublic/xml-cocoon2/webapp/sitemap.xmap,v
retrieving revision 1.16
diff -u -r1.16 sitemap.xmap
--- webapp/sitemap.xmap 2001/06/19 13:39:21     1.16
+++ webapp/sitemap.xmap 2001/06/21 17:17:06
@@ -97,6 +97,7 @@
    <map:action name="del-employee" 
src="org.apache.cocoon.acting.DatabaseDeleteAction"/>
    <map:action name="upd-employee" 
src="org.apache.cocoon.acting.DatabaseUpdateAction"/>
    <map:action name="lang-select" src="org.apache.cocoon.acting.LangSelect"/>
+   <map:action name="form-validator" 
+src="org.apache.cocoon.acting.FormValidatorAction"/>
   </map:actions>
 
  </map:components>
@@ -126,6 +127,14 @@
    <map:transform src="stylesheets/slides/slides-apachecon.xsl"/>
    <map:serialize/>
   </map:resource>
+
+   <map:resource name="simple-page">
+    <map:generate type="serverpages" src="{target}.xsp"/>
+     <map:transform src="stylesheets/dynamic-page2html.xsl">
+       <map:parameter name="view-source" value="{target}.xsp"/>
+     </map:transform>
+     <map:serialize/>
+  </map:resource>
  </map:resources>
 
 <!-- ========================== Action sets ================================ -->
@@ -391,6 +400,19 @@
      </map:transform>
      <map:serialize/>
    </map:match>
+
+   <!-- ======================= FormValidation ============================= -->
+
+   <map:match pattern="formvalidation/test">
+     <map:act type="form-validator">
+        <map:parameter name="descriptor" 
+value="context:///docs/samples/formvalidation/descriptor.xml"/>
+        <map:parameter name="validate-set" value="car-reservation"/>
+       <map:redirect-to resource="simple-page" 
+target="docs/samples/formvalidation/OK"/>
+     </map:act>
+      <map:redirect-to resource="simple-page" 
+target="docs/samples/formvalidation/ERROR"/>
+   </map:match>
+
+
 
    <!-- ========================== Session ================================= -->
    <map:match pattern="session">
Index: webapp/docs/samples/samples.xml
===================================================================
RCS file: /home/cvspublic/xml-cocoon2/webapp/docs/samples/samples.xml,v
retrieving revision 1.3
diff -u -r1.3 samples.xml
--- webapp/docs/samples/samples.xml     2001/05/23 09:40:55     1.3
+++ webapp/docs/samples/samples.xml     2001/06/21 17:17:15
@@ -138,6 +138,10 @@
       that you have a database and table according to the 
docs/samples/sql/sql-page.xml.sql
       definitions.  Don't forget to change the driver information...
     </sample>
+    <sample name="Form Validation" href="formvalidation/test" xlink:role="dynamic">
+      This example demonstrates the use of an action to validate user
+      input and report validation errors to the user through a taglib.
+    </sample>
   </group>
 
   <group name="System Pages">
Index: xdocs/logicsheet-forms.xml
===================================================================
RCS file: /home/cvspublic/xml-cocoon2/xdocs/logicsheet-forms.xml,v
retrieving revision 1.1
diff -u -r1.1 logicsheet-forms.xml
--- xdocs/logicsheet-forms.xml  2001/06/19 11:45:37     1.1
+++ xdocs/logicsheet-forms.xml  2001/06/21 17:18:24
@@ -41,11 +41,11 @@
 <?xml version="1.0"?>
 <root>
 
-   <parameter name="persons" type="long" min="1" default="4"/>
-   <parameter name="deposit" type="double" min="10.0" max="999.99" nullable="no"/>
-   <parameter name="email" type="string" max-len="50" 
match-regex="^[\d\w][\d\w\-_\.]*@([\d\w\-_]+\.)\w\w\w?$">
+   <parameter name="persons" type="long" min="1" default="4" nullable="no"/>
+   <parameter name="deposit" type="double" min="10.0" max="999.99"/>
+   <parameter name="email" type="string" max-len="50" 
+matches-regex="^[\d\w][\d\w\-_\.]*@([\d\w\-_]+\.)\w\w\w?$">
 
-   <constraint-set name="car-reservation">
+   <constraint-set name="car-reservation"/>
        <validate namecvs server: Diffing xdocs/drafts
="persons"/>
        <validate name="deposit" min="50.0"/>
        <validate name="email"/>
@@ -153,8 +153,13 @@
                                                   request attribute </td></tr>
         </table>
      <p>
-     If you'd like to be more specific what went wrong, you can query
-     the descriptor file for attributes.
+     For debugging purposes or if you would like to iterate over the
+     validation results, <code>xsp-formval:results</code> returns a
+     <code>java.util.Map</code> containing them all.
+     </p>
+     <p>
+     If you would like to be more specific what went wrong, you can
+     query the descriptor file for attributes.
      </p>
      <p>
      First set the url of the file or resource that contains the

formvalidation-sample.tar.gz

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to