blob: 56ad017e00d2c9b642fe57ddc053f4e763ba2429 [file] [log] [blame]
/*
* Copyright 2003,2004 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.pluto.internal.impl;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.portlet.PortalContext;
import javax.portlet.PortletMode;
import javax.portlet.PortletModeException;
import javax.portlet.PortletSecurityException;
import javax.portlet.PortletURL;
import javax.portlet.WindowState;
import javax.portlet.WindowStateException;
import org.apache.pluto.PortletContainer;
import org.apache.pluto.descriptors.portlet.PortletDD;
import org.apache.pluto.descriptors.portlet.SupportsDD;
import org.apache.pluto.internal.InternalPortletWindow;
import org.apache.pluto.spi.PortletURLProvider;
import org.apache.pluto.util.StringManager;
import org.apache.pluto.util.StringUtils;
public class PortletURLImpl implements PortletURL {
private static final StringManager EXCEPTIONS =
StringManager.getManager(PortletURLImpl.class.getPackage().getName());
private PortletContainer container;
protected PortletMode mode = null;
protected Map parameters = new HashMap();
protected InternalPortletWindow internalPortletWindow;
protected boolean secure;
protected javax.servlet.http.HttpServletRequest servletRequest;
protected javax.servlet.http.HttpServletResponse servletResponse;
protected WindowState state;
protected boolean isAction;
private PortalContext context;
public PortletURLImpl(PortletContainer container,
InternalPortletWindow internalPortletWindow,
javax.servlet.http.HttpServletRequest servletRequest,
javax.servlet.http.HttpServletResponse servletResponse,
boolean isAction) {
this.container = container;
this.internalPortletWindow = internalPortletWindow;
this.servletRequest = servletRequest;
this.servletResponse = servletResponse;
secure = servletRequest.isSecure();
this.isAction = isAction;
this.context = container.getRequiredContainerServices().getPortalContext();
}
// javax.portlet.PortletURL -------------------------------------------------------------------
public void setWindowState(WindowState windowState)
throws WindowStateException {
if (windowState != null && isWindowStateAllowed(windowState)) {
state = windowState;
return;
}
throw new WindowStateException(
"unsupported Window State used: " + windowState, windowState);
}
public void setPortletMode(PortletMode portletMode)
throws PortletModeException {
// Test and throw exception if not allowed.
isPortletModeAllowed(portletMode);
mode = portletMode;
}
public void setParameter(String name, String value) {
if (name == null || value == null) {
throw new IllegalArgumentException(
"name and value must not be null");
}
parameters.put(name, new String[]{value});
}
public void setParameter(String name, String[] values) {
if (name == null || values == null || values.length == 0) {
throw new IllegalArgumentException(
"name and values must not be null or values be an empty array");
}
parameters.put(name, StringUtils.copy(values));
}
/* (non-Javadoc)
* @see javax.portlet.PortletURL#setParameters(Map)
*/
public void setParameters(Map parameters) {
if (parameters == null) {
throw new IllegalArgumentException("Parameters must not be null.");
}
for (Iterator it = parameters.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
if (!(entry.getKey() instanceof String)) {
throw new IllegalArgumentException(
"Key must not be null and of type java.lang.String.");
}
if (!(entry.getValue() instanceof String[])) {
throw new IllegalArgumentException(
"Value must not be null and of type java.lang.String[].");
}
}
this.parameters = StringUtils.copyParameters(parameters);
}
public void setSecure(boolean secure) throws PortletSecurityException {
this.secure = secure;
}
public String toString() {
StringBuffer url = new StringBuffer(200);
PortletURLProvider urlProvider = container
.getRequiredContainerServices()
.getPortalCallbackService()
.getPortletURLProvider(servletRequest, internalPortletWindow);
if (mode != null) {
urlProvider.setPortletMode(mode);
}
if (state != null) {
urlProvider.setWindowState(state);
}
if (isAction) {
urlProvider.setAction(true);
}
if (secure) {
urlProvider.setSecure();
}
urlProvider.clearParameters();
urlProvider.setParameters(parameters);
url.append(urlProvider.toString());
return url.toString();
}
// --------------------------------------------------------------------------------------------
// additional methods -------------------------------------------------------------------------
public String getParameter(String name) {
return (String) parameters.get(name);
}
public String[] getParameters(String name) {
return (String[]) parameters.get(name);
}
public PortletMode getPortletMode() {
return mode;
}
public WindowState getWindowState() {
return state;
}
// --------------------------------------------------------------------------------------------
private boolean isPortletModeAllowed(PortletMode mode)
throws PortletModeException {
if (mode == null) {
throw new PortletModeException(
EXCEPTIONS.getString("javax.portlet.PortletModeException.null"),
null);
}
return isPortletModeAllowedByPortlet(mode)
&& isPortletModeAllowedByPortal(mode);
}
private boolean isPortletModeAllowedByPortlet(PortletMode mode)
throws PortletModeException {
// PLT 8.1: View Portlet Mode should always be
// supported by a portlet, even if not defined in the descriptor
if (mode.equals(PortletMode.VIEW)) {
return true;
}
PortletDD dd = internalPortletWindow.getPortletEntity()
.getPortletDefinition();
Iterator supports = dd.getSupports().iterator();
while(supports.hasNext()) {
SupportsDD support = (SupportsDD)supports.next();
Iterator modes = support.getPortletModes().iterator();
while(modes.hasNext()) {
String md = (String)modes.next();
if (md.toUpperCase().equals(
mode.toString().toUpperCase())) {
return true;
}
}
}
String message = EXCEPTIONS.getString(
"javax.portlet.PortletModeException.portlet", mode.toString());
throw new PortletModeException(message, mode);
}
private boolean isPortletModeAllowedByPortal(PortletMode mode)
throws PortletModeException {
Enumeration supportedModes = context.getSupportedPortletModes();
while (supportedModes.hasMoreElements()) {
if (supportedModes.nextElement().toString().toUpperCase().equals(
(mode.toString().toUpperCase()))) {
return true;
}
}
String message = EXCEPTIONS.getString(
"javax.portlet.PortletModeException.portal", mode.toString());
throw new PortletModeException(message, mode);
}
private boolean isWindowStateAllowed(WindowState state) {
Enumeration supportedStates = context.getSupportedWindowStates();
while (supportedStates.hasMoreElements()) {
if (supportedStates.nextElement().toString().toUpperCase().equals(
(state.toString().toUpperCase()))) {
return true;
}
}
return false;
}
}