Hi,
I'm writing components, that includes fields, that uses my ajax mixins, and
I'm facing a lot of problems due to the following issues(I'm still using
tap 5.1.0.5/5.2.6, but I'm planning an upgrade):

1) all the standard fields does not expose a public or protected methods to
get/set the "value" and "translator" parameters.
2) for the value parameter I can include a normal textfield in a composite
component, but this solution lacks in performance (2 components to render
instead 1).
3) if I put in my composite component the translator, like this:

    @Parameter(required = true, allowNull = false, defaultPrefix =
BindingConstants.TRANSLATE)
    private FieldTranslator<Object> translate;

    @Parameter(defaultPrefix = BindingConstants.VALIDATE)
    private FieldValidator<Object> validate;

    <t:textfield t:id="edit" t:mixins="skm/SkmTextUpdater"
clientEvent="prop:clientEvent" serverEvent="prop:serverEvent"
        zones="prop:zones" listeningElement="prop:listeningElement"
t:value="prop:value" translate="prop:translate" validate="prop:validate"/>

  I get an exception that tells me that my component(the composite) is not
a field (and i don't want it as a field):

java.lang.ClassCastException: it.skm.t5.ajax.components.AjaxTextField
cannot be cast to org.apache.tapestry5.Field
Stack trace

   - 
org.apache.tapestry5.internal.services.FieldTranslatorSourceImpl.createTranslator(FieldTranslatorSourceImpl.java:104)

   - 
$FieldTranslatorSource_1356ade43d4.createTranslator($FieldTranslatorSource_1356ade43d4.java)

   - 
org.apache.tapestry5.internal.bindings.TranslateBindingFactory$1.get(TranslateBindingFactory.java:48)

   - 
org.apache.tapestry5.internal.transform.ParameterWorker$2$1.readFromBinding(ParameterWorker.java:314)

   - 
org.apache.tapestry5.internal.transform.ParameterWorker$2$1.get(ParameterWorker.java:413)

   - it.skm.t5.ajax.components.AjaxTextField._$get_translate(AjaxTextField.java)

   - it.skm.t5.ajax.components.AjaxTextField.getTranslate(AjaxTextField.java:80)

   - $PropertyConduit_1356ade45c6.get($PropertyConduit_1356ade45c6.java)
   - org.apache.tapestry5.internal.bindings.PropBinding.get(PropBinding.java:59)

   - 
org.apache.tapestry5.internal.transform.ParameterWorker$2$1.readFromBinding(ParameterWorker.java:314)

   - 
org.apache.tapestry5.internal.transform.ParameterWorker$2$1.get(ParameterWorker.java:413)

   - 
org.apache.tapestry5.corelib.base.AbstractTextField._$get_translate(AbstractTextField.java)

   - 
org.apache.tapestry5.corelib.base.AbstractTextField.begin(AbstractTextField.java:167)

   - 
org.apache.tapestry5.corelib.base.AbstractTextField$MethodAccess_begin_1356ade44ee.invoke(AbstractTextField$MethodAccess_begin_1356ade44ee.java)

   - 
org.apache.tapestry5.internal.transform.RenderPhaseMethodWorker$Invoker.invoke(RenderPhaseMethodWorker.java:117)

   - 
org.apache.tapestry5.internal.transform.RenderPhaseMethodWorker$RenderPhaseMethodAdvice.advise(RenderPhaseMethodWorker.java:86)

   - 
org.apache.tapestry5.internal.services.AbstractComponentMethodInvocation.proceed(AbstractComponentMethodInvocation.java:86)

   - 
org.apache.tapestry5.corelib.base.AbstractTextField.beginRender(AbstractTextField.java)

   - 
org.apache.tapestry5.internal.structure.ComponentPageElementImpl$BeginRenderPhase.invokeComponent(ComponentPageElementImpl.java:239)

   -
   
org.apache.tapestry5.internal.structure.ComponentPageElementImpl$AbstractPhase.i
   - etc....


And here my request:
Keeping in mind that all fields basically gets a string from the request,
can you put in the AbstractField class (or better in the Field interface)
two abstract methods like this ?


   - protected abstract void setRawValue(String newValue)

Which is, essentially, the operation that all Fields do in the
"prepareForSubmit) method, that gets the string, calls the translator and
sets the bound parameter.
In this way, we can have the following benefits:

   1. ajax developers can set their value without touching the translation
   mechanism
   2. all the "zone" parameters added in the various releases can be
   removed by the default implementations of components, and with a simple
   class extension everyone can create it's own ajax mixin.

What do you think about this idea ?

Thanks,
Giulio

Reply via email to