Hi!
My intention was to put the page templates into subfolders.
like that:
/Home.html
/admin/Login.html
/shop/BrowseArticles.html
My solution works by evaluating the app-property
'org.apache.tapestry.page-class-packages' which specifies the
location of your class files. the code will _not_ work for .page
specification files (even though this
behaviour could probably achieved as easy).
example:
[org.apache.tapestry.page-class-packages = de.mycompany.webapp.pages]
url: http://myhost:port/context/admin/Login.html -> class:
de.mycompany.webapp.pages.admin.Login
url: http://myhost:port/context/admin/test/text/Foobar.html -> class:
de.mycompany.webapp.pages.admin.test.text.Fooba
It's simple and straightforward. I would like some feedback from you if I
am missing something. Especially I am not sure if
this solution is compatible with namespaces. If everything is fine I be
happy to donate that piece of code to the community.
It probably can also be used for components.
<span jwcid="@test/MyComponent"/> seems to work but looks somehow strange
*ugh*
[ hivemodule.xml ]
<service-point id="NestedComponentClassLoader"
interface="org.apache.tapestry.pageload.ComponentClassProvider">
<invoke-factory>
<construct class="NestedComponentClassLoader">
<set-object property="packageRoot"
value="app-property:org.apache.tapestry.page-class-packages"/>
</construct>
</invoke-factory>
</service-point>
<contribution configuration-id="tapestry.page.PageClassProviderChain">
<command id="locateNestedPageClass"
object="service:NestedComponentClassLoader" />
</contribution>
[ NestedComponentClassLoader.java ]
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tapestry.pageload.ComponentClassProvider;
import org.apache.tapestry.pageload.ComponentClassProviderContext;
public class NestedComponentClassLoader implements ComponentClassProvider
{
private static final Log log =
LogFactory.getLog(NestedComponentClassLoader.class);
private String packageRoot;
public void setPackageRoot(String packageRoot)
{
this.packageRoot = packageRoot;
}
public String provideComponentClassName(ComponentClassProviderContext
context)
{
String name = context.getName();
int slashPos = name.lastIndexOf('/');
if (slashPos == -1 || slashPos == name.length())
return null;
String path = name.substring(0, slashPos);
String page = name.substring(slashPos + 1);
StringBuilder classpath = new StringBuilder(packageRoot);
for (String pathComponent : path.split("/"))
{
classpath.append('.');
classpath.append(pathComponent);
}
classpath.append('.');
classpath.append(page);
log.debug(String.format("page '%s' -> class '%s'", page,
classpath.toString()));
return classpath.toString();
}
}
Best regards
Peter
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]