blob: ac4cafef04828574f5fc07726d7c32af8767499f [file] [log] [blame]
// Copyright 2004 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.tapestry.resolver;
import org.apache.tapestry.IEngine;
import org.apache.tapestry.INamespace;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.IResourceLocation;
import org.apache.tapestry.Tapestry;
import org.apache.tapestry.engine.ISpecificationSource;
import org.apache.tapestry.spec.IApplicationSpecification;
import org.apache.tapestry.spec.IComponentSpecification;
import org.apache.tapestry.util.pool.IPoolable;
/**
* Base class for resolving a {@link org.apache.tapestry.spec.IComponentSpecification}
* for a particular page or component, within a specified
* {@link org.apache.tapestry.INamespace}. In some cases, a search is necessary.
*
* @author Howard Lewis Ship
* @version $Id$
* @since 3.0
*
**/
public class AbstractSpecificationResolver implements IPoolable
{
private ISpecificationSource _specificationSource;
private INamespace _namespace;
private IComponentSpecification _specification;
private IResourceLocation _applicationRootLocation;
private IResourceLocation _webInfLocation;
private IResourceLocation _webInfAppLocation;
private ISpecificationResolverDelegate _delegate;
public AbstractSpecificationResolver(IRequestCycle cycle)
{
IEngine engine = cycle.getEngine();
_specificationSource = engine.getSpecificationSource();
_applicationRootLocation = Tapestry.getApplicationRootLocation(cycle);
String servletName =
cycle.getRequestContext().getServlet().getServletConfig().getServletName();
_webInfLocation = _applicationRootLocation.getRelativeLocation("/WEB-INF/");
_webInfAppLocation = _webInfLocation.getRelativeLocation(servletName + "/");
IApplicationSpecification specification = engine.getSpecification();
if (specification.checkExtension(Tapestry.SPECIFICATION_RESOLVER_DELEGATE_EXTENSION_NAME))
_delegate =
(ISpecificationResolverDelegate) engine.getSpecification().getExtension(
Tapestry.SPECIFICATION_RESOLVER_DELEGATE_EXTENSION_NAME,
ISpecificationResolverDelegate.class);
else
_delegate = NullSpecificationResolverDelegate.getSharedInstance();
}
/**
* Returns the {@link ISpecificationResolverDelegate} instance registered
* in the application specification as extension
* {@link Tapestry#SPECIFICATION_RESOLVER_DELEGATE_EXTENSION_NAME},
* or null if no such extension exists.
*
**/
public ISpecificationResolverDelegate getDelegate()
{
return _delegate;
}
/**
* Returns the location of the servlet, within the
* servlet context.
*
**/
protected IResourceLocation getApplicationRootLocation()
{
return _applicationRootLocation;
}
/**
* Invoked in subclasses to identify the resolved namespace.
*
**/
protected void setNamespace(INamespace namespace)
{
_namespace = namespace;
}
/**
* Returns the resolve namespace.
*
**/
public INamespace getNamespace()
{
return _namespace;
}
/**
* Returns the specification source for the running application.
*
**/
protected ISpecificationSource getSpecificationSource()
{
return _specificationSource;
}
/**
* Returns the location of /WEB-INF/, in the servlet context.
*
**/
protected IResourceLocation getWebInfLocation()
{
return _webInfLocation;
}
/**
* Returns the location of the application-specific subdirectory, under
* /WEB-INF/, in the servlet context.
*
**/
protected IResourceLocation getWebInfAppLocation()
{
return _webInfAppLocation;
}
/**
* Returns the resolved specification.
*
**/
public IComponentSpecification getSpecification()
{
return _specification;
}
/**
* Invoked in subclass to set the final specification the initial
* inputs are resolved to.
*
**/
protected void setSpecification(IComponentSpecification specification)
{
_specification = specification;
}
/**
* Clears the namespace, specification and simpleName properties.
*
**/
protected void reset()
{
_namespace = null;
_specification = null;
}
/** Does nothing. */
public void discardFromPool()
{
}
/** Invokes {@link #reset()} */
public void resetForPool()
{
reset();
}
}