diff --git a/build.xml b/build.xml index e77be267f..951ef511a 100644 --- a/build.xml +++ b/build.xml @@ -103,7 +103,7 @@ workingdirectory="$APP_PACKAGE/Contents/Resources" jvmversion="1.6+" bundleid="com.metaweb.gridworks.Gridworks" - vmoptions="${java.options}" + vmoptions="-Dgridworks.version=${revision} ${java.options}" antialiasedgraphics="true" antialiasedtext="true" liveresize="true" @@ -138,7 +138,7 @@ lib/*.jar - -Djava.library.path=lib/native/windows + -Djava.library.path=lib/native/windows -Dgridworks.version=${revision} max memory heap size to use default: 1024M + -a autoreload if class files change + default: false + --debug enable JVM debugging (on port 8000) --jmx enable JMX monitoring (for jconsole and jvisualvm) @@ -271,6 +274,10 @@ run() { OPTS="-Dgridworks.data_dir=$GRIDWORKS_DATA_DIR $OPTS" fi + get_revision + + OPTS="-Dgridworks.version=$REVISION $OPTS" + CLASSPATH="$GRIDWORKS_BUILD_DIR/classes:$GRIDWORKS_LIB_DIR/*" RUN_CMD="$JAVA -cp $CLASSPATH $OPTS com.metaweb.gridworks.Gridworks" @@ -349,6 +356,7 @@ while [ $# -ne 0 ] ; do -w) shift; GRIDWORKS_WEBAPP="$1"; shift; continue;; -d) shift; GRIDWORKS_DATA_DIR="$1"; shift; continue;; -m) shift; GRIDWORKS_MEMORY="$1"; shift; continue;; + -a) shift; add_option '-Dgridworks.autoreloading=true'; continue;; --debug) shift; add_option '-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n'; continue;; --jmx) shift; add_option '-Dcom.sun.management.jmxremote'; continue;; -*) fail "Invalid option: $1";; diff --git a/src/main/java/com/metaweb/gridworks/Gridworks.java b/src/main/java/com/metaweb/gridworks/Gridworks.java index 549a0878f..e7c95f8c2 100644 --- a/src/main/java/com/metaweb/gridworks/Gridworks.java +++ b/src/main/java/com/metaweb/gridworks/Gridworks.java @@ -19,18 +19,38 @@ import org.mortbay.jetty.Connector; import org.mortbay.jetty.Server; import org.mortbay.jetty.bio.SocketConnector; import org.mortbay.jetty.webapp.WebAppContext; -import org.mortbay.log.Log; import org.mortbay.util.Scanner; import com.metaweb.util.logging.IndentingLayout; import com.metaweb.util.signal.SignalHandler; import com.metaweb.util.threads.ThreadPoolExecutorAdapter; -public class Gridworks extends Server { - final static public String s_version = "1.0"; +public class Gridworks { + + static private String version; private static Logger root = Logger.getRootLogger(); private static Logger logger = Logger.getLogger("com.metaweb.gridworks"); + + public static void log(String message) { + logger.info(message); + } + + public static void info(String message) { + logger.info(message); + } + + public static void error(String message, Throwable t) { + logger.error(message, t); + } + + public static void warn(String message) { + logger.warn(message); + } + + public static String getVersion() { + return version; + } public static void main(String[] args) throws Exception { @@ -45,46 +65,37 @@ public class Gridworks extends Server { Logger jetty_logger = Logger.getLogger("org.mortbay.log"); jetty_logger.setLevel(Level.WARN); + + version = Configurations.get("gridworks.version","trunk"); - // get main configurations + Gridworks gridworks = new Gridworks(); + + gridworks.init(args); + } + + public void init(String[] args) throws Exception { + int port = Configurations.getInteger("gridworks.port",3333); String host = Configurations.get("gridworks.host","127.0.0.1"); - // create acre's server (which is a thin wrapper around Jetty) - Gridworks server = new Gridworks(host,port); + GridworksServer server = new GridworksServer(); + server.init(host,port); + GridworksClient client = new GridworksClient(); + client.init(host,port); + // hook up the signal handlers new ShutdownSignalHandler("TERM", server); - - // start the server - server.start(); - - // start the browser - URI starting_url = new URI("http://" + host + ":" + port + "/"); - Desktop.getDesktop().browse(starting_url); - - // join this thread - server.join(); } +} - public static void log(String message) { - logger.info(message); - } +/* -------------- Gridworks Server ----------------- */ - public static void error(String message, Throwable t) { - logger.error(message, t); - } - - public static void warn(String message) { - logger.warn(message); - } - - /* -------------- Gridworks HTTP server ----------------- */ +class GridworksServer extends Server { private ThreadPoolExecutor threadPool; - public Gridworks(String host, int port) throws Exception { - + public void init(String host, int port) throws Exception { int maxThreads = Configurations.getInteger("gridworks.queue.size", 10); int maxQueue = Configurations.getInteger("gridworks.queue.max_size", 50); long keepAliveTime = Configurations.getInteger("gridworks.queue.idle_time", 60); @@ -103,15 +114,16 @@ public class Gridworks extends Server { this.addConnector(connector); final File contextRoot = new File(Configurations.get("gridworks.webapp","webapp")); + final File classRoot = new File(Configurations.get("gridworks.classes","build/classes")); final String contextPath = Configurations.get("gridworks.context_path","/"); File webXml = new File(contextRoot, "WEB-INF/web.xml"); if (!webXml.isFile()) { - Log.warn("Warning: Failed to find web application. Could not find 'web.xml' at '" + webXml.getAbsolutePath() + "'"); + Gridworks.warn("Warning: Failed to find web application. Could not find 'web.xml' at '" + webXml.getAbsolutePath() + "'"); System.exit(-1); } - Log.info("Initializing context: '" + contextPath + "' from '" + contextRoot.getAbsolutePath() + "'"); + Gridworks.info("Initializing context: '" + contextPath + "' from '" + contextRoot.getAbsolutePath() + "'"); WebAppContext context = new WebAppContext(contextRoot.getAbsolutePath(), contextPath); //context.setCopyWebDir(false); //context.setDefaultsDescriptor(null); @@ -122,10 +134,12 @@ public class Gridworks extends Server { // Enable context autoreloading if (Configurations.getBoolean("gridworks.autoreloading",false)) { - scanForUpdates(contextRoot, context); + scanForUpdates(contextRoot, classRoot, context); } + + this.start(); } - + @Override protected void doStop() throws Exception { try { @@ -138,15 +152,15 @@ public class Gridworks extends Server { // ignore } } - - private void scanForUpdates(final File contextRoot, final WebAppContext context) { + + private void scanForUpdates(final File contextRoot, final File classRoot, final WebAppContext context) { List scanList = new ArrayList(); scanList.add(new File(contextRoot, "WEB-INF/web.xml")); findFiles(".class", new File(contextRoot, "WEB-INF"), scanList); - findFiles(".js", new File(contextRoot, "WEB-INF"), scanList); + findFiles(".class", classRoot, scanList); - Log.info("Starting autoreloading scanner..."); + Gridworks.info("Starting autoreloading scanner... [class dir: " + classRoot.getAbsolutePath() + "]"); Scanner scanner = new Scanner(); scanner.setScanInterval(Configurations.getInteger("gridworks.scanner.period",1)); @@ -157,10 +171,10 @@ public class Gridworks extends Server { @SuppressWarnings("unchecked") public void filesChanged(List changedFiles) { try { - Log.info("Stopping context: " + contextRoot.getAbsolutePath()); + Gridworks.info("Stopping context: " + contextRoot.getAbsolutePath()); context.stop(); - Log.info("Starting context: " + contextRoot.getAbsolutePath()); + Gridworks.info("Starting context: " + contextRoot.getAbsolutePath()); context.start(); } catch (Exception ex) { throw new RuntimeException(ex); @@ -170,8 +184,8 @@ public class Gridworks extends Server { scanner.start(); } - - static private void findFiles(final String extension, File baseDir, final Collection found) { + + private void findFiles(final String extension, File baseDir, final Collection found) { baseDir.listFiles(new FileFilter() { public boolean accept(File pathname) { if (pathname.isDirectory()) { @@ -183,21 +197,32 @@ public class Gridworks extends Server { } }); } - -} +} + +/* -------------- Gridworks Client ----------------- */ + +class GridworksClient { + + public void init(String host, int port) throws Exception { + URI starting_url = new URI("http://" + host + ":" + port + "/"); + Desktop.getDesktop().browse(starting_url); + + } +} + class ShutdownSignalHandler extends SignalHandler { - private Gridworks _server; + private Server _server; - public ShutdownSignalHandler(String sigName, Gridworks server) { + public ShutdownSignalHandler(String sigName, Server server) { super(sigName); this._server = server; } public boolean handle(String signame) { - System.err.println("Received Signal: " + signame); + //System.err.println("Received Signal: " + signame); // Tell the server we want to try and shutdown gracefully // this means that the server will stop accepting new connections diff --git a/src/main/java/com/metaweb/gridworks/GridworksServlet.java b/src/main/java/com/metaweb/gridworks/GridworksServlet.java index bc50648f3..d276a43f7 100644 --- a/src/main/java/com/metaweb/gridworks/GridworksServlet.java +++ b/src/main/java/com/metaweb/gridworks/GridworksServlet.java @@ -62,7 +62,7 @@ public class GridworksServlet extends HttpServlet { static protected Map _commands = new HashMap(); // timer for periodically saving projects - static protected Timer _timer = new Timer(); + static protected Timer _timer; static { _commands.put("create-project-from-upload", new CreateProjectCommand()); @@ -128,6 +128,10 @@ public class GridworksServlet extends HttpServlet { ProjectManager.initialize(); + if (_timer == null) { + _timer = new Timer(); + } + long period = 1000 * 60 * 5; // 5 minutes _timer.scheduleAtFixedRate(new TimerTask() { @Override diff --git a/src/main/java/com/metaweb/gridworks/history/History.java b/src/main/java/com/metaweb/gridworks/history/History.java index 402b5b5d9..5dfb5b4be 100644 --- a/src/main/java/com/metaweb/gridworks/history/History.java +++ b/src/main/java/com/metaweb/gridworks/history/History.java @@ -37,7 +37,7 @@ public class History implements Jsonizable { } static public void writeOneChange(Writer writer, Change change) throws Exception { - writer.write(Gridworks.s_version); writer.write('\n'); + writer.write(Gridworks.getVersion()); writer.write('\n'); writer.write(change.getClass().getName()); writer.write('\n'); Properties options = new Properties(); diff --git a/src/main/java/com/metaweb/gridworks/model/Project.java b/src/main/java/com/metaweb/gridworks/model/Project.java index e7c33b4d7..93d03c280 100644 --- a/src/main/java/com/metaweb/gridworks/model/Project.java +++ b/src/main/java/com/metaweb/gridworks/model/Project.java @@ -111,7 +111,7 @@ public class Project { } protected void saveToWriter(Writer writer, Properties options) throws IOException { - writer.write(Gridworks.s_version); writer.write('\n'); + writer.write(Gridworks.getVersion()); writer.write('\n'); writer.write("columnModel=\n"); columnModel.save(writer, options); writer.write("history=\n"); history.save(writer, options);