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]