    001package 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
    025import org.apache.commons.configuration.Configuration;
    026import org.apache.turbine.Turbine;
    027import org.apache.turbine.pipeline.PipelineData;
    028import org.apache.turbine.services.pull.ApplicationTool;
    029import org.apache.turbine.util.RunData;
    030import 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 1706239 2015-10-01 13:18:35Z tv $
    048 */
    049
    050public 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 initialize a ContentTool object that was
    101     * constructed with the default constructor (ApplicationTool
    102     * method).
    103     *
    104     * @param data assumed to be a PipelineData object
    105     */
    106    @Override
    107    public void init(Object data)
    108    {
    109        // we just blithely cast to RunData as if another object
    110        // or null is passed in we'll throw an appropriate runtime
    111        // exception.
    112        if (data instanceof PipelineData)
    113        {
    114            PipelineData pipelineData = (PipelineData) data;
    115            RunData runData = (RunData)pipelineData;
    116            dataURI = new DataURI(runData);
    117        }
    118        else
    119        {
    120            dataURI = new DataURI((RunData) data);
    121
    122        }
    123
    124        Configuration conf =
    125                Turbine.getConfiguration().subset(CONTENT_TOOL_PREFIX);
    126
    127        if (conf != null)
    128        {
    129            wantRelative = conf.getBoolean(CONTENT_TOOL_RELATIVE_KEY,
    130                    CONTENT_TOOL_RELATIVE_DEFAULT);
    131
    132            wantEncoding = conf.getBoolean(CONTENT_TOOL_ENCODING_KEY,
    133                    CONTENT_TOOL_ENCODING_DEFAULT);
    134        }
    135
    136        if (!wantEncoding)
    137        {
    138            dataURI.clearResponse();
    139        }
    140    }
    141
    142    /**
    143     * Refresh method - does nothing
    144     */
    145    @Override
    146    public void refresh()
    147    {
    148        // empty
    149    }
    150
    151    /**
    152     * Returns the Turbine URI of a given Path
    153     *
    154     * @param path The path to translate
    155     *
    156     * @return Turbine translated absolute path
    157     */
    158    public String getURI(String path)
    159    {
    160        dataURI.setScriptName(path);
    161
    162        return wantRelative ?
    163                dataURI.getRelativeLink() : dataURI.getAbsoluteLink();
    164    }
    165
    166    /**
    167     * Returns the Turbine URI of a given Path. The
    168     * result is always an absolute path starting with
    169     * the server scheme (http/https).
    170     *
    171     * @param path The path to translate
    172     *
    173     * @return Turbine translated absolute path
    174     */
    175    public String getAbsoluteURI(String path)
    176    {
    177        dataURI.setScriptName(path);
    178
    179        return dataURI.getAbsoluteLink();
    180    }
    181
    182    /**
    183     * Returns the Turbine URI of a given Path. The
    184     * result is always relative to the context of
    185     * the application.
    186     *
    187     * @param path The path to translate
    188     *
    189     * @return Turbine translated absolute path
    190     */
    191    public String getRelativeURI(String path)
    192    {
    193        dataURI.setScriptName(path);
    194
    195        return dataURI.getRelativeLink();
    196    }
    197
    198}