    001    package org.apache.turbine.services.pull.tools;
    002
    003
    004    /*
    005     * Licensed to the Apache Software Foundation (ASF) under one
    006     * or more contributor license agreements.  See the NOTICE file
    007     * distributed with this work for additional information
    008     * regarding copyright ownership.  The ASF licenses this file
    009     * to you under the Apache License, Version 2.0 (the
    010     * "License"); you may not use this file except in compliance
    011     * with the License.  You may obtain a copy of the License at
    012     *
    013     *   http://www.apache.org/licenses/LICENSE-2.0
    014     *
    015     * Unless required by applicable law or agreed to in writing,
    016     * software distributed under the License is distributed on an
    017     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    018     * KIND, either express or implied.  See the License for the
    019     * specific language governing permissions and limitations
    020     * under the License.
    021     */
    022
    023
    024
    025    import org.apache.commons.configuration.Configuration;
    026    import org.apache.turbine.Turbine;
    027    import org.apache.turbine.pipeline.PipelineData;
    028    import org.apache.turbine.services.pull.ApplicationTool;
    029    import org.apache.turbine.util.RunData;
    030    import org.apache.turbine.util.uri.DataURI;
    031
    032    /**
    033     * Terribly simple tool to translate URIs into Turbine Links.
    034     * Equivalent to URIUtils.getAbsoluteLink() in a pull tool.
    035     *
    036     * <p>
    037     * If you're missing any routines from the 'old' $content tool concerning
    038     * path_info or query data, you did use the wrong tool then. You should've used
    039     * the TemplateLink tool which should be available as "$link" in your context.
    040     * <p>
    041     *
    042     * This is an application pull tool for the template system. You should <b>not</b>
    043     * use it in a normal application!
    044     *
    045     * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
    046     * @author <a href="mailto:peter@courcoux.biz">Peter Courcoux</a>
    047     * @version $Id: ContentTool.java 1078552 2011-03-06 19:58:46Z tv $
    048     */
    049
    050    public class ContentTool
    051        implements ApplicationTool
    052    {
    053        /** Prefix for Parameters for this tool */
    054        public static final String CONTENT_TOOL_PREFIX = "tool.content";
    055
    056        /**
    057         * Should this tool add Container Encoding to the URIs returned?
    058         * True might cause trouble e.g. if you run with Apache HTTP Daemon / Tomcat Combo.
    059         *
    060         * Default is false (like Turbine 2.2)
    061         */
    062        public static final String CONTENT_TOOL_ENCODING_KEY = "want.encoding";
    063
    064        /** Default Value for CONTENT_TOOL_ENCODING_KEY */
    065        public static final boolean CONTENT_TOOL_ENCODING_DEFAULT = false;
    066
    067        /** Should this tool return relative URIs or absolute? Default: Absolute. */
    068        public static final String CONTENT_TOOL_RELATIVE_KEY = "want.relative";
    069
    070        /** Default Value for CONTENT_TOOL_RELATIVE_KEY */
    071        public static final boolean CONTENT_TOOL_RELATIVE_DEFAULT = false;
    072
    073        /** Do we want the container to encode the response? */
    074        boolean wantEncoding = false;
    075
    076        /** Do we want a relative link? */
    077        boolean wantRelative = false;
    078
    079        /** Caches a DataURI object which provides the translation routines */
    080        private DataURI dataURI = null;
    081
    082        /**
    083         * C'tor
    084         */
    085        public ContentTool()
    086        {
    087            // empty
    088        }
    089
    090        /*
    091         * ========================================================================
    092         *
    093         * Application Tool Interface
    094         *
    095         * ========================================================================
    096         *
    097         */
    098
    099        /**
    100         * This will initialise a ContentTool object that was
    101         * constructed with the default constructor (ApplicationTool
    102         * method).
    103         *
    104         * @param data assumed to be a RunData object
    105         */
    106        public void init(Object data)
    107        {
    108            // we just blithely cast to RunData as if another object
    109            // or null is passed in we'll throw an appropriate runtime
    110            // exception.
    111            if (data instanceof PipelineData)
    112            {
    113                PipelineData pipelineData = (PipelineData) data;
    114                RunData runData = (RunData)pipelineData;
    115                dataURI = new DataURI(runData);
    116            }
    117            else
    118            {
    119                dataURI = new DataURI((RunData) data);
    120
    121            }
    122
    123            Configuration conf =
    124                    Turbine.getConfiguration().subset(CONTENT_TOOL_PREFIX);
    125
    126            if (conf != null)
    127            {
    128                wantRelative = conf.getBoolean(CONTENT_TOOL_RELATIVE_KEY,
    129                        CONTENT_TOOL_RELATIVE_DEFAULT);
    130
    131                wantEncoding = conf.getBoolean(CONTENT_TOOL_ENCODING_KEY,
    132                        CONTENT_TOOL_ENCODING_DEFAULT);
    133            }
    134
    135            if (!wantEncoding)
    136            {
    137                dataURI.clearResponse();
    138            }
    139        }
    140
    141        /**
    142         * Refresh method - does nothing
    143         */
    144        public void refresh()
    145        {
    146            // empty
    147        }
    148
    149        /**
    150         * Returns the Turbine URI of a given Path
    151         *
    152         * @param path The path to translate
    153         *
    154         * @return Turbine translated absolute path
    155         */
    156        public String getURI(String path)
    157        {
    158            dataURI.setScriptName(path);
    159
    160            return wantRelative ?
    161                    dataURI.getRelativeLink() : dataURI.getAbsoluteLink();
    162        }
    163
    164        /**
    165         * Returns the Turbine URI of a given Path. The
    166         * result is always an absolute path starting with
    167         * the server scheme (http/https).
    168         *
    169         * @param path The path to translate
    170         *
    171         * @return Turbine translated absolute path
    172         */
    173        public String getAbsoluteURI(String path)
    174        {
    175            dataURI.setScriptName(path);
    176
    177            return dataURI.getAbsoluteLink();
    178        }
    179
    180        /**
    181         * Returns the Turbine URI of a given Path. The
    182         * result is always relative to the context of
    183         * the application.
    184         *
    185         * @param path The path to translate
    186         *
    187         * @return Turbine translated absolute path
    188         */
    189        public String getRelativeURI(String path)
    190        {
    191            dataURI.setScriptName(path);
    192
    193            return dataURI.getRelativeLink();
    194        }
    195
    196    }