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 * or null if no such extension exists. 064 */ 065 066 public ISpecificationResolverDelegate getDelegate() 067 { 068 return _delegate; 069 } 070 071 /** 072 * Returns the location of the servlet, within the servlet context. 073 */ 074 075 protected Resource getContextRoot() 076 { 077 return _contextRoot; 078 } 079 080 public void setContextRoot(Resource contextRoot) 081 { 082 _contextRoot = contextRoot; 083 } 084 085 /** 086 * Invoked in subclasses to identify the resolved namespace. 087 */ 088 089 protected void setNamespace(INamespace namespace) 090 { 091 _namespace = namespace; 092 } 093 094 /** 095 * Returns the resolve namespace. 096 */ 097 098 public INamespace getNamespace() 099 { 100 return _namespace; 101 } 102 103 /** 104 * Returns the specification source for the running application. 105 */ 106 107 protected ISpecificationSource getSpecificationSource() 108 { 109 return _specificationSource; 110 } 111 112 /** 113 * Returns the location of /WEB-INF/, in the servlet context. 114 */ 115 116 protected Resource getWebInfLocation() 117 { 118 return _webInfLocation; 119 } 120 121 /** 122 * Returns the location of the application-specific subdirectory, under /WEB-INF/, in the 123 * servlet context. 124 */ 125 126 protected Resource getWebInfAppLocation() 127 { 128 return _webInfAppLocation; 129 } 130 131 /** 132 * Returns the resolved specification. 133 */ 134 135 public IComponentSpecification getSpecification() 136 { 137 return _specification; 138 } 139 140 /** 141 * Invoked in subclass to set the final specification the initial inputs are resolved to. 142 */ 143 144 protected void setSpecification(IComponentSpecification specification) 145 { 146 _specification = specification; 147 } 148 149 /** 150 * Clears the namespace and specification properties. 151 */ 152 153 protected void reset() 154 { 155 _namespace = null; 156 _specification = null; 157 } 158 159 /** @since 4.0 */ 160 public void setDelegate(ISpecificationResolverDelegate delegate) 161 { 162 _delegate = delegate; 163 } 164 165 /** @since 4.0 */ 166 public void setApplicationId(String applicationId) 167 { 168 _applicationId = applicationId; 169 } 170 171 /** @since 4.0 */ 172 public void setSpecificationSource(ISpecificationSource source) 173 { 174 _specificationSource = source; 175 } 176 177 /** @since 4.0 */ 178 protected INamespace getApplicationNamespace() 179 { 180 return _specificationSource.getApplicationNamespace(); 181 } 182 183 /** @since 4.0 */ 184 protected INamespace getFrameworkNamespace() 185 { 186 return _specificationSource.getFrameworkNamespace(); 187 } 188 189 /** 190 * @since 4.0 191 */ 192 protected INamespace findNamespaceForId(INamespace containerNamespace, String libraryId) 193 { 194 if (libraryId == null) 195 return containerNamespace; 196 197 if (libraryId.equals(INamespace.APPLICATION_NAMESPACE)) 198 return getApplicationNamespace(); 199 200 if (libraryId.equals(INamespace.FRAMEWORK_NAMESPACE)) 201 return getFrameworkNamespace(); 202 203 return containerNamespace.getChildNamespace(libraryId); 204 } 205 }