/* * JBoss, a division of Red Hat * Copyright 2008, 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.test.protocol.v2.behaviors; import org.gatein.pc.api.Mode; import org.gatein.pc.api.WindowState; import org.gatein.wsrp.WSRPTypeFactory; import org.gatein.wsrp.api.extensions.UnmarshalledExtension; import org.gatein.wsrp.payload.PayloadUtils; import org.gatein.wsrp.test.protocol.v2.BehaviorRegistry; import org.gatein.wsrp.test.protocol.v2.MarkupBehavior; import org.oasis.wsrp.v2.AccessDenied; import org.oasis.wsrp.v2.Extension; import org.oasis.wsrp.v2.GetMarkup; import org.oasis.wsrp.v2.InconsistentParameters; import org.oasis.wsrp.v2.InteractionParams; import org.oasis.wsrp.v2.InvalidCookie; import org.oasis.wsrp.v2.InvalidHandle; import org.oasis.wsrp.v2.InvalidRegistration; import org.oasis.wsrp.v2.InvalidSession; import org.oasis.wsrp.v2.InvalidUserCategory; import org.oasis.wsrp.v2.MarkupParams; import org.oasis.wsrp.v2.MarkupResponse; import org.oasis.wsrp.v2.MissingParameters; import org.oasis.wsrp.v2.ModifyRegistrationRequired; import org.oasis.wsrp.v2.OperationFailed; import org.oasis.wsrp.v2.PortletContext; import org.oasis.wsrp.v2.PortletStateChangeRequired; import org.oasis.wsrp.v2.RegistrationContext; import org.oasis.wsrp.v2.ResourceSuspended; import org.oasis.wsrp.v2.RuntimeContext; import org.oasis.wsrp.v2.UnsupportedLocale; import org.oasis.wsrp.v2.UnsupportedMimeType; import org.oasis.wsrp.v2.UnsupportedMode; import org.oasis.wsrp.v2.UnsupportedWindowState; import org.oasis.wsrp.v2.UpdateResponse; import org.oasis.wsrp.v2.UserContext; import org.w3c.dom.Element; import org.w3c.dom.Node; import javax.jws.WebParam; import javax.xml.ws.Holder; import java.util.List; /** @author <a href="mailto:chris.laprun@jboss.com">Chris Laprun</a> */ public class ExtensionMarkupBehavior extends MarkupBehavior { public static final String PORTLET_HANDLE = "ExtensionMarkupBehavior"; public static final String SIMPLE_SUCCESS = "Simple Success"; public static final String ELEMENT_SUCCESS = "Element Success"; public static final String FAILURE = "Failure!"; public static final String EXPECTED_REQUEST_EXTENSION_VALUE = "foo"; public static final String EXPECTED_RESPONSE_EXTENSION_VALUE = "bar"; private static Element ELEMENT_RESPONSE; static { /* <ext1:MarkupResponseState xmlns:ext1='urn:bea:wsrp:ext:v1:types'> <ext1:state> bar </ext1:state> </ext1:MarkupResponseState> */ final String namespaceURI = "urn:bea:wsrp:ext:v1:types"; ELEMENT_RESPONSE = PayloadUtils.createElement(namespaceURI, "MarkupResponseState"); Node state = ELEMENT_RESPONSE.getOwnerDocument().createElementNS(namespaceURI, "state"); state = ELEMENT_RESPONSE.appendChild(state); state.setTextContent(ExtensionMarkupBehavior.EXPECTED_RESPONSE_EXTENSION_VALUE); } private static enum Status { simple(SIMPLE_SUCCESS, EXPECTED_RESPONSE_EXTENSION_VALUE), element(ELEMENT_SUCCESS, ELEMENT_RESPONSE), failure(FAILURE, null); private Status(String markup, Object response) { this.markup = markup; this.response = response; } private final String markup; private final Object response; } private Status status; public ExtensionMarkupBehavior(BehaviorRegistry registry) { super(registry); registerHandle(PORTLET_HANDLE); } @Override protected String getMarkupString(Mode mode, WindowState windowState, String navigationalState, GetMarkup getMarkup) throws UnsupportedWindowState, InvalidCookie, InvalidSession, AccessDenied, InconsistentParameters, InvalidHandle, UnsupportedLocale, UnsupportedMode, OperationFailed, MissingParameters, InvalidUserCategory, InvalidRegistration, UnsupportedMimeType { status = Status.failure; getStatus(getMarkup.getMarkupParams().getExtensions()); return status.markup; } @Override public void modifyResponseIfNeeded(MarkupResponse markupResponse) { final List<Extension> extensions = markupResponse.getExtensions(); addExtensions(extensions); } private void addExtensions(List<Extension> extensions) { if (!Status.failure.equals(status)) { extensions.add(WSRPTypeFactory.createExtension(PayloadUtils.marshallExtension(status.response))); } } @Override public void performBlockingInteraction(@WebParam(name = "registrationContext", targetNamespace = "urn:oasis:names:tc:wsrp:v2:types") RegistrationContext registrationContext, @WebParam(name = "portletContext", targetNamespace = "urn:oasis:names:tc:wsrp:v2:types") PortletContext portletContext, @WebParam(name = "runtimeContext", targetNamespace = "urn:oasis:names:tc:wsrp:v2:types") RuntimeContext runtimeContext, @WebParam(name = "userContext", targetNamespace = "urn:oasis:names:tc:wsrp:v2:types") UserContext userContext, @WebParam(name = "markupParams", targetNamespace = "urn:oasis:names:tc:wsrp:v2:types") MarkupParams markupParams, @WebParam(name = "interactionParams", targetNamespace = "urn:oasis:names:tc:wsrp:v2:types") InteractionParams interactionParams, @WebParam(name = "updateResponse", targetNamespace = "urn:oasis:names:tc:wsrp:v2:types", mode = WebParam.Mode.OUT) Holder<UpdateResponse> updateResponse, @WebParam(name = "redirectURL", targetNamespace = "urn:oasis:names:tc:wsrp:v2:types", mode = WebParam.Mode.OUT) Holder<String> redirectURL, @WebParam(name = "extensions", targetNamespace = "urn:oasis:names:tc:wsrp:v2:types", mode = WebParam.Mode.OUT) Holder<List<Extension>> extensions) throws AccessDenied, InconsistentParameters, InvalidCookie, InvalidHandle, InvalidRegistration, InvalidSession, InvalidUserCategory, MissingParameters, ModifyRegistrationRequired, OperationFailed, PortletStateChangeRequired, ResourceSuspended, UnsupportedLocale, UnsupportedMimeType, UnsupportedMode, UnsupportedWindowState { status = Status.failure; getStatus(interactionParams.getExtensions()); UpdateResponse ur = WSRPTypeFactory.createUpdateResponse(); updateResponse.value = ur; final List<Extension> responseExtensions = ur.getExtensions(); addExtensions(responseExtensions); extensions.value = responseExtensions; } private void getStatus(List<Extension> requestExtensions) { if (!requestExtensions.isEmpty()) { final Extension extension = requestExtensions.get(0); final UnmarshalledExtension unmarshalledExtension = PayloadUtils.unmarshallExtension(extension.getAny()); if (unmarshalledExtension.isElement()) { final Element element = (Element)unmarshalledExtension.getValue(); if (EXPECTED_REQUEST_EXTENSION_VALUE.equals(element.getTextContent())) { status = Status.element; } } else { final String foo = (String)unmarshalledExtension.getValue(); if (EXPECTED_REQUEST_EXTENSION_VALUE.equals(foo)) { status = Status.simple; } } } } }