diff --git a/.gitignore b/.gitignore index eaf142a..e406a70 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ tomcat.8080 .project .settings/ tomcat.*/ +test-output/ diff --git a/README.md b/README.md index b745128..d043850 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,54 @@ or java -jar target/tomcat-runner.jar help Prints out all arguments accepted + +## Using with Maven in your project + +You can use the Maven dependency plugin to download tomcat-runner as part of your build. This will eliminate the need for any external dependencies other than those specified in your build to run your application. + +### pom.xml + +Add the following to your pom.xml: + + ... + + + tomcat-runner-repo + tomcat runner repository on GitHub + http://jsimone.github.com/tomcat-runner/repository/ + + + ... + + ... + + + org.apache.maven.plugins + maven-dependency-plugin + 2.3 + + + package + copy + + + + heroku.runner + tomcat-runner + 0.0.5 + tomcat-runner.jar + + + + + + + + ... + + +### launching + +Now when you run `maven package` tomcat runner will be downloaded for you. You can then launch your application with: + + $ java -jar target/dependency/tomcat-runner.jar target/.war diff --git a/pom.xml b/pom.xml index 09cfbc7..99cda54 100644 --- a/pom.xml +++ b/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - heroku.runner + tomcat.runner tomcat-runner - 0.0.4 + 0.0.5 tomcat-runner http://maven.apache.org @@ -45,12 +45,12 @@ tomcat-jsp-api 7.0.22 - - junit - junit - 4.10 - test - + + org.testng + testng + 6.1.1 + test + tomcat-runner-no-dep diff --git a/src/main/java/com/heroku/launch/ArgParser.java b/src/main/java/tomcat/runner/launch/ArgParser.java similarity index 71% rename from src/main/java/com/heroku/launch/ArgParser.java rename to src/main/java/tomcat/runner/launch/ArgParser.java index 61b777c..a480d33 100644 --- a/src/main/java/com/heroku/launch/ArgParser.java +++ b/src/main/java/tomcat/runner/launch/ArgParser.java @@ -1,4 +1,4 @@ -package com.heroku.launch; +package tomcat.runner.launch; import java.util.HashMap; import java.util.Map; @@ -19,12 +19,17 @@ public class ArgParser { * @return * @throws ArgumentNotFoundException */ - public static Map parseArgs(String[] args) throws ArgumentNotFoundException { + public static Map parseArgs(String[] args) throws ArgumentNotFoundException, MissingAppException { Map argMap = new HashMap(); for(int i=0; i < args.length-1; i+=2) { argMap.put(Argument.getArgFor(args[i]), args[i+1]); } + + //if there are even number of arguments then we didn't define the app location + if(args.length % 2 == 0 || args[args.length-1].startsWith("--")) { + throw new MissingAppException(); + } argMap.put(Argument.APPLICATION_DIR, args[args.length-1]); diff --git a/src/main/java/com/heroku/launch/Argument.java b/src/main/java/tomcat/runner/launch/Argument.java similarity index 91% rename from src/main/java/com/heroku/launch/Argument.java rename to src/main/java/tomcat/runner/launch/Argument.java index 5475667..8d34275 100644 --- a/src/main/java/com/heroku/launch/Argument.java +++ b/src/main/java/tomcat/runner/launch/Argument.java @@ -1,4 +1,4 @@ -package com.heroku.launch; +package tomcat.runner.launch; /** * The argument enum holds which arguments are supported. @@ -9,6 +9,7 @@ public enum Argument { SESSION_TIMEOUT ("--session-timeout", "The number of minutes of inactivity before a user's session is timed out"), PORT ("--port", "The port that the server will accept http requests on"), + CONTEXT_XML ("--context_xml", "The parth to the context xml to use"), APPLICATION_DIR ("", ""); private String argName; diff --git a/src/main/java/com/heroku/launch/ArgumentNotFoundException.java b/src/main/java/tomcat/runner/launch/ArgumentNotFoundException.java similarity index 92% rename from src/main/java/com/heroku/launch/ArgumentNotFoundException.java rename to src/main/java/tomcat/runner/launch/ArgumentNotFoundException.java index 9c3c3c1..47273ae 100644 --- a/src/main/java/com/heroku/launch/ArgumentNotFoundException.java +++ b/src/main/java/tomcat/runner/launch/ArgumentNotFoundException.java @@ -1,4 +1,4 @@ -package com.heroku.launch; +package tomcat.runner.launch; /** * ArgumentNotFoundException is thrown when an argument that isn't understood diff --git a/src/main/java/com/heroku/launch/Main.java b/src/main/java/tomcat/runner/launch/Main.java similarity index 80% rename from src/main/java/com/heroku/launch/Main.java rename to src/main/java/tomcat/runner/launch/Main.java index ae73a21..5b6c5ee 100644 --- a/src/main/java/com/heroku/launch/Main.java +++ b/src/main/java/tomcat/runner/launch/Main.java @@ -1,5 +1,6 @@ -package com.heroku.launch; +package tomcat.runner.launch; import java.io.File; +import java.net.URL; import java.util.Map; import org.apache.catalina.Context; @@ -22,14 +23,14 @@ public static void printHelp() { System.out.println("Usage: java -jar tomcat-runner.jar [arguments...] path/to/webapp"); System.out.println("Arguments:"); for (Argument argument : Argument.values()) { - System.out.println(argument.argName() + " " + argument.helpText()); + System.out.format("%-30s%-90s%n", argument.argName(), argument.helpText()); } } public static void main(String[] args) throws Exception { //print help text when asked for - if("help".equals(args[0]) || "--help".equals(args[0])) { + if(args.length == 0 || "help".equals(args[0]) || "--help".equals(args[0])) { printHelp(); System.exit(0); } @@ -42,6 +43,10 @@ public static void main(String[] args) throws Exception { System.out.println("Unexpected Argument: " + e.getArgName()); System.out.println("For usage information run `java -jar tomcat-runner.jar help`"); System.exit(1); + } catch (MissingAppException e) { + System.out.println("Application location not defined"); + System.out.println("For usage information run `java -jar tomcat-runner.jar help`"); + System.exit(1); } Tomcat tomcat = new Tomcat(); @@ -60,7 +65,7 @@ public static void main(String[] args) throws Exception { ctx.setSessionTimeout(Integer.valueOf(argMap.get(Argument.SESSION_TIMEOUT))); } - System.out.println("configuring app at: " + new File(argMap.get(Argument.APPLICATION_DIR)).getAbsolutePath()); + System.out.println("deploying app from: " + new File(argMap.get(Argument.APPLICATION_DIR)).getAbsolutePath()); //start the server tomcat.start(); diff --git a/src/main/java/tomcat/runner/launch/MissingAppException.java b/src/main/java/tomcat/runner/launch/MissingAppException.java new file mode 100644 index 0000000..24145a2 --- /dev/null +++ b/src/main/java/tomcat/runner/launch/MissingAppException.java @@ -0,0 +1,5 @@ +package tomcat.runner.launch; + +public class MissingAppException extends Exception { + +} diff --git a/src/main/test/tomcat/runner/launch/ArgParserNegativeTest.java b/src/main/test/tomcat/runner/launch/ArgParserNegativeTest.java new file mode 100644 index 0000000..64996c0 --- /dev/null +++ b/src/main/test/tomcat/runner/launch/ArgParserNegativeTest.java @@ -0,0 +1,39 @@ +package tomcat.runner.launch; + +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import tomcat.runner.launch.ArgParser; +import tomcat.runner.launch.Argument; +import tomcat.runner.launch.ArgumentNotFoundException; +import tomcat.runner.launch.MissingAppException; + +public class ArgParserNegativeTest { + + @DataProvider(name = "Negative-Test-Provider") + public Object[][] parameterIntTestProvider() { + return new Object[][]{ + { new String[] {"--fake-arg", "45", "/path/to/project"}, ArgumentNotFoundException.class }, + { new String[] {Argument.SESSION_TIMEOUT.argName(), "45", "--fake-arg", "test", "/path/to/project"}, ArgumentNotFoundException.class }, + { new String[] {Argument.SESSION_TIMEOUT.argName(), "45", "--fake-arg", "/path/to/project"}, ArgumentNotFoundException.class }, + { new String[] {Argument.SESSION_TIMEOUT.argName(), "45", "test", "/path/to/project"}, ArgumentNotFoundException.class }, + { new String[] {Argument.SESSION_TIMEOUT.argName(), "--fake-arg", "test", "/path/to/project"}, ArgumentNotFoundException.class }, + { new String[] {"/path/to/project", Argument.SESSION_TIMEOUT.argName()}, ArgumentNotFoundException.class }, + { new String[] {Argument.SESSION_TIMEOUT.argName(), "--fake-arg", "45", "test", "/path/to/project"}, ArgumentNotFoundException.class }, + { new String[] {Argument.SESSION_TIMEOUT.argName(), "45", Argument.PORT.argName(), "9090"}, MissingAppException.class }, + { new String[] {Argument.SESSION_TIMEOUT.argName(), "45", Argument.PORT.argName()}, MissingAppException.class } + }; + } + + @Test(dataProvider = "Negative-Test-Provider") + public void testFakeArgument(String[] args, Class excpectedException) { + try { + ArgParser.parseArgs(args); + Assert.fail("Parsing of arguments should have thrown exception"); + } catch (Exception e) { + Assert.assertTrue(e.getClass().isAssignableFrom(excpectedException), "Wrong exception thrown for negative test"); + } + } + +} diff --git a/src/main/test/tomcat/runner/launch/ArgParserTest.java b/src/main/test/tomcat/runner/launch/ArgParserTest.java new file mode 100644 index 0000000..f2b2c01 --- /dev/null +++ b/src/main/test/tomcat/runner/launch/ArgParserTest.java @@ -0,0 +1,34 @@ +package tomcat.runner.launch; + +import java.util.Map; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import tomcat.runner.launch.ArgParser; +import tomcat.runner.launch.Argument; +import tomcat.runner.launch.ArgumentNotFoundException; +import tomcat.runner.launch.MissingAppException; + + +public class ArgParserTest { + + @Test + public void testArgumentParsingWithArg() throws ArgumentNotFoundException, MissingAppException { + String[] args = {Argument.SESSION_TIMEOUT.argName(), "45", Argument.PORT.argName(), "8888", "/path/to/project"}; + Map argMap = ArgParser.parseArgs(args); + + Assert.assertEquals(argMap.get(Argument.SESSION_TIMEOUT), "45", "Expected session timeout to match that which was set"); + Assert.assertEquals(argMap.get(Argument.PORT), "8888", "Expected port to match that which was set"); + Assert.assertEquals(argMap.get(Argument.APPLICATION_DIR), "/path/to/project", "Expected directory to math that which was set"); + } + + @Test + public void testArgumentParsingNoArg() throws ArgumentNotFoundException, MissingAppException { + String[] args = {"/path/to/project"}; + Map argMap = ArgParser.parseArgs(args); + + Assert.assertEquals(argMap.get(Argument.APPLICATION_DIR), "/path/to/project", "Expected directory to math that which was set"); + } + +}