You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by br...@apache.org on 2003/05/14 15:19:26 UTC

cvs commit: cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype DefaultDatatypeManager.java

bruno       2003/05/14 06:19:26

  Modified:    src/blocks/woody/conf woody.xconf
               src/blocks/woody/java/org/apache/cocoon/woody/datatype
                        DefaultDatatypeManager.java
  Log:
  Made datatypes and validation-rules configurable
  
  Revision  Changes    Path
  1.2       +18 -1     cocoon-2.1/src/blocks/woody/conf/woody.xconf
  
  Index: woody.xconf
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/conf/woody.xconf,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- woody.xconf	14 May 2003 12:53:01 -0000	1.1
  +++ woody.xconf	14 May 2003 13:19:26 -0000	1.2
  @@ -1,6 +1,6 @@
   <?xml version="1.0"?>
   
  -<xconf xpath="/cocoon" unless="woody">
  +<xconf xpath="/cocoon" unless="woody-formmanager">
     <!--
        | Woody's FormManager component
        |-->
  @@ -13,4 +13,21 @@
         <widget name="button" factory="org.apache.cocoon.woody.formmodel.ButtonDefinitionBuilder"/>
       </widgets>
     </woody-formmanager>
  +
  +  <!--
  +     | Woody's datatypes and validation rules.
  +     |-->
  +  <woody-datatype>
  +    <datatypes>
  +      <datatype name="string" factory="org.apache.cocoon.woody.datatype.typeimpl.StringTypeBuilder"/>
  +      <datatype name="long" factory="org.apache.cocoon.woody.datatype.typeimpl.LongTypeBuilder"/>
  +    </datatypes>
  +    <validation-rules>
  +      <validation-rule name="length" factory="org.apache.cocoon.woody.datatype.validationruleimpl.LengthValidationRuleBuilder"/>
  +      <validation-rule name="email" factory="org.apache.cocoon.woody.datatype.validationruleimpl.EmailValidationRuleBuilder"/>
  +      <validation-rule name="value-count" factory="org.apache.cocoon.woody.datatype.validationruleimpl.ValueCountValidationRuleBuilder"/>
  +      <validation-rule name="range" factory="org.apache.cocoon.woody.datatype.validationruleimpl.RangeValidationRuleBuilder"/>
  +      <validation-rule name="assert" factory="org.apache.cocoon.woody.datatype.validationruleimpl.AssertValidationRuleBuilder"/>
  +    </validation-rules>
  +  </woody-datatype>
   </xconf>
  
  
  
  1.2       +54 -43    cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/DefaultDatatypeManager.java
  
  Index: DefaultDatatypeManager.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/DefaultDatatypeManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultDatatypeManager.java	22 Apr 2003 12:04:18 -0000	1.1
  +++ DefaultDatatypeManager.java	14 May 2003 13:19:26 -0000	1.2
  @@ -50,14 +50,14 @@
   */
   package org.apache.cocoon.woody.datatype;
   
  -import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.thread.ThreadSafe;
   import org.apache.avalon.framework.component.Composable;
   import org.apache.avalon.framework.component.ComponentManager;
   import org.apache.avalon.framework.component.ComponentException;
  -import org.apache.cocoon.woody.datatype.typeimpl.StringTypeBuilder;
  -import org.apache.cocoon.woody.datatype.typeimpl.LongTypeBuilder;
  -import org.apache.cocoon.woody.datatype.validationruleimpl.*;
  +import org.apache.avalon.framework.configuration.Configurable;
  +import org.apache.avalon.framework.configuration.Configuration;
  +import org.apache.avalon.framework.configuration.ConfigurationException;
  +import org.apache.avalon.framework.logger.AbstractLogEnabled;
   import org.apache.cocoon.woody.util.DomHelper;
   import org.apache.cocoon.components.LifecycleHelper;
   import org.w3c.dom.Element;
  @@ -74,50 +74,61 @@
    * become externally configurable in the future.
    *
    */
  -public class DefaultDatatypeManager implements DatatypeManager, Initializable, ThreadSafe, Composable {
  +public class DefaultDatatypeManager extends AbstractLogEnabled implements DatatypeManager, ThreadSafe, Composable, Configurable {
       private Map typeBuilderMap = new HashMap();
       private Map validationRuleBuilderMap = new HashMap();
       private ComponentManager componentManager;
   
  -    public void initialize() throws Exception {
  +    public void configure(Configuration configuration) throws ConfigurationException {
           LifecycleHelper lifecycleHelper = new LifecycleHelper(null, null, componentManager, null, null, null);
   
  -        // TODO all the stuff below should come from a configuration file, so that this is extensible
  -
  -        // Setup the type builders
  -        Object typeBuilder;
  -
  -        typeBuilder = new StringTypeBuilder();
  -        lifecycleHelper.setupComponent(typeBuilder);
  -        typeBuilderMap.put("string", typeBuilder);
  -
  -        typeBuilder = new LongTypeBuilder();
  -        lifecycleHelper.setupComponent(typeBuilder);
  -        typeBuilderMap.put("long", typeBuilder);
  -
  -
  -        // Setup the validation rule builders
  -        Object validationRuleBuilder;
  -
  -        validationRuleBuilder = new LengthValidationRuleBuilder();
  -        lifecycleHelper.setupComponent(validationRuleBuilder);
  -        validationRuleBuilderMap.put("length", validationRuleBuilder);
  -
  -        validationRuleBuilder = new EmailValidationRuleBuilder();
  -        lifecycleHelper.setupComponent(validationRuleBuilder);
  -        validationRuleBuilderMap.put("email", validationRuleBuilder);
  -
  -        validationRuleBuilder = new ValueCountValidationRuleBuilder();
  -        lifecycleHelper.setupComponent(validationRuleBuilder);
  -        validationRuleBuilderMap.put("value-count", validationRuleBuilder);
  -
  -        validationRuleBuilder = new RangeValidationRuleBuilder();
  -        lifecycleHelper.setupComponent(validationRuleBuilder);
  -        validationRuleBuilderMap.put("range", validationRuleBuilder);
  -
  -        validationRuleBuilder = new AssertValidationRuleBuilder();
  -        lifecycleHelper.setupComponent(validationRuleBuilder);
  -        validationRuleBuilderMap.put("assert", validationRuleBuilder);
  +        // read available datatypes from configuration
  +        Configuration[] datatypeConfs = configuration.getChild("datatypes").getChildren("datatype");
  +        if (datatypeConfs.length == 0)
  +            getLogger().warn("No Woody datatypes found in DatatypeManager configuration.");
  +
  +        for (int i = 0; i < datatypeConfs.length; i++) {
  +            String name = datatypeConfs[i].getAttribute("name");
  +            String factoryClassName = datatypeConfs[i].getAttribute("factory");
  +            Class clazz;
  +            try {
  +                clazz = Class.forName(factoryClassName);
  +            } catch (Exception e) {
  +                throw new ConfigurationException("Could not load class \"" + factoryClassName + "\" specified at " + datatypeConfs[i].getLocation(), e);
  +            }
  +            DatatypeBuilder datatypeBuilder;
  +            try {
  +                datatypeBuilder = (DatatypeBuilder)clazz.newInstance();
  +                lifecycleHelper.setupComponent(datatypeBuilder);
  +            } catch (Exception e) {
  +                throw new ConfigurationException("Could not create DatatypeBuilder \"" + factoryClassName + "\"", e);
  +            }
  +            typeBuilderMap.put(name, datatypeBuilder);
  +        }
  +
  +        // read available validation rules from configuration
  +        Configuration[] validationRuleConfs = configuration.getChild("validation-rules").getChildren("validation-rule");
  +        if (validationRuleConfs.length == 0)
  +            getLogger().warn("No Woody validation rules found in DatatypeManager configuration");
  +
  +        for (int i = 0; i < validationRuleConfs.length; i++) {
  +            String name = validationRuleConfs[i].getAttribute("name");
  +            String factoryClassName = validationRuleConfs[i].getAttribute("factory");
  +            Class clazz;
  +            try {
  +                clazz = Class.forName(factoryClassName);
  +            } catch (Exception e) {
  +                throw new ConfigurationException("Could not load class \"" + factoryClassName + "\" specified at " + validationRuleConfs[i].getLocation(), e);
  +            }
  +            ValidationRuleBuilder validationRuleBuilder;
  +            try {
  +                validationRuleBuilder = (ValidationRuleBuilder)clazz.newInstance();
  +                lifecycleHelper.setupComponent(validationRuleBuilder);
  +            } catch (Exception e) {
  +                throw new ConfigurationException("Could not create ValidationRuleBuilder \"" + factoryClassName + "\"", e);
  +            }
  +            validationRuleBuilderMap.put(name, validationRuleBuilder);
  +        }
       }
   
       public void compose(ComponentManager componentManager) throws ComponentException {
  @@ -137,7 +148,7 @@
           String name  = validationRuleElement.getLocalName();
           ValidationRuleBuilder builder = (ValidationRuleBuilder)validationRuleBuilderMap.get(name);
           if (builder == null)
  -            throw new Exception("Unknown validation rule + \"" + name + "\" specified at " + DomHelper.getLocation(validationRuleElement));
  +            throw new Exception("Unknown validation rule \"" + name + "\" specified at " + DomHelper.getLocation(validationRuleElement));
           else
               return builder.build(validationRuleElement);
       }