blob: 0b8e23442dd36e50034ad2679a2f514e928093b1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.driver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.pluto.container.PortletContainer;
import org.apache.pluto.container.PortletContainerException;
import org.apache.pluto.driver.core.PortalRequestContext;
import org.apache.pluto.driver.core.PortletWindowImpl;
import org.apache.pluto.driver.services.portal.PortletWindowConfig;
import org.apache.pluto.driver.url.PortalURL;
import javax.portlet.PortletException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* The controller filter used to drive static portlet pages (see
* <a href="http://portals.apache.org/pluto/faq.html#simple-embed">
* http://portals.apache.org/pluto/faq.html#simple-embed</a> in Pluto FAQ).
*
* @version 1.0
* @since March 28, 2006
*/
public class PortalDriverFilter implements Filter {
/**
* Internal Logger.
*/
private static final Logger LOG = LoggerFactory.getLogger(PortalDriverFilter.class);
/**
* The Portal Driver sServlet Context
*/
private ServletContext servletContext;
/**
* The portlet container to which we
* will forward all portlet requests.
*/
protected PortletContainer container;
public ServletContext getServletContext() {
return servletContext;
}
/**
* Initialize the Portal Driver.
* This method retrieves the portlet container instance
* from the servlet context scope.
*
* @see org.apache.pluto.container.PortletContainer
*/
public void init(FilterConfig filterConfig) throws ServletException {
servletContext = filterConfig.getServletContext();
container = (PortletContainer) servletContext.getAttribute(
AttributeKeys.PORTLET_CONTAINER);
}
/**
* Release the container and the context.
*/
public void destroy() {
container = null;
servletContext = null;
}
/**
* Intercept requests in order to perform any actions.
*
* @param request the incoming ServletRequest.
* @param response the incoming ServletResponse.
* @throws javax.servlet.ServletException if an internal error occurs.
* @throws java.io.IOException if an error occurs writing to the response.
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
HttpServletRequest req = (HttpServletRequest) request;
// Since we must support a 2.3 environment, we can't use
// filter dispatchers. B/C of this, we make sure we haven't
// allready processed this request. No infinite loops for us!!!!
if (PortalRequestContext.getContext(req) == null) {
boolean actionRequestProcessed =
doPortletPrepare(req, (HttpServletResponse) response);
if (actionRequestProcessed) {
return;
}
}
String path = req.getServletPath();
int idx = path.indexOf(".jsp");
if (!path.endsWith(".jsp") && idx > 0) {
String realPath = path.substring(0, idx + ".jsp".length());
if (realPath.startsWith(req.getContextPath())) {
realPath = realPath.substring(req.getContextPath().length());
}
LOG.info("Forwarding to realPath: " + realPath);
request.getRequestDispatcher(realPath).forward(request, response);
return;
}
}
filterChain.doFilter(request, response);
}
/**
* Perform Portlet Preparation
*
* @param request
* @param response
* @throws java.io.IOException if an io exception occurs
* @throws javax.servlet.ServletException if a servlet exception occurs
* @return A boolean flag indicating whether or not an action request was
* processed. A value of true indicates than an action request was
* processed while a value of false indicates that an action request was
* NOT processed.
*/
public boolean doPortletPrepare(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
boolean actionRequestProcessed = false;
PortalRequestContext portalRequestContext =
new PortalRequestContext(getServletContext(), request, response);
PortalURL portalURL = portalRequestContext.getRequestedPortalURL();
String actionWindowId = portalURL.getActionWindow();
PortletWindowConfig actionWindowConfig =
actionWindowId == null
? null
: PortletWindowConfig.fromId(actionWindowId);
// Action window config will only exist if there is an action request.
if (actionWindowConfig != null) {
PortletWindowImpl portletWindow = new PortletWindowImpl(container,
actionWindowConfig, portalURL);
if (LOG.isDebugEnabled()) {
LOG.debug("Processing action request for window: "
+ portletWindow.getId().getStringId());
}
try {
container.doAction(portletWindow, request, response);
} catch (PortletContainerException ex) {
throw new ServletException(ex);
} catch (PortletException ex) {
throw new ServletException(ex);
}
if (LOG.isDebugEnabled()) {
LOG.debug("Action request processed.\n\n");
}
actionRequestProcessed = true;
}
if (LOG.isDebugEnabled()) {
LOG.debug("Render Path: " + portalURL.getRenderPath());
LOG.debug("Servlet Path: " + portalURL.getServletPath());
}
return actionRequestProcessed;
}
}