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]