1 package org.apache.turbine.services.servlet;
2
3
4 /*
5 * Licensed to the Apache Software Foundation (ASF) under one
6 * or more contributor license agreements. See the NOTICE file
7 * distributed with this work for additional information
8 * regarding copyright ownership. The ASF licenses this file
9 * to you under the Apache License, Version 2.0 (the
10 * "License"); you may not use this file except in compliance
11 * with the License. You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing,
16 * software distributed under the License is distributed on an
17 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18 * KIND, either express or implied. See the License for the
19 * specific language governing permissions and limitations
20 * under the License.
21 */
22
23
24 import java.io.InputStream;
25 import java.net.MalformedURLException;
26 import java.net.URL;
27
28 import javax.servlet.ServletConfig;
29 import javax.servlet.ServletContext;
30
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.apache.turbine.Turbine;
34 import org.apache.turbine.services.TurbineBaseService;
35 import org.apache.turbine.util.ServletUtils;
36
37 /**
38 * <p>This class provides a context service when the application
39 * is run in a ServletContainer. It is mainly a wrapper around
40 * the ServletContext API.</p>
41 * <p>This class requires Servlet API 2.1 or better.</p>
42 *
43 * @author <a href="mailto:burton@apache.org">Kevin A. Burton</a>
44 * @author <a href="mailto:raphael@apache.org">Raphaƫl Luta</a>
45 * @author <a href="mailto:ekkerbj@netscape.net">Jeff Brekke</a>
46 * @author <a href="mailto:sgala@hisitech.com">Santiago Gala</a>
47 * @author <a href="mailto:jvanzyl@periapt.com.com">Jason van Zyl</a>
48 * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a>
49 * @version $Id: TurbineServletService.java 1071044 2011-02-15 20:47:31Z tv $
50 */
51 public class TurbineServletService
52 extends TurbineBaseService implements ServletService
53 {
54 /** Logging */
55 private static Log log = LogFactory.getLog(TurbineServletService.class);
56
57 /** The servlet context for this servlet */
58 private ServletContext servletContext = null;
59
60 /** The servlet configuration for this servlet */
61 private ServletConfig servletConfig = null;
62
63 /**
64 * Load all configured components and initialize them. This is
65 * a zero parameter variant which queries the Turbine Servlet
66 * for its config.
67 */
68 @Override
69 public void init()
70 {
71 this.servletConfig = Turbine.getTurbineServletConfig();
72 try
73 {
74 this.servletContext = servletConfig.getServletContext();
75
76 log.debug("Initializing with ServletConfig");
77 }
78 catch (Exception e)
79 {
80 log.error("Cannot initialize TurbineServletService.", e);
81 }
82 setInit(true);
83 }
84
85 /**
86 * Returns an URL object for a given URI string.
87 * This URI is considered relative to the context.
88 *
89 * @see javax.servlet.ServletContext#getResource
90 * @param uri the URI to resolve as an URL
91 * @return an URL object or null is the uri is malformed or
92 * can't be resolved
93 */
94 public URL getResource(String uri)
95 {
96 if (servletContext == null)
97 {
98 return null;
99 }
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 }