final RuntimeContext runtimeContext = getRuntimeContext();
WSRP2ExceptionFactory.throwMissingParametersIfValueIsMissing(runtimeContext, "RuntimeContext", contextName);
checkForSessionIDs(runtimeContext);
// get parameters
final MimeRequest params = getParams();
WSRP2ExceptionFactory.throwMissingParametersIfValueIsMissing(params, "MarkupParams", contextName);
// get portlet handle
PortletContext wsrpPC = getPortletContext();
WSRP2ExceptionFactory.throwMissingParametersIfValueIsMissing(wsrpPC, "PortletContext", contextName);
org.gatein.pc.api.PortletContext portletContext = WSRPUtils.convertToPortalPortletContext(wsrpPC);
// check locales
final List<String> desiredLocales = params.getLocales();
for (String locale : desiredLocales)
{
try
{
WSRPUtils.getLocale(locale);
}
catch (IllegalArgumentException e)
{
throw WSRP2ExceptionFactory.throwWSException(UnsupportedLocale.class, e.getLocalizedMessage(), null);
}
}
// retrieve the portlet
try
{
// calls RegistrationLocal.setRegistration so no need to here
portlet = producer.getPortletWith(portletContext, registration);
}
catch (PortletInvokerException e)
{
throw WSRP2ExceptionFactory.throwWSException(OperationFailed.class, "Could not retrieve portlet '" + portletContext + "'", e);
}
// get portlet description for the desired portlet...
portletDescription = producer.getPortletDescription(wsrpPC, null, registration);
if (Boolean.TRUE.equals(portletDescription.isUsesMethodGet()))
{
throw WSRP2ExceptionFactory.throwWSException(OperationFailed.class, "Portlets using GET method in forms are not currently supported.", null);
}
List<MarkupType> markupTypes = portletDescription.getMarkupTypes();
// based on the markup parameters and portlet description generate the most appropriate markup request
markupRequest = createMarkupRequestFrom(markupTypes, params, portlet);
// prepare information for invocation
final org.oasis.wsrp.v2.UserContext wsrpUserContext = getUserContext();
checkUserContext(wsrpUserContext);
SecurityContext securityContext = createSecurityContext(params, runtimeContext, wsrpUserContext);
final MediaType mediaType = createMediaType(markupRequest);
PortalContext portalContext = createPortalContext(params, markupRequest);
UserContext userContext = createUserContext(wsrpUserContext, markupRequest.getLocale(), desiredLocales);
String portletInstanceKey = runtimeContext.getPortletInstanceKey();
instanceContext = createInstanceContext(portletContext, getAccessMode(), portletInstanceKey);
WindowContext windowContext = createWindowContext(portletContext.getId(), runtimeContext);
// prepare the invocation context
WSRPPortletInvocationContext context = new WSRPPortletInvocationContext(mediaType, securityContext, portalContext, userContext, instanceContext, windowContext);
// and use it to initialize the invocation that will send to the PortletInvoker
PortletInvocation invocation = initInvocation(context);
// mark the invocation as coming from WSRP, useful for bridges and/or web framework
final HashMap<String, Object> attributes = new HashMap<String, Object>();
attributes.put(WSRPConstants.FROM_WSRP_ATTRIBUTE_NAME, Boolean.TRUE);
invocation.setRequestAttributes(attributes);
invocation.setTarget(portlet.getContext());
invocation.setWindowState(WSRPUtils.getJSR168WindowStateFromWSRPName(markupRequest.getWindowState()));
invocation.setMode(WSRPUtils.getJSR168PortletModeFromWSRPName(markupRequest.getMode()));
NavigationalContext navigationalContext = params.getNavigationalContext();
if (navigationalContext != null)
{
StateString navigationalState = createNavigationalState(navigationalContext.getOpaqueValue());
invocation.setNavigationalState(navigationalState);