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");
+ }
+
+}