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() {
}
}