Am 13.09.2010 22:18, schrieb Thiago H. de Paula Figueiredo:
On Mon, 13 Sep 2010 17:02:02 -0300, Christophe Cordenier <christophe.corden...@gmail.com> wrote:

Please, Can you provide your Tapestry Module class that contributes your
worker ?

And the worker itself? It seems two different worker instances are trying to add the same method to the same page class.

files attached! appreciate your help.
// Copyright 2005 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.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package org.apache.tapestry5.portlet.services;

import java.io.IOException;
import java.util.List;

import javax.portlet.*;
import javax.servlet.http.Cookie;

import org.apache.tapestry5.SymbolConstants;
import org.apache.tapestry5.internal.portlet.services.*;
import org.apache.tapestry5.internal.services.*;
import org.apache.tapestry5.ioc.*;
import org.apache.tapestry5.ioc.annotations.*;
import org.apache.tapestry5.ioc.services.PipelineBuilder;
import org.apache.tapestry5.ioc.services.PropertyShadowBuilder;
import org.apache.tapestry5.portlet.PortletConstants;
import org.apache.tapestry5.portlet.PortletPageResolver;
import org.apache.tapestry5.services.*;
import org.apache.tapestry5.upload.services.MultipartDecoder;
import org.slf4j.Logger;

public final class PortletModule {
        
                public static void bind(ServiceBinder binder)
                {
                                binder.bind(PortletRequestGlobals.class, 
PortletRequestGlobalsImpl.class);
                                binder.bind(ComponentEventLinkEncoder.class, 
ComponentEventLinkEncoderImplPortlet.class).withId("ComponentEventLinkEncoderImplPortlet");
                }
        
                public static void 
contributeApplicationDefaults(MappedConfiguration<String, String> configuration)
                {
                                
configuration.add(SymbolConstants.FORCE_ABSOLUTE_URIS, "true");
                                
configuration.add(SymbolConstants.SUPPRESS_REDIRECT_FROM_ACTION_REQUESTS, 
"true");
                }
                
                public void 
contributeComponentClassTransformWorker(OrderedConfiguration<ComponentClassTransformWorker>
 configuration) {
                        
configuration.addInstance("PortletRequestParameterWorker", 
PortletRequestParameterWorker.class);
                }
    /**
     * Builds a shadow of the PortletRequestGlobals.portletRequest property. 
Note again that the shadow can be 
     * an ordinary singleton, even though PortletRequestGlobals is perthread.
     */
                @Marker(PortletInterfaceProvider.class)
    public PortletRequest buildPortletRequest(
                
                PropertyShadowBuilder shadowBuilder,
                
                PortletRequestGlobals portletRequestGlobals)
    {
        return shadowBuilder.build(portletRequestGlobals, "portletRequest", 
PortletRequest.class);
    }
    
    /**
     * Builds a shadow of the PortletRequestGlobals.actionRequest property. 
Note again that the shadow can be 
     * an ordinary singleton, even though PortletRequestGlobals is perthread.
     */
                @Marker(ActionInterfaceProvider.class)
    public ActionRequest buildActionRequest(
                
                PropertyShadowBuilder shadowBuilder,
                
                PortletRequestGlobals portletRequestGlobals)
    {
        return shadowBuilder.build(portletRequestGlobals, "actionRequest", 
ActionRequest.class);
    }
    
    /**
     * Builds a shadow of the PortletRequestGlobals.renderRequest property. 
Note again that the shadow can be 
     * an ordinary singleton, even though PortletRequestGlobals is perthread.
     */
                @Marker(RenderInterfaceProvider.class)
    public RenderRequest buildRenderRequest(
                
                PropertyShadowBuilder shadowBuilder,
                
                PortletRequestGlobals portletRequestGlobals)
    {
        return shadowBuilder.build(portletRequestGlobals, "renderRequest", 
RenderRequest.class);
    }
                
                @Marker(ResourceInterfaceProvider.class)
    public ResourceRequest buildResourceRequest(
                
                PropertyShadowBuilder shadowBuilder,
                
                PortletRequestGlobals portletRequestGlobals)
    {
        return shadowBuilder.build(portletRequestGlobals, "resourceRequest", 
ResourceRequest.class);
    }           
        
