Package org.gatein.wsrp.consumer.handlers

Source Code of org.gatein.wsrp.consumer.handlers.ResourceHandler

/*
* JBoss, a division of Red Hat
* Copyright 2010, Red Hat Middleware, LLC, and individual
* contributors as indicated by the @authors tag. See the
* copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.gatein.wsrp.consumer.handlers;

import org.gatein.common.util.ParameterValidation;
import org.gatein.pc.api.StateString;
import org.gatein.pc.api.invocation.ResourceInvocation;
import org.gatein.pc.api.spi.InstanceContext;
import org.gatein.pc.api.state.AccessMode;
import org.gatein.wsrp.WSRPRewritingConstants;
import org.gatein.wsrp.WSRPTypeFactory;
import org.gatein.wsrp.WSRPUtils;
import org.gatein.wsrp.consumer.spi.WSRPConsumerSPI;
import org.gatein.wsrp.spec.v2.WSRP2RewritingConstants;
import org.oasis.wsrp.v2.Extension;
import org.oasis.wsrp.v2.GetResource;
import org.oasis.wsrp.v2.MarkupParams;
import org.oasis.wsrp.v2.PortletContext;
import org.oasis.wsrp.v2.ResourceContext;
import org.oasis.wsrp.v2.ResourceParams;
import org.oasis.wsrp.v2.ResourceResponse;
import org.oasis.wsrp.v2.RuntimeContext;
import org.oasis.wsrp.v2.SessionContext;

import javax.xml.ws.Holder;
import java.util.List;
import java.util.Map;

/**
* @author <a href="mailto:chris.laprun@jboss.com">Chris Laprun</a>
* @version $Revision$
*/
public class ResourceHandler extends MimeResponseHandler<ResourceInvocation, GetResource, ResourceResponse, ResourceContext>
{

   public ResourceHandler(WSRPConsumerSPI consumer)
   {
      super(consumer);
   }

   @Override
   protected SessionContext getSessionContextFrom(ResourceResponse resourceResponse)
   {
      return resourceResponse.getSessionContext();
   }

   @Override
   protected ResourceContext getMimeResponseFrom(ResourceResponse resourceResponse)
   {
      return resourceResponse.getResourceContext();
   }

   /*@Override
   protected void updateUserContext(GetResource request, UserContext userContext)
   {
      request.setUserContext(userContext);
   }

   @Override
   protected void updateRegistrationContext(GetResource request) throws PortletInvokerException
   {
      request.setRegistrationContext(consumer.getRegistrationContext());
   }*/

   @Override
   protected RuntimeContext getRuntimeContextFrom(GetResource request)
   {
      return request.getRuntimeContext();
   }

   @Override
   protected GetResource prepareRequest(RequestPrecursor<ResourceInvocation> requestPrecursor, ResourceInvocation invocation)
   {
      /*String resourceInvocationId = invocation.getResourceId();
      Map<String, String> resourceMap = WSRPResourceURL.decodeResource(resourceInvocationId);
      String resourceId = resourceMap.get(WSRP2RewritingConstants.RESOURCE_ID);*/

      // get the resource id from the invocation attributes so that we don't need to redecode the original encoded resource id
      String resourceId = (String)invocation.getAttribute(WSRP2RewritingConstants.RESOURCE_ID);

      // if we didn't get a resource id, that means we need to use a resource URL, so get it and use it as the resource id
      // note that the InvocationDispatcher should properly handle which handler will be used so this should be safe
      // if we had a resource id anyway but are using WSRP 1, we need to reset it to use the URL instead
      if (resourceId == null || !consumer.isUsingWSRP2())
      {
         resourceId = (String)invocation.getAttribute(WSRPRewritingConstants.RESOURCE_URL);
      }

      PortletContext portletContext = requestPrecursor.getPortletContext();

      // since we actually extracted the data into MarkupParams in the RequestPrecursor, use that! :)
      MarkupParams params = requestPrecursor.getMarkupParams();

      // access mode
      InstanceContext instanceContext = invocation.getInstanceContext();
      ParameterValidation.throwIllegalArgExceptionIfNull(instanceContext, "instance context");
      AccessMode accessMode = instanceContext.getAccessMode();
      ParameterValidation.throwIllegalArgExceptionIfNull(accessMode, "access mode");
      if (debug)
      {
         log.debug("Portlet is requesting " + accessMode + " access mode");
      }

      // if the portlet didn't request a resource id, use the fake one:
      if (ParameterValidation.isNullOrEmpty(resourceId))
      {
         throw new IllegalArgumentException("GetResource needs a valid resource id.");
      }

      // Create ResourceParams
      ResourceParams resourceParams = WSRPTypeFactory.createResourceParams(params.isSecureClientCommunication(),
         params.getLocales(), params.getMimeTypes(), params.getMode(), params.getWindowState(), resourceId,
         WSRPUtils.getStateChangeFromAccessMode(accessMode));

      resourceParams.setNavigationalContext(params.getNavigationalContext());
      resourceParams.setClientData(params.getClientData());
      resourceParams.setResourceCacheability(WSRPUtils.getResourceCacheabilityFromCacheLevel(invocation.getCacheLevel()));

      for (Map.Entry<String, String[]> entry : invocation.getForm().entrySet())
      {
         String name = entry.getKey();
         for (String value : entry.getValue())
         {
            resourceParams.getFormParameters().add(WSRPTypeFactory.createNamedString(name, value));
         }
      }

      StateString resourceState = invocation.getResourceState();
      if (resourceState != null)
      {
         String state = resourceState.getStringValue();
         if (!StateString.JBPNS_PREFIX.equals(state))  // fix-me: see JBPORTAL-900
         {
            resourceParams.setResourceState(state);
         }
      }

      return WSRPTypeFactory.createGetResource(requestPrecursor.getRegistrationContext(), portletContext,
         requestPrecursor.getRuntimeContext(), requestPrecursor.getUserContext(), resourceParams);
   }

   @Override
   protected ResourceResponse performRequest(GetResource request) throws Exception
   {
      Holder<SessionContext> sessionContextHolder = new Holder<SessionContext>();
      Holder<ResourceContext> resourceContextHolder = new Holder<ResourceContext>();
      Holder<PortletContext> portletContextHolder = new Holder<PortletContext>(request.getPortletContext());

      consumer.getMarkupService().getResource(request.getRegistrationContext(), portletContextHolder, request.getRuntimeContext(),
         request.getUserContext(), request.getResourceParams(), resourceContextHolder, sessionContextHolder, new Holder<List<Extension>>());

      ResourceResponse resourceResponse = WSRPTypeFactory.createResourceResponse(resourceContextHolder.value);
      resourceResponse.setPortletContext(portletContextHolder.value);
      resourceResponse.setSessionContext(sessionContextHolder.value);
      return resourceResponse;
   }

}
TOP

Related Classes of org.gatein.wsrp.consumer.handlers.ResourceHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.