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>