    /**
     * Builds a shadow of the PortletRequestGlobals.portletResponse property. 
Note again that the shadow can be 
     * an ordinary singleton, even though PortletRequestGlobals is perthread.
     */
                @Marker(PortletInterfaceProvider.class)
    public PortletResponse buildPortletResponse(
                
                PropertyShadowBuilder shadowBuilder,
                
                PortletRequestGlobals portletRequestGlobals)
    {
        return shadowBuilder.build(portletRequestGlobals, "portletResponse", 
PortletResponse.class);
    }
    
    /**
     * Builds a shadow of the PortletRequestGlobals.actionResponse property. 
Note again that the shadow can be 
     * an ordinary singleton, even though PortletRequestGlobals is perthread.
     */
                @Marker(ActionInterfaceProvider.class)
    public ActionResponse buildActionResponse(
                
                PropertyShadowBuilder shadowBuilder,
                
                PortletRequestGlobals portletRequestGlobals)
    {
        return shadowBuilder.build(portletRequestGlobals, "actionResponse", 
ActionResponse.class);
    }
    
    /**
     * Builds a shadow of the PortletRequestGlobals.renderResponse property. 
Note again that the shadow can be 
     * an ordinary singleton, even though PortletRequestGlobals is perthread.
     */
                @Marker(RenderInterfaceProvider.class)
    public RenderResponse buildRenderResponse(
                
                PropertyShadowBuilder shadowBuilder,
                
                PortletRequestGlobals portletRequestGlobals)
    {
        return shadowBuilder.build(portletRequestGlobals, "renderResponse", 
RenderResponse.class);
    }
                
                @Marker(ResourceInterfaceProvider.class)
    public ResourceResponse buildResourceResponse(
                
                PropertyShadowBuilder shadowBuilder,
                
                PortletRequestGlobals portletRequestGlobals)
    {
        return shadowBuilder.build(portletRequestGlobals, "resourceResponse", 
ResourceResponse.class);
    }
        
    public PortletApplicationInitializer build(Logger logger,
                
                List<PortletApplicationInitializerFilter> configuration,
            
        @InjectService("ApplicationGlobals")
        final ApplicationGlobals applicationGlobals,
            
        @InjectService("ApplicationInitializer")
        final ApplicationInitializer initializer,
            
        @InjectService("PipelineBuilder")
        PipelineBuilder builder)
    {
        PortletApplicationInitializer terminator = new 
PortletApplicationInitializer()
        {
            public void initializeApplication(PortletContext context)
            {
                // this does not work since the app globals do not know of 
portlets  
                        //applicationGlobals.store(context);

                initializer.initializeApplication(new 
PortletContextImpl(context));
            }
        };

        return builder.build(logger,
                        PortletApplicationInitializer.class,
            PortletApplicationInitializerFilter.class,
            configuration,
            terminator);
    }
    
    public PortletPageResolver build(
                ComponentClassResolver componentClassResolver,
                List<PortletPageResolverRule> configuration)
    {
                return new PortletPageResolverImpl(componentClassResolver, 
configuration);
    }
    
