001    package org.apache.turbine.services.servlet;
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.io.InputStream;
025    import java.net.MalformedURLException;
026    import java.net.URL;
027    
028    import javax.servlet.ServletConfig;
029    import javax.servlet.ServletContext;
030    
031    import org.apache.commons.logging.Log;
032    import org.apache.commons.logging.LogFactory;
033    import org.apache.turbine.Turbine;
034    import org.apache.turbine.services.TurbineBaseService;
035    import org.apache.turbine.util.ServletUtils;
036    
037    /**
038     * <p>This class provides a context service when the application
039     * is run in a ServletContainer. It is mainly a wrapper around
040     * the ServletContext API.</p>
041     * <p>This class requires Servlet API 2.1 or better.</p>
042     *
043     * @author <a href="mailto:burton@apache.org">Kevin A. Burton</a>
044     * @author <a href="mailto:raphael@apache.org">Raphaƫl Luta</a>
045     * @author <a href="mailto:ekkerbj@netscape.net">Jeff Brekke</a>
046     * @author <a href="mailto:sgala@hisitech.com">Santiago Gala</a>
047     * @author <a href="mailto:jvanzyl@periapt.com.com">Jason van Zyl</a>
048     * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a>
049     * @version $Id: TurbineServletService.java 1071044 2011-02-15 20:47:31Z tv $
050     */
051    public class TurbineServletService
052            extends TurbineBaseService implements ServletService
053    {
054        /** Logging */
055        private static Log log = LogFactory.getLog(TurbineServletService.class);
056    
057        /** The servlet context for this servlet */
058        private ServletContext servletContext = null;
059    
060        /** The servlet configuration for this servlet */
061        private ServletConfig servletConfig = null;
062    
063        /**
064         * Load all configured components and initialize them. This is
065         * a zero parameter variant which queries the Turbine Servlet
066         * for its config.
067         */
068        @Override
069        public void init()
070        {
071            this.servletConfig = Turbine.getTurbineServletConfig();
072            try
073            {
074                this.servletContext = servletConfig.getServletContext();
075    
076                log.debug("Initializing with ServletConfig");
077            }
078            catch (Exception e)
079            {
080                log.error("Cannot initialize TurbineServletService.", e);
081            }
082            setInit(true);
083        }
084    
085        /**
086         * Returns an URL object for a given URI string.
087         * This URI is considered relative to the context.
088         *
089         * @see javax.servlet.ServletContext#getResource
090         * @param uri the URI to resolve as an URL
091         * @return an URL object or null is the uri is malformed or
092         * can't be resolved
093         */
094        public URL getResource(String uri)
095        {
096            if (servletContext == null)
097            {
098                return null;
099            }
100    
101            URL url = null;
102    
103            try
104            {
105                url = getServletContext().getResource(uri);
106                // work-around for Websphere 3.52
107                if (url != null && url.toString().startsWith("classloader:"))
108                {
109                    url = new URL("file:" + url.toString().substring(12));
110                }
111                else if (url == null)
112                {
113                    url = new URL("file:" + getServletContext().getRealPath(uri));
114                }
115            }
116            catch (MalformedURLException e)
117            {
118                //if the URL is wrong, return null
119            }
120    
121            return url;
122        }
123    
124        /**
125         * Same as getResource except that it returns an InputStream
126         *
127         * @see javax.servlet.ServletContext#getResourceAsStream
128         * @param uri the URI to resolve
129         * @return an InputStream on the URI content or null
130         */
131        public InputStream getResourceAsStream(String uri)
132        {
133            if (servletContext == null)
134            {
135                return null;
136            }
137    
138            InputStream is = null;
139            is = servletContext.getResourceAsStream(uri);
140            return is;
141        }
142    
143        /**
144         * Returns the complete filesystem path for a
145         * given URI
146         *
147         * @see javax.servlet.ServletContext#getRealPath
148         * @param uri the URI to resolve
149         * @return the full system path of this URI
150         */
151        public String getRealPath(String uri)
152        {
153            if (getServletContext() == null || uri == null)
154            {
155                return null;
156            }
157            else
158            {
159                return getServletContext().getRealPath(uri);
160            }
161        }
162    
163        /**
164         * Returns the servlet config used by this
165         * Turbine web application.
166         *
167         * @return turbine servlet config
168         */
169        public ServletConfig getServletConfig()
170        {
171            return servletConfig;
172        }
173    
174        /**
175         * Returns the servlet context used by this
176         * Turbine web application.
177         *
178         * @return turbine servlet context
179         */
180        public ServletContext getServletContext()
181        {
182            return servletContext;
183        }
184    
185        /**
186         * Returns the server scheme for this
187         * Turbine application. This will either
188         * be http or https.
189         *
190         * @return String
191         */
192        public String getServerScheme()
193        {
194            return Turbine.getServerScheme();
195        }
196    
197        /**
198         * Returns the server name that this
199         * Turbine application is running
200         * on.
201         *
202         * @return String
203         */
204        public String getServerName()
205        {
206            return Turbine.getServerName();
207        }
208    
209        /**
210         * Returns the port that this Turbine
211         * application is running through
212         * on the server.
213         *
214         * @return String
215         */
216        public String getServerPort()
217        {
218            return Turbine.getServerPort();
219        }
220    
221        /**
222         * Returns the context path for this
223         * Turbine application.
224         *
225         * @return String
226         */
227        public String getContextPath()
228        {
229            return Turbine.getContextPath();
230        }
231    
232        /**
233         * Expands a string that points to a relative path or path list,
234         * leaving it as an absolute path based on the servlet context.
235         * It will return null if the text is empty or the config object
236         * is null.
237         *
238         * @param path The String containing a path or path list.
239         * @return A String with the expanded path or path list.
240         */
241        public String expandRelative(String path)
242        {
243            return ServletUtils.expandRelative(getServletConfig(), path);
244        }
245    }