Originally I had a problem to load specification files(.page) at runtime located in external JAR files.


Finally I found a solution by myself, if somebody is interested in it here is.

First, you must extends the ApplicationServlet class overloading the createResourceResolver() method to return your own IResourceResolver implementation.
(Of course you must use this new servlet class for your Tapestry application).
<!-- Sample -->
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>com.project.web.SiteManagerServlet</servlet-class>
</servlet>


Here is my IResourceResolver implementation:

public class MyResourceResolver extends DefaultResourceResolver {

private ClassLoader currentLoader;
private ClassLoader parentLoader;
public MyResourceResolver () {
currentLoader = Thread.currentThread().getContextClassLoader();
parentLoader = Thread.currentThread().getContextClassLoader().getParent();
}
public MyResourceResolver (ClassLoader loader) {
currentLoader = loader;
parentLoader = loader.getParent();
}
public URL getResource(String name){
String stripped = removeLeadingSlash(name);
URL result = currentLoader.getResource(stripped);
if(result == null){
result = parentLoader.getResource(stripped);
}
return result;
}


private String removeLeadingSlash(String name){
while (name.startsWith("/")) {
return name.substring(1);
}


return name;
}
public Class findClass(String name)
{
try
{
Class clazz = Class.forName(name, true, currentLoader);
if(clazz == null){
clazz = Class.forName(name, true, parentLoader);
}
return clazz;
}
catch (Throwable t)
{
throw new ApplicationRuntimeException(
Tapestry.format("ResourceResolver.unable-to-load-class", name, currentLoader, t.getMessage()),
t);
}
}



public Class classForName(String name, Map map) throws ClassNotFoundException
{
return findClass(name);
}
public ClassLoader getClassLoader()
{
return currentLoader;
}


}

Library file sample (external JAR):

<library-specification> <page name="SamplePage" specification-path="SamplePage.page"/>
.....
<library-specification>


Loader:

ISpecificationSource spec = getEngine().getSpecificationSource();
IApplicationSpecification app = getEngine().getSpecification();
IResourceLocation location =
new ClasspathResourceLocation(getEngine().getResourceResolver(),
"com/project/sample.library");
ILibrarySpecification ls = getEngine().getSpecificationSource().getLibrarySpecification(location);
INamespace namespace = spec.getApplicationNamespace();
Iterator it = ls.getPageNames().iterator();
while(it.hasNext()){
String name = (String) it.next();
String path = ls.getPageSpecificationPath(name);
try{
IResourceLocation loc =
new ClasspathResourceLocation(getEngine().getResourceResolver(),
"com/project/" + path); // the .page files are located in the same package of the .library file
IComponentSpecification component = getEngine().getSpecificationSource().getPageSpecification(loc);
namespace.installPageSpecification(name, component);
} catch(Exception e){
logger.debug("installing exception: " + e.getMessage());
}
}




Eduardo Lobo wrote:


Hi,

I'm making an application that needs to load war files as plugins for the tapestry application to load them without making a new deploy or restarting the application server

Does anybody knows how to load pages at runtime, or another way to do this?

Thanks in advance.



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to