/* * Copyright 2000-2001,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.jetspeed.util.template; import java.lang.reflect.Method; import org.apache.turbine.util.RunData; import org.apache.turbine.util.DynamicURI; import org.apache.turbine.services.pull.ApplicationTool; import org.apache.jetspeed.services.resources.JetspeedResources; /** * A customized version of the DynamicURI for linking to non-servlet * webapp resources. * * @author <a href="mailto:raphael@apache.org">Rapha謖 Luta</a> * @author <a href="mailto:sgala@apache.org">Santiago Gala</a> * @version $Id: ContentTemplateLink.java,v 1.7 2004/02/23 03:20:45 jford Exp $ */ public class ContentTemplateLink extends DynamicURI implements ApplicationTool { /** the servlet 2.2+ webapp context */ private String contextPath; /** the webapp relative URI to find */ private String pathToContent; /** decide whether we should output full external URIs or simple absolute URIs */ private boolean useExternalForm = false; /** Empty Constructor for introspection */ public ContentTemplateLink () { } /** Constructor */ public ContentTemplateLink (RunData data) { super(data); initForceSecure(); initContextPath(data); } /** * This will initialise a ContentTemplateLink object that was * constructed with the default constructor (ApplicationTool * method). * * @param data assumed to be a RunData object */ public void init(Object data) { super.init((RunData)data); initForceSecure(); initContextPath(data); } /** Inits the contextPath for this object * * @param data the RunData to use */ protected void initContextPath(Object data) { try { Class runDataClass = RunData.class; Method meth = runDataClass.getDeclaredMethod("getContextPath", null); contextPath = (String)meth.invoke(data, null); } catch (Exception e) { /* * Ignore a NoSuchMethodException because it means we are * using Servlet API 2.0. Make sure scriptName is not * null. */ contextPath = ""; } } /** * Inits the force secure setting. */ protected void initForceSecure() { // check if we need to force to a secure (https) link if (JetspeedResources.getBoolean("force.ssl", false)) { setSecure(); } } /** * Refresh method - does nothing */ public void refresh() { // empty } /** * Specify the link should be expressed in external form (ie * with protocol, server name and server port) * @return a self reference for easy link construction in templates */ public ContentTemplateLink getExternal() { this.useExternalForm = true; return this; } /** * Specify the link should be expressed in absolute form (ie * only a URI and not a full URL) * @return a self reference for easy link construction in templates */ public ContentTemplateLink getAbsolute() { this.useExternalForm = false; return this; } /** * Specify the webapp resource to link to. * * @param pathToContent the path to resource, assumed to be relative to the * web application context * @return a self reference for easy link construction in templates */ public ContentTemplateLink setURI(String pathToContent) { this.pathToContent = pathToContent; return this; } /** * Returns the URI. After rendering the URI, it clears the * pathInfo and QueryString portions of the DynamicURI. * * @return A String with the URI in either external or absolute form */ public String toString() { StringBuffer sb = new StringBuffer(); // we want external URL form so include protocol and server name if (useExternalForm) { String scheme = getServerScheme(); sb.append ( getServerScheme() ); //http sb.append ("://"); sb.append (getServerName()); //www.foo.com int port = getServerPort(); if( ( "http".equals( scheme ) && port != 80 ) || ( "https".equals( scheme ) && port != 443 ) ) { //only for non-default ports, to preserve session tracking. sb.append (":"); sb.append ( port ); //port webserver running on (8080 for TDK) } } //the context for tomcat adds a / so no need to add another sb.append (contextPath); //the tomcat context sb.append ("/"); if (pathToContent!=null) sb.append (pathToContent); // This was added to allow multilple $link variables in one // template. removePathInfo(); removeQueryData(); this.pathToContent=null; return (sb.toString()); } }