Weird, does you Index page extends a base class ?
2010/9/8 Markus Feindler <[email protected]>
> Sorry to bother you, but Im stuck with a DuplicateMemberException:
> Caused by: java.lang.RuntimeException:
> javassist.bytecode.DuplicateMemberException: duplicate method:
> extractRequestParameters in de.wiv.tapestryportlet2.pages.Index
> at
> org.apache.tapestry5.internal.services.InternalClassTransformationImpl.addOverrideOfSuperclassMethod(InternalClassTransformationImpl.java:1458)
> at
> org.apache.tapestry5.internal.services.InternalClassTransformationImpl.findOrOverrideMethod(InternalClassTransformationImpl.java:1412)
> at
> org.apache.tapestry5.internal.services.InternalClassTransformationImpl.findOverrideOrCreateMethod(InternalClassTransformationImpl.java:1397)
> at
> org.apache.tapestry5.internal.services.InternalClassTransformationImpl.getOrCreateMethod(InternalClassTransformationImpl.java:1392)
> at
> org.apache.tapestry5.portlet.services.PortletRequestParameterWorker.transform(PortletRequestParameterWorker.java:48)
> at
> $ComponentClassTransformWorker_12af2cfc4c4.transform($ComponentClassTransformWorker_12af2cfc4c4.java)
> at
> $ComponentClassTransformWorker_12af2cfc4c5.transform($ComponentClassTransformWorker_12af2cfc4c5.java)
> at
> $ComponentClassTransformWorker_12af2cfc4b6.transform($ComponentClassTransformWorker_12af2cfc4b6.java)
> at
> org.apache.tapestry5.internal.services.ComponentClassTransformerImpl$1.run(ComponentClassTransformerImpl.java:194)
> ... 250 more
> Caused by: javassist.bytecode.DuplicateMemberException: duplicate method:
> extractRequestParameters in de.wiv.tapestryportlet2.pages.Index
> at javassist.bytecode.ClassFile.testExistingMethod(ClassFile.java:637)
> at javassist.bytecode.ClassFile.addMethod(ClassFile.java:613)
> at javassist.CtClassType.addMethod(CtClassType.java:1320)
> at
> org.apache.tapestry5.internal.services.InternalClassTransformationImpl.addOverrideOfSuperclassMethod(InternalClassTransformationImpl.java:1444)
> ... 258 more
>
> This is my worker:
>
> public class PortletRequestParameterWorker implements
> ComponentClassTransformWorker {
>
> private final ValueEncoderSource valueEncoderSource;
> private final ComponentClassCache classCache;
> private final RequestParameterContext requestParameterContext;
> private final ComponentSource componentSource;
>
> public PortletRequestParameterWorker(ValueEncoderSource
> valueEncoderSource,
> ComponentClassCache classCache, RequestParameterContext
> requestParameterContext,
> ComponentSource componentSource) {
> this.valueEncoderSource = valueEncoderSource;
> this.classCache = classCache;
> this.requestParameterContext = requestParameterContext;
> this.componentSource = componentSource;
> }
>
> public void transform(final ClassTransformation transformation,
> MutableComponentModel model) {
>
>
> transformation.addImplementedInterface(RequestParameterExtractor.class);
> TransformMethodSignature extractMethod = new
> TransformMethodSignature(Modifier.PUBLIC,
> "Map<String, String>", "extractRequestParameters", null,
> null);
> // if (transformation.isDeclaredMethod(extractMethod)) {
> // return;
> // }
> transformation.getOrCreateMethod(extractMethod).addAdvice(new
> ComponentMethodAdvice(){
>
> public void advise(ComponentMethodInvocation invocation) {
> Map<String, String> requestParameters = new
> HashMap<String, String>();
> for (TransformField field :
> transformation.matchFieldsWithAnnotation(ActivationRequestParameter.class))
> {
> String parameterName = getParameterName(field,
> field.getAnnotation(ActivationRequestParameter.class));
> Class fieldType =
> classCache.forName(field.getType());
> FieldAccess access = field.getAccess();
> ValueEncoder encoder =
> valueEncoderSource.getValueEncoder(fieldType);
> Object value =
> access.read(invocation.getInstance());
> if (value == null)
> continue;
> String clientValue = encoder.toClient(value);
> requestParameters.put(parameterName, clientValue);
> }
> invocation.overrideResult(requestParameters);
> }
>
> });
> }
>
> private String getParameterName(TransformField field,
> ActivationRequestParameter annotation)
> {
> if (annotation.value().equals(""))
> return field.getName();
>
> return annotation.value();
> }
>
> }
>
> Any ideas?
>
> Hi !
>>
>> Tapestry 5.2 has a brand new API for class manipulation in worker, you
>> have
>> to provide the method signature and implement the logic in a
>> ComponentMethodAdvice (see PropertyWorker sources to have a simple
>> example)
>>
>> HTH
>>
>> 2010/9/7 Markus Feindler<[email protected]>
>>
>> So, I tried to follow your advice, but I don't see how to add a new
>>> method
>>> after calling
>>> "transformation.addImplementedInterface(MyInterface.class)".
>>> The documentation states to use transformation.getOrCreateMethod, but
>>> where
>>> to define the message body?
>>>
>>> Actually,
>>>
>>>> I would implement a ClassTransformation and add it to
>>>> contributeComponentClassTransformWorker (see Tapestry Module), This
>>>> worker
>>>> should add and implement an interface that contains the method to
>>>> extract
>>>> useful information from the page
>>>>
>>>> Then in your PageResponseRenderer, you can use ComponentSource to get
>>>> the
>>>> page instance, cast it to your interface and call the method.
>>>>
>>>> 2010/9/6 Markus Feindler<[email protected]>
>>>>
>>>> Thats the class I discovered earlier at work.
>>>>
>>>>> Now my question is how to get ClassTransformation and
>>>>> MutableComponentModel
>>>>> from the Page Object in the PageResponseRenderer?
>>>>>
>>>>> Thanks for you help/hints.
>>>>>
>>>>> Regards markus
>>>>>
>>>>> Hi
>>>>>
>>>>> Logic is enclosed in ActivationRequestParameterWorker, i think you can
>>>>>> adapt
>>>>>> this to your needs and extract values. At the moment, I don't see any
>>>>>> other
>>>>>> way to identify ActivationRequestParameters during link creation.
>>>>>>
>>>>>> 2010/9/6 Markus Feindler<[email protected]>
>>>>>>
>>>>>> i would say you can get them from
>>>>>>
>>>>>> Request directly
>>>>>>>
>>>>>>>> This only works for the current request. I need to get the
>>>>>>>> parameters,
>>>>>>>>
>>>>>>>> which will be set for the next request/redirect. It would be
>>>>>>> possible
>>>>>>> to
>>>>>>> write get methods for the ActivationRequestParameters, but that would
>>>>>>> not
>>>>>>> be
>>>>>>> the right way. I need to find out how that is solved internally.
>>>>>>>
>>>>>>>
>>>>>>> Oh sorry, i had mis-read your first message. I didn't get deep into
>>>>>>> this
>>>>>>>
>>>>>>> new
>>>>>>>
>>>>>>>> feature at the time, but at first glance, i would say you can get
>>>>>>>> them
>>>>>>>> from
>>>>>>>> Request directly. Maybe, you can implement a worker that will be in
>>>>>>>> charge
>>>>>>>> of implementing an interface that will contain the method that
>>>>>>>> return
>>>>>>>> the
>>>>>>>> values.
>>>>>>>>
>>>>>>>> I will go deeper to see if there is not a more simple way of doing
>>>>>>>> this.
>>>>>>>>
>>>>>>>> 2010/9/6 Markus Feindler<[email protected]>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Thats what Im doing right now for the PageActivationContext, but I
>>>>>>>> also
>>>>>>>>
>>>>>>>> need the values for the ActivationRequestParameters (introduced in
>>>>>>>>> 5.2:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> http://tapestry.apache.org/tapestry5.2-dev/apidocs/org/apache/tapestry5/annotations/ActivationRequestParameter.html
>>>>>>>>> ).
>>>>>>>>>
>>>>>>>>> Hi
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> So why not passivate the page, see PageActivationContextCollector
>>>>>>>>> ?
>>>>>>>>>
>>>>>>>>> This
>>>>>>>>>> is
>>>>>>>>>> how it works to create links.
>>>>>>>>>>
>>>>>>>>>> 2010/9/5 Markus Feindler<[email protected]>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> No, Im trying to upgrade "my" portlet implementation from 5.1 to
>>>>>>>>>> 5.2
>>>>>>>>>>
>>>>>>>>>> and
>>>>>>>>>>> up to now the activationrequestparameters aren't put in the url,
>>>>>>>>>>> cause
>>>>>>>>>>> I
>>>>>>>>>>> have to adjust my former 5.1 custom response renderer. If the
>>>>>>>>>>> Request
>>>>>>>>>>> is
>>>>>>>>>>> an
>>>>>>>>>>> ActionRequest (see Portlet lifecycle) you can't write output into
>>>>>>>>>>> a
>>>>>>>>>>> stream
>>>>>>>>>>> instead a redirect is done internally in the portlet container.
>>>>>>>>>>> Therefore
>>>>>>>>>>> I
>>>>>>>>>>> have to add the parameters to the ActionReponse
>>>>>>>>>>> (_actionResponse.setRenderParameter). In order to do so I need to
>>>>>>>>>>> get
>>>>>>>>>>> the
>>>>>>>>>>> parameters.
>>>>>>>>>>>
>>>>>>>>>>> That's not enough details.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> -- Josh
>>>>>>>>>>>
>>>>>>>>>>> On Sep 5, 2010, at 9:51 AM, Markus Feindler<
>>>>>>>>>>>> [email protected]>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> Need it for portlet implementation.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Hi
>>>>>>>>>>>>
>>>>>>>>>>>>> What is the purpose ? I guess you are dealing with some kind of
>>>>>>>>>>>>>> dynamic
>>>>>>>>>>>>>> stuff, please can you give more details ?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> 2010/9/5 Markus Feindler<[email protected]>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hey folks,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I need to access page field values annotated with
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> ActivationRequestParameters in order to retrieve the values.
>>>>>>>>>>>>>>> Reflection
>>>>>>>>>>>>>>> doesnt work, because the fields are private and a
>>>>>>>>>>>>>>> java.lang.IllegalAccessException is thrown. Whats the right
>>>>>>>>>>>>>>> way
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>> retrieve
>>>>>>>>>>>>>>> the values / activation request parameters?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Regards
>>>>>>>>>>>>>>> Markus
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>> To unsubscribe, e-mail:
>>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> To unsubscribe, e-mail:
>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>>>>>>>>>
>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>
>>>>>>>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>>>>>>> For additional commands, e-mail: [email protected]
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>
>>>>>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>>>>> For additional commands, e-mail: [email protected]
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>
>>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>>> For additional commands, e-mail: [email protected]
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>>
>>>>>> To unsubscribe, e-mail: [email protected]
>>>>> For additional commands, e-mail: [email protected]
>>>>>
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>
>>>
>>
>
--
Regards,
Christophe Cordenier.
Committer on Apache Tapestry 5
Co-creator of wooki @wookicentral.com