GroovyFilter

View: New views
1 Messages — Rating Filter:   Alert me  

GroovyFilter

by akiliner :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

My humble GroovyFilter :)
WEB-INF/groovy/*/*/*.groovy files auto realoding :)

I was M$ engineer last 10 years.
I began java 3 month ago. It was funny.

I'm worried about there are performance problems in my Whole Source Code website method.
GroovyClassLoader is complex.
I does not have clear picture of GroovyClassLoader/Caching flow yet.

It will be good if there is officialy documented storyline about
filter based SEO friendly Groovy web solution with .groovy auto reloading.

*

package fa.servlet;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;

import org.codehaus.groovy.control.CompilerConfiguration;

class GroovyFilter implements Filter {
        private context
        private inDev
        private classLoader
        private codeSheet
        private codeSheetTime = 0
        private router
       
        void init(FilterConfig config) throws ServletException {
                context = config.getServletContext()
                resetClassLoader()
                inDev = InetAddress.localHost.hostName == "FA"
                context.log("GroovyFilter initialized")
        }
       
        def resetClassLoader() {
                def compilerConfig = new CompilerConfiguration()
                compilerConfig.sourceEncoding = "UTF-8"
                compilerConfig.classpathList = [ context.getRealPath("/WEB-INF/groovy") ]
                classLoader = new GroovyClassLoader(this.class.classLoader, compilerConfig)
                router = classLoader.parseClass(new File(context.getRealPath("/WEB-INF/groovy"), "/fa/servlet/Router.groovy")).newInstance()
                context.log("New ScriptEngine initialized")
        }
       
        def checkCodeUpdate() {
                def newCodeSheetTime = System.currentTimeMillis()
                if (newCodeSheetTime > codeSheetTime + 500) {
                        def newCodeSheet = [:]
                        new File(context.getRealPath("/WEB-INF/groovy")).eachFileRecurse { newCodeSheet[it.path] = it.lastModified() }
                        if (codeSheet && codeSheet != newCodeSheet) {
                                resetClassLoader()
                        }
                        codeSheet = newCodeSheet
                        codeSheetTime = newCodeSheetTime
                }
        }
       
        void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
                if (inDev) {
                        checkCodeUpdate()
                }
                if (!router.route(this, request, response, context)) {
                        chain.doFilter(request, response)
                }
        }
       
        void destroy() {
        }
}