cziegeler    2003/01/15 05:17:41

  Modified:    src/java/org/apache/cocoon/components/validation
                        ZValidationTest.java SchemaFactory.java
                        Validator.java ZTestBean.java Violation.java
                        ZNestedBean.java
               src/java/org/apache/cocoon/components/validation/schematron
                        Report.java Phase.java ValidationResult.java
                        SchematronValidator.java Rule.java Pattern.java
                        Assert.java SchematronSchema.java
                        SchematronFactory.java ActivePattern.java
               src/java/org/apache/cocoon/components/xmlform Form.java
                        FormListener.java
  Log:
  At least applying *some* of our coding guidelines
  
  Revision  Changes    Path
  1.5       +68 -65    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/ZValidationTest.java
  
  Index: ZValidationTest.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/ZValidationTest.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ZValidationTest.java      15 Jan 2003 11:52:32 -0000      1.4
  +++ ZValidationTest.java      15 Jan 2003 13:17:40 -0000      1.5
  @@ -68,69 +68,72 @@
    * Second is the validation phase to use
    *
    */
  -public class ZValidationTest
  -{
  -  
  -   /**
  -    * Method main
  -    */
  -   public static void main(String args[])
  -      throws Exception
  -   {    
  -      System.out.println("\n=== Java based Schematron validation ===");
  -    
  -      if (args.length < 1) {
  -         System.err.println("Usage: java Schematron <schema.xml> " +
  -                            "[phase] ");
  -         return;
  -      }
  -
  -      // use custom schema
  -      File file = new File( args[0] );
  -      if ( !file.exists () ) throw new Exception("Error: schema file not 
found !");
  -     InputStream istrm = new FileInputStream ( file );
  -     InputSource is = new InputSource ( istrm );
  -     SchemaFactory schf = SchemaFactory.lookup( 
SchemaFactory.NAMESPACE_SCHEMATRON );
  -     Schema sch = schf.compileSchema( is );
  -     Validator validator = sch.newValidator();
  -
  -     // set preprocessor parameters 
  -      if (args.length > 1)
  -         validator.setProperty("phase", new String(args[1]));
  -
  -      ZTestBean tbean = new ZTestBean();
  -      
  -      // measure validation speed
  -      long time = System.currentTimeMillis ();
  -      int i = 0;
  -      List violations = null;
  -      for (; i < 100; i++)
  -      {
  -        // perform validation
  -        violations = validator.validate( tbean );
  -      }
  -      time = System.currentTimeMillis () - time;
  -      System.out.println( "\nValidation performance:");
  -      System.out.println( " validate() executed " + i + " times for a total 
of " + time + " ms");
  -      System.out.println( "Avarage validation time: " + (time/i) + " ms " );
  -
  -      // everything ok?
  -      if (violations == null) 
  -      {
  -        System.out.println("\nValidation ok, no messages generated");
  -      }
  -      else {
  -        System.out.println("Validation encountered errors. Messages :");
  -        Iterator viter = violations.iterator();
  -        while (viter.hasNext ())
  -        {
  -          Violation v = (Violation) viter.next();
  -          System.out.println("Validity violation path: " + v.getPath() + ", 
message: " + v.getMessage() );
  -        }
  -      }
  -
  -      System.out.println("\n=== Schematron validation done ===");
  -   } 
  -   
  -   
  +public class ZValidationTest {
  +
  +     /**
  +      * Method main
  +      */
  +     public static void main(String args[]) throws Exception {
  +             System.out.println("\n=== Java based Schematron validation 
===");
  +
  +             if (args.length < 1) {
  +                     System.err.println(
  +                             "Usage: java Schematron <schema.xml> " + 
"[phase] ");
  +                     return;
  +             }
  +
  +             // use custom schema
  +             File file = new File(args[0]);
  +             if (!file.exists())
  +                     throw new Exception("Error: schema file not found !");
  +             InputStream istrm = new FileInputStream(file);
  +             InputSource is = new InputSource(istrm);
  +             SchemaFactory schf =
  +                     
SchemaFactory.lookup(SchemaFactory.NAMESPACE_SCHEMATRON);
  +             Schema sch = schf.compileSchema(is);
  +             Validator validator = sch.newValidator();
  +
  +             // set preprocessor parameters 
  +             if (args.length > 1)
  +                     validator.setProperty("phase", new String(args[1]));
  +
  +             ZTestBean tbean = new ZTestBean();
  +
  +             // measure validation speed
  +             long time = System.currentTimeMillis();
  +             int i = 0;
  +             List violations = null;
  +             for (; i < 100; i++) {
  +                     // perform validation
  +                     violations = validator.validate(tbean);
  +             }
  +             time = System.currentTimeMillis() - time;
  +             System.out.println("\nValidation performance:");
  +             System.out.println(
  +                     " validate() executed "
  +                             + i
  +                             + " times for a total of "
  +                             + time
  +                             + " ms");
  +             System.out.println("Avarage validation time: " + (time / i) + " 
ms ");
  +
  +             // everything ok?
  +             if (violations == null) {
  +                     System.out.println("\nValidation ok, no messages 
generated");
  +             } else {
  +                     System.out.println("Validation encountered errors. 
Messages :");
  +                     Iterator viter = violations.iterator();
  +                     while (viter.hasNext()) {
  +                             Violation v = (Violation) viter.next();
  +                             System.out.println(
  +                                     "Validity violation path: "
  +                                             + v.getPath()
  +                                             + ", message: "
  +                                             + v.getMessage());
  +                     }
  +             }
  +
  +             System.out.println("\n=== Schematron validation done ===");
  +     }
  +
   }
  
  
  
  1.4       +40 -36    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/SchemaFactory.java
  
  Index: SchemaFactory.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/SchemaFactory.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SchemaFactory.java        15 Jan 2003 11:52:32 -0000      1.3
  +++ SchemaFactory.java        15 Jan 2003 13:17:40 -0000      1.4
  @@ -61,43 +61,47 @@
    */
   public abstract class SchemaFactory {
   
  -  public static String NAMESPACE_SCHEMATRON = 
"http://www.ascc.net/xml/schematron";;
  -  
  -  /** Creates a new instance of ValidatorFactory */
  -  public SchemaFactory ()
  -  {
  -  }
  -  
  -  /**
  -   * This method creates an instance of a ValidatorFactory
  -   * using the JDK 1.3 META-INF/services mechanism.
  -   * The idea is borrowed from JARV
  -   * 
http://iso-relax.sourceforge.net/apiDoc/org/iso_relax/verifier/VerifierFactory.html
  -   *
  -   * @param ns the namespace of the schema language
  -   * @return ValidatorFactory
  -   * @throws InstantiationException when a factory could not be created
  -   */
  -  public static SchemaFactory lookup(java.lang.String ns)
  -                                   throws InstantiationException
  -  {
  -    // currently hardcoded implementation for Schematron
  -    // until another schema validator is implemented
  -    /* @todo create SchematronValidatorFactory */  
  -    if ( ns.equals ( NAMESPACE_SCHEMATRON ) )
  -      return new 
org.apache.cocoon.components.validation.schematron.SchematronFactory();
  -    return null;
  -  }
  +     public static String NAMESPACE_SCHEMATRON =
  +             "http://www.ascc.net/xml/schematron";;
   
  +     /** Creates a new instance of ValidatorFactory */
  +     public SchemaFactory() {
  +     }
   
  -  /**
  -   * Loads and compiles a Schema instance
  -   *
  -   * @param InputSource the SAX input source containing the Schema document
  -   * @return Schema the compiled schema instance
  -   * @throws InstantiationException when the Schema could not be loaded or 
compiled
  -   */  
  -  public abstract Schema compileSchema(InputSource is)
  -                              throws InstantiationException;
  +     /**
  +      * This method creates an instance of a ValidatorFactory
  +      * using the JDK 1.3 META-INF/services mechanism.
  +      * The idea is borrowed from JARV
  +      * 
http://iso-relax.sourceforge.net/apiDoc/org/iso_relax/verifier/VerifierFactory.html
  +      *
  +      * @param ns the namespace of the schema language
  +      * @return ValidatorFactory
  +      * @throws InstantiationException when a factory could not be created
  +      */
  +     public static SchemaFactory lookup(String ns)
  +             throws InstantiationException {
  +             // currently hardcoded implementation for Schematron
  +             // until another schema validator is implemented
  +             /* @todo create SchematronValidatorFactory */
  +             if (ns.equals(NAMESPACE_SCHEMATRON))
  +                     return new org
  +                             .apache
  +                             .cocoon
  +                             .components
  +                             .validation
  +                             .schematron
  +                             .SchematronFactory();
  +             return null;
  +     }
  +
  +     /**
  +      * Loads and compiles a Schema instance
  +      *
  +      * @param InputSource the SAX input source containing the Schema 
document
  +      * @return Schema the compiled schema instance
  +      * @throws InstantiationException when the Schema could not be loaded 
or compiled
  +      */
  +     public abstract Schema compileSchema(InputSource is)
  +             throws InstantiationException;
   
   }
  
  
  
  1.4       +7 -8      
xml-cocoon2/src/java/org/apache/cocoon/components/validation/Validator.java
  
  Index: Validator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/Validator.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Validator.java    15 Jan 2003 11:52:32 -0000      1.3
  +++ Validator.java    15 Jan 2003 13:17:40 -0000      1.4
  @@ -58,8 +58,7 @@
    *
    * @author  [EMAIL PROTECTED]
    */
  -public interface Validator
  -{
  +public interface Validator {
   
     /**
      * Validates an instance against a schema and returns a set of errors.
  @@ -68,7 +67,7 @@
      *
      * @param instance The instance can be either a DOM node or a JavaBean.
      * @return SortedSet of ValidityViolation(s). The set is sorted by
  -ValidityViolation.getPath()
  +   * ValidityViolation.getPath()
      * 
      * @throws RuntimeException if the validation process fails
      * Should not happen in a normal environment.
  @@ -80,23 +79,23 @@
      * The concept is borrowed from the Schematron schema
      * Not all schemas support partial validation
      */
  -  public String PROPERTY_PHASE = 
"http://xml.apache.org/cocoon/validator/phase";;
  +  String PROPERTY_PHASE = "http://xml.apache.org/cocoon/validator/phase";;
   
     /**
      * @param property name
      * @param value property value
      * @throws IllegalArgumentException when the property is not supported
      */
  -  public void setProperty(java.lang.String property, java.lang.Object value)
  -                 throws java.lang.IllegalArgumentException;
  +  void setProperty(String property, Object value)
  +                 throws IllegalArgumentException;
     
     /**
      * @param property name
      * @return the property value
      * @throws IllegalArgumentException when the property is not supported
      */
  -  public java.lang.Object getProperty(java.lang.String property)
  -                 throws java.lang.IllegalArgumentException;
  +  Object getProperty(String property)
  +                 throws IllegalArgumentException;
     
                    
                    
  
  
  
  1.4       +56 -59    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/ZTestBean.java
  
  Index: ZTestBean.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/ZTestBean.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ZTestBean.java    15 Jan 2003 11:52:32 -0000      1.3
  +++ ZTestBean.java    15 Jan 2003 13:17:40 -0000      1.4
  @@ -52,63 +52,60 @@
   
   import java.util.ArrayList;
   
  -  /**
  -   * just a test bean
  -   */
  +/**
  + * just a test bean
  + */
   public class ZTestBean {
  -  private String name = "dog";
  -  private String scope = "galaxy";
  -  private int count = 0;
  -  private ArrayList preferences = new ArrayList();
  -  private ZNestedBean personal = new ZNestedBean();
  -
  -  public ZTestBean (){
  -    preferences.add("likeVodka");
  -    preferences.add("likeSkiing");
  -  }
  -
  -  public ZTestBean (String newName, String newScope){
  -    this();
  -    name= newName;
  -    scope=newScope;
  -  }
  -  
  -  public String getName() {
  -    return name;
  -  }
  -  public void setName(String newName) {
  -    name = newName;
  -  }
  -
  -  public void setScope(String newScope) {
  -    scope = newScope;
  -  }
  -
  -  public String getScope() {
  -    return scope;
  -  }
  -
  -  public ArrayList getPreferences() 
  -    {
  -    return preferences;
  -    }
  -  
  -    public ZNestedBean getPersonalInfo() 
  -      {
  -      return personal;
  -     }
  -
  -    public void setPersonalInfo( ZNestedBean newPersonal ) 
  -      {
  -      personal = newPersonal;
  -     }
  -
  -  public int getCount() {
  -    return count;
  -  }
  -
  -  public void incrementCount() {
  -    count++;
  -  }
  -  
  -  }
  +     private String name = "dog";
  +     private String scope = "galaxy";
  +     private int count = 0;
  +     private ArrayList preferences = new ArrayList();
  +     private ZNestedBean personal = new ZNestedBean();
  +
  +     public ZTestBean() {
  +             preferences.add("likeVodka");
  +             preferences.add("likeSkiing");
  +     }
  +
  +     public ZTestBean(String newName, String newScope) {
  +             this();
  +             name = newName;
  +             scope = newScope;
  +     }
  +
  +     public String getName() {
  +             return name;
  +     }
  +     public void setName(String newName) {
  +             name = newName;
  +     }
  +
  +     public void setScope(String newScope) {
  +             scope = newScope;
  +     }
  +
  +     public String getScope() {
  +             return scope;
  +     }
  +
  +     public ArrayList getPreferences() {
  +             return preferences;
  +     }
  +
  +     public ZNestedBean getPersonalInfo() {
  +             return personal;
  +     }
  +
  +     public void setPersonalInfo(ZNestedBean newPersonal) {
  +             personal = newPersonal;
  +     }
  +
  +     public int getCount() {
  +             return count;
  +     }
  +
  +     public void incrementCount() {
  +             count++;
  +     }
  +
  +}
  
  
  
  1.4       +76 -81    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/Violation.java
  
  Index: Violation.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/Violation.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Violation.java    15 Jan 2003 11:52:32 -0000      1.3
  +++ Violation.java    15 Jan 2003 13:17:40 -0000      1.4
  @@ -57,85 +57,80 @@
    * 
    * @author  [EMAIL PROTECTED]
    */
  -public class Violation implements Comparable
  -{
  -  
  -    /** 
  -    * @return the XPath location of the Violation
  -    */
  -    public String getPath()
  -    {
  -      return xpath_;
  -    }
  -  
  -    /** 
  -    * set the XPath location of the Violation
  -    */
  -    public void setPath( String xpath )
  -    {
  -      xpath_ = xpath;
  -    }
  -
  -    
  -    /**
  -     * @return the error message
  -     */
  -    public String getMessage ()
  -    {
  -      return message_;
  -    }    
  -    
  -    /**
  -     * set the error message
  -     */
  -    public void setMessage ( String message )
  -    {
  -      message_ = message;
  -    }    
  -
  -    public boolean equals(Object obj)    
  -    {
  -      if (obj == null) return false;
  -      if (obj == this) return true;
  -      if ( !(obj instanceof Violation) ) 
  -          throw new java.lang.IllegalArgumentException( "Can only compare to 
a Violation object" );
  -      Violation v = (Violation) obj;
  -      if 
  -        (
  -        getPath().equals ( v.getPath() ) 
  -        && 
  -        getMessage().equals ( v.getMessage() ) 
  -        )
  -        return true;
  -      else return false;
  -    }
  -
  -    public int hashCode()    
  -    {
  -      return (getPath().hashCode () ^ getMessage().hashCode());
  -    }
  -
  -    public int compareTo(Object obj)    
  -    {
  -      if (obj == null) return 1;
  -      if (obj == this) return 0;
  -      if ( !(obj instanceof Violation) ) 
  -          throw new java.lang.IllegalArgumentException( "Can only compare to 
a Violation object" );
  -      Violation v = (Violation) obj;
  -      int primaryResult = getPath().compareTo ( v.getPath () );
  -      if (primaryResult != 0) return primaryResult;
  -      else 
  -      {
  -        if (getMessage () == null)
  -        {
  -          if (v.getMessage() == null) return 0;
  -          else return -1;
  -        }
  -        else return (getMessage().compareTo( v.getMessage () ) );
  -      }
  -    }
  -    
  -    private String xpath_;
  -    private String message_;
  -  
  +public class Violation implements Comparable {
  +
  +     /** 
  +     * @return the XPath location of the Violation
  +     */
  +     public String getPath() {
  +             return xpath_;
  +     }
  +
  +     /** 
  +     * set the XPath location of the Violation
  +     */
  +     public void setPath(String xpath) {
  +             xpath_ = xpath;
  +     }
  +
  +     /**
  +      * @return the error message
  +      */
  +     public String getMessage() {
  +             return message_;
  +     }
  +
  +     /**
  +      * set the error message
  +      */
  +     public void setMessage(String message) {
  +             message_ = message;
  +     }
  +
  +     public boolean equals(Object obj) {
  +             if (obj == null)
  +                     return false;
  +             if (obj == this)
  +                     return true;
  +             if (!(obj instanceof Violation))
  +                     throw new java.lang.IllegalArgumentException(
  +                             "Can only compare to a Violation object");
  +             Violation v = (Violation) obj;
  +             if (getPath().equals(v.getPath())
  +                     && getMessage().equals(v.getMessage()))
  +                     return true;
  +             else
  +                     return false;
  +     }
  +
  +     public int hashCode() {
  +             return (getPath().hashCode() ^ getMessage().hashCode());
  +     }
  +
  +     public int compareTo(Object obj) {
  +             if (obj == null)
  +                     return 1;
  +             if (obj == this)
  +                     return 0;
  +             if (!(obj instanceof Violation))
  +                     throw new java.lang.IllegalArgumentException(
  +                             "Can only compare to a Violation object");
  +             Violation v = (Violation) obj;
  +             int primaryResult = getPath().compareTo(v.getPath());
  +             if (primaryResult != 0)
  +                     return primaryResult;
  +             else {
  +                     if (getMessage() == null) {
  +                             if (v.getMessage() == null)
  +                                     return 0;
  +                             else
  +                                     return -1;
  +                     } else
  +                             return (getMessage().compareTo(v.getMessage()));
  +             }
  +     }
  +
  +     private String xpath_;
  +     private String message_;
  +
   }
  
  
  
  1.3       +14 -17    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/ZNestedBean.java
  
  Index: ZNestedBean.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/ZNestedBean.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ZNestedBean.java  15 Jan 2003 11:52:32 -0000      1.2
  +++ ZNestedBean.java  15 Jan 2003 13:17:40 -0000      1.3
  @@ -50,20 +50,17 @@
   */
   package org.apache.cocoon.components.validation;
   
  -  /**
  -   * just a test bean
  -   */
  -  public class ZNestedBean 
  -    {
  -    private String kind = "mammal";
  -    
  -    public void setKind(String newKind) 
  -      {
  -      kind = newKind;
  -      }
  -    
  -    public String getKind() 
  -      {
  -      return kind;
  -      }
  -    }
  +/**
  + * just a test bean
  + */
  +public class ZNestedBean {
  +     private String kind = "mammal";
  +
  +     public void setKind(String newKind) {
  +             kind = newKind;
  +     }
  +
  +     public String getKind() {
  +             return kind;
  +     }
  +}
  
  
  
  1.3       +1 -2      
xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/Report.java
  
  Index: Report.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/Report.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Report.java       15 Jan 2003 11:52:32 -0000      1.2
  +++ Report.java       15 Jan 2003 13:17:40 -0000      1.3
  @@ -62,6 +62,5 @@
    *
    * @author  Ivelin Ivanov, [EMAIL PROTECTED], [EMAIL PROTECTED]
    */
  -public class Report extends Assert
  -{
  +public class Report extends Assert {
   }
  
  
  
  1.4       +41 -49    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/Phase.java
  
  Index: Phase.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/Phase.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Phase.java        15 Jan 2003 11:52:32 -0000      1.3
  +++ Phase.java        15 Jan 2003 13:17:40 -0000      1.4
  @@ -54,7 +54,6 @@
   import java.util.Collection;
   import java.util.List;
   
  -
   /**
    * Represents a Schematron phase element
    *
  @@ -68,52 +67,45 @@
    *
    * @author  Ivelin Ivanov, [EMAIL PROTECTED], [EMAIL PROTECTED]
    */
  -public class Phase
  -{
  -  
  -  private String id_;
  -  private ArrayList active_ = new ArrayList ();
  -  
  -
  -  /**
  -   * Returns the id of the phase
  -   */
  -  public String getId()
  -  {
  -    return id_;
  -  }
  -  
  -  /**
  -   * Sets the id of the phase
  -   */
  -  public void setId( String newId )
  -  {
  -    id_ = newId;
  -  }
  -      
  -  /**
  -   * Returns the list of active patterns
  -   */
  -  public List getActive()
  -  {
  -    return active_;
  -  }
  -  
  -  /**
  -   * Sets the list of active patterns
  -   */
  -  public void setActive(Collection newActivePatterns)
  -  {
  -    active_ = new ArrayList();
  -    active_.addAll ( newActivePatterns );
  -  }
  -  
  -  /**
  -   * Add a pattern to the list of active patterns
  -   */
  -  public void addActive(ActivePattern p)
  -  {
  -    active_.add ( p );
  -  }
  -  
  +public class Phase {
  +
  +     private String id_;
  +     private ArrayList active_ = new ArrayList();
  +
  +     /**
  +      * Returns the id of the phase
  +      */
  +     public String getId() {
  +             return id_;
  +     }
  +
  +     /**
  +      * Sets the id of the phase
  +      */
  +     public void setId(String newId) {
  +             id_ = newId;
  +     }
  +
  +     /**
  +      * Returns the list of active patterns
  +      */
  +     public List getActive() {
  +             return active_;
  +     }
  +
  +     /**
  +      * Sets the list of active patterns
  +      */
  +     public void setActive(Collection newActivePatterns) {
  +             active_ = new ArrayList();
  +             active_.addAll(newActivePatterns);
  +     }
  +
  +     /**
  +      * Add a pattern to the list of active patterns
  +      */
  +     public void addActive(ActivePattern p) {
  +             active_.add(p);
  +     }
  +
   }
  
  
  
  1.6       +83 -93    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/ValidationResult.java
  
  Index: ValidationResult.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/ValidationResult.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ValidationResult.java     15 Jan 2003 11:52:32 -0000      1.5
  +++ ValidationResult.java     15 Jan 2003 13:17:40 -0000      1.6
  @@ -67,97 +67,87 @@
    *
    * @author  Ivelin Ivanov, [EMAIL PROTECTED], [EMAIL PROTECTED]
    */
  -public class ValidationResult
  -{
  -  
  -  private ArrayList patterns_ = new ArrayList();
  -  
  - 
  -  /**
  -   * Returns a list of the patterns which
  -   * contain rules that failed during validation
  -   */
  -  public List getPattern()
  -  {
  -    return patterns_;
  -  }
  -  
  -  /**
  -   * Sets the list of the patterns which
  -   * contain rules that failed during validation
  -   */
  -  public void setPattern(Collection newPatterns)
  -  {
  -    patterns_ = new ArrayList();
  -    patterns_.addAll ( newPatterns );
  -  }
  -  
  -  /**
  -   * Add a pattern to the list
  -   */
  -  public void addPattern(Pattern p)
  -  {
  -    patterns_.add ( p );
  -  }
  -  
  -  public boolean isEmpty ()
  -  {
  -    return patterns_.isEmpty ();
  -  }
  -  
  -  /**
  -   * adds all errors to a sorted list
  -   * Key is XPath of each error location
  -   *
  -   * @todo implement this method !!!
  -   * @return SortedSet
  -   */
  -  public List toList()
  -  {
  -    
  -    if ( isEmpty() ) return null;
  -    
  -    List violations = new LinkedList();
  -    
  -    Iterator piter = getPattern().iterator();
  -    while (piter.hasNext ())
  -    {
  -      Pattern pattern = (Pattern)piter.next ();
  -      // System.out.println("Pattern name: " + pattern.getName() + ", id: " 
+ pattern.getId() );
  -      Iterator ruleIter = pattern.getRule().iterator();
  -      while (ruleIter.hasNext ())
  -      {
  -        Rule rule = (Rule)ruleIter.next ();
  -        // System.out.println("    Rule name: " + rule.getContext() );
  -
  -        Iterator assertIter = rule.getAssert().iterator();
  -        while (assertIter.hasNext ())
  -        {
  -          Assert assertion = (Assert)assertIter.next ();
  -
  -          // add the next assert to the violations set
  -          Violation v = new Violation();
  -          v.setPath( rule.getContext() );
  -          v.setMessage( assertion.getMessage() );
  -          violations.add( v );
  -          // System.out.println("        Assert test: " + 
assertion.getTest() + ", message: " + assertion.getMessage() );
  -        }
  -
  -        Iterator reportIter = rule.getReport().iterator();
  -        while (reportIter.hasNext ())
  -        {
  -          Report report = (Report)reportIter.next ();
  -
  -          // add the next report to the violations set
  -          Violation v = new Violation();
  -          v.setPath( rule.getContext() );
  -          v.setMessage( report.getMessage() );
  -          violations.add( v );
  -          // System.out.println("        Report test: " + report.getTest() + 
", message: " + report.getMessage() );
  -        }
  -      }
  -    }
  -    return violations;
  -  }
  -  
  +public class ValidationResult {
  +
  +     private ArrayList patterns_ = new ArrayList();
  +
  +     /**
  +      * Returns a list of the patterns which
  +      * contain rules that failed during validation
  +      */
  +     public List getPattern() {
  +             return patterns_;
  +     }
  +
  +     /**
  +      * Sets the list of the patterns which
  +      * contain rules that failed during validation
  +      */
  +     public void setPattern(Collection newPatterns) {
  +             patterns_ = new ArrayList();
  +             patterns_.addAll(newPatterns);
  +     }
  +
  +     /**
  +      * Add a pattern to the list
  +      */
  +     public void addPattern(Pattern p) {
  +             patterns_.add(p);
  +     }
  +
  +     public boolean isEmpty() {
  +             return patterns_.isEmpty();
  +     }
  +
  +     /**
  +      * adds all errors to a sorted list
  +      * Key is XPath of each error location
  +      *
  +      * @todo implement this method !!!
  +      * @return SortedSet
  +      */
  +     public List toList() {
  +
  +             if (isEmpty())
  +                     return null;
  +
  +             List violations = new LinkedList();
  +
  +             Iterator piter = getPattern().iterator();
  +             while (piter.hasNext()) {
  +                     Pattern pattern = (Pattern) piter.next();
  +                     // System.out.println("Pattern name: " + 
pattern.getName() + ", id: " + pattern.getId() );
  +                     Iterator ruleIter = pattern.getRule().iterator();
  +                     while (ruleIter.hasNext()) {
  +                             Rule rule = (Rule) ruleIter.next();
  +                             // System.out.println("    Rule name: " + 
rule.getContext() );
  +
  +                             Iterator assertIter = 
rule.getAssert().iterator();
  +                             while (assertIter.hasNext()) {
  +                                     Assert assertion = (Assert) 
assertIter.next();
  +
  +                                     // add the next assert to the 
violations set
  +                                     Violation v = new Violation();
  +                                     v.setPath(rule.getContext());
  +                                     v.setMessage(assertion.getMessage());
  +                                     violations.add(v);
  +                                     // System.out.println("        Assert 
test: " + assertion.getTest() + ", message: " + assertion.getMessage() );
  +                             }
  +
  +                             Iterator reportIter = 
rule.getReport().iterator();
  +                             while (reportIter.hasNext()) {
  +                                     Report report = (Report) 
reportIter.next();
  +
  +                                     // add the next report to the 
violations set
  +                                     Violation v = new Violation();
  +                                     v.setPath(rule.getContext());
  +                                     v.setMessage(report.getMessage());
  +                                     violations.add(v);
  +                                     // System.out.println("        Report 
test: " + report.getTest() + ", message: " + report.getMessage() );
  +                             }
  +                     }
  +             }
  +             return violations;
  +     }
  +
   }
  
  
  
  1.7       +289 -319  
xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/SchematronValidator.java
  
  Index: SchematronValidator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/SchematronValidator.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- SchematronValidator.java  15 Jan 2003 11:52:32 -0000      1.6
  +++ SchematronValidator.java  15 Jan 2003 13:17:40 -0000      1.7
  @@ -73,324 +73,294 @@
    *
    * @author Ivelin Ivanov, [EMAIL PROTECTED], [EMAIL PROTECTED]
    */
  -public class SchematronValidator implements Validator
  -{
  +public class SchematronValidator implements Validator {
  +
  +     /** The schema instance for this Validator
  +      * It is initialized once when a new Validator instance
  +      * is created and used multiple times for validating
  +      * different JavaBeans/DOM objects against the schema
  +      */
  +     private SchematronSchema schema_;
  +
  +     /**
  +      * lookup map, with phase id keys.
  +      * Used for efficiency when validating by phase
  +      */
  +     private Map phaseMap_ = new HashMap();
  +
  +     /**
  +      * the schema name space prefix used in the schema document
  +      */
  +     private String schemaPrefix_;
  +
  +     /**
  +      * the default schema name space prefix 
  +      */
  +     private String defaultSchemaPrefix_ = "sch";
  +
  +     /*
  +      * Schematron Phase property
  +      */
  +     private String phaseProperty_ = null;
  +
  +     /*
  +      * private logger
  +      */
  +     private Logger logger = setupLogger();
  +
  +     //
  +     // Constructors
  +     //
  +
  +     /**
  +      * Constructs a new Validator object for a given Schematron schema.
  +      *
  +      * @param schema 
  +      *        The Schematron schema
  +      */
  +     public SchematronValidator(SchematronSchema schema) {
  +             schema_ = schema;
  +             preparePhaseMap();
  +     }
  +
  +     //
  +     // helper methods for the constructors
  +     //
  +
  +     /**
  +      * initialize logger
  +      */
  +     protected Logger setupLogger() {
  +             Logger logger = 
Hierarchy.getDefaultHierarchy().getLoggerFor("XmlForm");
  +             logger.setPriority(Priority.ERROR);
  +             return logger;
  +     }
  +
  +     protected void preparePhaseMap() {
  +             Map patternMap = new HashMap();
  +
  +             Iterator ptiter = schema_.getPattern().iterator();
  +             while (ptiter.hasNext()) {
  +                     Pattern pattern = (Pattern) ptiter.next();
  +                     patternMap.put(pattern.getId(), pattern);
  +             }
  +
  +             Iterator phiter = schema_.getPhase().iterator();
  +             while (phiter.hasNext()) {
  +                     Phase phase = (Phase) phiter.next();
  +                     List activePatterns = new ArrayList();
  +                     phaseMap_.put(phase.getId(), activePatterns);
  +
  +                     Iterator activeIter = phase.getActive().iterator();
  +                     while (activeIter.hasNext()) {
  +                             ActivePattern active = (ActivePattern) 
activeIter.next();
  +                             
activePatterns.add(patternMap.get(active.getPattern()));
  +                     }
  +             }
  +
  +     }
  +
  +     //
  +     // public methods
  +     //
  +
  +     /**
  +      * Performs validation of the passed JavaBean or DOM object.
  +      *
  +      * This method tries to find the "phase" attribute
  +      * and runs the active patterns for the phase.
  +      * If phase not found, the method will try to match all patterns
  +      *
  +      *
  +      * @param jbean The JavaBean or DOM object to be validated.
  +      * @param props Properties which control different aspects of the 
  +      * validation process. This method only looks for the phase property.
  +      * Another implementation may use other.
  +      *
  +      * @return A Result object which represents the result
  +      *         of the validation.
  +      */
  +     public List validate(Object jbean) {
  +             List patterns = null;
  +             if (phaseProperty_ != null) {
  +                     patterns = getPatternsForPhase(phaseProperty_);
  +                     logger.debug(" Validating for phase: " + 
phaseProperty_);
  +             } else {
  +                     patterns = schema_.getPattern();
  +                     logger.debug(" Validating all patterns. No phase 
provided ");
  +             }
  +
  +             ValidationResult vres = new ValidationResult();
  +
  +             if (patterns != null) {
  +                     // create the JXPathContext
  +                     // which will be used to validate each rule
  +                     JXPathContext jxpContext = 
JXPathContext.newContext(jbean);
  +
  +                     Iterator iter = patterns.iterator();
  +                     while (iter.hasNext()) {
  +                             Pattern resultPattern =
  +                                     evalPattern(jxpContext, (Pattern) 
iter.next());
  +                             // if the resultPattern is null,
  +                             // then it passed successfully
  +                             if (resultPattern != null)
  +                                     vres.addPattern(resultPattern);
  +                     }
  +             }
  +
  +             return vres.toList();
  +     }
  +
  +     /**
  +      * return the list of patterns listed
  +      * as <active/> elements of <phase/>
  +      *
  +      * @param phase name of the phase
  +      * @return List of patterns
  +      */
  +     protected List getPatternsForPhase(String phase) {
  +             return (List) phaseMap_.get(phase);
  +     }
  +
  +     /** 
  +     * Returns pattern with rules which failed during validation.
  +     * The context attribute of each rule in the result pattern
  +     * contains the exact location of the failed element
  +     * unlike the context attribute of the original pattern which
  +     * is an XSLT production pattern
  +     *
  +     * @param jxpContext The JXPathContext being validated
  +     * @param pattern The production schema pattern to be evaluated
  +     * @return pattern with rules wich failed during validation.
  +     */
  +     protected Pattern evalPattern(JXPathContext jxpContext, Pattern 
pattern) {
  +             // copy attributes
  +             Pattern resultPattern = new Pattern();
  +             resultPattern.setName(pattern.getName());
  +             resultPattern.setId(pattern.getId());
  +
  +             // evaluate rules
  +             Iterator iter = pattern.getRule().iterator();
  +             while (iter.hasNext()) {
  +                     List failedRules = evalRule(jxpContext, (Rule) 
iter.next());
  +                     // if there were failed rules
  +                     // add them to the list of other failed rules
  +                     if (failedRules.size() > 0) {
  +                             failedRules.addAll(resultPattern.getRule());
  +                             resultPattern.setRule(failedRules);
  +                     }
  +             }
  +
  +             // if there are no failed rules return null
  +             if (resultPattern.getRule().size() == 0)
  +                     return null;
  +             else
  +                     return resultPattern;
  +     }
  +
  +     /** 
  +     * Returns rules with asserts or reports which failed during validation.
  +     * The context attribute of each rule in the result pattern
  +     * contains the exact location of the failed element
  +     * unlike the context attribute of the original pattern which
  +     * is an XSLT production pattern
  +     *
  +     * @param jxpContext The JXPath context being validated
  +     * @param rule The original pattern rule to be evaluated
  +     * @return pattern with rules wich failed during validation.
  +     */
  +     protected List evalRule(JXPathContext jxpContext, Rule rule) {
  +             List failedRules = new ArrayList();
  +
  +             Iterator pointerIter = 
jxpContext.iteratePointers(rule.getContext());
  +             while (pointerIter.hasNext()) {
  +
  +                     Pointer ptr = (Pointer) pointerIter.next();
  +
  +                     // prepare result Rule
  +                     Rule nextFailedRule = new Rule();
  +                     nextFailedRule.setContext(ptr.asPath());
  +
  +                     // switch to the context of the rule
  +                     JXPathContext localJxpContext =
  +                             JXPathContext.newContext(jxpContext, 
ptr.getValue());
  +
  +                     // evaluate asserts
  +                     Iterator assertIter = rule.getAssert().iterator();
  +                     while (assertIter.hasNext()) {
  +                             Assert assertion = (Assert) assertIter.next();
  +                             // if an assert test fails, then it should be 
added
  +                             // to the result
  +                             boolean passed = evalTest(localJxpContext, 
assertion.getTest());
  +                             if (!passed) {
  +                                     nextFailedRule.addAssert(assertion);
  +                             }
  +                     }
  +
  +                     // evaluate reports
  +                     Iterator reportIter = rule.getReport().iterator();
  +                     while (reportIter.hasNext()) {
  +                             Report report = (Report) reportIter.next();
  +                             // if a report test passes, then it should be 
added
  +                             // to the result
  +                             boolean passed = evalTest(localJxpContext, 
report.getTest());
  +                             if (passed) {
  +                                     nextFailedRule.addReport(report);
  +                             }
  +                     }
  +
  +                     // if the nextFailedRule is non empty,
  +                     // then add it to the list of failed rules
  +                     if (nextFailedRule.getAssert().size() > 0
  +                             || nextFailedRule.getReport().size() > 0) {
  +                             failedRules.add(nextFailedRule);
  +                     }
  +             }
  +
  +             return failedRules;
  +     }
  +
  +     /** 
  +     * Test an XPath expression in a context
  +      *
  +     * @param jxpContext The JXPath context being validated
  +     * @param String The XPath expression
  +     * @return boolean result of evaluation
  +     */
  +     protected boolean evalTest(JXPathContext jxpContext, String test) {
  +             Boolean passed = (Boolean) jxpContext.getValue(test, 
Boolean.class);
  +             return passed.booleanValue();
  +     }
  +
  +     /**
  +      * @param property name
  +      * @return the property value
  +      * @throws IllegalArgumentException when the property is not supported
  +      */
  +     public Object getProperty(String property)
  +             throws IllegalArgumentException {
  +             if (property.equals(Validator.PROPERTY_PHASE))
  +                     return phaseProperty_;
  +             else
  +                     throw new IllegalArgumentException(
  +                             " Property " + property + " is not supported");
  +     }
  +
  +     /**
  +      * @param property name
  +      * @param value property value
  +      * @throws IllegalArgumentException when the property is not supported
  +      */
  +     public void setProperty(String property, Object value)
  +             throws IllegalArgumentException {
  +             if (property.equals(Validator.PROPERTY_PHASE)
  +                     && (value == null || (value instanceof String))) {
  +                     phaseProperty_ = (String) value;
  +             } else
  +                     throw new IllegalArgumentException(
  +                             " Property "
  +                                     + property
  +                                     + " is not supported or value is 
invalid");
  +     }
   
  -  
  -  /** The schema instance for this Validator
  -   * It is initialized once when a new Validator instance
  -   * is created and used multiple times for validating
  -   * different JavaBeans/DOM objects against the schema
  -   */
  -  private SchematronSchema schema_;
  -
  -  /**
  -   * lookup map, with phase id keys.
  -   * Used for efficiency when validating by phase
  -   */
  -  private Map phaseMap_ = new HashMap();
  -  
  -  
  -  /**
  -   * the schema name space prefix used in the schema document
  -   */
  -  private String schemaPrefix_;
  -  
  -  /**
  -   * the default schema name space prefix 
  -   */
  -  private String defaultSchemaPrefix_ = "sch";
  -
  -  /*
  -   * Schematron Phase property
  -   */
  -  private String phaseProperty_  = null;
  -  
  -  
  -  /*
  -   * private logger
  -   */
  -  private Logger logger = setupLogger();
  -  
  -    
  -  
  -  //
  -  // Constructors
  -  //
  -
  -  
  -  /**
  -   * Constructs a new Validator object for a given Schematron schema.
  -   *
  -   * @param schema 
  -   *        The Schematron schema
  -   */
  -  public SchematronValidator (SchematronSchema schema)
  -  {
  -    schema_ = schema;
  -    preparePhaseMap();
  -  }
  -
  -
  -
  -
  -  //
  -  // helper methods for the constructors
  -  //
  -
  -  /**
  -   * initialize logger
  -   */
  -  protected Logger setupLogger()
  -  {
  -    Logger logger = Hierarchy.getDefaultHierarchy().getLoggerFor("XmlForm");
  -    logger.setPriority( Priority.ERROR );
  -    return logger;
  -  }
  -  
  -
  -  protected void preparePhaseMap()
  -  {
  -    Map patternMap = new HashMap();
  -    
  -    Iterator ptiter = schema_.getPattern().iterator();
  -    while (ptiter.hasNext())
  -    {
  -      Pattern pattern = (Pattern) ptiter.next();
  -      patternMap.put( pattern.getId(), pattern );
  -    }
  -    
  -    Iterator phiter = schema_.getPhase().iterator();
  -    while (phiter.hasNext())
  -    {
  -      Phase phase = (Phase) phiter.next();
  -      List activePatterns = new ArrayList();
  -      phaseMap_.put( phase.getId(), activePatterns );
  -      
  -      Iterator activeIter = phase.getActive().iterator();
  -      while (activeIter.hasNext())
  -      {
  -        ActivePattern active = (ActivePattern) activeIter.next();
  -        activePatterns.add( patternMap.get( active.getPattern() ) );
  -      }
  -    }
  -    
  -    
  -  }
  -
  -  //
  -  // public methods
  -  //
  -
  -
  -
  -
  -  /**
  -   * Performs validation of the passed JavaBean or DOM object.
  -   *
  -   * This method tries to find the "phase" attribute
  -   * and runs the active patterns for the phase.
  -   * If phase not found, the method will try to match all patterns
  -   *
  -   *
  -   * @param jbean The JavaBean or DOM object to be validated.
  -   * @param props Properties which control different aspects of the 
  -   * validation process. This method only looks for the phase property.
  -   * Another implementation may use other.
  -   *
  -   * @return A Result object which represents the result
  -   *         of the validation.
  -   */
  -  public List validate( Object jbean ) 
  -  {
  -    List patterns = null;
  -    if (phaseProperty_ != null) 
  -    {
  -      patterns = getPatternsForPhase( phaseProperty_ );
  -      logger.debug(" Validating for phase: " + phaseProperty_);
  -    }
  -    else
  -    {
  -      patterns = schema_.getPattern();
  -      logger.debug(" Validating all patterns. No phase provided ");
  -    }
  -    
  -    ValidationResult vres = new ValidationResult();
  -
  -    if (patterns != null)
  -    {
  -      // create the JXPathContext
  -      // which will be used to validate each rule
  -      JXPathContext jxpContext = JXPathContext.newContext( jbean );
  -
  -      Iterator iter = patterns.iterator ();
  -      while (iter.hasNext ())
  -      {
  -        Pattern resultPattern = evalPattern( jxpContext, (Pattern) 
iter.next());
  -        // if the resultPattern is null,
  -        // then it passed successfully
  -        if ( resultPattern != null) vres.addPattern( resultPattern );
  -      }
  -    }
  -    
  -    return vres.toList();
  -  }
  -
  -  /**
  -   * return the list of patterns listed
  -   * as <active/> elements of <phase/>
  -   *
  -   * @param phase name of the phase
  -   * @return List of patterns
  -   */
  -  protected List getPatternsForPhase( String phase )
  -  {
  -    return (List) phaseMap_.get( phase );
  -  }
  -  
  -  /** 
  -  * Returns pattern with rules which failed during validation.
  -  * The context attribute of each rule in the result pattern
  -  * contains the exact location of the failed element
  -  * unlike the context attribute of the original pattern which
  -  * is an XSLT production pattern
  -  *
  -  * @param jxpContext The JXPathContext being validated
  -  * @param pattern The production schema pattern to be evaluated
  -  * @return pattern with rules wich failed during validation.
  -  */
  -  protected Pattern evalPattern( JXPathContext jxpContext, Pattern pattern)
  -  {
  -    // copy attributes
  -    Pattern resultPattern = new Pattern();
  -    resultPattern.setName( pattern.getName() );
  -    resultPattern.setId( pattern.getId() );
  -
  -    // evaluate rules
  -    Iterator iter = pattern.getRule().iterator();
  -    while (iter.hasNext())
  -    {
  -      List failedRules = evalRule(jxpContext, (Rule) iter.next () );
  -      // if there were failed rules
  -      // add them to the list of other failed rules
  -      if (failedRules.size () > 0) 
  -      {
  -        failedRules.addAll ( resultPattern.getRule() );
  -        resultPattern.setRule ( failedRules );
  -      }
  -    }
  -    
  -    // if there are no failed rules return null
  -    if (resultPattern.getRule().size() == 0) return null;
  -    else return resultPattern;
  -  }
  -  
  -  
  -  /** 
  -  * Returns rules with asserts or reports which failed during validation.
  -  * The context attribute of each rule in the result pattern
  -  * contains the exact location of the failed element
  -  * unlike the context attribute of the original pattern which
  -  * is an XSLT production pattern
  -  *
  -  * @param jxpContext The JXPath context being validated
  -  * @param rule The original pattern rule to be evaluated
  -  * @return pattern with rules wich failed during validation.
  -  */
  -  protected List evalRule( JXPathContext jxpContext, Rule rule )
  -  {
  -    List failedRules = new ArrayList();
  -    
  -    Iterator pointerIter = jxpContext.iteratePointers( rule.getContext() );
  -    while ( pointerIter.hasNext() )
  -    {
  -
  -      Pointer ptr = (Pointer) pointerIter.next ();
  -
  -      // prepare result Rule
  -      Rule nextFailedRule = new Rule();
  -      nextFailedRule.setContext( ptr.asPath() );
  -
  -      // switch to the context of the rule
  -      JXPathContext localJxpContext = JXPathContext.newContext( jxpContext, 
ptr.getValue() );
  -      
  -      // evaluate asserts
  -      Iterator assertIter = rule.getAssert().iterator();
  -      while (assertIter.hasNext())
  -      {
  -        Assert assertion = (Assert) assertIter.next();
  -        // if an assert test fails, then it should be added
  -        // to the result
  -        boolean passed = evalTest( localJxpContext, assertion.getTest() );
  -        if (!passed) 
  -        {
  -          nextFailedRule.addAssert ( assertion );
  -        }
  -      }
  -      
  -      // evaluate reports
  -      Iterator reportIter = rule.getReport().iterator();
  -      while (reportIter.hasNext())
  -      {
  -        Report report = (Report) reportIter.next();
  -        // if a report test passes, then it should be added
  -        // to the result
  -        boolean passed = evalTest( localJxpContext, report.getTest() );
  -        if (passed) 
  -        {
  -          nextFailedRule.addReport ( report );
  -        }
  -      }
  -      
  -      // if the nextFailedRule is non empty,
  -      // then add it to the list of failed rules
  -      if (nextFailedRule.getAssert().size() > 0 || 
nextFailedRule.getReport().size() > 0)
  -      {
  -        failedRules.add( nextFailedRule );
  -      }
  -    }
  -    
  -    return failedRules;
  -  }
  -
  -  
  -  /** 
  -  * Test an XPath expression in a context
  -   *
  -  * @param jxpContext The JXPath context being validated
  -  * @param String The XPath expression
  -  * @return boolean result of evaluation
  -  */
  -  protected boolean evalTest( JXPathContext jxpContext, String test )
  -  {
  -    Boolean passed = (Boolean) jxpContext.getValue( test, Boolean.class);
  -    return passed.booleanValue ();
  -  }
  -  
  -  /**
  -   * @param property name
  -   * @return the property value
  -   * @throws IllegalArgumentException when the property is not supported
  -   */
  -  public java.lang.Object getProperty (java.lang.String property) throws 
java.lang.IllegalArgumentException
  -  {
  -    if (property.equals ( Validator.PROPERTY_PHASE ) ) return phaseProperty_;
  -    else throw new IllegalArgumentException(" Property " + property + " is 
not supported");
  -  }  
  -  
  -  /**
  -   * @param property name
  -   * @param value property value
  -   * @throws IllegalArgumentException when the property is not supported
  -   */
  -  public void setProperty (java.lang.String property, java.lang.Object 
value) throws java.lang.IllegalArgumentException
  -  {
  -    if ( property.equals ( Validator.PROPERTY_PHASE ) && ( value == null || 
(value instanceof String)) ) 
  -    {
  -      phaseProperty_ = (String) value;
  -    }
  -    else 
  -      throw new IllegalArgumentException(" Property " + property + " is not 
supported or value is invalid");
  -  }
  -  
   }
  
  
  
  1.4       +63 -76    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/Rule.java
  
  Index: Rule.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/Rule.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Rule.java 15 Jan 2003 11:52:32 -0000      1.3
  +++ Rule.java 15 Jan 2003 13:17:40 -0000      1.4
  @@ -67,81 +67,68 @@
    *
    * @author  Ivelin Ivanov, [EMAIL PROTECTED], [EMAIL PROTECTED]
    */
  -public class Rule 
  -{
  +public class Rule {
  +
  +     private String context_;
  +     private ArrayList asserts_ = new ArrayList();
  +     private ArrayList reports_ = new ArrayList();
  +
  +     /**
  +      * Returns the context of the pattern
  +      */
  +     public String getContext() {
  +             return context_;
  +     }
  +
  +     /**
  +      * Sets the context of the pattern
  +      */
  +     public void setContext(String newContext) {
  +             context_ = newContext;
  +     }
  +
  +     /**
  +      * Returns the list of the assertion rules 
  +      */
  +     public List getAssert() {
  +             return asserts_;
  +     }
  +
  +     /**
  +      * Sets the the list of the assertion rules 
  +      */
  +     public void setAssert(Collection newAsserts) {
  +             asserts_ = new ArrayList();
  +             asserts_.addAll(newAsserts);
  +     }
  +
  +     /**
  +      * Add an assert rule 
  +      */
  +     public void addAssert(Assert a) {
  +             asserts_.add(a);
  +     }
  +
  +     /**
  +      * Returns the list of the report rules 
  +      */
  +     public List getReport() {
  +             return reports_;
  +     }
  +
  +     /**
  +      * Sets the list of the report rules 
  +      */
  +     public void setReport(Collection newReports) {
  +             reports_ = new ArrayList();
  +             reports_.addAll(newReports);
  +     }
  +
  +     /**
  +      * Add a report rule 
  +      */
  +     public void addReport(Report r) {
  +             reports_.add(r);
  +     }
   
  -  private String context_;
  -  private ArrayList asserts_ = new ArrayList ();
  -  private ArrayList reports_ = new ArrayList ();
  -
  -  
  -
  -  /**
  -   * Returns the context of the pattern
  -   */
  -  public String getContext()
  -  {
  -    return context_;
  -  }
  -  
  -  /**
  -   * Sets the context of the pattern
  -   */
  -  public void setContext( String newContext )
  -  {
  -    context_ = newContext;
  -  }
  -        
  -  /**
  -   * Returns the list of the assertion rules 
  -   */
  -  public List getAssert()
  -  {
  -    return asserts_;
  -  }
  -  
  -  /**
  -   * Sets the the list of the assertion rules 
  -   */
  -  public void setAssert(Collection newAsserts)
  -  {
  -    asserts_ = new ArrayList();
  -    asserts_.addAll ( newAsserts );
  -  }
  -  
  -  /**
  -   * Add an assert rule 
  -   */
  -  public void addAssert(Assert a)
  -  {
  -    asserts_.add ( a );
  -  }
  -  
  -  
  -  /**
  -   * Returns the list of the report rules 
  -   */
  -  public List getReport()
  -  {
  -    return reports_;
  -  }
  -  
  -  /**
  -   * Sets the list of the report rules 
  -   */
  -  public void setReport(Collection newReports)
  -  {
  -    reports_ = new ArrayList();
  -    reports_.addAll ( newReports );
  -  }
  -  
  -  /**
  -   * Add a report rule 
  -   */
  -  public void addReport(Report r)
  -  {
  -    reports_.add ( r );
  -  }
  -  
  -      
   }
  
  
  
  1.4       +56 -67    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/Pattern.java
  
  Index: Pattern.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/Pattern.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Pattern.java      15 Jan 2003 11:52:32 -0000      1.3
  +++ Pattern.java      15 Jan 2003 13:17:40 -0000      1.4
  @@ -54,76 +54,65 @@
   import java.util.Collection;
   import java.util.List;
   
  -
   /**
    * Represents a Schematron pattern 
    * 
    * @author  Ivelin Ivanov, [EMAIL PROTECTED], [EMAIL PROTECTED]
    */
  -public class Pattern
  -{
  -  
  -  private String name_;
  -  private String id_;
  -  private ArrayList rules_ = new ArrayList ();
  -  
  -
  -  /**
  -   * Returns the id of the pattern
  -   */
  -  public String getId()
  -  {
  -    return id_;
  -  }
  -  
  -  /**
  -   * Sets the id of the pattern
  -   */
  -  public void setId( String newId )
  -  {
  -    id_ = newId;
  -  }
  -     
  -  /**
  -   * Returns the name of the pattern
  -   */
  -  public String getName()
  -  {
  -    return name_;
  -  }
  -  
  -  /**
  -   * Sets the name of the pattern
  -   */
  -  public void setName( String newName )
  -  {
  -    name_ = newName;
  -  }
  -      
  -  /**
  -   * Returns the list of rules 
  -   */
  -  public List getRule()
  -  {
  -    return rules_;
  -  }
  -  
  -  /**
  -   * Sets the list of rules 
  -   */
  -  public void setRule(Collection newRules)
  -  {
  -    rules_ = new ArrayList();
  -    rules_.addAll ( newRules );
  -  }
  -  
  -  /**
  -   * Add a rule to the list 
  -   */
  -  public void addRule(Rule r)
  -  {
  -    rules_.add ( r );
  -  }
  -  
  -  
  +public class Pattern {
  +
  +     private String name_;
  +     private String id_;
  +     private ArrayList rules_ = new ArrayList();
  +
  +     /**
  +      * Returns the id of the pattern
  +      */
  +     public String getId() {
  +             return id_;
  +     }
  +
  +     /**
  +      * Sets the id of the pattern
  +      */
  +     public void setId(String newId) {
  +             id_ = newId;
  +     }
  +
  +     /**
  +      * Returns the name of the pattern
  +      */
  +     public String getName() {
  +             return name_;
  +     }
  +
  +     /**
  +      * Sets the name of the pattern
  +      */
  +     public void setName(String newName) {
  +             name_ = newName;
  +     }
  +
  +     /**
  +      * Returns the list of rules 
  +      */
  +     public List getRule() {
  +             return rules_;
  +     }
  +
  +     /**
  +      * Sets the list of rules 
  +      */
  +     public void setRule(Collection newRules) {
  +             rules_ = new ArrayList();
  +             rules_.addAll(newRules);
  +     }
  +
  +     /**
  +      * Add a rule to the list 
  +      */
  +     public void addRule(Rule r) {
  +             rules_.add(r);
  +     }
  +
   }
  
  
  
  1.3       +48 -57    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/Assert.java
  
  Index: Assert.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/Assert.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Assert.java       15 Jan 2003 11:52:32 -0000      1.2
  +++ Assert.java       15 Jan 2003 13:17:40 -0000      1.3
  @@ -58,61 +58,52 @@
    *
    * @author  Ivelin Ivanov, [EMAIL PROTECTED], [EMAIL PROTECTED]
    */
  -public class Assert
  -{
  -  
  -  private String test_;
  -  private String message_;
  -  private String diagnostics_;
  - 
  -  /**
  -   * Returns the test attribute 
  -   */
  -  public String getTest()
  -  {
  -    return test_;
  -  }
  -  
  -  /**
  -   * Sets the test attribute 
  -   */
  -  public void setTest( String newTest )
  -  {
  -    test_ = newTest;
  -  }
  -  
  -  /**
  -   * Returns the message for to the element 
  -   */
  -  public String getMessage()
  -  {
  -    return message_;
  -  }
  -  
  -  /**
  -   * Sets the message for to the element 
  -   */
  -  public void setMessage( String newMessage )
  -  {
  -    message_ = newMessage;
  -  }
  -
  -  
  -  /**
  -   * Returns the diagnostics list 
  -   */
  -  public String getDiagnostics()
  -  {
  -    return diagnostics_;
  -  }
  -  
  -  /**
  -   * Sets the diagnostics list 
  -   */
  -  public void setDiagnostics( String newDiagnostics )
  -  {
  -    diagnostics_ = newDiagnostics;
  -  }
  -  
  -  
  +public class Assert {
  +
  +     private String test_;
  +     private String message_;
  +     private String diagnostics_;
  +
  +     /**
  +      * Returns the test attribute 
  +      */
  +     public String getTest() {
  +             return test_;
  +     }
  +
  +     /**
  +      * Sets the test attribute 
  +      */
  +     public void setTest(String newTest) {
  +             test_ = newTest;
  +     }
  +
  +     /**
  +      * Returns the message for to the element 
  +      */
  +     public String getMessage() {
  +             return message_;
  +     }
  +
  +     /**
  +      * Sets the message for to the element 
  +      */
  +     public void setMessage(String newMessage) {
  +             message_ = newMessage;
  +     }
  +
  +     /**
  +      * Returns the diagnostics list 
  +      */
  +     public String getDiagnostics() {
  +             return diagnostics_;
  +     }
  +
  +     /**
  +      * Sets the diagnostics list 
  +      */
  +     public void setDiagnostics(String newDiagnostics) {
  +             diagnostics_ = newDiagnostics;
  +     }
  +
   }
  
  
  
  1.4       +69 -81    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/SchematronSchema.java
  
  Index: SchematronSchema.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/SchematronSchema.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SchematronSchema.java     15 Jan 2003 11:52:32 -0000      1.3
  +++ SchematronSchema.java     15 Jan 2003 13:17:40 -0000      1.4
  @@ -57,7 +57,6 @@
   import java.util.Collection;
   import java.util.List;
   
  -
   /**
    * Represents a Schematron Schema 
    *
  @@ -66,85 +65,74 @@
    * 
    * @author  Ivelin Ivanov, [EMAIL PROTECTED], [EMAIL PROTECTED]
    */
  -public class SchematronSchema implements Schema
  -{
  -  
  -  private String title_;
  -  private ArrayList patterns_ = new ArrayList();
  -  private ArrayList phases_  = new ArrayList();
  -  
  -   /**
  -   * Returns the message for to the element 
  -   */
  -  public String getTitle()
  -  {
  -    return title_;
  -  }
  -  
  -  /**
  -   * Sets the message for to the element 
  -   */
  -  public void setTitle( String newTitle )
  -  {
  -    title_ = newTitle;
  -  }
  -    
  -  /**
  -   * Returns a list of the patterns which
  -   * contain messages that failed during validation
  -   */
  -  public List getPattern()
  -  {
  -    return patterns_;
  -  }
  -  
  -  /**
  -   * Sets the list of the patterns which
  -   * contain messages that failed during validation
  -   */
  -  public void setPattern(Collection newPatterns)
  -  {
  -    patterns_ = new ArrayList();
  -    patterns_.addAll ( newPatterns );
  -  }
  -  
  -  /**
  -   * Add a pattern to the list
  -   */
  -  public void addPattern(Pattern p)
  -  {
  -    patterns_.add ( p );
  -  }
  -  
  -    
  -  /**
  -   * Returns the list of schema phases 
  -   */
  -  public List getPhase()
  -  {
  -    return phases_;
  -  }
  -  
  -  /**
  -   * Sets the list of schema phases 
  -   */
  -  public void setPhase(Collection newPhases)
  -  {
  -    phases_ = new ArrayList();
  -    phases_.addAll ( newPhases );
  -  }
  -  
  -  /**
  -   * Add a pattern to the list
  -   */
  -  public void addPhase(Phase p)
  -  {
  -    phases_.add ( p );
  -  }
  -  
  -  public Validator newValidator () throws InstantiationException
  -  {
  -    return new SchematronValidator( this );
  -  }  
  +public class SchematronSchema implements Schema {
  +
  +     private String title_;
  +     private ArrayList patterns_ = new ArrayList();
  +     private ArrayList phases_ = new ArrayList();
  +
  +     /**
  +     * Returns the message for to the element 
  +     */
  +     public String getTitle() {
  +             return title_;
  +     }
  +
  +     /**
  +      * Sets the message for to the element 
  +      */
  +     public void setTitle(String newTitle) {
  +             title_ = newTitle;
  +     }
  +
  +     /**
  +      * Returns a list of the patterns which
  +      * contain messages that failed during validation
  +      */
  +     public List getPattern() {
  +             return patterns_;
  +     }
  +
  +     /**
  +      * Sets the list of the patterns which
  +      * contain messages that failed during validation
  +      */
  +     public void setPattern(Collection newPatterns) {
  +             patterns_ = new ArrayList();
  +             patterns_.addAll(newPatterns);
  +     }
  +
  +     /**
  +      * Add a pattern to the list
  +      */
  +     public void addPattern(Pattern p) {
  +             patterns_.add(p);
  +     }
  +
  +     /**
  +      * Returns the list of schema phases 
  +      */
  +     public List getPhase() {
  +             return phases_;
  +     }
  +
  +     /**
  +      * Sets the list of schema phases 
  +      */
  +     public void setPhase(Collection newPhases) {
  +             phases_ = new ArrayList();
  +             phases_.addAll(newPhases);
  +     }
  +
  +     /**
  +      * Add a pattern to the list
  +      */
  +     public void addPhase(Phase p) {
  +             phases_.add(p);
  +     }
  +
  +     public Validator newValidator() throws InstantiationException {
  +             return new SchematronValidator(this);
  +     }
   
   }
  
  
  
  1.11      +385 -357  
xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/SchematronFactory.java
  
  Index: SchematronFactory.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/SchematronFactory.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- SchematronFactory.java    15 Jan 2003 11:52:32 -0000      1.10
  +++ SchematronFactory.java    15 Jan 2003 13:17:40 -0000      1.11
  @@ -64,7 +64,6 @@
   import javax.xml.parsers.DocumentBuilder;
   import javax.xml.parsers.DocumentBuilderFactory;
   
  -
   /**
    * A helper class which builds a SchematronSchema instance object
    * from a DOM source
  @@ -72,362 +71,391 @@
    * @author Ivelin Ivanov, [EMAIL PROTECTED], [EMAIL PROTECTED]
    * @author Michael Ratliff, [EMAIL PROTECTED] <[EMAIL PROTECTED]>, May 2002
    */
  -public class SchematronFactory extends SchemaFactory
  -{
  -
  -  /**
  -   * the schema name space prefix used in the schema document
  -   */
  -  private String schemaPrefix_;
  -
  -  /**
  -   * the default schema name space prefix
  -   */
  -  private String defaultSchemaPrefix_ = "sch";
  -
  -  /*
  -   * private logger
  -   */
  -  private Logger logger = setupLogger();
  -
  -
  -  //
  -  // Constructors
  -  //
  -
  -  /**
  -   * initialize logger
  -   */
  -  protected Logger setupLogger()
  -  {
  -    Logger logger = Hierarchy.getDefaultHierarchy().getLoggerFor("XmlForm");
  -    logger.setPriority( Priority.ERROR );
  -    return logger;
  -  }
  -
  -  /**
  -   * Builds a new Schema instance from
  -   * the given XML InputSource
  -   *
  -   * @param schemaSrc
  -   *        the Schema document XML InputSource
  -   */
  -  public Schema compileSchema(InputSource schemaSrc)
  -                              throws InstantiationException
  -  {
  -    SchematronSchema schema = null;
  -    try {
  -
  -      // load Schema file into a DOM document
  -      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance ();
  -      DocumentBuilder dbld = dbf.newDocumentBuilder ();
  -      Document document = dbld.parse( schemaSrc );
  -
  -      schema = buildSchema( document );
  -
  -    } catch (Exception e) {
  -        logger.error("!!! Failed loading Schematron schema", e);
  -        throw new CascadingRuntimeException(" !!! Failed loading Schematron 
schema", e);
  -    }
  -   return schema;
  -  } // build
  -
  -
  -  /**
  -   * Build Schematron schema object from a DOM document
  -   * @param doc DOM document containing the schema
  -   *
  -   */
  -  protected SchematronSchema buildSchema( Document doc )
  -  {
  -    SchematronSchema schema = new SchematronSchema();
  -    boolean errors = false;
  -
  -    doc.getNamespaceURI ();
  -    doc.getPrefix ();
  -
  -    // Initialize the JXPath context
  -    Element root = doc.createElement ( "root" );
  -    Element schemaElement = doc.getDocumentElement ();
  -    schemaPrefix_ = schemaElement.getPrefix ();
  -    root.appendChild (  schemaElement );
  -    JXPathContext jxpContext = JXPathContext.newContext ( root );
  -    jxpContext.setLenient(false);
  -
  -    // Bind sch:schema element
  -
  -    // schema title
  -    String title = (String) jxpContext.getValue ( "/schema/title", 
String.class );
  -    schema.setTitle( title );
  -    logger.debug( "Schema title: " + schema.getTitle());
  -
  -    bindPatterns( schema, jxpContext );
  -    bindPhases( schema, jxpContext );
  -
  -    return schema;
  -  }
  -
  -  /**
  -   * populates the patterns elements from the dom tree
  -   *
  -   * @param schema the schema instance
  -   * @param jxpContext
  -   */
  -  protected void bindPatterns( SchematronSchema schema, JXPathContext 
jxpContext)
  -  {
  -    // ensure that mandatory elements which are not found
  -    // will result in Exception
  -    jxpContext.setLenient(false);
  -
  -    // schema patterns
  -    int ptCount = ((Integer) jxpContext.getValue ( "count(/schema/pattern)", 
Integer.class )).intValue();
  -    logger.debug( "\nNumber of patterns:  " + ptCount);
  -    for (int i = 1; i <= ptCount; i++)
  -    {
  -      logger.debug( "Pattern# :  " + i);
  -      Pattern pattern = new Pattern();
  -      String ptprefix = "/schema/pattern[" + i + "]";
  -
  -      String name = (String) jxpContext.getValue ( ptprefix + "/@name", 
String.class );
  -      pattern.setName( name );
  -      logger.debug( "Pattern name :  " + pattern.getName());
  -
  -      String id = (String) jxpContext.getValue (  ptprefix + "/@id", 
String.class );
  -      pattern.setId( id );
  -      logger.debug( "Pattern id :  " + pattern.getId() );
  -
  -      bindRules( pattern, ptprefix, jxpContext );
  -
  -      schema.addPattern( pattern );
  -    }
  -  }
  -
  -
  -  /**
  -   * populates the rules elements for a pattern
  -   * from the dom tree
  -   *
  -   * @param pattern
  -   * @param pathPrefix pattern path prefix
  -   * @param jxpContext JXPathContext
  -   */
  -  protected void bindRules( Pattern pattern, String pathPrefix, 
JXPathContext jxpContext)
  -  {
  -    // ensure that mandatory elements which are not found
  -    // will result in Exception
  -    jxpContext.setLenient(false);
  -
  -    // schema rules
  -    int ruleCount = ((Integer) jxpContext.getValue ( "count(" + pathPrefix + 
"/rule)", Integer.class )).intValue();
  -    logger.debug( "\nNumber of rules:  " + ruleCount);
  -    for (int i = 1; i <= ruleCount; i++)
  -    {
  -      logger.debug( "Rule# :  " + i);
  -      Rule rule = new Rule();
  -      String rulePrefix = pathPrefix + "/rule[" + i + "]";
  -
  -      String context = (String) jxpContext.getValue ( rulePrefix + 
"/@context", String.class );
  -      rule.setContext( context );
  -      logger.debug( "Rule context :  " + rule.getContext());
  -
  -      bindAsserts( rule, rulePrefix, jxpContext );
  -
  -      // Patch to make reports work in schematron
  -      // Note change to name of bindRerports [sic] function
  -      bindReports( rule, rulePrefix, jxpContext );
  -
  -      pattern.addRule( rule );
  -    }
  -  }
  -
  -
  -  /**
  -   * populates the assert elements for a rule
  -   * from the dom tree
  -   *
  -   * @param rule
  -   * @param pathPrefix rule path prefix
  -   * @param jxpContext JXPathContext
  -   */
  -  protected void bindAsserts( Rule rule, String pathPrefix, JXPathContext 
jxpContext)
  -  {
  -    // ensure that mandatory elements which are not found
  -    // will result in Exception
  -    jxpContext.setLenient(false);
  -
  -    // schema reports
  -    int elementCount = ((Integer) jxpContext.getValue ( "count(" + 
pathPrefix + "/assert)", Integer.class )).intValue();
  -    logger.debug( "\nNumber of asserts:  " + elementCount);
  -    for (int i = 1; i <= elementCount; i++)
  -    {
  -      logger.debug( "Assert# :  " + i);
  -      Assert assertion = new Assert();
  -      String assertPrefix = pathPrefix + "/assert[" + i + "]";
  -
  -      String test = (String) jxpContext.getValue ( assertPrefix + "/@test", 
String.class );
  -      assertion.setTest( test );
  -      logger.debug( "Assert test :  " + assertion.getTest());
  -
  -
  -      // since diagnostics is a non-mandatory element
  -      // we will try to get its value in a lenient mode
  -      jxpContext.setLenient(true);
  -      String diagnostics = (String) jxpContext.getValue ( assertPrefix + 
"/@diagnostics", String.class );
  -      assertion.setDiagnostics( diagnostics );
  -      logger.debug( "Assert diagnostics :  " + assertion.getDiagnostics());
  -      jxpContext.setLenient(false);
  -
  -      
  -      // now read the report message
  -      // @todo: The current implementation does not 
  -      // read xml tags used within the assert message.
  -      // Solution is to use JXPath NodePointer to get 
  -      // to the DOM node and then convert it to a String.
  -      // e.g.
  -      // NodePointer nptr = (NodePointer) jxpContext.locateValue( 
assertPrefix );
  -      // Node msgNode = (Node) nptr.getNodeValue();
  -      // convery DOMNode to String
  -
  -      String message = (String) jxpContext.getValue ( assertPrefix, 
String.class );
  -      assertion.setMessage( message );
  -      logger.debug( "Assert message :  " + assertion.getMessage());
  -
  -      rule.addAssert( assertion );
  -    }
  -  }
  -
  -
  -  /**
  -   * populates the report elements for a rule
  -   * from the dom tree
  -   *
  -   * @param rule
  -   * @param pathPrefix rule path prefix
  -   * @param jxpContext JXPathContext
  -   */
  -
  -  protected void bindReports( Rule rule, String pathPrefix, JXPathContext 
jxpContext)
  -  {
  -    // ensure that mandatory elements which are not found
  -    // will result in Exception
  -    jxpContext.setLenient(false);
  -
  -    // schema reports
  -    int elementCount = ((Integer) jxpContext.getValue ( "count(" + 
pathPrefix + "/report)", Integer.class )).intValue();
  -    logger.debug( "\nNumber of reports:  " + elementCount);
  -    for (int i = 1; i <= elementCount; i++)
  -    {
  -      logger.debug( "Report# :  " + i);
  -      Report report = new Report();
  -      String assertPrefix = pathPrefix + "/report[" + i + "]";
  -
  -      String test = (String) jxpContext.getValue ( assertPrefix + "/@test", 
String.class );
  -      report.setTest( test );
  -      logger.debug( "Report test :  " + report.getTest());
  -
  -      // since diagnostics is a non-mandatory element
  -      // we will try to get its value in a lenient mode
  -      jxpContext.setLenient(true);
  -      String diagnostics = (String) jxpContext.getValue ( assertPrefix + 
"/@diagnostics", String.class );
  -      report.setDiagnostics( diagnostics );
  -      logger.debug( "Report diagnostics :  " + report.getDiagnostics());
  -      jxpContext.setLenient(false);
  -
  -      String message = (String) jxpContext.getValue ( assertPrefix, 
String.class );
  -      report.setMessage( message );
  -      logger.debug( "Report message :  " + report.getMessage());
  -
  -      rule.addReport( report );
  -    }
  -  }
  -
  -
  -  /**
  -   * populates the phases elements from the dom tree
  -   *
  -   * @param schema the schema instance
  -   * @param jxpContext
  -   */
  -  protected void bindPhases( SchematronSchema schema, JXPathContext 
jxpContext)
  -  {
  -    // ensure that mandatory elements which are not found
  -    // will result in Exception
  -    jxpContext.setLenient(false);
  -
  -    // schema phases
  -    int phaseCount = ((Integer) jxpContext.getValue ( 
"count(/schema/phase)", Integer.class )).intValue();
  -    logger.debug( "\nNumber of phases:  " + phaseCount);
  -
  -    for (int i = 1; i <= phaseCount; i++)
  -    {
  -      logger.debug( "phase# :  " + i);
  -      Phase phase = new Phase();
  -      String phprefix = "/schema/phase[" + i + "]";
  -
  -      String id = (String) jxpContext.getValue ( phprefix + "/@id", 
String.class );
  -      phase.setId( id );
  -      logger.debug( "phase id :  " + phase.getId());
  -
  -      bindPhaseActivePatterns( phase, phprefix, jxpContext );
  -
  -      schema.addPhase( phase );
  -    }
  -  }
  -
  -
  -  protected void bindPhaseActivePatterns( Phase phase, String pathPrefix, 
JXPathContext jxpContext)
  -  {
  -    // ensure that mandatory elements which are not found
  -    // will result in Exception
  -    jxpContext.setLenient(false);
  -
  -    // phase active patterns
  -    int elementCount = ((Integer) jxpContext.getValue ( "count(" + 
pathPrefix + "/active)", Integer.class )).intValue();
  -    logger.debug( "Number of active patterns:  " + elementCount);
  -    for (int i = 1; i <= elementCount; i++)
  -    {
  -      logger.debug( "active pattern # :  " + i);
  -      ActivePattern activePattern = new ActivePattern();
  -      String assertPrefix = pathPrefix + "/active[" + i + "]";
  -
  -      String pt = (String) jxpContext.getValue ( assertPrefix + "/@pattern", 
String.class );
  -      activePattern.setPattern( pt );
  -      logger.debug( "Phase active pattern :  " + activePattern.getPattern());
  -
  -      phase.addActive( activePattern  );
  -    }
  -  }
  -
  -
  -
  -
  -  /*
  -   * Replace all occurances of sch: with the actual Schema prefix used in 
the document
  -   *
  -   * @todo fix this implementaion. There are problems with DOM.
  -   * Returns null instead of the actual namespace prefix (e.g. "sch") as 
expected.
  -   */
  -  protected String fixns( String path )
  -  {
  -    // Ironicly, at the time I am writing this
  -    // JDK 1.4 is offering String.replaceAll(regex, str)
  -    // I don't use it however for backward compatibility
  -    StringBuffer strbuf = new StringBuffer( path );
  -    int i = 0;
  -    int j = 0;
  -    String dprefix = defaultSchemaPrefix_ + ":";
  -    int dplen = dprefix.length();
  -    while ( ( j = path.indexOf ( dprefix, i ) ) >= 0 )
  -    {
  -      strbuf.append ( path.substring ( i, j ) );
  -      strbuf.append ( schemaPrefix_ );
  -      strbuf.append ( ':' );
  -      i = j + dplen;
  -    }
  -    strbuf.append( path.substring ( i ) );
  -    return strbuf.toString ();
  -  }
  +public class SchematronFactory extends SchemaFactory {
   
  +     /**
  +      * the schema name space prefix used in the schema document
  +      */
  +     private String schemaPrefix_;
  +
  +     /**
  +      * the default schema name space prefix
  +      */
  +     private String defaultSchemaPrefix_ = "sch";
  +
  +     /*
  +      * private logger
  +      */
  +     private Logger logger = setupLogger();
  +
  +     //
  +     // Constructors
  +     //
  +
  +     /**
  +      * initialize logger
  +      */
  +     protected Logger setupLogger() {
  +             Logger logger = 
Hierarchy.getDefaultHierarchy().getLoggerFor("XmlForm");
  +             logger.setPriority(Priority.ERROR);
  +             return logger;
  +     }
  +
  +     /**
  +      * Builds a new Schema instance from
  +      * the given XML InputSource
  +      *
  +      * @param schemaSrc
  +      *        the Schema document XML InputSource
  +      */
  +     public Schema compileSchema(InputSource schemaSrc)
  +             throws InstantiationException {
  +             SchematronSchema schema = null;
  +             try {
  +
  +                     // load Schema file into a DOM document
  +                     DocumentBuilderFactory dbf = 
DocumentBuilderFactory.newInstance();
  +                     DocumentBuilder dbld = dbf.newDocumentBuilder();
  +                     Document document = dbld.parse(schemaSrc);
  +
  +                     schema = buildSchema(document);
  +
  +             } catch (Exception e) {
  +                     logger.error("!!! Failed loading Schematron schema", e);
  +                     throw new CascadingRuntimeException(
  +                             " !!! Failed loading Schematron schema",
  +                             e);
  +             }
  +             return schema;
  +     } // build
  +
  +     /**
  +      * Build Schematron schema object from a DOM document
  +      * @param doc DOM document containing the schema
  +      *
  +      */
  +     protected SchematronSchema buildSchema(Document doc) {
  +             SchematronSchema schema = new SchematronSchema();
  +             boolean errors = false;
  +
  +             doc.getNamespaceURI();
  +             doc.getPrefix();
  +
  +             // Initialize the JXPath context
  +             Element root = doc.createElement("root");
  +             Element schemaElement = doc.getDocumentElement();
  +             schemaPrefix_ = schemaElement.getPrefix();
  +             root.appendChild(schemaElement);
  +             JXPathContext jxpContext = JXPathContext.newContext(root);
  +             jxpContext.setLenient(false);
  +
  +             // Bind sch:schema element
  +
  +             // schema title
  +             String title =
  +                     (String) jxpContext.getValue("/schema/title", 
String.class);
  +             schema.setTitle(title);
  +             logger.debug("Schema title: " + schema.getTitle());
  +
  +             bindPatterns(schema, jxpContext);
  +             bindPhases(schema, jxpContext);
  +
  +             return schema;
  +     }
  +
  +     /**
  +      * populates the patterns elements from the dom tree
  +      *
  +      * @param schema the schema instance
  +      * @param jxpContext
  +      */
  +     protected void bindPatterns(
  +             SchematronSchema schema,
  +             JXPathContext jxpContext) {
  +             // ensure that mandatory elements which are not found
  +             // will result in Exception
  +             jxpContext.setLenient(false);
  +
  +             // schema patterns
  +             int ptCount =
  +                     ((Integer) jxpContext
  +                             .getValue("count(/schema/pattern)", 
Integer.class))
  +                             .intValue();
  +             logger.debug("\nNumber of patterns:  " + ptCount);
  +             for (int i = 1; i <= ptCount; i++) {
  +                     logger.debug("Pattern# :  " + i);
  +                     Pattern pattern = new Pattern();
  +                     String ptprefix = "/schema/pattern[" + i + "]";
  +
  +                     String name =
  +                             (String) jxpContext.getValue(ptprefix + 
"/@name", String.class);
  +                     pattern.setName(name);
  +                     logger.debug("Pattern name :  " + pattern.getName());
  +
  +                     String id =
  +                             (String) jxpContext.getValue(ptprefix + "/@id", 
String.class);
  +                     pattern.setId(id);
  +                     logger.debug("Pattern id :  " + pattern.getId());
  +
  +                     bindRules(pattern, ptprefix, jxpContext);
  +
  +                     schema.addPattern(pattern);
  +             }
  +     }
  +
  +     /**
  +      * populates the rules elements for a pattern
  +      * from the dom tree
  +      *
  +      * @param pattern
  +      * @param pathPrefix pattern path prefix
  +      * @param jxpContext JXPathContext
  +      */
  +     protected void bindRules(
  +             Pattern pattern,
  +             String pathPrefix,
  +             JXPathContext jxpContext) {
  +             // ensure that mandatory elements which are not found
  +             // will result in Exception
  +             jxpContext.setLenient(false);
  +
  +             // schema rules
  +             int ruleCount =
  +                     ((Integer) jxpContext
  +                             .getValue("count(" + pathPrefix + "/rule)", 
Integer.class))
  +                             .intValue();
  +             logger.debug("\nNumber of rules:  " + ruleCount);
  +             for (int i = 1; i <= ruleCount; i++) {
  +                     logger.debug("Rule# :  " + i);
  +                     Rule rule = new Rule();
  +                     String rulePrefix = pathPrefix + "/rule[" + i + "]";
  +
  +                     String context =
  +                             (String) jxpContext.getValue(
  +                                     rulePrefix + "/@context",
  +                                     String.class);
  +                     rule.setContext(context);
  +                     logger.debug("Rule context :  " + rule.getContext());
  +
  +                     bindAsserts(rule, rulePrefix, jxpContext);
  +
  +                     // Patch to make reports work in schematron
  +                     // Note change to name of bindRerports [sic] function
  +                     bindReports(rule, rulePrefix, jxpContext);
  +
  +                     pattern.addRule(rule);
  +             }
  +     }
  +
  +     /**
  +      * populates the assert elements for a rule
  +      * from the dom tree
  +      *
  +      * @param rule
  +      * @param pathPrefix rule path prefix
  +      * @param jxpContext JXPathContext
  +      */
  +     protected void bindAsserts(
  +             Rule rule,
  +             String pathPrefix,
  +             JXPathContext jxpContext) {
  +             // ensure that mandatory elements which are not found
  +             // will result in Exception
  +             jxpContext.setLenient(false);
  +
  +             // schema reports
  +             int elementCount =
  +                     ((Integer) jxpContext
  +                             .getValue("count(" + pathPrefix + "/assert)", 
Integer.class))
  +                             .intValue();
  +             logger.debug("\nNumber of asserts:  " + elementCount);
  +             for (int i = 1; i <= elementCount; i++) {
  +                     logger.debug("Assert# :  " + i);
  +                     Assert assertion = new Assert();
  +                     String assertPrefix = pathPrefix + "/assert[" + i + "]";
  +
  +                     String test =
  +                             (String) jxpContext.getValue(
  +                                     assertPrefix + "/@test",
  +                                     String.class);
  +                     assertion.setTest(test);
  +                     logger.debug("Assert test :  " + assertion.getTest());
  +
  +                     // since diagnostics is a non-mandatory element
  +                     // we will try to get its value in a lenient mode
  +                     jxpContext.setLenient(true);
  +                     String diagnostics =
  +                             (String) jxpContext.getValue(
  +                                     assertPrefix + "/@diagnostics",
  +                                     String.class);
  +                     assertion.setDiagnostics(diagnostics);
  +                     logger.debug("Assert diagnostics :  " + 
assertion.getDiagnostics());
  +                     jxpContext.setLenient(false);
  +
  +                     // now read the report message
  +                     // @todo: The current implementation does not 
  +                     // read xml tags used within the assert message.
  +                     // Solution is to use JXPath NodePointer to get 
  +                     // to the DOM node and then convert it to a String.
  +                     // e.g.
  +                     // NodePointer nptr = (NodePointer) 
jxpContext.locateValue( assertPrefix );
  +                     // Node msgNode = (Node) nptr.getNodeValue();
  +                     // convery DOMNode to String
  +
  +                     String message =
  +                             (String) jxpContext.getValue(assertPrefix, 
String.class);
  +                     assertion.setMessage(message);
  +                     logger.debug("Assert message :  " + 
assertion.getMessage());
  +
  +                     rule.addAssert(assertion);
  +             }
  +     }
  +
  +     /**
  +      * populates the report elements for a rule
  +      * from the dom tree
  +      *
  +      * @param rule
  +      * @param pathPrefix rule path prefix
  +      * @param jxpContext JXPathContext
  +      */
  +
  +     protected void bindReports(
  +             Rule rule,
  +             String pathPrefix,
  +             JXPathContext jxpContext) {
  +             // ensure that mandatory elements which are not found
  +             // will result in Exception
  +             jxpContext.setLenient(false);
  +
  +             // schema reports
  +             int elementCount =
  +                     ((Integer) jxpContext
  +                             .getValue("count(" + pathPrefix + "/report)", 
Integer.class))
  +                             .intValue();
  +             logger.debug("\nNumber of reports:  " + elementCount);
  +             for (int i = 1; i <= elementCount; i++) {
  +                     logger.debug("Report# :  " + i);
  +                     Report report = new Report();
  +                     String assertPrefix = pathPrefix + "/report[" + i + "]";
  +
  +                     String test =
  +                             (String) jxpContext.getValue(
  +                                     assertPrefix + "/@test",
  +                                     String.class);
  +                     report.setTest(test);
  +                     logger.debug("Report test :  " + report.getTest());
  +
  +                     // since diagnostics is a non-mandatory element
  +                     // we will try to get its value in a lenient mode
  +                     jxpContext.setLenient(true);
  +                     String diagnostics =
  +                             (String) jxpContext.getValue(
  +                                     assertPrefix + "/@diagnostics",
  +                                     String.class);
  +                     report.setDiagnostics(diagnostics);
  +                     logger.debug("Report diagnostics :  " + 
report.getDiagnostics());
  +                     jxpContext.setLenient(false);
  +
  +                     String message =
  +                             (String) jxpContext.getValue(assertPrefix, 
String.class);
  +                     report.setMessage(message);
  +                     logger.debug("Report message :  " + 
report.getMessage());
  +
  +                     rule.addReport(report);
  +             }
  +     }
  +
  +     /**
  +      * populates the phases elements from the dom tree
  +      *
  +      * @param schema the schema instance
  +      * @param jxpContext
  +      */
  +     protected void bindPhases(
  +             SchematronSchema schema,
  +             JXPathContext jxpContext) {
  +             // ensure that mandatory elements which are not found
  +             // will result in Exception
  +             jxpContext.setLenient(false);
  +
  +             // schema phases
  +             int phaseCount =
  +                     ((Integer) jxpContext
  +                             .getValue("count(/schema/phase)", 
Integer.class))
  +                             .intValue();
  +             logger.debug("\nNumber of phases:  " + phaseCount);
  +
  +             for (int i = 1; i <= phaseCount; i++) {
  +                     logger.debug("phase# :  " + i);
  +                     Phase phase = new Phase();
  +                     String phprefix = "/schema/phase[" + i + "]";
  +
  +                     String id =
  +                             (String) jxpContext.getValue(phprefix + "/@id", 
String.class);
  +                     phase.setId(id);
  +                     logger.debug("phase id :  " + phase.getId());
  +
  +                     bindPhaseActivePatterns(phase, phprefix, jxpContext);
  +
  +                     schema.addPhase(phase);
  +             }
  +     }
  +
  +     protected void bindPhaseActivePatterns(
  +             Phase phase,
  +             String pathPrefix,
  +             JXPathContext jxpContext) {
  +             // ensure that mandatory elements which are not found
  +             // will result in Exception
  +             jxpContext.setLenient(false);
  +
  +             // phase active patterns
  +             int elementCount =
  +                     ((Integer) jxpContext
  +                             .getValue("count(" + pathPrefix + "/active)", 
Integer.class))
  +                             .intValue();
  +             logger.debug("Number of active patterns:  " + elementCount);
  +             for (int i = 1; i <= elementCount; i++) {
  +                     logger.debug("active pattern # :  " + i);
  +                     ActivePattern activePattern = new ActivePattern();
  +                     String assertPrefix = pathPrefix + "/active[" + i + "]";
  +
  +                     String pt =
  +                             (String) jxpContext.getValue(
  +                                     assertPrefix + "/@pattern",
  +                                     String.class);
  +                     activePattern.setPattern(pt);
  +                     logger.debug(
  +                             "Phase active pattern :  " + 
activePattern.getPattern());
  +
  +                     phase.addActive(activePattern);
  +             }
  +     }
  +
  +     /*
  +      * Replace all occurances of sch: with the actual Schema prefix used in 
the document
  +      *
  +      * @todo fix this implementaion. There are problems with DOM.
  +      * Returns null instead of the actual namespace prefix (e.g. "sch") as 
expected.
  +      */
  +     protected String fixns(String path) {
  +             // Ironicly, at the time I am writing this
  +             // JDK 1.4 is offering String.replaceAll(regex, str)
  +             // I don't use it however for backward compatibility
  +             StringBuffer strbuf = new StringBuffer(path);
  +             int i = 0;
  +             int j = 0;
  +             String dprefix = defaultSchemaPrefix_ + ":";
  +             int dplen = dprefix.length();
  +             while ((j = path.indexOf(dprefix, i)) >= 0) {
  +                     strbuf.append(path.substring(i, j));
  +                     strbuf.append(schemaPrefix_);
  +                     strbuf.append(':');
  +                     i = j + dplen;
  +             }
  +             strbuf.append(path.substring(i));
  +             return strbuf.toString();
  +     }
   
   }
  -
  
  
  
  1.4       +17 -21    
xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/ActivePattern.java
  
  Index: ActivePattern.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/validation/schematron/ActivePattern.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ActivePattern.java        15 Jan 2003 11:52:32 -0000      1.3
  +++ ActivePattern.java        15 Jan 2003 13:17:40 -0000      1.4
  @@ -56,26 +56,22 @@
    *
    * @author  Ivelin Ivanov, [EMAIL PROTECTED], [EMAIL PROTECTED]
    */
  -public class ActivePattern
  -{
  -  
  -  private String pattern_;
  -  
  +public class ActivePattern {
  +
  +     private String pattern_;
  +
  +     /**
  +      * Returns the active pattern name
  +      */
  +     public String getPattern() {
  +             return pattern_;
  +     }
  +
  +     /**
  +      * Sets the active pattern name
  +      */
  +     public void setPattern(String pattern) {
  +             pattern_ = pattern;
  +     }
   
  -  /**
  -   * Returns the active pattern name
  -   */
  -  public String getPattern()
  -  {
  -    return pattern_;
  -  }
  -  
  -  /**
  -   * Sets the active pattern name
  -   */
  -  public void setPattern( String pattern )
  -  {
  -    pattern_ = pattern;
  -  }
  -  
   }
  
  
  
  1.13      +774 -871  
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.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- Form.java 27 Oct 2002 07:23:18 -0000      1.12
  +++ Form.java 15 Jan 2003 13:17:41 -0000      1.13
  @@ -1,65 +1,53 @@
  -/* 
  - * $Header$
  - * $Revision$
  - * $Date$
  - *
  - * ====================================================================
  - * The Apache Software License, Version 1.1
  - *  
  - * 
  - * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  - * reserved.
  - *
  - * Redistribution and use in source and binary forms, with or without
  - * modification, are permitted provided that the following conditions
  - * are met:
  - *
  - * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer.
  - *
  - * 2. Redistributions in binary form must reproduce the above copyright
  - *    notice, this list of conditions and the following disclaimer in
  - *    the documentation and/or other materials provided with the
  - *    distribution.
  - *
  - * 3. The end-user documentation included with the redistribution, if
  - *    any, must include the following acknowlegement:
  - *       "This product includes software developed by the
  - *        Apache Software Foundation (http://www.apache.org/)."
  - *    Alternately, this acknowlegement may appear in the software itself,
  - *    if and wherever such third-party acknowlegements normally appear.
  - *
  - * 4. The names "The Jakarta Project", "Commons", and "Apache Software
  - *    Foundation" must not be used to endorse or promote products derived
  - *    from this software without prior written permission. For written
  - *    permission, please contact [EMAIL PROTECTED]
  - *
  - * 5. Products derived from this software may not be called "Apache"
  - *    nor may "Apache" appear in their names without prior written
  - *    permission of the Apache Group.
  - *
  - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  - * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  - * SUCH DAMAGE.
  - * ====================================================================
  - *
  - * This software consists of voluntary contributions made by many
  - * individuals on behalf of the Apache Software Foundation and was
  - * originally based on software copyright (c) 2001, Plotnix, Inc,
  - * <http://www.plotnix.com/>.
  - * For more information on the Apache Software Foundation, please see
  - * <http://www.apache.org/>.
  - */
  +/*
  +
  + ============================================================================
  +                   The Apache Software License, Version 1.1
  + ============================================================================
  +
  + Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.
  +
  + Redistribution and use in source and binary forms, with or without modifica-
  + tion, are permitted provided that the following conditions are met:
  +
  + 1. Redistributions of  source code must  retain the above copyright  notice,
  +    this list of conditions and the following disclaimer.
  +
  + 2. Redistributions in binary form must reproduce the above copyright notice,
  +    this list of conditions and the following disclaimer in the documentation
  +    and/or other materials provided with the distribution.
  +
  + 3. The end-user documentation included with the redistribution, if any, must
  +    include  the following  acknowledgment:  "This product includes  software
  +    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
  +    Alternately, this  acknowledgment may  appear in the software itself,  if
  +    and wherever such third-party acknowledgments normally appear.
  +
  + 4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
  +    used to  endorse or promote  products derived from  this software without
  +    prior written permission. For written permission, please contact
  +    [EMAIL PROTECTED]
  +
  + 5. Products  derived from this software may not  be called "Apache", nor may
  +    "Apache" appear  in their name,  without prior written permission  of the
  +    Apache Software Foundation.
  +
  + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  + FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
  + APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
  + INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
  + DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
  + OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
  + ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
  + (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
  + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  +
  + This software  consists of voluntary contributions made  by many individuals
  + on  behalf of the Apache Software  Foundation and was  originally created by
  + Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
  + Software Foundation, please see <http://www.apache.org/>.
   
  +*/
   package org.apache.cocoon.components.xmlform;
   
   import java.util.ArrayList;
  @@ -103,815 +91,730 @@
    * @version $Revision$ $Date$
    */
   
  -public class Form
  -{
  +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 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);
  -  }
  -
  -  
  -  public void setValue(String xpath, Object[] values) 
  -  {
  -
  -//    // 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] );
  -    }
  -  }
  -
  -  
  -  /**
  -   * 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" );
  -    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();
  -      }
  -    }
  -    return property;
  -  }
  -  
  -  
  -  /**
  -   * Resolves a nodeset selector
  -   * into a list of concrete node locations
  -   * @param xpath the nodeset selector
  -   *
  -   * @return a Set of XPath strings pointing to 
  -   * each nodeset satisfying the nodeset selector
  -   * 
  -   * @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();
  -    Iterator iter = jxcontext_.iteratePointers( xpathSelector );
  -    while ( iter.hasNext() )
  -    {
  -      Pointer nextPointer = (Pointer) iter.next();
  -      nodeset.add ( nextPointer.asPath() );
  -    }
  -    return nodeset;
  -  }
  -
  -
  -  
  -  /**
  -   * Performs complete validation
  -   * of the form model
  -   */
  -  public boolean validate()
  -  {
  -    return validate( null );
  -  }
  -  
  -  
  -  /**
  -   *
  -   * @param 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 ( violations_ != null)
  -    {
  -      violations_.addAll( vs );
  -    }
  -    else
  -    {
  -      if ( vs != null && !vs.isEmpty () ) violations_ = vs;
  -    }
  -      
  -    if (violations_ == null) return true;
  -    else 
  -    {
  -      updateViolationsAsSortedSet();
  -      return false;
  -    }
  -  }
  -
  -
  -  
  -  /**
  -   * <p>
  -   *  Populates an HTML Form POST into the XMLForm model (JavaBean or DOM 
node).
  -   *
  -   *  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
  -   *
  -   *
  -   *  @todo provide a more sophisticated examples with checkboxes, multi 
choice,
  -   *  radio button, text area, file upload, etc.
  -   * </p>
  -   */
  -    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( message );
  -              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 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 )
  -    {
  -      Request request = getRequest( sitemapObjectModel );
  -      return (String) getRequest( sitemapObjectModel ).getParameter ( 
Form.FORM_VIEW_PARAM );
  -    }
  -    
  -    
  -  /**
  -   *
  -   * This method is called before 
  -   * the form is populated with request parameters.
  -   *
  -   * Semanticly 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 objectMap
  -   * @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 objectMap
  -   * @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 objectMap 
  -   * @param isSessionScope 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( viewName );
  -        viewStateMap_.put( viewName, formViewState );
  -      }
  -    return formViewState;
  -  }
  -  
  -    
  -  
  -  
  -  /**
  -   * Internal class used for keeping state information
  -   * during the life cycle of a form.
  -   * 
  -   * Used only for session scoped forms
  -   * 
  -   */
  -  class FormViewState 
  -  {
  -    
  -    
  -    FormViewState( String viewName )
  -    {
  -      viewName_ = viewName;
  -    }
  -    
  -    /**
  -     * 
  -     * @return Map of (String modelPropertyReference, String inputType) 
pairs 
  -     * 
  -     */
  -    Map getModelReferenceMap()
  -    {
  -      return modelReferences_;
  -    }
  -    
  -    void addModelReferenceAndInputType( String modelPropertyReference, 
String inputType)
  -    {
  -      modelReferences_.put( modelPropertyReference, inputType );
  -    }
  -    
  -    void clear()
  -    {
  -      modelReferences_.clear();
  -    }
  -
  -    private Map modelReferences_ = new HashMap();
  -    
  -    private String viewName_;
  -    
  -  }
  -    
  -  
  -  /** the set of violations the model commited during validation */
  -  private List violations_ = null;  
  -  
  -  /** another view of the violations_ collection */
  -  private SortedSet violationsAsSortedSet_ = null;
  -  
  -  /** flag allowing control over automatic validation on populate() */
  -  private boolean autoValidateEnabled_ = true;
  -  
  -  /** The data model this form encapsulates */
  -  private Object model_ = null;
  -  
  -  /** 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
  -   *
  -   * @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();
  -  
  -}
  +     public static String FORM_VIEW_PARAM = "cocoon-xmlform-view";
  +
  +     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);
  +     }
  +
  +     public void setValue(String xpath, Object[] values) {
  +
  +             //    // 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]);
  +             }
  +     }
  +
  +     /**
  +      * 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");
  +             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();
  +                     }
  +             }
  +             return property;
  +     }
  +
  +     /**
  +      * Resolves a nodeset selector
  +      * into a list of concrete node locations
  +      * @param xpath the nodeset selector
  +      *
  +      * @return a Set of XPath strings pointing to 
  +      * each nodeset satisfying the nodeset selector
  +      * 
  +      * @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();
  +             Iterator iter = jxcontext_.iteratePointers(xpathSelector);
  +             while (iter.hasNext()) {
  +                     Pointer nextPointer = (Pointer) iter.next();
  +                     nodeset.add(nextPointer.asPath());
  +             }
  +             return nodeset;
  +     }
  +
  +     /**
  +      * Performs complete validation
  +      * of the form model
  +      */
  +     public boolean validate() {
  +             return validate(null);
  +     }
  +
  +     /**
  +      *
  +      * @param 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 (violations_ != null) {
  +                     violations_.addAll(vs);
  +             } else {
  +                     if (vs != null && !vs.isEmpty())
  +                             violations_ = vs;
  +             }
  +
  +             if (violations_ == null)
  +                     return true;
  +             else {
  +                     updateViolationsAsSortedSet();
  +                     return false;
  +             }
  +     }
  +
  +     /**
  +      * <p>
  +      *  Populates an HTML Form POST into the XMLForm model (JavaBean or DOM 
node).
  +      *
  +      *  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
  +      *
  +      *
  +      *  @todo provide a more sophisticated examples with checkboxes, multi 
choice,
  +      *  radio button, text area, file upload, etc.
  +      * </p>
  +      */
  +     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(message);
  +                             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 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) {
  +             Request request = getRequest(sitemapObjectModel);
  +             return (String) getRequest(sitemapObjectModel).getParameter(
  +                     Form.FORM_VIEW_PARAM);
  +     }
  +
  +     /**
  +      *
  +      * This method is called before 
  +      * the form is populated with request parameters.
  +      *
  +      * Semanticly 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 objectMap
  +      * @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 objectMap
  +      * @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 objectMap 
  +      * @param isSessionScope 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(viewName);
  +                     viewStateMap_.put(viewName, formViewState);
  +             }
  +             return formViewState;
  +     }
  +
  +     /**
  +      * Internal class used for keeping state information
  +      * during the life cycle of a form.
  +      * 
  +      * Used only for session scoped forms
  +      * 
  +      */
  +     class FormViewState {
  +
  +             FormViewState(String viewName) {
  +                     viewName_ = viewName;
  +             }
  +
  +             /**
  +              * 
  +              * @return Map of (String modelPropertyReference, String 
inputType) pairs 
  +              * 
  +              */
  +             Map getModelReferenceMap() {
  +                     return modelReferences_;
  +             }
  +
  +             void addModelReferenceAndInputType(
  +                     String modelPropertyReference,
  +                     String inputType) {
  +                     modelReferences_.put(modelPropertyReference, inputType);
  +             }
  +
  +             void clear() {
  +                     modelReferences_.clear();
  +             }
  +
  +             private Map modelReferences_ = new HashMap();
  +
  +             private String viewName_;
  +
  +     }
  +
  +     /** the set of violations the model commited during validation */
  +     private List violations_ = null;
  +
  +     /** another view of the violations_ collection */
  +     private SortedSet violationsAsSortedSet_ = null;
  +
  +     /** flag allowing control over automatic validation on populate() */
  +     private boolean autoValidateEnabled_ = true;
  +
  +     /** The data model this form encapsulates */
  +     private Object model_ = null;
  +
  +     /** 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
  +      *
  +      * @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();
   
  +}
  
  
  
  1.2       +73 -86    
xml-cocoon2/src/java/org/apache/cocoon/components/xmlform/FormListener.java
  
  Index: FormListener.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/xmlform/FormListener.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FormListener.java 20 May 2002 07:19:25 -0000      1.1
  +++ FormListener.java 15 Jan 2003 13:17:41 -0000      1.2
  @@ -1,65 +1,53 @@
  -/* 
  - * $Header$
  - * $Revision$
  - * $Date$
  - *
  - * ====================================================================
  - * The Apache Software License, Version 1.1
  - *
  - *
  - * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  - * reserved.
  - *
  - * Redistribution and use in source and binary forms, with or without
  - * modification, are permitted provided that the following conditions
  - * are met:
  - *
  - * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer.
  - *
  - * 2. Redistributions in binary form must reproduce the above copyright
  - *    notice, this list of conditions and the following disclaimer in
  - *    the documentation and/or other materials provided with the
  - *    distribution.
  - *
  - * 3. The end-user documentation included with the redistribution, if
  - *    any, must include the following acknowlegement:
  - *       "This product includes software developed by the
  - *        Apache Software Foundation (http://www.apache.org/)."
  - *    Alternately, this acknowlegement may appear in the software itself,
  - *    if and wherever such third-party acknowlegements normally appear.
  - *
  - * 4. The names "The Jakarta Project", "Commons", and "Apache Software
  - *    Foundation" must not be used to endorse or promote products derived
  - *    from this software without prior written permission. For written
  - *    permission, please contact [EMAIL PROTECTED]
  - *
  - * 5. Products derived from this software may not be called "Apache"
  - *    nor may "Apache" appear in their names without prior written
  - *    permission of the Apache Group.
  - *
  - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  - * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  - * SUCH DAMAGE.
  - * ====================================================================
  - *
  - * This software consists of voluntary contributions made by many
  - * individuals on behalf of the Apache Software Foundation and was
  - * originally based on software copyright (c) 2001, Plotnix, Inc,
  - * <http://www.plotnix.com/>.
  - * For more information on the Apache Software Foundation, please see
  - * <http://www.apache.org/>.
  - */
  +/*
  +
  + ============================================================================
  +                   The Apache Software License, Version 1.1
  + ============================================================================
  +
  + Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.
  +
  + Redistribution and use in source and binary forms, with or without modifica-
  + tion, are permitted provided that the following conditions are met:
  +
  + 1. Redistributions of  source code must  retain the above copyright  notice,
  +    this list of conditions and the following disclaimer.
  +
  + 2. Redistributions in binary form must reproduce the above copyright notice,
  +    this list of conditions and the following disclaimer in the documentation
  +    and/or other materials provided with the distribution.
  +
  + 3. The end-user documentation included with the redistribution, if any, must
  +    include  the following  acknowledgment:  "This product includes  software
  +    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
  +    Alternately, this  acknowledgment may  appear in the software itself,  if
  +    and wherever such third-party acknowledgments normally appear.
  +
  + 4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
  +    used to  endorse or promote  products derived from  this software without
  +    prior written permission. For written permission, please contact
  +    [EMAIL PROTECTED]
  +
  + 5. Products  derived from this software may not  be called "Apache", nor may
  +    "Apache" appear  in their name,  without prior written permission  of the
  +    Apache Software Foundation.
  +
  + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  + FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
  + APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
  + INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
  + DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
  + OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
  + ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
  + (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
  + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  +
  + This software  consists of voluntary contributions made  by many individuals
  + on  behalf of the Apache Software  Foundation and was  originally created by
  + Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
  + Software Foundation, please see <http://www.apache.org/>.
   
  +*/
   package org.apache.cocoon.components.xmlform;
   
   /**
  @@ -73,31 +61,30 @@
    * @version $Revision$ $Date$
    */
   
  -public interface FormListener
  -{
  +public interface FormListener {
   
  -  /**
  -   * This method is called before 
  -   * the form is populated with request parameters.
  -   *
  -   * Semanticly 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.
  -   *
  -   * This method does nothing by default
  -   * Subclasses should override it to implement custom logic
  -   *
  -   */  
  -  public void reset( Form form );
  -
  -  /**
  -   * filters custom request parameter
  -   * not refering to the model
  -   */
  -  public boolean filterRequestParameter( Form form, String parameterName );
  +    /**
  +     * This method is called before 
  +     * the form is populated with request parameters.
  +     *
  +     * Semanticly 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.
  +     *
  +     * This method does nothing by default
  +     * Subclasses should override it to implement custom logic
  +     *
  +     */
  +    void reset(Form form);
  +    
  +    /**
  +     * filters custom request parameter
  +     * not refering to the model
  +     */
  +    boolean filterRequestParameter(Form form, String parameterName);
   
   }
   
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to