001    package org.apache.turbine.util;
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 java.util.StringTokenizer;
025    
026    import javax.servlet.ServletConfig;
027    import javax.servlet.ServletContext;
028    
029    import org.apache.commons.lang.StringUtils;
030    import org.apache.turbine.Turbine;
031    
032    /**
033     * This is where common Servlet manipulation routines should go.
034     *
035     * @author <a href="mailto:gonzalo.diethelm@sonda.com">Gonzalo Diethelm</a>
036     * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
037     * @version $Id: ServletUtils.java 1073174 2011-02-21 22:18:45Z tv $
038     */
039    public class ServletUtils
040    {
041        /**
042         * Expands a string that points to a relative path or path list,
043         * leaving it as an absolute path based on the servlet context.
044         * It will return null if the text is empty or the config object
045         * is null.
046         *
047         * @param config The ServletConfig.
048         * @param text The String containing a path or path list.
049         * @return A String with the expanded path or path list.
050         */
051        public static String expandRelative(ServletConfig config,
052                                            String text)
053        {
054            if (StringUtils.isEmpty(text))
055            {
056                return text;
057            }
058    
059            if (config == null)
060            {
061                return null;
062            }
063    
064            // attempt to make it relative
065            if (!text.startsWith("/") && !text.startsWith("./")
066                    && !text.startsWith("\\") && !text.startsWith(".\\"))
067            {
068                StringBuffer sb = new StringBuffer();
069                sb.append("./");
070                sb.append(text);
071                text = sb.toString();
072            }
073    
074            ServletContext context = config.getServletContext();
075            String base = context.getRealPath("/");
076    
077            base = (StringUtils.isEmpty(base))
078                ? config.getInitParameter(Turbine.BASEDIR_KEY)
079                : base;
080    
081            if (StringUtils.isEmpty(base))
082            {
083                return text;
084            }
085    
086            String separator = System.getProperty("path.separator");
087    
088            StringTokenizer tokenizer = new StringTokenizer(text,
089                    separator);
090            StringBuffer buffer = new StringBuffer();
091            while (tokenizer.hasMoreTokens())
092            {
093                buffer.append(base).append(tokenizer.nextToken());
094                if (tokenizer.hasMoreTokens())
095                {
096                    buffer.append(separator);
097                }
098            }
099            return buffer.toString();
100        }
101    }