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, [EMAIL PROTECTED] <[EMAIL PROTECTED]> 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: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> > -- Andreas Andreou - [EMAIL PROTECTED] - http://andyhot.di.uoa.gr Tapestry / Tacos developer Open Source / J2EE Consulting --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]