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.desktop.impl;
018:
019: import java.io.IOException;
020:
021: import org.apache.commons.logging.Log;
022: import org.apache.commons.logging.LogFactory;
023: import org.apache.jetspeed.desktop.JetspeedDesktop;
024: import org.apache.jetspeed.pipeline.PipelineException;
025: import org.apache.jetspeed.pipeline.valve.AbstractValve;
026: import org.apache.jetspeed.pipeline.valve.ValveContext;
027: import org.apache.jetspeed.request.RequestContext;
028:
029: /**
030: * DesktopEncoderRedirect Valve
031: *
032: * if request parameter encoder=desktop is NOT defined,
033: * redirect to same url with /desktop pipeline,
034: * otherwise,
035: * just invoke next valve
036: *
037: * Used by the /render pipeline (desktop-render-pipeline) to allow
038: * render requests that are not initiated via desktop javascript code to result
039: * in a page level navigation to the /desktop pipeline with the correct portlet rendering
040: * indicated in the original url. The encoder=desktop request parameter
041: * is used by desktop javascript code to indicate that the request is an "official"
042: * desktop ajax request.
043: *
044: * @author <a href="mailto:smilek@apache.org">Steve Milek</a>
045: * @version $Id: $
046: */
047: public class DesktopEncoderRedirectValveImpl extends AbstractValve {
048: protected Log log = LogFactory
049: .getLog(DesktopEncoderRedirectValveImpl.class);
050:
051: private String desktopPipelinePath = null;
052: private String desktopRenderPipelinePath = null;
053:
054: public DesktopEncoderRedirectValveImpl(String desktopPipelinePath,
055: String desktopRenderPipelinePath) {
056: if (desktopPipelinePath == null
057: || desktopPipelinePath.length() == 0)
058: desktopPipelinePath = JetspeedDesktop.DEFAULT_DESKTOP_PIPELINE_PATH;
059: if (desktopPipelinePath.charAt(0) != '/')
060: desktopPipelinePath = "/" + desktopPipelinePath;
061: if (desktopPipelinePath
062: .charAt(desktopPipelinePath.length() - 1) != '/')
063: desktopPipelinePath = desktopPipelinePath + "/";
064:
065: if (desktopRenderPipelinePath == null
066: || desktopRenderPipelinePath.length() == 0)
067: desktopRenderPipelinePath = JetspeedDesktop.DEFAULT_DESKTOP_RENDER_PIPELINE_PATH;
068: if (desktopRenderPipelinePath.charAt(0) != '/')
069: desktopRenderPipelinePath = "/" + desktopRenderPipelinePath;
070: if (desktopRenderPipelinePath.charAt(desktopRenderPipelinePath
071: .length() - 1) != '/')
072: desktopRenderPipelinePath = desktopRenderPipelinePath + "/";
073:
074: this .desktopPipelinePath = desktopPipelinePath;
075: this .desktopRenderPipelinePath = desktopRenderPipelinePath;
076: }
077:
078: public void invoke(RequestContext request, ValveContext context)
079: throws PipelineException {
080: try {
081: if (request.getPortalURL() == null) {
082: String encoding = request
083: .getRequestParameter(JetspeedDesktop.DESKTOP_ENCODER_REQUEST_PARAMETER);
084: if (encoding == null
085: || !encoding
086: .equals(JetspeedDesktop.DESKTOP_ENCODER_REQUEST_PARAMETER_VALUE)) {
087: // redirect to page url with render encoding
088: try {
089: String queryString = request.getRequest()
090: .getQueryString();
091: String location = request.getRequest()
092: .getRequestURI();
093: if (queryString != null
094: && queryString.length() > 0)
095: location += "?" + queryString;
096: location = location.replaceAll(
097: this .desktopRenderPipelinePath,
098: this .desktopPipelinePath);
099: //log.info( "DesktopEncoderRedirectValveImpl redirecting request-uri=" + request.getRequest().getRequestURI() + " location=" + location );
100: request.getResponse().sendRedirect(location);
101: } catch (IOException ioe) {
102: }
103: return;
104: }
105: }
106: } catch (Exception e) {
107: throw new PipelineException(e);
108: }
109: // Pass control to the next Valve in the Pipeline
110: context.invokeNext(request);
111: }
112:
113: public String toString() {
114: return "DesktopValve";
115: }
116: }
|