You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2003/03/11 16:24:15 UTC

cvs commit: jakarta-tapestry/web new.html

hlship      2003/03/11 07:24:15

  Modified:    examples/Workbench/src/org/apache/tapestry/workbench/jsp
                        JSPResults.java
               framework/src/org/apache/tapestry/enhance
                        ComponentClassFactory.java
               framework/src/org/apache/tapestry/binding
                        AbstractBinding.java
               junit/mock-scripts TestEnhancedParameterProperties.xml
               examples/Workbench/context/WEB-INF JSPResults.page
               .        TODO.html
               framework/src/org/apache/tapestry/param
                        ParameterManager.java
               web      new.html
  Added:       junit/context12 Three.html
               junit/context12/WEB-INF Speller.jwc Speller.html
  Log:
  Add support for missing primitive types byte and char in connected parameters.
  Add support for primitive arrays, Object[] and String[] in connected parameters and declared properties.
  
  Revision  Changes    Path
  1.1                  jakarta-tapestry/junit/context12/Three.html
  
  Index: Three.html
  ===================================================================
  <html jwcid="@Shell" title="Three">
  <body jwcid="@Body">
  
  Page name: [<span jwcid="@Speller" letters="ognl:pageName.toCharArray()"/>]
  	
  </body>
  </html>
  
  
  1.2       +2 -2      jakarta-tapestry/examples/Workbench/src/org/apache/tapestry/workbench/jsp/JSPResults.java
  
  Index: JSPResults.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/examples/Workbench/src/org/apache/tapestry/workbench/jsp/JSPResults.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JSPResults.java	10 Mar 2003 19:25:19 -0000	1.1
  +++ JSPResults.java	11 Mar 2003 15:24:14 -0000	1.2
  @@ -70,7 +70,7 @@
   
   public abstract class JSPResults extends JSP implements IExternalPage
   {
  -	public abstract void setParameters(Object parameters);
  +	public abstract void setParameters(Object[] parameters);
   
       public void activateExternalPage(Object[] parameters, IRequestCycle cycle)
           throws RequestCycleException
  
  
  
  1.2       +26 -1     jakarta-tapestry/framework/src/org/apache/tapestry/enhance/ComponentClassFactory.java
  
  Index: ComponentClassFactory.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/framework/src/org/apache/tapestry/enhance/ComponentClassFactory.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ComponentClassFactory.java	5 Mar 2003 22:59:48 -0000	1.1
  +++ ComponentClassFactory.java	11 Mar 2003 15:24:15 -0000	1.2
  @@ -75,6 +75,7 @@
   import org.apache.tapestry.spec.PropertySpecification;
   import org.apache.bcel.Constants;
   import org.apache.bcel.classfile.JavaClass;
  +import org.apache.bcel.generic.ArrayType;
   import org.apache.bcel.generic.BasicType;
   import org.apache.bcel.generic.InstructionConstants;
   import org.apache.bcel.generic.InstructionFactory;
  @@ -126,19 +127,43 @@
       /**
        *  Map of type (as Type), keyed on type name.
        * 
  +     *  This should be kept in synch with ParameterManager, which maintains
  +     *  a similar list.
  +     * 
        **/
   
       private Map _objectTypeMap = new HashMap();
   
       {
           recordType("boolean", boolean.class, Type.BOOLEAN);
  +        recordType("boolean[]", boolean[].class, new ArrayType(Type.BOOLEAN, 1));
  +        
           recordType("short", short.class, Type.SHORT);
  +        recordType("short[]", short[].class, new ArrayType(Type.SHORT, 1));
  +        
           recordType("int", int.class, Type.INT);
  +        recordType("int[]", int[].class, new ArrayType(Type.INT, 1));
  +        
           recordType("long", long.class, Type.LONG);
  +        recordType("long[]", long[].class, new ArrayType(Type.LONG, 1));
  +        
           recordType("float", float.class, Type.FLOAT);
  +        recordType("float[]", float[].class, new ArrayType(Type.FLOAT, 1));
  +        
           recordType("double", double.class, Type.DOUBLE);
  +        recordType("double[]", double[].class, new ArrayType(Type.DOUBLE, 1));
  +        
           recordType("char", char.class, Type.CHAR);
  +        recordType("char[]", char[].class, new ArrayType(Type.CHAR, 1));
  +        
           recordType("byte", byte.class, Type.BYTE);
  +        recordType("byte[]", byte.class, new ArrayType(Type.BYTE, 1));
  +        
  +        recordType("java.lang.Object", Object.class, Type.OBJECT);
  +        recordType("java.lang.Object[]", Object[].class, new ArrayType(Type.OBJECT, 1));
  +        
  +        recordType("java.lang.String", String.class, Type.STRING);
  +        recordType("java.lang.String[]", String[].class, new ArrayType(Type.STRING, 1));
       }
   
       public ComponentClassFactory(
  
  
  
  1.2       +46 -14    jakarta-tapestry/framework/src/org/apache/tapestry/binding/AbstractBinding.java
  
  Index: AbstractBinding.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/framework/src/org/apache/tapestry/binding/AbstractBinding.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- AbstractBinding.java	5 Mar 2003 22:59:27 -0000	1.1
  +++ AbstractBinding.java	11 Mar 2003 15:24:15 -0000	1.2
  @@ -55,6 +55,9 @@
   
   package org.apache.tapestry.binding;
   
  +import java.util.HashMap;
  +import java.util.Map;
  +
   import org.apache.tapestry.BindingException;
   import org.apache.tapestry.IBinding;
   import org.apache.tapestry.NullValueForBindingException;
  @@ -72,6 +75,24 @@
   public abstract class AbstractBinding implements IBinding
   {
       /**
  +     *  A mapping from primitive types to wrapper types.
  +     * 
  +     **/
  +
  +    private static final Map PRIMITIVE_TYPES = new HashMap();
  +
  +    static {
  +        PRIMITIVE_TYPES.put(boolean.class, Boolean.class);
  +        PRIMITIVE_TYPES.put(byte.class, Byte.class);
  +        PRIMITIVE_TYPES.put(char.class, Character.class);
  +        PRIMITIVE_TYPES.put(short.class, Short.class);
  +        PRIMITIVE_TYPES.put(int.class, Integer.class);
  +        PRIMITIVE_TYPES.put(long.class, Long.class);
  +        PRIMITIVE_TYPES.put(float.class, Float.class);
  +        PRIMITIVE_TYPES.put(double.class, Double.class);
  +    }
  +
  +    /**
        *  Cooerces the raw value into a true or false, according to the
        *  rules set by {@link Tapestry#evaluateBoolean(Object)}.
        *
  @@ -196,17 +217,17 @@
           throw new ReadOnlyBindingException(this);
       }
   
  -	/**
  -	 *  Default implementation: returns true.
  -	 * 
  -	 *  @since 2.0.3
  -	 * 
  -	 **/
  -	
  -	public boolean isInvariant()
  -	{
  -	    return true;
  -	}
  +    /**
  +     *  Default implementation: returns true.
  +     * 
  +     *  @since 2.0.3
  +     * 
  +     **/
  +
  +    public boolean isInvariant()
  +    {
  +        return true;
  +    }
   
       public Object getObject(String parameterName, Class type)
       {
  @@ -215,13 +236,24 @@
           if (result == null)
               return result;
   
  -        if (type.isAssignableFrom(result.getClass()))
  +        Class resultClass = result.getClass();
  +
  +        if (type.isAssignableFrom(resultClass))
               return result;
   
  -        String key = type.isInterface() ? "AbstractBinding.wrong-interface" : "AbstractBinding.wrong-type";
  +        if (type.isPrimitive() && isWrapper(type, resultClass))
  +            return result;
  +
  +        String key =
  +            type.isInterface() ? "AbstractBinding.wrong-interface" : "AbstractBinding.wrong-type";
   
           String message = Tapestry.getString(key, parameterName, result, type.getName());
   
           throw new BindingException(message, this);
  +    }
  +
  +    public boolean isWrapper(Class primitiveType, Class subjectClass)
  +    {
  +        return PRIMITIVE_TYPES.get(primitiveType).equals(subjectClass);
       }
   }
  
  
  
  1.2       +18 -1     jakarta-tapestry/junit/mock-scripts/TestEnhancedParameterProperties.xml
  
  Index: TestEnhancedParameterProperties.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/junit/mock-scripts/TestEnhancedParameterProperties.xml,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TestEnhancedParameterProperties.xml	8 Mar 2003 17:08:40 -0000	1.1
  +++ TestEnhancedParameterProperties.xml	11 Mar 2003 15:24:15 -0000	1.2
  @@ -43,5 +43,22 @@
   		</assert-output>
   
   	</request>
  +	
  +	<!-- This test also works out some aspects of connected parameters. -->
  +	
  +	<request>
  +		<parameter name="service" value="page"/>
  +		<parameter name="context" value="Three"/>
  +		
  +		<assert-output name="Page Title">
  +<![CDATA[
  +<title>Three</title>
  +]]>
  +		</assert-output>	
  +		
  +		<assert-output name="Message">
  +		Page name: [T h r e e]	
  +		</assert-output>
  +	</request>
   		
    </mock-test>
  
  
  
  1.2       +1 -1      jakarta-tapestry/examples/Workbench/context/WEB-INF/JSPResults.page
  
  Index: JSPResults.page
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/examples/Workbench/context/WEB-INF/JSPResults.page,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JSPResults.page	10 Mar 2003 19:25:19 -0000	1.1
  +++ JSPResults.page	11 Mar 2003 15:24:15 -0000	1.2
  @@ -6,7 +6,7 @@
   
   <page-specification class="org.apache.tapestry.workbench.jsp.JSPResults">
   
  -  <property-specification name="parameters" type="java.lang.Object"/>
  +  <property-specification name="parameters" type="java.lang.Object[]"/>
     <property-specification name="parameter"/>
   	
   </page-specification>
  
  
  
  1.8       +4 -3      jakarta-tapestry/TODO.html
  
  Index: TODO.html
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/TODO.html,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- TODO.html	10 Mar 2003 19:25:21 -0000	1.7
  +++ TODO.html	11 Mar 2003 15:24:15 -0000	1.8
  @@ -52,8 +52,6 @@
   		<li>New DTD</li>
   	</ul></li>
   	
  -<li>Support array types for declared properties and connected parameters.</li>	
  -	
   	<li>Unit testing stategy for the JSP tags and tagsupport service.</li>
   </UL>
   
  @@ -70,6 +68,9 @@
   <LI>Resolve GPL issues around McKoiDBMBean 
   <b>HLS</STRONG></b>
   <li>Tapestry JSP tag library <b>HLS</b></li>
  +<li>Support array types for declared properties and connected parameters. <b>HLS</b></li>	
  +
  +<li>Support primitive types for connected parameters. <b>HLS</b></li>
   </ul>
   
   <h1>Release 2.5</h1>
  
  
  
  1.1                  jakarta-tapestry/junit/context12/WEB-INF/Speller.jwc
  
  Index: Speller.jwc
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!-- $Id: Speller.jwc,v 1.1 2003/03/11 15:24:15 hlship Exp $ -->
  <!DOCTYPE component-specification PUBLIC 
    "-//Apache Software Foundation//Tapestry Specification 1.4//EN" 
    "http://jakarta.apache.org/tapestry/dtd/Tapestry_1_4.dtd">
    
  <component-specification allow-body="no" allow-informal-parameters="no">
  
    <parameter name="letters" type="char[]" direction="in"/>
    
    <property-specification name="letter" type="char"/>
    <property-specification name="index" type="int"/>
  		
    <component id="e" type="Foreach">
    	<binding name="source" expression="letters"/>	
    	<binding name="value" expression="letter"/>
    	<binding name="index" expression="index"/>
    </component>
    
    <component id="insertLetter" type="Insert">
    	<binding name="value" expression="letter"/>	
    </component>
    
    <component id="ifNotFirst" type="Conditional">
    	<binding name="condition" expression="index != 0"/>
    </component>
  </component-specification>
  
  
  
  1.1                  jakarta-tapestry/junit/context12/WEB-INF/Speller.html
  
  Index: Speller.html
  ===================================================================
  <span jwcid="e"><span jwcid="ifNotFirst"> </span><span jwcid="insertLetter"/></span>
  
  
  1.2       +57 -29    jakarta-tapestry/framework/src/org/apache/tapestry/param/ParameterManager.java
  
  Index: ParameterManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/framework/src/org/apache/tapestry/param/ParameterManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ParameterManager.java	5 Mar 2003 22:59:38 -0000	1.1
  +++ ParameterManager.java	11 Mar 2003 15:24:15 -0000	1.2
  @@ -64,7 +64,6 @@
   
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
  -
   import org.apache.tapestry.BindingException;
   import org.apache.tapestry.IBinding;
   import org.apache.tapestry.IComponent;
  @@ -92,15 +91,37 @@
   {
       private static final Log LOG = LogFactory.getLog(ParameterManager.class);
   
  -    private static final Map scalarTypeMap = new HashMap();
  +    /**
  +     *  Special types that aren't resolved by class lookups, including
  +     *  scalars, arrays of scalars, etc.
  +     * 
  +     *  <p>
  +     *  There's some overlap here with ComponentClassFactory.
  +     * 
  +     **/
  +
  +    private static final Map SPECIAL_TYPE_MAP = new HashMap();
   
       static {
  -        scalarTypeMap.put("boolean", Boolean.TYPE);
  -        scalarTypeMap.put("short", Short.TYPE);
  -        scalarTypeMap.put("int", Integer.TYPE);
  -        scalarTypeMap.put("long", Long.TYPE);
  -        scalarTypeMap.put("float", Float.class);
  -        scalarTypeMap.put("double", Double.class);
  +        SPECIAL_TYPE_MAP.put("boolean", boolean.class);
  +        SPECIAL_TYPE_MAP.put("boolean[]", boolean[].class);
  +        SPECIAL_TYPE_MAP.put("byte", byte.class);
  +        SPECIAL_TYPE_MAP.put("byte[]", byte[].class);
  +        SPECIAL_TYPE_MAP.put("char", char.class);
  +        SPECIAL_TYPE_MAP.put("char[]", char[].class);
  +        SPECIAL_TYPE_MAP.put("short", short.class);
  +        SPECIAL_TYPE_MAP.put("short[]", short[].class);
  +        SPECIAL_TYPE_MAP.put("int", int.class);
  +        SPECIAL_TYPE_MAP.put("int[]", int[].class);
  +        SPECIAL_TYPE_MAP.put("long", long.class);
  +        SPECIAL_TYPE_MAP.put("long[]", long[].class);
  +        SPECIAL_TYPE_MAP.put("float", float.class);
  +        SPECIAL_TYPE_MAP.put("float[]", float[].class);
  +        SPECIAL_TYPE_MAP.put("double", double.class);
  +        SPECIAL_TYPE_MAP.put("double[]", double[].class);
  +
  +        SPECIAL_TYPE_MAP.put("java.lang.Object[]", Object[].class);
  +        SPECIAL_TYPE_MAP.put("java.lang.String[]", String[].class);
       }
   
       private IComponent _component;
  @@ -116,7 +137,7 @@
        *  that are assigned to connected properties.
        * 
        **/
  -    
  +
       public void setParameters(IRequestCycle cycle) throws RequiredParameterException
       {
           if (_connectors == null)
  @@ -135,7 +156,7 @@
        *  form is rewinding).
        * 
        **/
  -    
  +
       public void resetParameters(IRequestCycle cycle)
       {
           if (_connectors == null)
  @@ -194,12 +215,16 @@
               // Next,verify that there is a writable property with the same
               // name as the parameter.
   
  -            PropertyInfo propertyInfo = PropertyFinder.getPropertyInfo(_component.getClass(), propertyName);
  +            PropertyInfo propertyInfo =
  +                PropertyFinder.getPropertyInfo(_component.getClass(), propertyName);
   
               if (propertyInfo == null)
               {
                   throw new ConnectedParameterException(
  -                    Tapestry.getString("ParameterManager.no-accessor", _component.getExtendedId(), propertyName),
  +                    Tapestry.getString(
  +                        "ParameterManager.no-accessor",
  +                        _component.getExtendedId(),
  +                        propertyName),
                       _component,
                       name,
                       propertyName);
  @@ -225,7 +250,10 @@
               if (parameterType == null)
               {
                   throw new ConnectedParameterException(
  -                    Tapestry.getString("ParameterManager.java-type-not-specified", name, _component.getExtendedId()),
  +                    Tapestry.getString(
  +                        "ParameterManager.java-type-not-specified",
  +                        name,
  +                        _component.getExtendedId()),
                       _component,
                       name,
                       propertyName);
  @@ -249,7 +277,8 @@
               // Here's where we will sniff it for type, for the moment
               // assume its some form of object (not scalar) type.
   
  -            IParameterConnector connector = createConnector(_component, name, binding, propertyType, parameterType);
  +            IParameterConnector connector =
  +                createConnector(_component, name, binding, propertyType, parameterType);
   
               // Static bindings are set here and then forgotten
               // about.  Dynamic bindings are kept for later.
  @@ -276,26 +305,25 @@
                           propertyName,
                           ex);
                   }
  -                
  +
                   continue;
               }
  -            
  -            
  -                if (debug)
  -                    LOG.debug("Adding " + connector + ".");
   
  -// To properly support forms elements, the disabled parameter
  -// must always be processed last.
  +            if (debug)
  +                LOG.debug("Adding " + connector + ".");
  +
  +            // To properly support forms elements, the disabled parameter
  +            // must always be processed last.
   
  -if (name.equals("disabled"))
  -    disabledConnector = connector;
  -    else
  +            if (name.equals("disabled"))
  +                disabledConnector = connector;
  +            else
                   list.add(connector);
  -  
  +
           }
   
  -            if (disabledConnector != null)
  -                list.add(disabledConnector);
  +        if (disabledConnector != null)
  +            list.add(disabledConnector);
   
           // Convert for List to array
   
  @@ -335,7 +363,7 @@
           if (Tapestry.isNull(name))
               return null;
   
  -        Class result = (Class) scalarTypeMap.get(name);
  +        Class result = (Class) SPECIAL_TYPE_MAP.get(name);
   
           if (result != null)
               return result;
  
  
  
  1.135     +5 -1      jakarta-tapestry/web/new.html
  
  Index: new.html
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/web/new.html,v
  retrieving revision 1.134
  retrieving revision 1.135
  diff -u -r1.134 -r1.135
  --- new.html	10 Mar 2003 19:25:22 -0000	1.134
  +++ new.html	11 Mar 2003 15:24:15 -0000	1.135
  @@ -18,6 +18,10 @@
   into the session unecessarily often.</li>
   <li>Fix NPE when image parameter of Image component is bound but value is null.</li>
   <li>Create a basic JSP tag library to allow JSPs to access Tapestry pages using the page and external services.</li>
  +<li>Added support for primitive arrays, java.lang.Object[] and java.lang.String[] 
  +for connected parameters.</li>
  +<li>Added connected parameter support for missing primitive types byte and char</li>
  +<li>Added support for primitive arrays, java.lang.Object[], and java.lang.String[] for declared properties.</li>
   </ul>
   
   <h3>Release 2.4-alpha-4</h3>