    public PortletActionRequestHandler buildPortletActionRequestHandler(Logger 
logger,
            
                List<PortletActionRequestFilter> configuration,
                
                @InjectService("PipelineBuilder")
                PipelineBuilder builder,
            
                final PortletPageResolver pageResolver,
            
                @InjectService("RequestGlobals")
                final RequestGlobals requestGlobals,
            
                @InjectService("PortletRequestGlobals")
                final PortletRequestGlobals portletRequestGlobals,

                @InjectService("RequestHandler")
                final RequestHandler handler,
        
                @Primary
                final SessionPersistedObjectAnalyzer analyzer) {
        
        PortletActionRequestHandler terminator = new 
PortletActionRequestHandler()
        {
            public boolean service(String portletName, ActionRequest request, 
ActionResponse response)
                        throws IOException
            {
                        String pageName = "";
                        if (isStateChange(request)) {
                                        pageName = 
pageResolver.resolve(portletName, request);
                        } else {
                                        pageName = 
request.getParameter(PortletConstants.PORTLET_PAGE);
                                    int querySeparator = pageName.indexOf('?');
                                    if (querySeparator != -1) {
                                        pageName = pageName.substring(0, 
querySeparator);
                                    }
                        }
                
                        Request portletRequest = new 
PortletRequestImpl(request, pageName, analyzer);
                        Response portletResponse = new 
PortletActionResponseImpl(response, portletRequest);
                
                        requestGlobals.storeRequestResponse(portletRequest, 
portletResponse);
                        portletRequestGlobals.store(request, response);

                return handler.service(portletRequest, portletResponse);
            }
            
            /**
             * Returns true if the portlet mode or the window state has changed 
since
             * (if both are null, the state has not changed).
             * The values stored previously (during an action request) are 
compared to
             * the current values.
             */
            private boolean isStateChange(ActionRequest actionRequest)
            {
                        String mode = 
actionRequest.getParameter(PortletConstants.PORTLET_MODE);
                String windowState = 
actionRequest.getParameter(PortletConstants.WINDOW_STATE);

                return (mode != null || windowState != null) 
                   && !(actionRequest.getPortletMode().toString().equals(mode) 
                         && 
actionRequest.getWindowState().toString().equals(windowState));
            }
        };

        return builder.build(logger,
                        PortletActionRequestHandler.class,
            PortletActionRequestFilter.class,
            configuration,
            terminator);
    }
    
    public PortletRenderRequestHandler buildPortletRenderRequestHandler(Logger 
logger,
            
                    List<PortletRenderRequestFilter> configuration,
                
                    @InjectService("PipelineBuilder")
                    PipelineBuilder builder,
            
                    final PortletPageResolver pageResolver,
            
                    @InjectService("RequestGlobals")
                    final RequestGlobals requestGlobals,
            
                    @InjectService("PortletRequestGlobals")
                    final PortletRequestGlobals portletRequestGlobals,

                    @InjectService("RequestHandler")
                    final RequestHandler handler,

                    @Primary
                    final SessionPersistedObjectAnalyzer analyzer) {
        
        PortletRenderRequestHandler terminator = new 
PortletRenderRequestHandler()
        {
            public boolean service(String portletName, RenderRequest request, 
RenderResponse response)
                    throws IOException
            {
                        String pageName = 
request.getParameter(PortletConstants.PORTLET_PAGE);

                        if (pageName == null || pageName.equals("")) {
                                        pageName = 
pageResolver.resolve(portletName, request);
                        }
                            int querySeparator = pageName.indexOf('?');
                            if (querySeparator != -1) {
                                pageName = pageName.substring(0, 
querySeparator);
                            }
                        Request portletRequest = new 
PortletRequestImpl(request, pageName, analyzer);
                        Response portletResponse = new 
PortletRenderResponseImpl(response);
                
                        requestGlobals.storeRequestResponse(portletRequest, 
portletResponse);
                        portletRequestGlobals.store(request, response);

                return handler.service(portletRequest, portletResponse);
            }
        };

        return builder.build(
                        logger,
            PortletRenderRequestHandler.class,
            PortletRenderRequestFilter.class,
            configuration,
            terminator);
    }
    
