001    package 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    
024    import org.apache.turbine.util.RunData;
025    import org.apache.turbine.util.ServerData;
026    
027    /**
028     * This class can convert a simple link into a turbine relative
029     * URL. It should be used to convert references for images, style
030     * sheets and similar references.
031     *
032     * The resulting links have no query data or path info. If you need
033     * this, use TurbineURI or TemplateURI.
034     *
035     * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
036     * @version $Id: DataURI.java 938645 2010-04-27 20:57:51Z tv $
037     *
038     */
039    
040    public class DataURI
041            extends BaseURI
042            implements URIConstants
043    {
044        /**
045         * Empty C'tor. Uses Turbine.getDefaultServerData().
046         *
047         */
048        public DataURI()
049        {
050            super();
051        }
052    
053        /**
054         * Constructor with a RunData object
055         *
056         * @param runData A RunData object
057         */
058        public DataURI(RunData runData)
059        {
060            super(runData);
061        }
062    
063        /**
064         * Constructor, set explicit redirection
065         *
066         * @param runData A RunData object
067         * @param redirect True if redirection allowed.
068         */
069        public DataURI(RunData runData, boolean redirect)
070        {
071            super(runData, redirect);
072        }
073    
074        /**
075         * Constructor with a ServerData object
076         *
077         * @param serverData A ServerData object
078         */
079        public DataURI(ServerData serverData)
080        {
081            super(serverData);
082        }
083    
084        /**
085         * Constructor, set explicit redirection
086         *
087         * @param serverData A ServerData object
088         * @param redirect True if redirection allowed.
089         */
090        public DataURI(ServerData serverData, boolean redirect)
091        {
092            super(serverData, redirect);
093        }
094    
095    
096        /**
097         * Content Tool wants to be able to turn the encoding
098         * of the servlet container off. After calling this method,
099         * the encoding will not happen any longer.
100         */
101        public void clearResponse()
102        {
103            setResponse(null);
104        }
105    
106        /**
107         * Builds the URL with all of the data URL-encoded as well as
108         * encoded using HttpServletResponse.encodeUrl(). The resulting
109         * URL is absolute; it starts with http/https...
110         *
111         * <p>
112         * <code><pre>
113         * TurbineURI tui = new TurbineURI (data, "UserScreen");
114         * tui.addPathInfo("user","jon");
115         * tui.getAbsoluteLink();
116         * </pre></code>
117         *
118         *  The above call to getAbsoluteLink() would return the String:
119         *
120         * <p>
121         * http://www.server.com/servlets/Turbine/screen/UserScreen/user/jon
122         *
123         * @return A String with the built URL.
124         */
125        public String getAbsoluteLink()
126        {
127            StringBuffer output = new StringBuffer();
128    
129            getSchemeAndPort(output);
130            getContextAndScript(output);
131    
132            if (hasReference())
133            {
134                output.append('#');
135                output.append(getReference());
136            }
137    
138            //
139            // Encode Response does all the fixup for the Servlet Container
140            //
141            return encodeResponse(output.toString());
142        }
143    
144        /**
145         * Builds the URL with all of the data URL-encoded as well as
146         * encoded using HttpServletResponse.encodeUrl(). The resulting
147         * URL is relative to the webserver root.
148         *
149         * <p>
150         * <code><pre>
151         * TurbineURI tui = new TurbineURI (data, "UserScreen");
152         * tui.addPathInfo("user","jon");
153         * tui.getRelativeLink();
154         * </pre></code>
155         *
156         *  The above call to getRelativeLink() would return the String:
157         *
158         * <p>
159         * /servlets/Turbine/screen/UserScreen/user/jon
160         *
161         * @return A String with the built URL.
162         */
163        public String getRelativeLink()
164        {
165            StringBuffer output = new StringBuffer();
166    
167            getContextAndScript(output);
168    
169            if (hasReference())
170            {
171                output.append('#');
172                output.append(getReference());
173            }
174    
175            //
176            // Encode Response does all the fixup for the Servlet Container
177            //
178            return encodeResponse(output.toString());
179        }
180    
181        /**
182         * toString() simply calls getAbsoluteLink. You should not use this in your
183         * code unless you have to. Use getAbsoluteLink.
184         *
185         * @return This URI as a String
186         *
187         */
188        public String toString()
189        {
190            return getAbsoluteLink();
191        }
192    }