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.resolver;
016
017 import org.apache.hivemind.Resource;
018 import org.apache.tapestry.INamespace;
019 import org.apache.tapestry.engine.ISpecificationSource;
020 import org.apache.tapestry.spec.IComponentSpecification;
021
022 /**
023 * Base class for resolving a {@link org.apache.tapestry.spec.IComponentSpecification}for a
024 * particular page or component, within a specified {@link org.apache.tapestry.INamespace}. In some
025 * cases, a search is necessary.
026 *
027 * @author Howard Lewis Ship
028 * @since 3.0
029 */
030
031 public class AbstractSpecificationResolver
032 {
033 /** Set by resolve() */
034 private INamespace _namespace;
035
036 /** Set by resolve() */
037 private IComponentSpecification _specification;
038
039 /** Set by container */
040 private ISpecificationSource _specificationSource;
041
042 private ISpecificationResolverDelegate _delegate;
043
044 private String _applicationId;
045
046 private Resource _contextRoot;
047
048 /** Initialized in initializeService() */
049
050 private Resource _webInfLocation;
051
052 private Resource _webInfAppLocation;
053
054 public void initializeService()
055 {
056 _webInfLocation = _contextRoot.getRelativeResource("WEB-INF/");
057
058 _webInfAppLocation = _webInfLocation.getRelativeResource(_applicationId + "/");
059 }
060
061 /**
062 * Returns the {@link ISpecificationResolverDelegate}instance registered in the application
063 * specification as extension {@link Tapestry#SPECIFICATION_RESOLVER_DELEGATE_EXTENSION_NAME},
064 * or null if no such extension exists.
065 */
066
067 public ISpecificationResolverDelegate getDelegate()
068 {
069 return _delegate;
070 }
071
072 /**
073 * Returns the location of the servlet, within the servlet context.
074 */
075
076 protected Resource getContextRoot()
077 {
078 return _contextRoot;
079 }
080
081 public void setContextRoot(Resource contextRoot)
082 {
083 _contextRoot = contextRoot;
084 }
085
086 /**
087 * Invoked in subclasses to identify the resolved namespace.
088 */
089
090 protected void setNamespace(INamespace namespace)
091 {
092 _namespace = namespace;
093 }
094
095 /**
096 * Returns the resolve namespace.
097 */
098
099 public INamespace getNamespace()
100 {
101 return _namespace;
102 }
103
104 /**
105 * Returns the specification source for the running application.
106 */
107
108 protected ISpecificationSource getSpecificationSource()
109 {
110 return _specificationSource;
111 }
112
113 /**
114 * Returns the location of /WEB-INF/, in the servlet context.
115 */
116
117 protected Resource getWebInfLocation()
118 {
119 return _webInfLocation;
120 }
121
122 /**
123 * Returns the location of the application-specific subdirectory, under /WEB-INF/, in the
124 * servlet context.
125 */
126
127 protected Resource getWebInfAppLocation()
128 {
129 return _webInfAppLocation;
130 }
131
132 /**
133 * Returns the resolved specification.
134 */
135
136 public IComponentSpecification getSpecification()
137 {
138 return _specification;
139 }
140
141 /**
142 * Invoked in subclass to set the final specification the initial inputs are resolved to.
143 */
144
145 protected void setSpecification(IComponentSpecification specification)
146 {
147 _specification = specification;
148 }
149
150 /**
151 * Clears the namespace and specification properties.
152 */
153
154 protected void reset()
155 {
156 _namespace = null;
157 _specification = null;
158 }
159
160 /** @since 4.0 */
161 public void setDelegate(ISpecificationResolverDelegate delegate)
162 {
163 _delegate = delegate;
164 }
165
166 /** @since 4.0 */
167 public void setApplicationId(String applicationId)
168 {
169 _applicationId = applicationId;
170 }
171
172 /** @since 4.0 */
173 public void setSpecificationSource(ISpecificationSource source)
174 {
175 _specificationSource = source;
176 }
177
178 /** @since 4.0 */
179 protected INamespace getApplicationNamespace()
180 {
181 return _specificationSource.getApplicationNamespace();
182 }
183
184 /** @since 4.0 */
185 protected INamespace getFrameworkNamespace()
186 {
187 return _specificationSource.getFrameworkNamespace();
188 }
189
190 /**
191 * @since 4.0
192 */
193 protected INamespace findNamespaceForId(INamespace containerNamespace, String libraryId)
194 {
195 if (libraryId == null)
196 return containerNamespace;
197
198 if (libraryId.equals(INamespace.APPLICATION_NAMESPACE))
199 return getApplicationNamespace();
200
201 if (libraryId.equals(INamespace.FRAMEWORK_NAMESPACE))
202 return getFrameworkNamespace();
203
204 return containerNamespace.getChildNamespace(libraryId);
205 }
206 }