001 // Copyright 2004, 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry.services.impl;
016
017 import javax.servlet.ServletContext;
018 import javax.servlet.http.HttpServlet;
019
020 import org.apache.commons.logging.Log;
021 import org.apache.hivemind.Resource;
022 import org.apache.hivemind.util.ContextResource;
023 import org.apache.tapestry.parse.ISpecificationParser;
024 import org.apache.tapestry.services.ApplicationGlobals;
025 import org.apache.tapestry.services.ApplicationInitializer;
026 import org.apache.tapestry.services.ClasspathResourceFactory;
027 import org.apache.tapestry.spec.ApplicationSpecification;
028 import org.apache.tapestry.spec.IApplicationSpecification;
029 import org.apache.tapestry.web.HttpServletWebActivator;
030
031 /**
032 * Locates the application specification and informs the
033 * {@link org.apache.tapestry.services.ServletInfo}service about it.
034 *
035 * @author Howard Lewis Ship
036 * @since 4.0
037 */
038 public class ApplicationSpecificationInitializer implements ApplicationInitializer
039 {
040 private Log _log;
041
042 private ClasspathResourceFactory _classpathResourceFactory;
043
044 private ApplicationGlobals _globals;
045
046 private ISpecificationParser _parser;
047
048 public static final String APP_SPEC_PATH_PARAM = "org.apache.tapestry.application-specification";
049
050 public void initialize(HttpServlet servlet)
051 {
052 IApplicationSpecification spec = null;
053
054 Resource specResource = findApplicationSpecification(servlet);
055
056 if (specResource == null)
057 {
058 _log.debug(ImplMessages.noApplicationSpecification(servlet));
059
060 spec = constructStandinSpecification(servlet);
061 }
062 else
063 spec = _parser.parseApplicationSpecification(specResource);
064
065 _globals.storeActivator(new HttpServletWebActivator(servlet));
066 _globals.storeSpecification(spec);
067 }
068
069 private Resource findApplicationSpecification(HttpServlet servlet)
070 {
071 String path = servlet.getInitParameter(APP_SPEC_PATH_PARAM);
072
073 if (path != null)
074 return _classpathResourceFactory.newResource(path);
075
076 ServletContext context = servlet.getServletContext();
077 String servletName = servlet.getServletName();
078 String expectedName = servletName + ".application";
079
080 Resource webInfLocation = new ContextResource(context, "/WEB-INF/");
081 Resource webInfAppLocation = webInfLocation.getRelativeResource(servletName + "/");
082
083 Resource result = check(webInfAppLocation, expectedName);
084 if (result != null)
085 return result;
086
087 return check(webInfLocation, expectedName);
088 }
089
090 private Resource check(Resource resource, String name)
091 {
092 Resource result = resource.getRelativeResource(name);
093
094 if (_log.isDebugEnabled())
095 _log.debug("Checking for existence of " + result);
096
097 if (result.getResourceURL() != null)
098 {
099 _log.debug("Found " + result);
100 return result;
101 }
102
103 return null;
104 }
105
106 private IApplicationSpecification constructStandinSpecification(HttpServlet servlet)
107 {
108 String servletName = servlet.getServletName();
109
110 ApplicationSpecification result = new ApplicationSpecification();
111
112 // Pretend the file exists in the most common expected location.
113
114 Resource virtualLocation = new ContextResource(servlet.getServletContext(), "/WEB-INF/"
115 + servletName + ".application");
116
117 result.setSpecificationLocation(virtualLocation);
118
119 result.setName(servletName);
120
121 return result;
122 }
123
124 public void setClasspathResourceFactory(ClasspathResourceFactory factory)
125 {
126 _classpathResourceFactory = factory;
127 }
128
129 public void setLog(Log log)
130 {
131 _log = log;
132 }
133
134 public void setGlobals(ApplicationGlobals globals)
135 {
136 _globals = globals;
137 }
138
139 public void setParser(ISpecificationParser parser)
140 {
141 _parser = parser;
142 }
143
144 }