You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by andyhot <an...@di.uoa.gr> on 2006/11/01 06:29:26 UTC
Re: ITemplateSourceDelegate
I recently did the exact same thing and just saw your implementation...
Actually, I got a slightly better solution ;)
After finding the page class, you have to create a 'virtual' page spec.
The trick is to set its specificationLocation to be in the classpath,
right in
the package of the class you've found... Something like this:
String fullPath = pageClass.getName().replace('.', '/');
ClasspathResource virtualPage = new ClasspathResource(new
DefaultClassResolver(), fullPath + ".page");
and then
spec.setSpecificationLocation(virtualPage);
No need to create that asset
Pablo Ruggia wrote:
> Thank you very much, you save me many hours of work.
> I've modified your class so it try to find templates in the packages you
> define in "org.apache.tapestry.page-class-packages" configuration, and
> look
> it into classpath, so it has not have to be only in WEB-INF/classes.
> Here is the code and the hivemind configuration i've used to make it
> work:
>
> <?xml version="1.0"?>
> <module id="ar.com.example" version="4.0.0">
> <implementation
> service-id="tapestry.page.SpecificationResolverDelegate">
> <invoke-factory model="threaded">
> <construct class="ar.com.example.SpecificationResolverDelegate">
> <set-object property="clazzFinder"
> value="infrastructure:classFinder"/>
> </construct>
> </invoke-factory>
> </implementation>
> </module>
>
> package ar.com.example;
>
> import org.apache.hivemind.Location;
> import org.apache.hivemind.Resource;
> import org.apache.hivemind.impl.LocationImpl;
> import org.apache.tapestry.INamespace;
> import org.apache.tapestry.IRequestCycle;
> import org.apache.tapestry.resolver.ISpecificationResolverDelegate;
> import org.apache.tapestry.services.ClassFinder;
> import org.apache.tapestry.spec.AssetSpecification;
> import org.apache.tapestry.spec.ComponentSpecification;
> import org.apache.tapestry.spec.IComponentSpecification;
> import org.apache.tapestry.util.DescribedLocation;
>
> public class SpecificationResolverDelegate implements
> ISpecificationResolverDelegate {
>
> private ClassFinder clazzFinder;
>
> public ClassFinder getClazzFinder() {
> return clazzFinder;
> }
>
> public void setClazzFinder(ClassFinder clazzFinder) {
> this.clazzFinder = clazzFinder;
> }
>
> public IComponentSpecification findPageSpecification(IRequestCycle
> cycle,
> INamespace namespace, String simplePageName) {
>
> //first I try to find the page class
> String packages = namespace
> .getPropertyValue("org.apache.tapestry.page-class-packages
> ");
>
> String className = simplePageName.replace('/', '.');
> Class pageClass = getClazzFinder().findClass(packages, className);
>
> if (pageClass == null)
> return null;
>
> //very good, I've found the page class, so I have to create the
> specification
> IComponentSpecification spec = new ComponentSpecification();
> Resource namespaceResource = namespace.getSpecificationLocation();
> Resource componentResource = namespaceResource
> .getRelativeResource(simplePageName + ".page");
> Location location = new LocationImpl(componentResource);
> spec.setLocation(location);
> spec.setSpecificationLocation(componentResource);
> spec.setComponentClassName(pageClass.getName());
>
> //add the $template asset telling the framework where to look for
> the template
> AssetSpecification aspec = new AssetSpecification();
> aspec.setPath("classpath:/"
> + pageClass.getPackage().getName().replace(".", "/") + "/"
> + className + ".html");
> aspec.setLocation(new DescribedLocation(
> spec.getSpecificationLocation(), ""));
> spec.addAsset("$template", aspec);
>
> //return the specification
> return spec;
>
> }
>
> public IComponentSpecification findComponentSpecification(
> IRequestCycle cycle, INamespace namespace, String type) {
> return null;
> }
>
> }
>
>
>
>
> On 10/27/06, spamsucks@spamsucks.com <sp...@spamsucks.com> wrote:
>>
>> > Has someone a working example of an ITemplateSourceDelegate
>> > or or a PageSpecificationResolverImpl ? I can't find any.
>> > I only want to have a .class for each page and in the same
>> > package the html template. All .page configuration will be
>> > set using annotations.
>> > Thanks !!
>> >
>>
>> Here is ISpecificationResolverDelegate which I use in my project. It
>> allows
>> me to
>> 1. get rid of *.page files. Ionly need MyPage.html and MyPage.class
>> 2. store both MyPage.html and MyPage.class in the same location ( in my
>> case
>> it's WEB_INF\classes\com\Mycompany\page\ )
>> 3. use getPage( "com.mycompany.MyPage" )
>> 4. get rid of <meta key="org.apache.tapestry.page-class-packages" >
>> in my
>> .application file
>>
>> Hope this helps.
>>
>> import org.apache.hivemind.Resource;
>> import org.apache.hivemind.impl.LocationImpl;
>> import org.apache.tapestry.INamespace;
>> import org.apache.tapestry.IRequestCycle;
>> import org.apache.tapestry.resolver.ISpecificationResolverDelegate;
>> import org.apache.tapestry.spec.ComponentSpecification;
>> import org.apache.tapestry.spec.IComponentSpecification;
>>
>> public class SpecificationResolverDelegate implements
>> ISpecificationResolverDelegate {
>>
>> public IComponentSpecification
>> findPageSpecification(IRequestCycle
>> cycle, INamespace namespace, String simplePageName){
>>
>> final Resource namespaceLocation =
>> namespace.getSpecificationLocation();
>> final Resource templateResource =
>> namespaceLocation.getRelativeResource( "classes/" +
>> simplePageName.replace
>> (
>> '.', '/' ) + ".html" );
>>
>> if ( templateResource.getResourceURL() != null ){
>> final Resource pageResource =
>> namespaceLocation.getRelativeResource( "classes/" +
>> simplePageName.replace
>> (
>> '.', '/' ) + ".page" );
>>
>> final IComponentSpecification specification =
>> new
>> ComponentSpecification();
>> specification.setComponentClassName(
>> simplePageName
>> );
>> specification.setPageSpecification( false );
>> specification.setSpecificationLocation(
>> pageResource
>> );
>> specification.setLocation( new LocationImpl(
>> templateResource ) );
>> return specification;
>> }
>> return null;
>> }
>>
>> public IComponentSpecification findComponentSpecification(
>> IRequestCycle cycle, INamespace namespace, String type){
>> return null;
>> }
>> }
>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
>
--
Andreas Andreou - andyhot@apache.org - http://andyhot.di.uoa.gr
Tapestry / Tacos developer
Open Source / J2EE Consulting
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org