Gmane
From: Hensley, Richard <Richard.Hensley <at> McKesson.com>
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