You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2007/02/01 19:30:11 UTC
svn commit: r502308 - in /tapestry/tapestry5/tapestry-core/trunk/src:
main/java/org/apache/tapestry/ main/java/org/apache/tapestry/annotations/
main/java/org/apache/tapestry/corelib/base/
main/java/org/apache/tapestry/corelib/components/ main/java/org/...
Author: hlship
Date: Thu Feb 1 10:30:09 2007
New Revision: 502308
URL: http://svn.apache.org/viewvc?view=rev&rev=502308
Log:
All parameter defaulter methods to return simple values as well as Binding instances.
Fix a bug where Form rendered a "style" attribute, not a "class" attribute.
Allow for null values inside EnumValueEncoder.
Add method getContainerMessages() to ComponentResources.
Add principal attribute to the Parameter annotation, with corresponding support inside ParamterWorker.
Add a FieldFilter interface, and a findFields() method on ClassTransformation.
Change Select to automatically provide an default SelectModel and/or ValueEncoder when the value parameter's type is an Enum type.
Added:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/FieldFilter.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/data/Department.java
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/EnumValueEncoder.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/Parameter.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractTextField.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/BeanEditForm.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Form.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Label.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Select.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/InternalComponentResourcesCommon.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/parser/StartComponentToken.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/FieldValidatorSourceImpl.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderProcessor.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ParameterWorker.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ClassTransformation.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/parameters.apt
tapestry/tapestry5/tapestry-core/trunk/src/site/apt/index.apt
tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/SimpleForm.html
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/data/IncidentData.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/FieldValidatorSourceImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ParameterWorkerTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/SimpleForm.properties
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java Thu Feb 1 10:30:09 2007
@@ -48,6 +48,12 @@
ComponentResources getContainerResources();
/**
+ * Returns the {@link Messages} from the container, or null if this is the root component (with
+ * no container). As a special case, for a mixin, this return the core component's messages.
+ */
+ Messages getContainerMessages();
+
+ /**
* Returns the page that contains this component. Technically, the page itself is an internal
* object in Tapestry and this returns the root component of the actual page, but from an
* application developer point of view, this is the page.
@@ -78,15 +84,15 @@
Messages getMessages();
/**
- * Returns the actual type of the bound parameter, or Object.class if the parameter is not
- * bound. This is primarily used with property bindings, and is used to determine the actual
- * type of the property, rather than the type of parameter (remember that type coercion
- * automatically occurs, which can mask significant differences between the parameter type and
- * the bound property type).
+ * Returns the actual type of the bound parameter, or null if the parameter is not bound. This
+ * is primarily used with property bindings, and is used to determine the actual type of the
+ * property, rather than the type of parameter (remember that type coercion automatically
+ * occurs, which can mask significant differences between the parameter type and the bound
+ * property type).
*
* @see Binding#getBindingType()
* @param parameterName
- * @return
+ * @return the type of the bound parameter, or null if the parameter is not bound
*/
Class getBoundType(String parameterName);
}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/EnumValueEncoder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/EnumValueEncoder.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/EnumValueEncoder.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/EnumValueEncoder.java Thu Feb 1 10:30:09 2007
@@ -39,6 +39,9 @@
@SuppressWarnings("unchecked")
public Enum toValue(String clientValue)
{
+ if (clientValue == null)
+ return null;
+
return Enum.valueOf(_enumType, clientValue);
}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/Parameter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/Parameter.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/Parameter.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/Parameter.java Thu Feb 1 10:30:09 2007
@@ -62,8 +62,19 @@
/**
* The default binding prefix for the parameter, if no specific binding prefix is provided with
* the binding. There is <em>rarely</em> a reason to override this. Typically, non-standard
- * default binding prefixes are paired with specific {@link BindingFactory} implementations,
- * and used with parameters whose name reflects the binding prefix.
+ * default binding prefixes are paired with specific {@link BindingFactory} implementations, and
+ * used with parameters whose name reflects the binding prefix.
*/
String defaultPrefix() default "prop";
+
+ /**
+ * Used to mark a parameter as requiring earlier initialization than other parameters. This is
+ * used when default bindings for secondary parameters rely on a principal parameter, which
+ * itself may have a default value. This ensures that the binding for the principal parameter(s)
+ * are initialized, possibly involving a defaulter method, before the secondary parameters are
+ * initialized (as they may need to know if the principal parameter is bound, and what type of
+ * value it is bound to). This is rarely used, and it is highly unlikely a single component
+ * would have more than a single principal parameter.
+ */
+ boolean principal() default false;
}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractTextField.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractTextField.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractTextField.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/base/AbstractTextField.java Thu Feb 1 10:30:09 2007
@@ -28,7 +28,6 @@
import org.apache.tapestry.annotations.Environmental;
import org.apache.tapestry.annotations.Inject;
import org.apache.tapestry.annotations.Parameter;
-import org.apache.tapestry.internal.bindings.AbstractBinding;
import org.apache.tapestry.internal.services.FormParameterLookup;
import org.apache.tapestry.ioc.Messages;
import org.apache.tapestry.services.TranslatorDefaultSource;
@@ -40,7 +39,7 @@
*/
public abstract class AbstractTextField extends AbstractField
{
- @Parameter(required = true)
+ @Parameter(required = true, principal = true)
private Object _value;
@Parameter
@@ -65,25 +64,17 @@
@Inject
private Locale _locale;
- final Binding defaultTranslate()
+ final Translator defaultTranslate()
{
- // Have to do this a bit the hard way: defer getting the translator until first needed,
- // since we won't know the bound type of the value parameter until after
- // containingPageDidLoad(). This is because fields are handled in alphabetical order, and
- // _translate is ordered before _validate.
-
- return new AbstractBinding()
- {
- private Translator _translator;
-
- public Object get()
- {
- if (_translator == null)
- _translator = _translatorDefaultSource.find(_resources.getBoundType("value"));
-
- return _translator;
- }
- };
+ // Because the value parameter is a principal parameter, we know that it will be bound (even
+ // via its default parameter) by the time this method is invoked.
+
+ Class type = _resources.getBoundType("value");
+
+ if (type == null)
+ return null;
+
+ return _translatorDefaultSource.find(type);
}
/**
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/BeanEditForm.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/BeanEditForm.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/BeanEditForm.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/BeanEditForm.java Thu Feb 1 10:30:09 2007
@@ -183,7 +183,7 @@
// Use the property name, not the field id, when locating
// validation message overrides.
- Messages overrideMessages = _resources.getContainerResources().getMessages();
+ Messages overrideMessages = _resources.getContainerMessages();
for (String constraint : _validationConstraintGenerator
.buildConstraints(_propertyEditModel))
@@ -244,7 +244,7 @@
public SelectModel getSelectModelForProperty()
{
return new EnumSelectModel(_propertyEditModel.getPropertyType(), _resources
- .getContainerResources().getMessages());
+ .getContainerMessages());
}
public Form getForm()
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Form.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Form.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Form.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Form.java Thu Feb 1 10:30:09 2007
@@ -209,7 +209,7 @@
_resources.renderInformalParameters(writer);
- _div = writer.element("div", "style", "t-invisible");
+ _div = writer.element("div", "class", "t-invisible");
for (String parameterName : link.getParameterNames())
{
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Label.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Label.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Label.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Label.java Thu Feb 1 10:30:09 2007
@@ -14,6 +14,7 @@
package org.apache.tapestry.corelib.components;
+import org.apache.tapestry.ComponentResources;
import org.apache.tapestry.Field;
import org.apache.tapestry.MarkupWriter;
import org.apache.tapestry.ValidationDecorator;
@@ -22,14 +23,16 @@
import org.apache.tapestry.annotations.BeginRender;
import org.apache.tapestry.annotations.ComponentClass;
import org.apache.tapestry.annotations.Environmental;
+import org.apache.tapestry.annotations.Inject;
import org.apache.tapestry.annotations.Parameter;
-import org.apache.tapestry.corelib.mixins.RenderInformals;
+import org.apache.tapestry.annotations.SupportsInformalParameters;
import org.apache.tapestry.dom.Element;
import org.apache.tapestry.services.Heartbeat;
/** Generates a <label> element for a particular field. */
@ComponentClass
-public class Label extends RenderInformals
+@SupportsInformalParameters
+public class Label
{
/**
* The for parameter is used to identify the {@link Field} linked to this label (it is named
@@ -44,6 +47,9 @@
@Environmental
private ValidationDecorator _decorator;
+ @Inject
+ private ComponentResources _resources;
+
@BeginRender
void begin(MarkupWriter writer)
{
@@ -51,10 +57,13 @@
final Element element = writer.element("label");
- // Uh oh! Referenching a private field (that happens to get instrumented up the wazoo) from
+ _resources.renderInformalParameters(writer);
+
+ // Uh oh! Referencing a private field (that happens to get instrumented up the wazoo) from
// a inner class causes a java.lang.Verify error (Unable to pop operand off an empty stack).
// Perhaps this is a Javassist error? Shouldn't the inner class be going through a synthetic
- // accessor method of some kind?
+ // accessor method of some kind? Resolved by assigning to a local variable and referencing
+ // that. Layers on layers, oh my!
final ValidationDecorator decorator = _decorator;
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Select.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Select.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Select.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Select.java Thu Feb 1 10:30:09 2007
@@ -18,17 +18,21 @@
import java.util.Map;
import org.apache.tapestry.Binding;
+import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.EnumSelectModel;
+import org.apache.tapestry.EnumValueEncoder;
import org.apache.tapestry.FieldValidator;
import org.apache.tapestry.MarkupWriter;
import org.apache.tapestry.OptionGroupModel;
import org.apache.tapestry.OptionModel;
+import org.apache.tapestry.SelectModel;
import org.apache.tapestry.ValidationException;
import org.apache.tapestry.ValidationTracker;
import org.apache.tapestry.ValueEncoder;
-import org.apache.tapestry.SelectModel;
import org.apache.tapestry.annotations.AfterRender;
import org.apache.tapestry.annotations.BeforeRenderTemplate;
import org.apache.tapestry.annotations.Environmental;
+import org.apache.tapestry.annotations.Inject;
import org.apache.tapestry.annotations.Parameter;
import org.apache.tapestry.corelib.base.AbstractField;
import org.apache.tapestry.internal.services.FormParameterLookup;
@@ -39,7 +43,7 @@
*/
public final class Select extends AbstractField
{
- @Parameter(required = true)
+ @Parameter(required = true, principal = true)
private Object _value;
/**
@@ -75,9 +79,40 @@
@Environmental
private ValidationTracker _tracker;
+ @Inject
+ private ComponentResources _resources;
+
Binding defaultValue()
{
return createDefaultParameterBinding("value");
+ }
+
+ @SuppressWarnings("unchecked")
+ ValueEncoder defaultEncoder()
+ {
+ Class valueType = _resources.getBoundType("value");
+
+ if (valueType == null)
+ return null;
+
+ if (Enum.class.isAssignableFrom(valueType))
+ return new EnumValueEncoder(valueType);
+
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ SelectModel defaultModel()
+ {
+ Class valueType = _resources.getBoundType("value");
+
+ if (valueType == null)
+ return null;
+
+ if (Enum.class.isAssignableFrom(valueType))
+ return new EnumSelectModel(valueType, _resources.getContainerMessages());
+
+ return null;
}
void beginRender(MarkupWriter writer)
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/InternalComponentResourcesCommon.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/InternalComponentResourcesCommon.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/InternalComponentResourcesCommon.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/InternalComponentResourcesCommon.java Thu Feb 1 10:30:09 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -48,9 +48,8 @@
/**
* Used during construction of the page to identify the binding for a particular parameter.
* <p>
- * TODO: Would prefer to move this to a sub-interface, say "MutableInternalComponentResources".
*/
- void addParameter(String parameterName, Binding binding);
+ void bindParameter(String parameterName, Binding binding);
/**
* Returns the mixin instance for the fully qualfied mixin class name.
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/parser/StartComponentToken.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/parser/StartComponentToken.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/parser/StartComponentToken.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/parser/StartComponentToken.java Thu Feb 1 10:30:09 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -99,7 +99,7 @@
add(builder, "type", _type);
add(builder, "mixins", _mixins);
- builder.insert(0, "STartComponentToken[");
+ builder.insert(0, "StartComponentToken[");
builder.append("]");
return builder.toString();
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/FieldValidatorSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/FieldValidatorSourceImpl.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/FieldValidatorSourceImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/FieldValidatorSourceImpl.java Thu Feb 1 10:30:09 2007
@@ -59,12 +59,10 @@
String overrideId = componentResources.getId();
Locale locale = componentResources.getLocale();
- ComponentResources containerResources = componentResources.getContainerResources();
-
// So, if you use a TextField on your EditUser page, we want to search the messages
// of the EditUser page (the container), not the TextField (which will always be the same).
- Messages overrideMessages = containerResources.getMessages();
+ Messages overrideMessages = componentResources.getContainerMessages();
return createValidator(
field,
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java Thu Feb 1 10:30:09 2007
@@ -53,6 +53,7 @@
import org.apache.tapestry.ioc.internal.util.InternalUtils;
import org.apache.tapestry.model.ComponentModel;
import org.apache.tapestry.runtime.Component;
+import org.apache.tapestry.services.FieldFilter;
import org.apache.tapestry.services.MethodFilter;
import org.apache.tapestry.services.MethodSignature;
import org.apache.tapestry.services.TransformUtils;
@@ -783,74 +784,63 @@
return true;
}
- public List<String> findFieldsWithAnnotation(Class<? extends Annotation> annotationClass)
+ public List<String> findFieldsWithAnnotation(final Class<? extends Annotation> annotationClass)
{
- failIfFrozen();
-
- List<String> result = newList();
-
- for (CtField field : _ctClass.getDeclaredFields())
+ FieldFilter filter = new FieldFilter()
{
- if (!isInstanceField(field))
- continue;
-
- String fieldName = field.getName();
-
- if (_claimedFields.containsKey(fieldName))
- continue;
-
- List<Annotation> annotations = findFieldAnnotations(fieldName);
-
- // Check to see if any of the annotations are the right type, if
- // so, add the field name to the result.
-
- for (Object annotation : annotations)
+ public boolean accept(String fieldName, String fieldType)
{
- if (annotationClass.isInstance(annotation))
- {
- result.add(fieldName);
- break;
- }
+ return getFieldAnnotation(fieldName, annotationClass) != null;
}
- }
+ };
- Collections.sort(result);
-
- return result;
+ return findFields(filter);
}
- public List<String> findFieldsOfType(String type)
+ public List<String> findFields(FieldFilter filter)
{
failIfFrozen();
List<String> result = newList();
- for (CtField field : _ctClass.getDeclaredFields())
+ try
{
- if (!isInstanceField(field))
- continue;
+ for (CtField field : _ctClass.getDeclaredFields())
+ {
+ if (!isInstanceField(field))
+ continue;
- String fieldName = field.getName();
+ String fieldName = field.getName();
- try
- {
- if (!field.getType().getName().equals(type))
+ if (_claimedFields.containsKey(fieldName))
continue;
- }
- catch (NotFoundException ex)
- {
- throw new RuntimeException(ex);
- }
- if (_claimedFields.containsKey(fieldName))
- continue;
+ if (filter.accept(fieldName, field.getType().getName()))
+ result.add(fieldName);
- result.add(fieldName);
+ }
+ }
+ catch (NotFoundException ex)
+ {
+ throw new RuntimeException(ex);
}
Collections.sort(result);
return result;
+ }
+
+ public List<String> findFieldsOfType(final String type)
+ {
+ FieldFilter filter = new FieldFilter()
+ {
+ public boolean accept(String fieldName, String fieldType)
+ {
+ return type.equals(fieldType);
+ }
+ };
+
+ return findFields(filter);
}
public List<MethodSignature> findMethodsWithAnnotation(
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderProcessor.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderProcessor.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderProcessor.java Thu Feb 1 10:30:09 2007
@@ -112,8 +112,7 @@
_persistentFieldManager = persistentFieldManager;
}
- // This is for bindings from the template.
- private void addBindingToComponent(ComponentPageElement component, AttributeToken token)
+ private void bindParameterFromTemplate(ComponentPageElement component, AttributeToken token)
{
String name = token.getName();
ComponentResources resources = component.getComponentResources();
@@ -140,7 +139,7 @@
token.getValue(),
token.getLocation());
- component.addParameter(name, binding);
+ component.bindParameter(name, binding);
}
// As element, components, parameters or blocks are started, they push an element onto this
@@ -163,7 +162,7 @@
}
}
- private void addParametersFromModel(EmbeddedComponentModel model,
+ private void bindParametersFromModel(EmbeddedComponentModel model,
ComponentPageElement loadingComponent, ComponentPageElement component)
{
for (String name : model.getParameterNames())
@@ -186,27 +185,27 @@
value,
null);
- component.addParameter(name, binding);
+ component.bindParameter(name, binding);
}
}
/**
- * Determines the default binding prefix for a particular parameters.
+ * Determines the default binding prefix for a particular parameter.
*
* @param component
* the component which will have a parameter bound
* @param parameterName
* the name of the parameter
- * @param metaDefaultBindingPrefix
+ * @param informalParameterBindingPrefix
* the default to use for informal parameters
* @return the binding prefix
*/
private String determineDefaultBindingPrefix(ComponentPageElement component,
- String parameterName, String metaDefaultBindingPrefix)
+ String parameterName, String informalParameterBindingPrefix)
{
String defaultBindingPrefix = component.getDefaultBindingPrefix(parameterName);
- return defaultBindingPrefix != null ? defaultBindingPrefix : metaDefaultBindingPrefix;
+ return defaultBindingPrefix != null ? defaultBindingPrefix : informalParameterBindingPrefix;
}
private void addRenderBodyElement()
@@ -230,7 +229,7 @@
{
ComponentPageElement activeElement = _activeElementStack.peek();
- addBindingToComponent(activeElement, token);
+ bindParameterFromTemplate(activeElement, token);
return;
}
@@ -462,7 +461,7 @@
// TODO: Check that the t:parameter doesn't appear outside of an embedded component.
- _activeElementStack.peek().addParameter(name, binding);
+ _activeElementStack.peek().bindParameter(name, binding);
setupBlock(block);
}
@@ -557,7 +556,7 @@
addMixinsToComponent(newComponent, embeddedModel, token.getMixins());
if (embeddedModel != null)
- addParametersFromModel(embeddedModel, _loadingElement, newComponent);
+ bindParametersFromModel(embeddedModel, _loadingElement, newComponent);
addToBody(newComponent);
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ParameterWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ParameterWorker.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ParameterWorker.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ParameterWorker.java Thu Feb 1 10:30:09 2007
@@ -19,12 +19,15 @@
import org.apache.tapestry.Binding;
import org.apache.tapestry.annotations.Parameter;
+import org.apache.tapestry.internal.InternalComponentResources;
+import org.apache.tapestry.internal.bindings.LiteralBinding;
import org.apache.tapestry.ioc.internal.util.InternalUtils;
import org.apache.tapestry.ioc.util.BodyBuilder;
import org.apache.tapestry.model.MutableComponentModel;
import org.apache.tapestry.services.BindingSource;
import org.apache.tapestry.services.ClassTransformation;
import org.apache.tapestry.services.ComponentClassTransformWorker;
+import org.apache.tapestry.services.FieldFilter;
import org.apache.tapestry.services.MethodFilter;
import org.apache.tapestry.services.MethodSignature;
import org.apache.tapestry.services.TransformConstants;
@@ -36,6 +39,8 @@
*/
public class ParameterWorker implements ComponentClassTransformWorker
{
+ private static final String BIND_METHOD_NAME = ParameterWorker.class.getName() + ".bind";
+
private final BindingSource _bindingSource;
public ParameterWorker(BindingSource bindingSource)
@@ -43,10 +48,33 @@
_bindingSource = bindingSource;
}
- public void transform(ClassTransformation transformation, MutableComponentModel model)
+ public void transform(final ClassTransformation transformation, MutableComponentModel model)
{
+ FieldFilter filter = new FieldFilter()
+ {
+ public boolean accept(String fieldName, String fieldType)
+ {
+ Parameter annotation = transformation
+ .getFieldAnnotation(fieldName, Parameter.class);
+
+ return annotation != null && annotation.principal();
+ }
+ };
+
+ List<String> principleFieldNames = transformation.findFields(filter);
+
+ convertFieldsIntoParameters(transformation, model, principleFieldNames);
+
+ // Now convert the rest.
+
List<String> fieldNames = transformation.findFieldsWithAnnotation(Parameter.class);
+ convertFieldsIntoParameters(transformation, model, fieldNames);
+ }
+
+ private void convertFieldsIntoParameters(ClassTransformation transformation,
+ MutableComponentModel model, List<String> fieldNames)
+ {
for (String name : fieldNames)
convertFieldIntoParameter(name, transformation, model);
}
@@ -174,7 +202,7 @@
_bindingSource);
builder.addln(
- " %s.addParameter(\"%s\", %s.newBinding(\"default %2$s\", %1$s, \"%s\"));",
+ " %s.bindParameter(\"%s\", %s.newBinding(\"default %2$s\", %1$s, \"%s\"));",
resourcesFieldName,
parameterName,
bindingFactoryFieldName,
@@ -194,24 +222,25 @@
public boolean accept(MethodSignature signature)
{
return signature.getParameterTypes().length == 0
- && signature.getMethodName().equals(methodName)
- && signature.getReturnType().equals(Binding.class.getName());
+ && signature.getMethodName().equals(methodName);
}
};
// This will match exactly 0 or 1 methods, and if it matches, we know the name
// of the method.
- if (!transformation.findMethods(filter).isEmpty())
- {
- builder.addln("if (! %s.isBound(\"%s\"))", resourcesFieldName, parameterName);
+ List<MethodSignature> signatures = transformation.findMethods(filter);
- builder.addln(
- " %s.addParameter(\"%s\", %s());",
- resourcesFieldName,
- parameterName,
- methodName);
- }
+ if (signatures.isEmpty())
+ return;
+
+ builder.addln("if (! %s.isBound(\"%s\"))", resourcesFieldName, parameterName);
+ builder.addln(
+ " %s(\"%s\", %s, %s());",
+ BIND_METHOD_NAME,
+ parameterName,
+ resourcesFieldName,
+ methodName);
}
private void addWriterMethod(String fieldName, String cachedFieldName, boolean cache,
@@ -321,5 +350,22 @@
return annotatedName;
return InternalUtils.stripMemberPrefix(fieldName);
+ }
+
+ public static void bind(String parameterName, InternalComponentResources resources, Object value)
+ {
+ if (value == null)
+ return;
+
+ if (value instanceof Binding)
+ {
+ Binding binding = (Binding) value;
+
+ resources.bindParameter(parameterName, binding);
+ return;
+ }
+
+ resources.bindParameter(parameterName, new LiteralBinding("default " + parameterName,
+ value, null));
}
}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java Thu Feb 1 10:30:09 2007
@@ -625,7 +625,7 @@
_components.add(resources.getComponent());
}
- public void addParameter(String parameterName, Binding binding)
+ public void bindParameter(String parameterName, Binding binding)
{
// Maybe should use colon here? Depends on what works best in the template,
// don't want to lock this out as just
@@ -646,7 +646,7 @@
String simpleName = parameterName.substring(dotx + 1);
- mixinResources.addParameter(simpleName, binding);
+ mixinResources.bindParameter(simpleName, binding);
return;
}
@@ -656,7 +656,7 @@
if (_coreResources.getComponentModel().getParameterModel(parameterName) != null)
{
- _coreResources.addParameter(parameterName, binding);
+ _coreResources.bindParameter(parameterName, binding);
return;
}
@@ -665,7 +665,7 @@
InternalComponentResources resources = _mixinsByShortName.get(mixinName);
if (resources.getComponentModel().getParameterModel(parameterName) != null)
{
- resources.addParameter(parameterName, binding);
+ resources.bindParameter(parameterName, binding);
return;
}
@@ -684,7 +684,7 @@
// that will likely change.
if (informalParameterResources != null)
- informalParameterResources.addParameter(parameterName, binding);
+ informalParameterResources.bindParameter(parameterName, binding);
}
public void addToBody(PageElement element)
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java Thu Feb 1 10:30:09 2007
@@ -166,7 +166,7 @@
_element.persistFieldChange(this, fieldName, newValue);
}
- public void addParameter(String parameterName, Binding binding)
+ public void bindParameter(String parameterName, Binding binding)
{
if (_bindings == null)
_bindings = newMap();
@@ -201,7 +201,7 @@
{
Binding b = getBinding(parameterName);
- return b != null ? b.getBindingType() : Object.class;
+ return b != null ? b.getBindingType() : null;
}
@SuppressWarnings("unchecked")
@@ -209,7 +209,6 @@
{
Binding b = getBinding(parameterName);
-
Class bindingType = b.getBindingType();
try
@@ -266,6 +265,11 @@
public ComponentResources getContainerResources()
{
return _containerResources;
+ }
+
+ public Messages getContainerMessages()
+ {
+ return _containerResources != null ? _containerResources.getMessages() : null;
}
public Locale getLocale()
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ClassTransformation.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ClassTransformation.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ClassTransformation.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ClassTransformation.java Thu Feb 1 10:30:09 2007
@@ -88,6 +88,15 @@
List<MethodSignature> findMethods(MethodFilter filter);
/**
+ * Finds all unclaimed fields matched by the provided filter.
+ *
+ * @param filter
+ * passed each field name and field type
+ * @return the names of all matched fields, in ascending order
+ */
+ List<String> findFields(FieldFilter filter);
+
+ /**
* Finds an annotation for the class itself, including any annotations inherited from parent
* classes.
*
Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/FieldFilter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/FieldFilter.java?view=auto&rev=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/FieldFilter.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/FieldFilter.java Thu Feb 1 10:30:09 2007
@@ -0,0 +1,9 @@
+package org.apache.tapestry.services;
+
+/**
+ * Used by {@link ClassTransformation#findFields(FieldFilter)} to identify which fields to keep.
+ */
+public interface FieldFilter
+{
+ boolean accept(String fieldName, String fieldType);
+}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java Thu Feb 1 10:30:09 2007
@@ -705,6 +705,12 @@
expect(resources.getContainerResources()).andReturn(containerResources).atLeastOnce();
}
+ protected final void train_getContainerMessages(ComponentResources resources,
+ Messages containerMessages)
+ {
+ expect(resources.getContainerMessages()).andReturn(containerMessages).atLeastOnce();
+ }
+
protected final void train_getId(ComponentResources resources, String id)
{
expect(resources.getId()).andReturn(id).atLeastOnce();
@@ -773,7 +779,8 @@
expect(messages.contains(isA(String.class))).andStubReturn(contained);
}
- protected final <T extends Annotation> void train_getAnnotation(PropertyConduit conduit, Class<T> annotationClass, T annotation)
+ protected final <T extends Annotation> void train_getAnnotation(PropertyConduit conduit,
+ Class<T> annotationClass, T annotation)
{
expect(conduit.getAnnotation(annotationClass)).andReturn(annotation).atLeastOnce();
}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/parameters.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/parameters.apt?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/parameters.apt (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/parameters.apt Thu Feb 1 10:30:09 2007
@@ -291,8 +291,11 @@
Computed Parameter Binding Defaults
In <rare> cases, you may want to compute the binding to be used as a parameter default. In this case, you will provide
- a <default binding method>, a method that takes no parameters and returns a
- {{{../apidocs/org/apache/tapestry/Binding.html}Binding}} instance. The method name is "default" plus the capitalized name
+ a <default binding method>, a method that takes no parameters. The returned value is used to bind the parameter. The return value may
+ be a
+ {{{../apidocs/org/apache/tapestry/Binding.html}Binding}} instance, or it may be a simple value (which is more often the case).
+
+ The method name is "default" plus the capitalized name
of the parameter.
Using this approach, the previous example may be rewritten as:
@@ -310,7 +313,7 @@
@Inject("infrastructure:BindingSource")
private BindingSource _bindingSource;
- Binding defaultValue()
+ Binding defaultMessage()
{
return _bindingSource.newBinding("default value", _resources, "defaultMessage");
}
@@ -320,6 +323,31 @@
return String.format("Maximum field length is %d.", _maxLength);
}
+---+
+
+ In this example, a property expression, "defaultMessage", is used to access the message dynamically.
+
+ Alternately, the previous example may be written even more succinctly as:
+
++----+
+ @Parameter
+ private String _message;
+
+ @Parameter(required=true)
+ private int _maxLength;
+
+ @Inject
+ private ComponentResources _resources;
+
+ @Inject("infrastructure:BindingSource")
+ private BindingSource _bindingSource;
+
+ String defaultMessage()
+ {
+ return String.format("Maximum field length is %d.", _maxLength);
+ }
++---+
+
+ This form is more like using the "literal:" binding prefix, except that the literal value is computed by the defaultMessage() method.
Obviously, this is a lot more work than simply specifying a default value as part of the Parameter annotation. In the few
real cases where this is approach is used, the default binding method will usually deduce a proper binding, typically in terms of
Modified: tapestry/tapestry5/tapestry-core/trunk/src/site/apt/index.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/index.apt?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/index.apt (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/index.apt Thu Feb 1 10:30:09 2007
@@ -38,8 +38,11 @@
Progress on Tapestry 5 is really taking off. This space lists some cool new features that have been added
recently.
+ * BeanEditForm component that creates a form and related controls to edit the properties of any JavaBean, automatically.
+ Inspired by {{{http://www.trailsframework.org/}Trails}} and {{{http://beanform.sourceforge.net/}BeanForm}} (both for Tapestry 4).
+
* Case insensitve URLs. Tapestry no longer cares about the case of the page names and commponent ids it puts
- into URLs, and they are now generated in all lower-case for that clean "Web 2.0" loop. And they're
+ into URLs, and they are now generated in all lower-case for that clean "Web 2.0" look. And they're
shorter, too!
* Initial support for {{{guide/appstate.html}application state objects}}.
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/SimpleForm.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/SimpleForm.html?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/SimpleForm.html (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/SimpleForm.html Thu Feb 1 10:30:09 2007
@@ -5,26 +5,33 @@
<form t:type="Form">
<input t:type="Checkbox" t:id="disabled"/>
- <label t:type="Label" for="disabled"/>
-
- <hr/>
-
- <label t:type="Label" for="email">This isn't used</label>: <input
- t:type="TextField" t:id="email" value="incident.email" size="50" disabled="disabled"/>
- <br/>
- <label t:type="Label" for="message"/>: <input t:type="TextArea" t:id="message" label="Incident Message"
- value="incident.message" cols="50" rows="10" disabled="disabled"> You can put text here, but it isn't used. </input>
+ <label id="l1" t:type="Label" for="disabled"/>
<br/>
- <label t:type="Label" for="operatingSystem"/>:
- <select t:type="Select" t:id="operatingSystem" value="incident.operatingSystem" model="message:os-values" disabled="disabled"/>
-
- <br/>
-
- <input t:type="Checkbox" t:id="urgent" value="incident.urgent" disabled="disabled"/>
- <label t:type="Label" for="urgent"/>
- <br/>
- <input type="submit"/>
+ <div class="t-beaneditor">
+
+ <label id="l2" t:type="Label" for="email">This isn't used</label>
+ <input t:type="TextField"
+ t:id="email" value="incident.email" size="50" disabled="disabled"/>
+ <br/>
+ <label id="l3" t:type="Label" for="message"/>
+ <input t:type="TextArea" t:id="message"
+ label="Incident Message" value="incident.message" cols="50" rows="10"
+ disabled="disabled"> You can put text here, but it isn't used. </input>
+ <br/>
+ <label id="l4" t:type="Label" for="operatingSystem"/>
+ <select t:type="Select"
+ t:id="operatingSystem" value="incident.operatingSystem" model="message:os-values"
+ disabled="disabled"/>
+ <br/>
+ <label id="l5" t:type="Label" for="department"/>
+ <select t:type="Select" t:id="department"
+ value="incident.department" disabled="disabled"/>
+ <br/>
+ <label id="l6" t:type="Label" for="urgent"/>
+ <input t:type="Checkbox" t:id="urgent" value="incident.urgent" disabled="disabled"/>
+ <br/>
+ <input type="submit"/></div>
</form>
<hr/>
@@ -35,7 +42,8 @@
<li>email: [${incident.email}]</li>
<li>message: [${incident.message}]</li>
<li>OS: [${incident.operatingSystem}]</li>
- <li>urgent: [${incident.urgent}]</li>
+ <li>urgent: [${incident.urgent}]</li>
+ <li>department: [${incident.department}]</li>
</ul>
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java Thu Feb 1 10:30:09 2007
@@ -475,20 +475,23 @@
clickAndWait("link=SimpleForm");
- assertText("//label[1]", "Disabled");
- assertText("//label[2]", "Email");
- assertText("//label[3]", "Incident Message");
- assertText("//label[4]", "Operating System");
- assertText("//label[5]", "Urgent Processing Requested");
+ assertText("//label[@id='l1']", "Disabled");
+ assertText("//label[@id='l2']", "Email");
+ assertText("//label[@id='l3']", "Incident Message");
+ assertText("//label[@id='l4']", "Operating System");
+ assertText("//label[@id='l5']", "Department");
+ assertText("//label[@id='l6']", "Urgent Processing Requested");
assertValue("email", "");
assertValue("message", "");
assertValue("operatingSystem", "osx");
+ assertValue("department", "ACCOUNTING");
assertValue("urgent", "on");
_selenium.type("email", "foo@bar.baz");
_selenium.type("message", "Message for you, sir!");
_selenium.select("operatingSystem", "Windows NT");
+ _selenium.select("department", "R&D");
_selenium.click("urgent");
clickAndWait("//input[@type='submit']");
@@ -499,10 +502,12 @@
// Tried to use "email:" and "exact:email:" but Selenium 0.8.1 doesn't seem to accept that.
- assertTextPresent("[foo@bar.baz]");
- assertTextPresent("[Message for you, sir!]");
- assertTextPresent("[false]");
- assertTextPresent("[winnt]");
+ assertTextPresent(
+ "[foo@bar.baz]",
+ "[Message for you, sir!]",
+ "[false]",
+ "[winnt]",
+ "[RESEARCH_AND_DESIGN]");
// Haven't figured out how to get selenium to check that fields are disabled.
}
Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/data/Department.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/data/Department.java?view=auto&rev=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/data/Department.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/data/Department.java Thu Feb 1 10:30:09 2007
@@ -0,0 +1,6 @@
+package org.apache.tapestry.integration.app1.data;
+
+public enum Department {
+
+ ACCOUNTING, RESEARCH_AND_DESIGN, IT, SALES_AND_MARKETING
+}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/data/IncidentData.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/data/IncidentData.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/data/IncidentData.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/data/IncidentData.java Thu Feb 1 10:30:09 2007
@@ -18,7 +18,7 @@
public class IncidentData implements Serializable
{
- private static final long serialVersionUID = 7512595251925899186L;
+ private static final long serialVersionUID = -321606932140181054L;
private String _email;
@@ -30,6 +30,8 @@
private int _hours;
+ private Department _department;
+
public String getEmail()
{
return _email;
@@ -78,6 +80,16 @@
public void setHours(int hours)
{
_hours = hours;
+ }
+
+ public Department getDepartment()
+ {
+ return _department;
+ }
+
+ public void setDepartment(Department department)
+ {
+ _department = department;
}
}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/FieldValidatorSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/FieldValidatorSourceImplTest.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/FieldValidatorSourceImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/FieldValidatorSourceImplTest.java Thu Feb 1 10:30:09 2007
@@ -50,15 +50,13 @@
TypeCoercer coercer = newTypeCoercer();
FieldComponent field = newFieldComponent();
ComponentResources resources = newComponentResources();
- ComponentResources containerResources = newComponentResources();
Messages containerMessages = newMessages();
Map<String, Validator> map = newMap();
train_getComponentResources(field, resources);
train_getId(resources, "fred");
train_getLocale(resources, Locale.ENGLISH);
- train_getContainerResources(resources, containerResources);
- train_getMessages(containerResources, containerMessages);
+ train_getContainerMessages(resources, containerMessages);
map.put("alpha", validator);
map.put("beta", validator);
@@ -94,8 +92,7 @@
MessageFormatter formatter = newMessageFormatter();
Object inputValue = new Object();
ComponentResources resources = newComponentResources();
- ComponentResources containerResources = newComponentResources();
- Messages componentMessages = newMessages();
+ Messages containerMessages = newMessages();
Map<String, Validator> map = singletonMap("required", validator);
@@ -104,9 +101,8 @@
train_getComponentResources(field, resources);
train_getId(resources, "fred");
- train_getContainerResources(resources, containerResources);
- train_getMessages(containerResources, componentMessages);
- train_contains(componentMessages, "fred-required", false);
+ train_getContainerMessages(resources, containerMessages);
+ train_contains(containerMessages, "fred-required", false);
train_getLocale(resources, Locale.FRENCH);
@@ -141,8 +137,7 @@
MessageFormatter formatter = newMessageFormatter();
Object inputValue = new Object();
ComponentResources resources = newComponentResources();
- ComponentResources containerResources = newComponentResources();
- Messages componentMessages = newMessages();
+ Messages containerMessages = newMessages();
Map<String, Validator> map = singletonMap("required", validator);
@@ -151,11 +146,10 @@
train_getComponentResources(field, resources);
train_getId(resources, "fred");
train_getLocale(resources, Locale.ENGLISH);
- train_getContainerResources(resources, containerResources);
- train_getMessages(containerResources, componentMessages);
- train_contains(componentMessages, "fred-required", true);
+ train_getContainerMessages(resources, containerMessages);
+ train_contains(containerMessages, "fred-required", true);
- train_getMessageFormatter(componentMessages, "fred-required", formatter);
+ train_getMessageFormatter(containerMessages, "fred-required", formatter);
train_invokeIfBlank(validator, false);
train_getValueType(validator, Object.class);
@@ -184,8 +178,7 @@
MessageFormatter formatter = newMessageFormatter();
Object inputValue = new Object();
ComponentResources resources = newComponentResources();
- ComponentResources containerResources = newComponentResources();
- Messages componentMessages = newMessages();
+ Messages containerMessages = newMessages();
Map<String, Validator> map = singletonMap("required", validator);
@@ -193,9 +186,8 @@
train_getComponentResources(field, resources);
train_getId(resources, "fred");
- train_getContainerResources(resources, containerResources);
- train_getMessages(containerResources, componentMessages);
- train_contains(componentMessages, "fred-required", false);
+ train_getContainerMessages(resources, containerMessages);
+ train_contains(containerMessages, "fred-required", false);
train_getLocale(resources, Locale.FRENCH);
@@ -204,7 +196,7 @@
train_getMessageKey(validator, "key");
train_getMessageFormatter(messages, "key", formatter);
- train_invokeIfBlank(validator,false);
+ train_invokeIfBlank(validator, false);
train_getValueType(validator, Object.class);
validator.validate(field, null, formatter, inputValue);
@@ -233,8 +225,7 @@
MessageFormatter minLengthFormatter = newMessageFormatter();
Object inputValue = "input value";
ComponentResources resources = newComponentResources();
- ComponentResources containerResources = newComponentResources();
- Messages componentMessages = newMessages();
+ Messages containerMessages = newMessages();
Integer fifteen = 15;
Map<String, Validator> map = newMap();
@@ -247,9 +238,8 @@
train_getComponentResources(field, resources);
train_getId(resources, "fred");
- train_getContainerResources(resources, containerResources);
- train_getMessages(containerResources, componentMessages);
- train_contains(componentMessages, "fred-required", false);
+ train_getContainerMessages(resources, containerMessages);
+ train_contains(containerMessages, "fred-required", false);
train_getLocale(resources, Locale.FRENCH);
@@ -258,7 +248,7 @@
train_getMessageKey(required, "required");
train_getMessageFormatter(messages, "required", requiredFormatter);
- train_contains(componentMessages, "fred-minLength", false);
+ train_contains(containerMessages, "fred-minLength", false);
train_getMessageKey(minLength, "min-length");
train_getMessageFormatter(messages, "min-length", minLengthFormatter);
@@ -296,8 +286,7 @@
MessageFormatter formatter = newMessageFormatter();
Object inputValue = new Object();
ComponentResources resources = newComponentResources();
- ComponentResources containerResources = newComponentResources();
- Messages componentMessages = newMessages();
+ Messages containerMessages = newMessages();
Integer five = 5;
Map<String, Validator> map = singletonMap("minLength", validator);
@@ -308,9 +297,8 @@
train_getComponentResources(field, resources);
train_getId(resources, "fred");
- train_getContainerResources(resources, containerResources);
- train_getMessages(containerResources, componentMessages);
- train_contains(componentMessages, "fred-minLength", false);
+ train_getContainerMessages(resources, containerMessages);
+ train_contains(containerMessages, "fred-minLength", false);
train_getLocale(resources, Locale.FRENCH);
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ParameterWorkerTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ParameterWorkerTest.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ParameterWorkerTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ParameterWorkerTest.java Thu Feb 1 10:30:09 2007
@@ -475,7 +475,7 @@
expect(source.newBinding("default value", resources, "literal:greeting"))
.andReturn(binding);
- resources.addParameter("value", binding);
+ resources.bindParameter("value", binding);
train_isInvariant(resources, "value", true);
@@ -521,7 +521,7 @@
// How can this happen? Only if the generated code invokes defaultValue().
- resources.addParameter("value", _binding);
+ resources.bindParameter("value", _binding);
train_isInvariant(resources, "value", true);
};
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java Thu Feb 1 10:30:09 2007
@@ -121,7 +121,7 @@
ComponentResources resources = cpe.getComponentResources();
assertFalse(resources.isBound("fred"));
- cpe.addParameter("barney", binding);
+ cpe.bindParameter("barney", binding);
assertFalse(resources.isBound("fred"));
assertTrue(resources.isBound("barney"));
@@ -183,7 +183,7 @@
ComponentPageElementImpl cpe = new ComponentPageElementImpl(page, ins, coercer, null);
- cpe.addParameter("barney", binding);
+ cpe.bindParameter("barney", binding);
cpe.containingPageDidLoad();
@@ -293,7 +293,7 @@
assertFalse(cpe.getComponentResources().isInvariant("fred"));
- cpe.addParameter("barney", binding);
+ cpe.bindParameter("barney", binding);
assertFalse(cpe.getComponentResources().isInvariant("fred"));
assertTrue(cpe.getComponentResources().isInvariant("barney"));
@@ -326,7 +326,7 @@
ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, coercer, null);
- cpe.addParameter("barney", binding);
+ cpe.bindParameter("barney", binding);
assertSame(cpe.getComponentResources().readParameter("barney", Long.class), boundValue);
@@ -358,7 +358,7 @@
ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, coercer, null);
- cpe.addParameter("barney", binding);
+ cpe.bindParameter("barney", binding);
cpe.getComponentResources().writeParameter("barney", 23);
@@ -544,7 +544,7 @@
try
{
- cpe.addParameter("Wilma.barney", binding);
+ cpe.bindParameter("Wilma.barney", binding);
unreachable();
}
catch (TapestryException ex)
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImplTest.java?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImplTest.java Thu Feb 1 10:30:09 2007
@@ -70,7 +70,7 @@
InternalComponentResources resources = new InternalComponentResourcesImpl(element, null,
ins, coercer, null);
- resources.addParameter("fred", binding);
+ resources.bindParameter("fred", binding);
resources.renderInformalParameters(writer);
@@ -105,7 +105,7 @@
InternalComponentResources resources = new InternalComponentResourcesImpl(element, null,
ins, coercer, null);
- resources.addParameter("fred", binding);
+ resources.bindParameter("fred", binding);
resources.renderInformalParameters(writer);
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/SimpleForm.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/SimpleForm.properties?view=diff&rev=502308&r1=502307&r2=502308
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/SimpleForm.properties (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/SimpleForm.properties Thu Feb 1 10:30:09 2007
@@ -19,4 +19,9 @@
vista=Windows Vista, \
os9=Mac OS 9, \
osx=Mac OS X, \
- linux=Linux
\ No newline at end of file
+ linux=Linux
+
+# Correct some of the labels for the drop down list
+SALES_AND_MARKETING=Sales/Marketing
+RESEARCH_AND_DESIGN=R&D
+IT=IT
\ No newline at end of file