001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.jetspeed.container;
018:
019: import javax.servlet.http.HttpServletResponse;
020:
021: import org.apache.jetspeed.request.RequestContext;
022: import org.apache.jetspeed.container.state.MutableNavigationalState;
023: import org.apache.jetspeed.om.page.Page;
024: import org.apache.jetspeed.om.common.portlet.MutablePortletEntity;
025: import org.apache.jetspeed.om.window.impl.PortletWindowImpl;
026: import org.apache.jetspeed.pipeline.PipelineException;
027: import org.apache.jetspeed.pipeline.valve.AbstractValve;
028: import org.apache.jetspeed.pipeline.valve.ValveContext;
029: import org.apache.pluto.om.window.PortletWindow;
030:
031: /**
032: * Determines the action window in the current request If no action was found,
033: * sets the request context's action window to null denoting that there is no
034: * targeted action for this request otherwise the target action window is set
035: * here
036: *
037: * @author <a href="mailto:david@bluesunrise.com">David Sean Taylor</a>
038: * @version $Id: ContainerValve.java 589933 2007-10-30 01:51:50Z woonsan $
039: */
040: public class ContainerValve extends AbstractValve {
041: public void invoke(RequestContext request, ValveContext context)
042: throws PipelineException {
043: try {
044: // create a session if not already created, necessary for Tomcat 5
045: request.getRequest().getSession(true);
046:
047: // PortletContainerServices.prepare();
048: MutableNavigationalState state = (MutableNavigationalState) request
049: .getPortalURL().getNavigationalState();
050: if (state != null) {
051: boolean redirect = false;
052: Page page = request.getPage();
053: PortletWindow window = state
054: .getPortletWindowOfResource();
055: if (window != null
056: && page.getFragmentById(window.getId()
057: .toString()) == null) {
058: // target window doesn't exists anymore or the target page is not accessible (anymore)
059: request.getResponse().sendError(
060: HttpServletResponse.SC_NOT_FOUND);
061: return;
062: }
063: window = state.getPortletWindowOfAction();
064: if (window != null
065: && page.getFragmentById(window.getId()
066: .toString()) == null) {
067: if (!((PortletWindowImpl) window)
068: .isInstantlyRendered()) {
069: // target window doesn't exists anymore or the target page is not accessible (anymore)
070: // remove any navigational state for the window
071: state.removeState(window);
072: // as this is an action request which cannot be handled, perform a direct redirect after sync state (for the other windows)
073: redirect = true;
074: }
075: }
076: window = state.getMaximizedWindow();
077: if (window != null
078: && page.getFragmentById(window.getId()
079: .toString()) == null) {
080: // target window doesn't exists anymore or the target page is not accessible (anymore)
081: // remove any navigational state for the window
082: state.removeState(window);
083: }
084: state.sync(request);
085: if (redirect) {
086: // target page doesn't contain (anymore) the targeted windowOfAction
087: // this can also occur when a session is expired and the target page isn't accessible for the anonymous user
088: // Redirect the user back to the target page (with possibly retaining the other windows navigational state).
089: request.getResponse().sendRedirect(
090: request.getPortalURL().getPortalURL());
091: return;
092: }
093:
094: PortletWindow actionWindow = state
095: .getPortletWindowOfAction();
096: if (null == actionWindow) {
097: // set to null to denote that no action was requested
098: request.setActionWindow(null);
099: } else {
100: // set the requested action window
101: request.setActionWindow(actionWindow);
102: }
103: }
104: } catch (Exception e) {
105: throw new PipelineException(e);
106: }
107: // Pass control to the next Valve in the Pipeline
108: context.invokeNext(request);
109: }
110:
111: public String toString() {
112: return "ContainerValve";
113: }
114: }
|