|
Subject: RE: Using Groovy to implement pages Newsgroups: gmane.comp.java.tapestry.user Date: 2004-06-23 17:12:52 GMT (5 years, 1 week, 4 days, 20 hours and 50 minutes ago)
Here is GroovyResourceLoader.java
package org.apache.tapestry.util;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyCodeSource;
import groovy.lang.MetaClass;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tapestry.ApplicationRuntimeException;
import org.apache.tapestry.ApplicationServlet;
import org.apache.tapestry.IResourceResolver;
import org.apache.tapestry.Tapestry;
import org.apache.tapestry.util.DefaultResourceResolver;
/**
* @author Richard Hensley
*/
public class GroovyResourceResolver extends DefaultResourceResolver
implements
IResourceResolver {
private static final Log LOG =
LogFactory.getLog(ApplicationServlet.class);
private GroovyClassLoader groovyLoader;
private Map loadedClasses;
public GroovyResourceResolver() {
super();
/*
* This is done because the classes are not known at the time
* of compile by groovy. see the following link
* http://jira.codehaus.org/browse/GROOVY-210#action_16996
*/
MetaClass.setUseReflection(true);
groovyLoader = new GroovyClassLoader(super.getClassLoader());
loadedClasses = new HashMap();
}
public Class findClass(String name) {
if (name.endsWith(".gy") || name.endsWith(".groovy")) {
return loadGroovyClass(name);
}
return super.findClass(name);
}
/**
* @param name
* @return
*/
private Class loadGroovyClass(String name) {
URL script = getResource(name);
try {
Class result = null;
File file = new File(script.getFile());
long lastModified = file.lastModified();
LoadedClass lc = (LoadedClass) loadedClasses.get(script);
/*
* Figure out when the script file was last modified
* If the class has been loaded, but the script file is
* newer load it again.
*/
if (lc != null) {
if (lc.lastModified >= lastModified) {
result = lc.clazz;
if (LOG.isDebugEnabled()) {
LOG.debug("Found groovy class " + name);
}
}
else {
if (LOG.isDebugEnabled()) {
LOG.debug("Discarding groovy class " + name);
}
loadedClasses.remove(script);
}
}
if (result == null) {
if (LOG.isDebugEnabled()) {
LOG.debug("Loading groovy class " + name);
}
InputStream is = new
BufferedInputStream(script.openStream());
try {
GroovyCodeSource gcs = new GroovyCodeSource(is, name,
script.getPath());
result = groovyLoader.parseClass(gcs);
loadedClasses.put(script, new LoadedClass(lastModified,
result));
}
finally {
is.close();
}
}
return result;
}
catch (Throwable t) {
throw new ApplicationRuntimeException(Tapestry.format(
"ResourceResolver.unable-to-load-class", name, super
.getClassLoader(), t.getMessage()), t);
}
}
/**
* Simple static class used to store the last modified
* time of a script file, and the Class that was
* generated.
* @author rhensle
*/
static private class LoadedClass {
long lastModified;
Class clazz;
LoadedClass(long lastModified, Class clazz) {
this.lastModified = lastModified;
this.clazz = clazz;
}
}
}
Here is GroovyApplicationServlet.java
package org.apache.tapestry;
import javax.servlet.ServletException;
import org.apache.tapestry.ApplicationServlet;
import org.apache.tapestry.IResourceResolver;
import org.apache.tapestry.util.GroovyResourceResolver;
/**
* @author Richard Hensley
*/
public class GroovyApplicationServlet extends ApplicationServlet {
protected IResourceResolver createResourceResolver()
throws ServletException {
return new GroovyResourceResolver();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe <at> jakarta.apache.org
For additional commands, e-mail: tapestry-user-help <at> jakarta.apache.org
|
|
|