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 }