package com.jdbernard.net import org.eclipse.jetty.rewrite.handler.RewriteHandler import org.eclipse.jetty.rewrite.handler.RewriteRegexRule import org.eclipse.jetty.servlet.DefaultServlet import org.eclipse.jetty.servlet.ServletContextHandler import org.eclipse.jetty.server.Server import groovy.servlet.GroovyServlet import com.jdbernard.util.LightOptionParser public class GroovyDirectoryServer { public static final String VERSION = "1.2" public static void main(String[] args) { def port = 9000 def cli = [ v: [longName: 'version'], h: [longName: 'help'], p: [longName: 'port', arguments: 1], P: [longName: 'map-path', arguments: 2], r: [longName: 'rewrite', arguments: 2], g: [longName: 'groovy-servlet', arguments: 1] ] def opts = LightOptionParser.parseOptions(cli, args) if (opts.v) { println "GroovyDirectoryServer v$VERSION"; System.exit(1) } if (opts.h) { println getUsage(); System.exit(1) } def options = [ port: opts.p ? opts.p[0] as int : 9000, mappedPaths: opts.P ?: [['/', '.']], rewriteRules: opts.r ?: [], groovyPatterns: opts.g ?: ["*.groovy"] ] runJetty(options).join() } public static Server runJetty(options) { def server = new Server(options.port) def handler = new ServletContextHandler(ServletContextHandler.SESSIONS) handler.contextPath = '/' handler.resourceBase = '.' // Maped paths. println options.mappedPaths options.mappedPaths.each { pair -> def pathHandler = handler.addServlet(DefaultServlet, pair[0]) pathHandler.setInitParameter('resourceBase', pair[1]) println "Serving '${pair[1]}' from base url '${pair[0]}'." } // Groovy Scripts options.groovyPatterns.each { pattern -> handler.addServlet(GroovyServlet, pattern) println "Using GroovyServlet for urls matching '$pattern'." } // Rewrite rules if (options.rewriteRules) { def rewriteHandler = new RewriteHandler() rewriteHandler.setHandler(handler) handler = rewriteHandler } options.rewriteRules.each { pair -> def rule = new RewriteRegexRule() rule.regex = pair[0] rule.replacement = pair[1] handler.addRule(rule) println "Rewriting '${pair[0]}' to '${pair[1]}'." } server.handler = handler server.start() println "Jetty started on port ${options.port}." return server } public static String getUsage() { return """\ GroovyDirectoryServer v$VERSION usage: GroovyDirectoryServer [options] Options: -h,--help Print this usage information. -v, --version Print versioning information. -p, --port Listen on the given port. Defaults to 9000. -P , --map-path Map the contents of the filesystem at to the url prefix at . -r , --rewrite Rewrite URLs matching to . -g , --groovy-servlet Invoke the GroovyServet for any url matching """; } }