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]


Reply via email to