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]

Reply via email to