001package org.apache.turbine.util.uri;
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
024import java.util.Iterator;
025
026import org.apache.commons.lang.StringUtils;
027import org.apache.fulcrum.parser.ParameterParser;
028import org.apache.turbine.util.RunData;
029import org.apache.turbine.util.ServerData;
030
031/**
032 * This class allows you to keep all the information needed for a single
033 * link at one place. It keeps your query data, path info, the server
034 * scheme, name, port and the script path. It is tuned for usage with a
035 * Template System e.g. Velocity.
036 *
037 * If you must generate a Turbine Link in a Template System, use this class.
038 *
039 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
040 * @version $Id: TemplateURI.java 1071038 2011-02-15 20:32:27Z tv $
041 */
042
043public class TemplateURI
044        extends TurbineURI
045{
046    /**
047     * Empty C'tor. Uses Turbine.getDefaultServerData().
048     *
049     */
050    public TemplateURI()
051    {
052        super();
053    }
054
055    /**
056     * Constructor with a RunData object
057     *
058     * @param runData A RunData object
059     */
060    public TemplateURI(RunData runData)
061    {
062        super(runData);
063    }
064
065    /**
066     * Constructor, set explicit redirection
067     *
068     * @param runData A RunData object
069     * @param redirect True if redirection allowed.
070     */
071    public TemplateURI(RunData runData, boolean redirect)
072    {
073        super(runData, redirect);
074    }
075
076    /**
077     * Constructor, set Template
078     *
079     * @param runData A RunData object
080     * @param template A Template Name
081     */
082    public TemplateURI(RunData runData, String template)
083    {
084        super(runData);
085        setTemplate(template);
086    }
087
088    /**
089     * Constructor, set Template, set explicit redirection
090     *
091     * @param runData A RunData object
092     * @param template A Template Name
093     * @param redirect True if redirection allowed.
094     */
095    public TemplateURI(RunData runData, String template, boolean redirect)
096    {
097        super(runData, redirect);
098        setTemplate(template);
099    }
100
101    /**
102     * Constructor, set Template and Action
103     *
104     * @param runData A RunData object
105     * @param template A Template Name
106     * @param action An Action Name
107     */
108    public TemplateURI(RunData runData, String template, String action)
109    {
110        this(runData, template);
111        setAction(action);
112    }
113
114    /**
115     * Constructor, set Template and Action, set explicit redirection
116     *
117     * @param runData A RunData object
118     * @param template A Template Name
119     * @param action An Action Name
120     * @param redirect True if redirection allowed.
121     */
122    public TemplateURI(RunData runData, String template, String action, boolean redirect)
123    {
124        this(runData, template, redirect);
125        setAction(action);
126    }
127
128    /**
129     * Constructor with a ServerData object
130     *
131     * @param serverData A ServerData object
132     */
133    public TemplateURI(ServerData serverData)
134    {
135        super(serverData);
136    }
137
138    /**
139     * Constructor, set explicit redirection
140     *
141     * @param serverData A ServerData object
142     * @param redirect True if redirection allowed.
143     */
144    public TemplateURI(ServerData serverData, boolean redirect)
145    {
146        super(serverData, redirect);
147    }
148
149    /**
150     * Constructor, set Template
151     *
152     * @param serverData A ServerData object
153     * @param template A Template Name
154     */
155    public TemplateURI(ServerData serverData, String template)
156    {
157        super(serverData);
158        setTemplate(template);
159    }
160
161    /**
162     * Constructor, set Template, set explicit redirection
163     *
164     * @param serverData A ServerData object
165     * @param template A Template Name
166     * @param redirect True if redirection allowed.
167     */
168    public TemplateURI(ServerData serverData, String template, boolean redirect)
169    {
170        super(serverData, redirect);
171        setTemplate(template);
172    }
173
174    /**
175     * Constructor, set Template and Action
176     *
177     * @param serverData A ServerData object
178     * @param template A Template Name
179     * @param action An Action Name
180     */
181    public TemplateURI(ServerData serverData, String template, String action)
182    {
183        this(serverData, template);
184        setAction(action);
185    }
186
187    /**
188     * Constructor, set Template and Action, set explicit redirection
189     *
190     * @param serverData A ServerData object
191     * @param template A Template Name
192     * @param action An Action Name
193     * @param redirect True if redirection allowed.
194     */
195    public TemplateURI(ServerData serverData, String template, String action, boolean redirect)
196    {
197        this(serverData, template, redirect);
198        setAction(action);
199    }
200
201    /**
202     * Constructor, user Turbine.getDefaultServerData(), set Template and Action
203     *
204     * @param template A Template Name
205     * @param action An Action Name
206     */
207    public TemplateURI(String template, String action)
208    {
209        this();
210        setTemplate(template);
211        setAction(action);
212    }
213
214    /**
215     * Sets the template= value for this URL.
216     *
217     * By default it adds the information to the path_info instead
218     * of the query data. An empty value (null or "") cleans out
219     * an existing value.
220     *
221     * @param template A String with the template value.
222     */
223    public void setTemplate(String template)
224    {
225        if(StringUtils.isNotEmpty(template))
226        {
227            add(PATH_INFO, CGI_TEMPLATE_PARAM, template);
228        }
229        else
230        {
231            clearTemplate();
232        }
233    }
234
235    /**
236     * Clears the template= value for this URL.
237     *
238     */
239    public void clearTemplate()
240    {
241        removePathInfo(CGI_TEMPLATE_PARAM);
242    }
243
244    /*
245     * ========================================================================
246     *
247     * Protected / Private Methods
248     *
249     * ========================================================================
250     *
251     */
252
253    /**
254     * Method for a quick way to add all the parameters in a
255     * ParameterParser.
256     *
257     * <p>If the type is P (0), then add name/value to the pathInfo
258     * hashtable.
259     *
260     * <p>If the type is Q (1), then add name/value to the queryData
261     * hashtable.
262     *
263     * @param type Type of insertion (@see #add(char type, String name, String value))
264     * @param pp A ParameterParser.
265     */
266    protected void add(int type,
267            ParameterParser pp)
268    {
269        for(Iterator<?> it = pp.keySet().iterator(); it.hasNext();)
270        {
271            String key = (String) it.next();
272
273            if (!key.equalsIgnoreCase(CGI_ACTION_PARAM) &&
274                    !key.equalsIgnoreCase(CGI_SCREEN_PARAM) &&
275                    !key.equalsIgnoreCase(CGI_TEMPLATE_PARAM))
276            {
277                String[] values = pp.getStrings(key);
278                if(values != null)
279                {
280                    for (int i = 0; i < values.length; i++)
281                    {
282                        add(type, key, values[i]);
283                    }
284                }
285                else
286                {
287                    add(type, key, "");
288                }
289            }
290        }
291    }
292}