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/07/15 16:09:26 UTC

cvs commit: cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl AbstractDatatype.java AbstractDatatypeBuilder.java LongTypeBuilder.java StringType.java StringTypeBuilder.java

bruno       2003/07/15 07:09:26

  Modified:    src/blocks/woody/java/org/apache/cocoon/woody/datatype
                        Datatype.java DatatypeBuilder.java
               src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl
                        AbstractDatatype.java AbstractDatatypeBuilder.java
                        LongTypeBuilder.java StringType.java
                        StringTypeBuilder.java
  Log:
  Various changes/cleanup to Datatype interface.
  Introduce use of Convertors.
  
  Revision  Changes    Path
  1.2       +33 -6     cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/Datatype.java
  
  Index: Datatype.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/Datatype.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Datatype.java	22 Apr 2003 12:04:18 -0000	1.1
  +++ Datatype.java	15 Jul 2003 14:09:25 -0000	1.2
  @@ -51,6 +51,7 @@
   package org.apache.cocoon.woody.datatype;
   
   import org.outerj.expression.ExpressionContext;
  +import org.apache.cocoon.woody.datatype.convertor.Convertor;
   
   import java.util.Locale;
   
  @@ -70,14 +71,23 @@
    * an array of objects. See also {@link #isArrayType}.
    */
   public interface Datatype {
  -    public Object convertFromString(String value);
  -    public Object convertFromStringLocalized(String value, Locale locale);
  -    public String convertToString(Object value);
  -    public String convertToStringLocalized(Object value, Locale locale);
  -    // TODO validate moet wellicht ook nog een context meekrijgen
  +    /**
  +     * Converts a string to an object of this datatype. Returns null if this
  +     * fails. This method uses the same {@link Convertor} as returned by the
  +     * {@link #getConvertor} method.
  +     */
  +    public Object convertFromString(String value, Locale locale);
   
       /**
  -     * Returns null if validation is successful, otherwise returns the failmessage key.
  +     * Converts an object of this datatype to a string representation.
  +     * This method uses the same {@link Convertor} as returned by the
  +     * {@link #getConvertor} method.
  +     */
  +    public String convertToString(Object value, Locale locale);
  +
  +    /**
  +     * Returns null if validation is successful, otherwise returns a
  +     * {@link ValidationError} instance.
        *
        * @param value an Object of the correct type for this datatype (see {@link #getTypeClass}, or
        * if {@link #isArrayType} returns true, an array of objects of that type.
  @@ -111,4 +121,21 @@
        * required.
        */
       public boolean isArrayType();
  +
  +    /**
  +     * Returns the convertor used by this datatype.
  +     */
  +    public Convertor getConvertor();
  +
  +    /**
  +     * Returns the "plain convertor". This is convertor that should have a locale-independent
  +     * string encoding, and guarantees perfect roundtripping. It is used if a value of this
  +     * datatype needs to be stored but not displayed to the user.
  +     */
  +    public Convertor getPlainConvertor();
  +
  +    /**
  +     * Returns the factory that built this datatype.
  +     */
  +    public DatatypeBuilder getBuilder();
   }
  
  
  
  1.2       +5 -0      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/DatatypeBuilder.java
  
  Index: DatatypeBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/DatatypeBuilder.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DatatypeBuilder.java	22 Apr 2003 12:04:18 -0000	1.1
  +++ DatatypeBuilder.java	15 Jul 2003 14:09:25 -0000	1.2
  @@ -51,6 +51,7 @@
   package org.apache.cocoon.woody.datatype;
   
   import org.w3c.dom.Element;
  +import org.apache.cocoon.woody.datatype.convertor.Convertor;
   
   /**
    * Implementations of this class build a Datatype from an XML description
  @@ -63,4 +64,8 @@
    */
   public interface DatatypeBuilder {
       public Datatype build(Element datatypeElement, boolean arrayType, DatatypeManager datatypeManager) throws Exception;
  +
  +    public Convertor getPlainConvertor();
  +
  +    public Convertor buildConvertor(Element convertorEl) throws Exception;
   }
  
  
  
  1.3       +35 -9     cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl/AbstractDatatype.java
  
  Index: AbstractDatatype.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl/AbstractDatatype.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- AbstractDatatype.java	26 Jun 2003 15:32:34 -0000	1.2
  +++ AbstractDatatype.java	15 Jul 2003 14:09:25 -0000	1.3
  @@ -51,14 +51,10 @@
   package org.apache.cocoon.woody.datatype.typeimpl;
   
   import org.outerj.expression.ExpressionContext;
  -import org.apache.cocoon.woody.datatype.Datatype;
  -import org.apache.cocoon.woody.datatype.SelectionList;
  -import org.apache.cocoon.woody.datatype.ValidationError;
  -import org.apache.cocoon.woody.datatype.ValidationRule;
  -
  -import java.util.List;
  -import java.util.ArrayList;
  -import java.util.Iterator;
  +import org.apache.cocoon.woody.datatype.*;
  +import org.apache.cocoon.woody.datatype.convertor.Convertor;
  +
  +import java.util.*;
   
   /**
    * Abstract base class for Datatype implementations. Most concreate datatypes
  @@ -68,6 +64,8 @@
       private List validationRules = new ArrayList();
       private SelectionList selectionList;
       private boolean arrayType = false;
  +    private DatatypeBuilder builder;
  +    private Convertor convertor;
   
       public ValidationError validate(Object value, ExpressionContext expressionContext) {
           Iterator validationRulesIt = validationRules.iterator();
  @@ -98,7 +96,35 @@
           return arrayType;
       }
   
  -    protected void setArrayType(boolean arrayType) {
  +    void setArrayType(boolean arrayType) {
           this.arrayType = arrayType;
  +    }
  +
  +    void setConvertor(Convertor convertor) {
  +        this.convertor = convertor;
  +    }
  +
  +    void setBuilder(DatatypeBuilder builder) {
  +        this.builder = builder;
  +    }
  +
  +    public Convertor getPlainConvertor() {
  +        return builder.getPlainConvertor();
  +    }
  +
  +    public DatatypeBuilder getBuilder() {
  +        return builder;
  +    }
  +
  +    public Convertor getConvertor() {
  +        return convertor;
  +    }
  +
  +    public Object convertFromString(String value, Locale locale) {
  +        return getConvertor().convertFromString(value, locale, null);
  +    }
  +
  +    public String convertToString(Object value, Locale locale) {
  +        return getConvertor().convertToString(value, locale, null);
       }
   }
  
  
  
  1.4       +53 -1     cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl/AbstractDatatypeBuilder.java
  
  Index: AbstractDatatypeBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl/AbstractDatatypeBuilder.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- AbstractDatatypeBuilder.java	26 Jun 2003 15:34:40 -0000	1.3
  +++ AbstractDatatypeBuilder.java	15 Jul 2003 14:09:25 -0000	1.4
  @@ -51,11 +51,18 @@
   package org.apache.cocoon.woody.datatype.typeimpl;
   
   import org.apache.cocoon.woody.datatype.*;
  +import org.apache.cocoon.woody.datatype.convertor.Convertor;
  +import org.apache.cocoon.woody.datatype.convertor.ConvertorBuilder;
   import org.apache.cocoon.woody.util.DomHelper;
  +import org.apache.cocoon.woody.util.SimpleServiceSelector;
   import org.apache.cocoon.woody.Constants;
   import org.apache.avalon.framework.component.Composable;
   import org.apache.avalon.framework.component.ComponentManager;
   import org.apache.avalon.framework.component.ComponentException;
  +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.service.ServiceException;
   import org.apache.excalibur.source.Source;
   import org.apache.excalibur.source.SourceResolver;
   import org.w3c.dom.Element;
  @@ -68,11 +75,56 @@
    * Abstract base class for datatype builders, most concrete datatype builders
    * will derive from this class.
    */
  -public abstract class AbstractDatatypeBuilder implements DatatypeBuilder, Composable {
  +public abstract class AbstractDatatypeBuilder implements DatatypeBuilder, Composable, Configurable {
       protected ComponentManager componentManager;
  +    private SimpleServiceSelector convertorBuilders;
  +    private String defaultConvertorHint;
  +    private Convertor plainConvertor;
   
       public void compose(ComponentManager componentManager) throws ComponentException {
           this.componentManager = componentManager;
  +    }
  +
  +    public void configure(Configuration configuration) throws ConfigurationException {
  +        convertorBuilders = new SimpleServiceSelector("convertor", ConvertorBuilder.class);
  +        Configuration convertorsConf = configuration.getChild("convertors");
  +        convertorBuilders.configure(convertorsConf);
  +        defaultConvertorHint = convertorsConf.getAttribute("default");
  +
  +        String plainConvertorHint = convertorsConf.getAttribute("plain");
  +        ConvertorBuilder plainConvertorBuilder;
  +        try {
  +            plainConvertorBuilder = (ConvertorBuilder)convertorBuilders.select(plainConvertorHint);
  +        } catch (ServiceException e) {
  +            throw new ConfigurationException("Convertor defined in plain attribute unavailable.", e);
  +        }
  +
  +        try {
  +            plainConvertor = plainConvertorBuilder.build(null);
  +        } catch (Exception e) {
  +            throw new ConfigurationException("Error create plain convertor.", e);
  +        }
  +    }
  +
  +    public void buildConvertor(Element datatypeEl, AbstractDatatype datatype) throws Exception {
  +        Element convertorEl = DomHelper.getChildElement(datatypeEl, Constants.WD_NS, "convertor", false);
  +        Convertor convertor = buildConvertor(convertorEl);
  +        datatype.setConvertor(convertor);
  +    }
  +
  +    public Convertor buildConvertor(Element convertorEl) throws Exception {
  +        String type = null;
  +        // convertor configuration is allowed to be null, so check that it is not null
  +        if (convertorEl != null)
  +            type = convertorEl.getAttribute("type");
  +        if (type == null || type.equals(""))
  +            type = defaultConvertorHint;
  +        ConvertorBuilder convertorBuilder = (ConvertorBuilder)convertorBuilders.select(type);
  +        return convertorBuilder.build(convertorEl);
  +    }
  +
  +    public Convertor getPlainConvertor() {
  +        return plainConvertor;
       }
   
       protected Source resolve(String src) throws ComponentException, IOException {
  
  
  
  1.2       +2 -5      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl/LongTypeBuilder.java
  
  Index: LongTypeBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl/LongTypeBuilder.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- LongTypeBuilder.java	22 Apr 2003 12:04:18 -0000	1.1
  +++ LongTypeBuilder.java	15 Jul 2003 14:09:25 -0000	1.2
  @@ -60,13 +60,10 @@
       public Datatype build(Element datatypeElement, boolean arrayType, DatatypeManager datatypeManager) throws Exception {
           LongType type = new LongType();
           type.setArrayType(arrayType);
  +        type.setBuilder(this);
   
           buildValidationRules(datatypeElement, type, datatypeManager);
  -
  -        // TODO number formatting patterns
  -
  -        // TODO default value
  -
  +        buildConvertor(datatypeElement, type);
           buildSelectionList(datatypeElement, type);
   
           return type;
  
  
  
  1.2       +0 -17     cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl/StringType.java
  
  Index: StringType.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl/StringType.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- StringType.java	22 Apr 2003 12:04:18 -0000	1.1
  +++ StringType.java	15 Jul 2003 14:09:25 -0000	1.2
  @@ -50,28 +50,11 @@
   */
   package org.apache.cocoon.woody.datatype.typeimpl;
   
  -import java.util.Locale;
  -
   /**
    * A {@link org.apache.cocoon.woody.datatype.Datatype Datatype} implementation
    * for strings.
    */
   public class StringType extends AbstractDatatype {
  -    public Object convertFromString(String value) {
  -        return value;
  -    }
  -
  -    public Object convertFromStringLocalized(String value, Locale locale) {
  -        return value;
  -    }
  -
  -    public String convertToString(Object value) {
  -        return (String)value;
  -    }
  -
  -    public String convertToStringLocalized(Object value, Locale locale) {
  -        return (String)value;
  -    }
   
       public Class getTypeClass() {
           return String.class;
  
  
  
  1.2       +2 -0      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl/StringTypeBuilder.java
  
  Index: StringTypeBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/typeimpl/StringTypeBuilder.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- StringTypeBuilder.java	22 Apr 2003 12:04:18 -0000	1.1
  +++ StringTypeBuilder.java	15 Jul 2003 14:09:25 -0000	1.2
  @@ -63,8 +63,10 @@
       public Datatype build(Element datatypeElement, boolean arrayType, DatatypeManager datatypeManager) throws Exception {
           StringType type = new StringType();
           type.setArrayType(arrayType);
  +        type.setBuilder(this);
   
           buildValidationRules(datatypeElement, type, datatypeManager);
  +        buildConvertor(datatypeElement, type);
           buildSelectionList(datatypeElement, type);
   
           return type;