    public PortletResourceRequestHandler 
buildPortletResourceRequestHandler(Logger logger,
            
                    List<PortletResourceRequestFilter> configuration,
                
                    @InjectService("PipelineBuilder")
                    PipelineBuilder builder,
            
                    final PortletPageResolver pageResolver,
            
                    @InjectService("RequestGlobals")
                    final RequestGlobals requestGlobals,
            
                    @InjectService("PortletRequestGlobals")
                    final PortletRequestGlobals portletRequestGlobals,

                    @InjectService("RequestHandler")
                    final RequestHandler handler,

                    @Primary
                    final SessionPersistedObjectAnalyzer analyzer) {
        
        PortletResourceRequestHandler terminator = new 
PortletResourceRequestHandler() {
                        
                        public boolean service(String portletName, 
ResourceRequest request,
                                        ResourceResponse response) throws 
IOException, PortletException {
                                String pageName = 
request.getParameter(PortletConstants.PORTLET_PAGE);

                        if (pageName == null || pageName.equals("")) {
                                        pageName = 
pageResolver.resolve(portletName, request);
                        }
                    int querySeparator = pageName.indexOf('?');
                    if (querySeparator != -1) {
                        pageName = pageName.substring(0, querySeparator);
                    }
                        Request portletRequest = new 
PortletRequestImpl(request, pageName, analyzer);
                        Response portletResponse = new 
PortletResourceResponseImpl(response);
            
                        requestGlobals.storeRequestResponse(portletRequest, 
portletResponse);
                        portletRequestGlobals.store(request, response);

            return handler.service(portletRequest, portletResponse);
                        }
                };
                
        return builder.build(
                        logger,
            PortletResourceRequestHandler.class,
            PortletResourceRequestFilter.class,
            configuration,
            terminator);
        
    }
    
    public void 
contributePortletActionRequestHandler(OrderedConfiguration<PortletActionRequestFilter>
 configuration, Logger logger) {
        logger.info("contributePortletActionRequestHandler");
    }

    public PageResponseRenderer buildPortletPageResponseRenderer(
                
                @PortletInterfaceProvider
                PortletRequest portletRequest,
                
                @ActionInterfaceProvider
                ActionResponse actionResponse,
                
                MarkupWriterFactory markupWriterFactory,
                        
                PageMarkupRenderer markupRenderer,
                        
                PageContentTypeAnalyzer pageContentTypeAnalyzer,
                        
                Response response,
                
            ContextValueEncoder contextValueEncoder,
            
            ContextPathEncoder contextPathEncoder)
    {
                return new PortletPageResponseRendererImpl(portletRequest, 
actionResponse, 
                                markupWriterFactory, markupRenderer, 
pageContentTypeAnalyzer, response, contextValueEncoder, contextPathEncoder);
    }
    
    public CookieSource buildPortletCookieSource()
    {
        return new CookieSource()
        {
            public Cookie[] getCookies()
            {
                return new Cookie[0];
            }

        };
    }
    
    public void contributeAliasOverrides(
                Configuration<AliasContribution> configuration,
                
                @InjectService("PortletCookieSource")
            final CookieSource cookieSource,
                
                @InjectService("PortletPageResponseRenderer")
                final PageResponseRenderer pageResponseRenderer,
                
                @InjectService("ComponentEventLinkEncoder")
            final ComponentEventLinkEncoder componentEventLinkEncoder)
    {
        configuration.add(AliasContribution.create(CookieSource.class, 
cookieSource));
        configuration.add(AliasContribution.create(PageResponseRenderer.class, 
pageResponseRenderer));
    }
    
    public void contributeServiceOverride(MappedConfiguration<Class, Object> 
configuration,
                                          @Local ComponentEventLinkEncoder 
componentEventLinkEncoder) {
        configuration.add(ComponentEventLinkEncoder.class, 
componentEventLinkEncoder);
    }
}
package org.apache.tapestry5.portlet.services;

import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

import org.apache.tapestry5.ValueEncoder;
import org.apache.tapestry5.annotations.ActivationRequestParameter;
import org.apache.tapestry5.internal.portlet.RequestParameterExtractor;
import org.apache.tapestry5.internal.portlet.services.RequestParameterContext;
import org.apache.tapestry5.internal.services.ComponentClassCache;
import org.apache.tapestry5.model.MutableComponentModel;
import org.apache.tapestry5.services.ClassTransformation;
import org.apache.tapestry5.services.ComponentClassTransformWorker;
import org.apache.tapestry5.services.ComponentMethodAdvice;
import org.apache.tapestry5.services.ComponentMethodInvocation;
import org.apache.tapestry5.services.ComponentSource;
import org.apache.tapestry5.services.FieldAccess;
import org.apache.tapestry5.services.TransformField;
import org.apache.tapestry5.services.TransformMethodSignature;
import org.apache.tapestry5.services.ValueEncoderSource;

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();
    }

}
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to