You are viewing a plain text version of this content. The canonical link for it is here.
Posted to s4-commits@incubator.apache.org by mm...@apache.org on 2012/06/15 16:06:01 UTC

[4/22] git commit: fixed gradle warnings + added gradle options - added "s4r" task for creating an s4r archive, instead of using gradle - added "appClass" parameter for directly specifying the application entry point, rather than guessing it by parsing t

fixed gradle warnings + added gradle options
- added "s4r" task for creating an s4r archive, instead of using gradle
- added "appClass" parameter for directly specifying the application
entry point, rather
than guessing it by parsing the source files
- added "gradleOpts" parameter for specifying gradle options


Project: http://git-wip-us.apache.org/repos/asf/incubator-s4/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-s4/commit/ab7f0206
Tree: http://git-wip-us.apache.org/repos/asf/incubator-s4/tree/ab7f0206
Diff: http://git-wip-us.apache.org/repos/asf/incubator-s4/diff/ab7f0206

Branch: refs/heads/piper
Commit: ab7f020655e83adb0a895c937a6b4331f960a877
Parents: c34742d
Author: Matthieu Morel <mm...@apache.org>
Authored: Mon Jun 11 12:45:31 2012 +0200
Committer: Matthieu Morel <mm...@apache.org>
Committed: Mon Jun 11 12:45:31 2012 +0200

----------------------------------------------------------------------
 build.gradle                                       |   18 ++--
 s4                                                 |    5 +-
 .../src/main/java/org/apache/s4/core/Main.java     |    3 +-
 .../main/java/org/apache/s4/core/RemoteStream.java |    2 +-
 .../main/java/org/apache/s4/tools/CreateApp.java   |    9 ++-
 .../java/org/apache/s4/tools/DefineCluster.java    |    6 --
 .../src/main/java/org/apache/s4/tools/Deploy.java  |   41 +++++-----
 .../org/apache/s4/tools/FileExistsValidator.java   |   18 ++++
 .../src/main/java/org/apache/s4/tools/Package.java |   44 +++++++++++
 .../main/java/org/apache/s4/tools/S4ArgsBase.java  |   20 +++++
 .../src/main/java/org/apache/s4/tools/Tools.java   |    9 ++-
 .../main/java/org/apache/s4/tools/ZKServer.java    |    1 +
 .../src/main/resources/templates/build.gradle      |   61 ++++++++-------
 .../src/main/resources/templates/settings.gradle   |    1 +
 test-apps/s4-counter/build.gradle                  |   11 ++-
 test-apps/s4-showtime/build.gradle                 |   11 ++-
 test-apps/simple-deployable-app-1/build.gradle     |   11 ++-
 test-apps/simple-deployable-app-2/build.gradle     |   11 ++-
 18 files changed, 194 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/build.gradle
----------------------------------------------------------------------
diff --git a/build.gradle b/build.gradle
index a27b68b..4639a8a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -21,8 +21,8 @@
 
 description = 'Apache S4'
 defaultTasks 'assemble'
-archivesBaseName = 's4'
-distRootFolder = "$archivesBaseName-${-> version}"
+project.ext["archivesBaseName"] = 's4'
+project.ext["distRootFolder"] = "$archivesBaseName-${-> version}"
 
 allprojects {
 
@@ -34,7 +34,7 @@ allprojects {
     repositories {
         mavenLocal()
         mavenCentral()
-        mavenRepo name: "gson", urls: "http://google-gson.googlecode.com/svn/mavenrepo"
+        mavenRepo name: "gson", url: "http://google-gson.googlecode.com/svn/mavenrepo"
 
         /* Add lib dir as a repo. Some jar files that are not available
          in a public repo are distributed in the lib dir. */
@@ -43,7 +43,7 @@ allprojects {
 }
 
 /* All project libraries must be defined here. */
-libraries = [
+project.ext["libraries"] = [
     json:               'org.json:json:20090211',
     guava:              'com.google.guava:guava:10.0.1',
     gson:               'com.google.code.gson:gson:1.6',
@@ -84,13 +84,13 @@ subprojects {
     apply plugin: 'java'
     apply plugin: 'eclipse'
     apply plugin: 'maven'
-    apply plugin: 'code-quality'
+//    apply plugin: 'checkstyle'
 
     /* Set Java version. */
     sourceCompatibility = 1.6
     targetCompatibility = 1.6
 
-    checkstyleConfigFileName = "$rootDir/config/checkstyle/s4-checkstyle.xml"
+    project.ext["checkstyleConfigFileName"] = "$rootDir/config/checkstyle/s4-checkstyle.xml"
 
     configurations.all {
         exclude group: 'com.sun.jdmk', module: 'jmxtools'
@@ -142,9 +142,9 @@ subprojects {
     )
 }
 
-dependsOnChildren()
+evaluationDependsOnChildren()
 
-platformProjects = [project(':s4-base'), project(':s4-core'), project(':s4-comm'), project(':s4-tools')]
+project.ext["platformProjects"] = [project(':s4-base'), project(':s4-core'), project(':s4-comm'), project(':s4-tools')]
 
 configurations {
     platformLibs
@@ -168,7 +168,7 @@ dependencies {
 //    }
 //}
 
-binDistImage = copySpec {
+project.ext["binDistImage"] = copySpec {
     platformProjects.collect {proj ->
         into ("platform/lib") {
             from proj.sourceSets.main.resources

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/s4
----------------------------------------------------------------------
diff --git a/s4 b/s4
index 61517a1..3d3e0b4 100755
--- a/s4
+++ b/s4
@@ -2,11 +2,12 @@
 
 # NOTE: "./gradlew s4-tools:installApp" will prepare/update the tools subproject and related startup scripts
 
-GRADLE=`pwd`/gradlew
-
 S4_DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 S4_SCRIPT_PATH="$S4_DIR/s4"
 
+# JVM options for starting nodes and for other s4 tools can be configured here
+# export JAVA_OPTS=-Xmx1G
+
 subprojects/s4-tools/build/install/s4-tools/bin/s4-tools -s4ScriptPath=$S4_SCRIPT_PATH $@
 
 # EXAMPLES

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-core/src/main/java/org/apache/s4/core/Main.java
----------------------------------------------------------------------
diff --git a/subprojects/s4-core/src/main/java/org/apache/s4/core/Main.java b/subprojects/s4-core/src/main/java/org/apache/s4/core/Main.java
index 663caed..139ad35 100644
--- a/subprojects/s4-core/src/main/java/org/apache/s4/core/Main.java
+++ b/subprojects/s4-core/src/main/java/org/apache/s4/core/Main.java
@@ -100,7 +100,8 @@ public class Main {
                         Arrays.toString(mainArgs.extraNamedParameters.toArray(new String[] {})));
                 Map<String, String> namedParameters = new HashMap<String, String>();
                 for (String namedParam : mainArgs.extraNamedParameters) {
-                    namedParameters.put(namedParam.split("[:]")[0].trim(), namedParam.split("[:]")[1].trim());
+                    namedParameters.put(namedParam.split("[:]")[0].trim(),
+                            namedParam.substring(namedParam.indexOf(':') + 1).trim());
                 }
                 modules.add(new ParametersInjectionModule(namedParameters));
             }

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-core/src/main/java/org/apache/s4/core/RemoteStream.java
----------------------------------------------------------------------
diff --git a/subprojects/s4-core/src/main/java/org/apache/s4/core/RemoteStream.java b/subprojects/s4-core/src/main/java/org/apache/s4/core/RemoteStream.java
index 0833a07..330fd83 100644
--- a/subprojects/s4-core/src/main/java/org/apache/s4/core/RemoteStream.java
+++ b/subprojects/s4-core/src/main/java/org/apache/s4/core/RemoteStream.java
@@ -10,7 +10,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Stream that dispatches events to a remote cluster
+ * Stream that dispatches events to interested apps in remote clusters
  * 
  */
 public class RemoteStream implements Streamable<Event> {

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-tools/src/main/java/org/apache/s4/tools/CreateApp.java
----------------------------------------------------------------------
diff --git a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/CreateApp.java b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/CreateApp.java
index 8f870be..beaee41 100644
--- a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/CreateApp.java
+++ b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/CreateApp.java
@@ -44,9 +44,16 @@ public class CreateApp extends S4ArgsBase {
             Files.copy(gradlewTempFile, new File(appArgs.getAppDir() + "/gradlew"));
             new File(appArgs.getAppDir() + "/gradlew").setExecutable(true);
 
-            // copy build file
+            // copy build file contents
             Files.copy(Resources.newInputStreamSupplier(Resources.getResource("templates/build.gradle")), new File(
                     appArgs.getAppDir() + "/build.gradle"));
+
+            // update app settings
+            String settingsFileContents = Resources.toString(Resources.getResource("templates/settings.gradle"),
+                    Charsets.UTF_8);
+            settingsFileContents = settingsFileContents.replaceFirst("rootProject.name=<project-name>",
+                    "rootProject.name=\"" + appArgs.appName.get(0) + "\"");
+            Files.write(settingsFileContents, new File(appArgs.getAppDir() + "/settings.gradle"), Charsets.UTF_8);
             // copy hello app files
             Files.copy(Resources.newInputStreamSupplier(Resources.getResource("templates/HelloPE.java.txt")), new File(
                     appArgs.getAppDir() + "/src/main/java/hello/HelloPE.java"));

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-tools/src/main/java/org/apache/s4/tools/DefineCluster.java
----------------------------------------------------------------------
diff --git a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/DefineCluster.java b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/DefineCluster.java
index f4b269b..646ae92 100644
--- a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/DefineCluster.java
+++ b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/DefineCluster.java
@@ -1,7 +1,5 @@
 package org.apache.s4.tools;
 
-import org.apache.log4j.BasicConfigurator;
-import org.apache.log4j.Level;
 import org.apache.s4.comm.tools.TaskSetup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -14,10 +12,6 @@ public class DefineCluster {
     static Logger logger = LoggerFactory.getLogger(DefineCluster.class);
 
     public static void main(String[] args) {
-        // configure log4j for Zookeeper
-        BasicConfigurator.configure();
-        org.apache.log4j.Logger.getLogger("org.apache.zookeeper").setLevel(Level.ERROR);
-        org.apache.log4j.Logger.getLogger("org.I0Itec").setLevel(Level.ERROR);
 
         ZKServerArgs clusterArgs = new ZKServerArgs();
         Tools.parseArgs(clusterArgs, args);

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Deploy.java
----------------------------------------------------------------------
diff --git a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Deploy.java b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Deploy.java
index de8843a..9471910 100644
--- a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Deploy.java
+++ b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Deploy.java
@@ -8,22 +8,19 @@ import java.util.List;
 import junit.framework.Assert;
 
 import org.I0Itec.zkclient.ZkClient;
-import org.apache.log4j.BasicConfigurator;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
 import org.apache.s4.comm.topology.ZNRecord;
 import org.apache.s4.comm.topology.ZNRecordSerializer;
 import org.apache.s4.deploy.DistributedDeploymentManager;
 import org.apache.zookeeper.CreateMode;
 import org.gradle.tooling.BuildLauncher;
 import org.gradle.tooling.GradleConnector;
+import org.gradle.tooling.ProgressListener;
 import org.gradle.tooling.ProjectConnection;
 import org.slf4j.LoggerFactory;
 
-import sun.net.ProgressListener;
-
 import com.beust.jcommander.Parameter;
 import com.beust.jcommander.Parameters;
+import com.beust.jcommander.converters.FileConverter;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.Files;
 
@@ -40,10 +37,6 @@ public class Deploy extends S4ArgsBase {
         DeployAppArgs deployArgs = new DeployAppArgs();
 
         Tools.parseArgs(deployArgs, args);
-        // configure log4j for Zookeeper
-        BasicConfigurator.configure();
-        Logger.getLogger("org.apache.zookeeper").setLevel(Level.ERROR);
-        Logger.getLogger("org.I0Itec").setLevel(Level.ERROR);
 
         try {
             ZkClient zkClient = new ZkClient(deployArgs.zkConnectionString, deployArgs.timeout);
@@ -61,8 +54,13 @@ public class Deploy extends S4ArgsBase {
                         "Using specified S4R [{}], the S4R archive will not be built from source (and corresponding parameters are ignored)",
                         s4rPath);
             } else {
-                ExecGradle.exec(deployArgs.gradleBuildFilePath, "installS4R",
-                        new String[] { "appsDir=" + tmpAppsDir.getAbsolutePath(), "appName=" + deployArgs.appName });
+                List<String> params = new ArrayList<String>();
+                // prepare gradle -P parameters, including passed gradle opts
+                params.addAll(deployArgs.gradleOpts);
+                params.add("appClass=" + deployArgs.appClass);
+                params.add("appsDir=" + tmpAppsDir.getAbsolutePath());
+                params.add("appName=" + deployArgs.appName);
+                ExecGradle.exec(deployArgs.gradleBuildFile, "installS4R", params.toArray(new String[] {}));
                 s4rPath = tmpAppsDir.getAbsolutePath() + "/" + deployArgs.appName + ".s4r";
             }
             Assert.assertTrue(ByteStreams.copy(Files.newInputStreamSupplier(new File(s4rPath)),
@@ -86,32 +84,35 @@ public class Deploy extends S4ArgsBase {
     @Parameters(commandNames = "s4 deploy", commandDescription = "Package and deploy application to S4 cluster", separators = "=")
     static class DeployAppArgs extends S4ArgsBase {
 
-        @Parameter(names = { "-b", "-buildFile" }, description = "path to gradle build file for the S4 application", required = false)
-        String gradleBuildFilePath;
+        @Parameter(names = { "-b", "-buildFile" }, description = "Full path to gradle build file for the S4 application", required = false, converter = FileConverter.class, validateWith = FileExistsValidator.class)
+        File gradleBuildFile;
 
-        @Parameter(names = "-s4r", description = "path to s4r file", required = false)
+        @Parameter(names = "-s4r", description = "Path to s4r file", required = false)
         String s4rPath;
 
-        @Parameter(names = "-appName", description = "name of S4 application", required = true)
+        @Parameter(names = { "-a", "-appClass" }, description = "Full class name of the application class (extending App or AdapterApp)", required = false)
+        String appClass = "";
+
+        @Parameter(names = "-appName", description = "Name of S4 application. This will be the name of the s4r file as well", required = true)
         String appName;
 
-        @Parameter(names = { "-c", "-cluster" }, description = "logical name of the S4 cluster", required = true)
+        @Parameter(names = { "-c", "-cluster" }, description = "Logical name of the S4 cluster", required = true)
         String clusterName;
 
-        @Parameter(names = "-zk", description = "zookeeper connection string")
+        @Parameter(names = "-zk", description = "ZooKeeper connection string")
         String zkConnectionString = "localhost:2181";
 
-        @Parameter(names = "-timeout", description = "connection timeout to Zookeeper, in ms")
+        @Parameter(names = "-timeout", description = "Connection timeout to Zookeeper, in ms")
         int timeout = 10000;
 
     }
 
     static class ExecGradle {
 
-        public static void exec(String buildFilePath, String taskName, String[] params) throws Exception {
+        public static void exec(File buildFile, String taskName, String[] params) throws Exception {
 
             ProjectConnection connection = GradleConnector.newConnector()
-                    .forProjectDirectory(new File(buildFilePath).getParentFile()).connect();
+                    .forProjectDirectory(buildFile.getParentFile()).connect();
 
             try {
                 BuildLauncher build = connection.newBuild();

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-tools/src/main/java/org/apache/s4/tools/FileExistsValidator.java
----------------------------------------------------------------------
diff --git a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/FileExistsValidator.java b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/FileExistsValidator.java
new file mode 100644
index 0000000..9e21600
--- /dev/null
+++ b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/FileExistsValidator.java
@@ -0,0 +1,18 @@
+package org.apache.s4.tools;
+
+import java.io.File;
+
+import com.beust.jcommander.IParameterValidator;
+import com.beust.jcommander.ParameterException;
+
+public class FileExistsValidator implements IParameterValidator {
+
+    @Override
+    public void validate(String name, String value) throws ParameterException {
+        if (!new File(value).exists()) {
+            throw new ParameterException("File with path [" + value + "] specified in [" + name + "] does not exist");
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Package.java
----------------------------------------------------------------------
diff --git a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Package.java b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Package.java
new file mode 100644
index 0000000..d737d40
--- /dev/null
+++ b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Package.java
@@ -0,0 +1,44 @@
+package org.apache.s4.tools;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.s4.tools.Deploy.ExecGradle;
+import org.slf4j.LoggerFactory;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.converters.FileConverter;
+
+public class Package extends S4ArgsBase {
+
+    public static void main(String[] args) {
+        try {
+            final PackageArgs packageArgs = new PackageArgs();
+            Tools.parseArgs(packageArgs, args);
+
+            List<String> params = new ArrayList<String>();
+            // prepare gradle -P parameters, including passed gradle opts
+            params.add("appClass=" + packageArgs.appClass);
+            params.add("appName=" + packageArgs.appName.get(0));
+            ExecGradle.exec(packageArgs.gradleBuildFile, "installS4R", params.toArray(new String[] {}));
+        } catch (Exception e) {
+            LoggerFactory.getLogger(Package.class).error("Cannot deploy app", e);
+        }
+    }
+
+    @Parameters(commandNames = "package", separators = "=", commandDescription = "Create s4r")
+    static class PackageArgs extends S4ArgsBase {
+
+        @Parameter(description = "name of the application", required = true, arity = 1)
+        List<String> appName;
+
+        @Parameter(names = { "-b", "-buildFile" }, description = "Path to gradle build file for the S4 application", required = true, converter = FileConverter.class, validateWith = FileExistsValidator.class)
+        File gradleBuildFile;
+
+        @Parameter(names = { "-a", "-appClass" }, description = "Full class name of the application class (extending App or AdapterApp)", required = false)
+        String appClass = "";
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-tools/src/main/java/org/apache/s4/tools/S4ArgsBase.java
----------------------------------------------------------------------
diff --git a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/S4ArgsBase.java b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/S4ArgsBase.java
index 477fdaa..213001d 100644
--- a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/S4ArgsBase.java
+++ b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/S4ArgsBase.java
@@ -1,5 +1,9 @@
 package org.apache.s4.tools;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import com.beust.jcommander.IStringConverter;
 import com.beust.jcommander.Parameter;
 
 public abstract class S4ArgsBase {
@@ -10,4 +14,20 @@ public abstract class S4ArgsBase {
     @Parameter(names = "-s4ScriptPath", description = "path of the S4 script", hidden = true, required = true)
     String s4ScriptPath;
 
+    @Parameter(names = "-gradleOpts", variableArity = true, description = "gradle system properties (as in GRADLE_OPTS environment properties) passed to gradle scripts", required = false, converter = GradleOptsConverter.class)
+    List<String> gradleOpts = new ArrayList<String>();
+
+    // This removes automatically the -D of each gradle opt jvm parameter, if present
+    public class GradleOptsConverter implements IStringConverter<String> {
+
+        @Override
+        public String convert(String value) {
+            if (value.startsWith("-D")) {
+                return value.substring("-D".length());
+            } else {
+                return value;
+            }
+        }
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Tools.java
----------------------------------------------------------------------
diff --git a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Tools.java b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Tools.java
index 7f2a844..733c7ad 100644
--- a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Tools.java
+++ b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Tools.java
@@ -5,6 +5,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Level;
 import org.apache.s4.core.Main;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,7 +22,7 @@ public class Tools {
 
     enum Task {
         deploy(Deploy.class), node(Main.class), zkServer(ZKServer.class), newCluster(DefineCluster.class), adapter(null), newApp(
-                CreateApp.class);
+                CreateApp.class), s4r(Package.class);
 
         Class<?> target;
 
@@ -42,6 +44,11 @@ public class Tools {
 
     public static void main(String[] args) {
 
+        // configure log4j for Zookeeper
+        BasicConfigurator.configure();
+        org.apache.log4j.Logger.getLogger("org.apache.zookeeper").setLevel(Level.ERROR);
+        org.apache.log4j.Logger.getLogger("org.I0Itec").setLevel(Level.ERROR);
+
         if (!(args.length > 1)) {
             List<String> taskNames = getTaskNames();
             System.err.println("please specify a task name and proper arguments. Available tasks are: "

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-tools/src/main/java/org/apache/s4/tools/ZKServer.java
----------------------------------------------------------------------
diff --git a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/ZKServer.java b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/ZKServer.java
index ae0b011..0842f07 100644
--- a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/ZKServer.java
+++ b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/ZKServer.java
@@ -17,6 +17,7 @@ public class ZKServer {
     static Logger logger = LoggerFactory.getLogger(ZKServer.class);
 
     public static void main(String[] args) {
+
         ZKServerArgs zkArgs = new ZKServerArgs();
         Tools.parseArgs(zkArgs, args);
         try {

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-tools/src/main/resources/templates/build.gradle
----------------------------------------------------------------------
diff --git a/subprojects/s4-tools/src/main/resources/templates/build.gradle b/subprojects/s4-tools/src/main/resources/templates/build.gradle
index f60c3f3..a1e50e3 100644
--- a/subprojects/s4-tools/src/main/resources/templates/build.gradle
+++ b/subprojects/s4-tools/src/main/resources/templates/build.gradle
@@ -15,15 +15,13 @@
 *
 */
 
-/* Set the destination where we want to install the apps. */
+project.ext["s4AppInstallDir"] = hasProperty('appsDir') ? "$appsDir" : "/tmp/appsDir"
 
-s4AppInstallDir = hasProperty('appsDir') ? "$appsDir" : "/tmp/appsDir"
-
-s4Version = '0.5.0-SNAPSHOT'
+project.ext["s4Version"] = '0.5.0-SNAPSHOT'
 description = 'Apache S4 App'
 //defaultTasks 'installS4R'
-archivesBaseName = "$project.name"
-distRootFolder = "$archivesBaseName-${-> version}"
+project.ext["archivesBaseName"] = "$project.name"
+project.ext["distRootFolder"] = "$archivesBaseName-${-> version}"
 
 
 // Append the suffix 'SNAPSHOT' when the build is not for release.
@@ -44,7 +42,7 @@ targetCompatibility = 1.6
 repositories {
     mavenLocal()
     mavenCentral()
-    mavenRepo name: "gson", urls: "http://google-gson.googlecode.com/svn/mavenrepo"
+    mavenRepo name: "gson", url: "http://google-gson.googlecode.com/svn/mavenrepo"
 
     /* Add lib dir as a repo. Some jar files that are not available
      in a public repo are distributed in the lib dir. */
@@ -52,7 +50,7 @@ repositories {
 }
 
 /* All project libraries must be defined here. */
-libraries = [
+project.ext["libraries"] = [
             // for instance, adding twitter4j 2.2.5 will be:
             //twitter4j_core:     'org.twitter4j:twitter4j-core:2.2.5'
             // http://mvnrepository.com/ is a good source
@@ -92,34 +90,42 @@ manifest.mainAttributes(
        'S4-Version': s4Version
        )
 
-appDependencies = ( configurations.compile )
+project.ext["appDependencies"] = ( configurations.compile )
 
 /* This task will extract all the class files and create a fat jar. We set the manifest and the extension to make it an S4 archive file. */
 // TODO: exclude schenma files as needed (not critical) see: http://forums.gradle.org/gradle/topics/using_gradle_to_fat_jar_a_spring_project
 task s4r(type: Jar) {
+
+   if (rootProject.hasProperty("appName")) {
+       archiveName= "$appName"+".s4r"
+   }
    dependsOn jar
    from { appDependencies.collect { it.isDirectory() ? it : zipTree(it) } }
    from { configurations.archives.allArtifacts.files.collect { zipTree(it) } }
    manifest = project.manifest
-   extension = 's4r'
-
-   /* Set class name in manifest. Parse source files until we find a class that extends App.
-    * Get fully qualified Java class name and set attribute in Manifest.
-    */
-   sourceSets.main.allSource.files.each {  File file ->
-       if (appClassname =="" || appClassname == "UNKNOWN") {
-           // only execute the closure for this file if we haven't already found the app class name
-           appClassname = getAppClassname(file)
-           if(appClassname != "") {
-               manifest.mainAttributes('S4-App-Class': appClassname)
-           }
-       }
-   }
+
+   // check -PappClassName, need to refer to rootProject to check property, see http://issues.gradle.org/browse/GRADLE-1826
+    if (!rootProject.hasProperty('appClass') || !"$appClass") {
+        /* Set class name in manifest. Parse source files until we find a class that extends App.
+         * Get fully qualified Java class name and set attribute in Manifest.
+         */
+        sourceSets.main.allSource.files.each {  File file ->
+            if (appClassname =="" || appClassname == "UNKNOWN") {
+                // only execute the closure for this file if we haven't already found the app class name
+                appClassname = getAppClassname(file)
+                if(appClassname != "") {
+                    manifest.mainAttributes('S4-App-Class': appClassname)
+                }
+            }
+        }
+    } else {
+        manifest.mainAttributes('S4-App-Class': "$appClass")
+    }
 
    if (appClassname == "UNKNOWN") {
 
        println "Couldn't find App class in source files...aborting."
-       exit(1)
+       System.exit(1)
    }
 }
 
@@ -132,7 +138,7 @@ s4r << {
 }
 
 task cp << {
-    description='dumps the classpath for running a class from this project, into a \'classpath.txt\' file in the current directory'
+    description='Dumps the classpath for running a class from this project, into a \'classpath.txt\' file in the current directory'
     new File("classpath.txt").write(sourceSets.main.runtimeClasspath.asPath)
 }
 
@@ -148,15 +154,16 @@ task installS4R (type: Copy) {
 */
 def getAppClassname(file) {
    def classname = "UNKNOWN"
-   lines= file.readLines()
+   def lines= file.readLines()
+   def packageName = ""
    for(line in lines) {
 
        def pn = line =~ /.*package\s+([\w\.]+)\s*;.*/
        if(pn) {
            packageName = pn[0][1] + "."
        }
-
        def an = line =~ /.*public\s+class\s+(\w+)\s+extends.+App.*\{/
+
        if (an) {
            classname = packageName + an[0][1]
            println "Found app class name: " + classname

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/subprojects/s4-tools/src/main/resources/templates/settings.gradle
----------------------------------------------------------------------
diff --git a/subprojects/s4-tools/src/main/resources/templates/settings.gradle b/subprojects/s4-tools/src/main/resources/templates/settings.gradle
new file mode 100644
index 0000000..e0a06c9
--- /dev/null
+++ b/subprojects/s4-tools/src/main/resources/templates/settings.gradle
@@ -0,0 +1 @@
+rootProject.name=<project-name>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/test-apps/s4-counter/build.gradle
----------------------------------------------------------------------
diff --git a/test-apps/s4-counter/build.gradle b/test-apps/s4-counter/build.gradle
index 87512df..d71f75f 100644
--- a/test-apps/s4-counter/build.gradle
+++ b/test-apps/s4-counter/build.gradle
@@ -34,9 +34,9 @@
 /* Set the destination where we want to install the apps. */
 //s4AppInstallDir = "/tmp/s4Apps" // TODO: decide how to standarize dirs, use env var?
 
-s4AppInstallDir = hasProperty('appsDir') ? "$appsDir" : "/tmp/appsDir"
+project.ext["s4AppInstallDir"] = hasProperty('appsDir') ? "$appsDir" : "/tmp/appsDir"
 
-s4Version = '0.5.0-SNAPSHOT'
+project.ext["s4Version"] = '0.5.0-SNAPSHOT'
 description = 'Apache S4 App'
 //defaultTasks 'installS4R'
 archivesBaseName = "$project.name"
@@ -60,7 +60,7 @@ targetCompatibility = 1.6
 
 
 /* All project libraries must be defined here. */
-libraries = [
+project.ext["libraries"] = [
            json:               'org.json:json:20090211',
            guava:              'com.google.guava:guava:10.0.1',
            gson:               'com.google.code.gson:gson:1.6',
@@ -131,7 +131,7 @@ manifest.mainAttributes(
        'S4-Version': s4Version
        )
 
-appDependencies = ( configurations.compile )
+project.ext["appDependencies"] = ( configurations.compile )
 
 /* This task will extract all the class files and create a fat jar. We set the manifest and the extension to make it an S4 archive file. */
 // TODO: exclude schenma files as needed (not critical) see: http://forums.gradle.org/gradle/topics/using_gradle_to_fat_jar_a_spring_project
@@ -193,7 +193,8 @@ task wrapper(type: Wrapper) { gradleVersion = '1.0-milestone-3' }
 */
 def getAppClassname(file) {
    def classname = "UNKNOWN"
-   lines= file.readLines()
+   def lines= file.readLines()
+   def packageName=""
    for(line in lines) {
 
        def pn = line =~ /.*package\s+([\w\.]+)\s*;.*/

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/test-apps/s4-showtime/build.gradle
----------------------------------------------------------------------
diff --git a/test-apps/s4-showtime/build.gradle b/test-apps/s4-showtime/build.gradle
index 72ff887..3bfe72f 100644
--- a/test-apps/s4-showtime/build.gradle
+++ b/test-apps/s4-showtime/build.gradle
@@ -34,9 +34,9 @@
 /* Set the destination where we want to install the apps. */
 //s4AppInstallDir = "/tmp/s4Apps" // TODO: decide how to standarize dirs, use env var?
 
-s4AppInstallDir = hasProperty('appsDir') ? "$appsDir" : "/tmp/appsDir"
+project.ext["s4AppInstallDir"] = hasProperty('appsDir') ? "$appsDir" : "/tmp/appsDir"
 
-s4Version = '0.5.0-SNAPSHOT'
+project.ext["s4Version"] = '0.5.0-SNAPSHOT'
 description = 'Apache S4 App'
 //defaultTasks 'installS4R'
 archivesBaseName = "$project.name"
@@ -60,7 +60,7 @@ targetCompatibility = 1.6
 
 
 /* All project libraries must be defined here. */
-libraries = [
+project.ext["libraries"] = [
            json:               'org.json:json:20090211',
            guava:              'com.google.guava:guava:10.0.1',
            gson:               'com.google.code.gson:gson:1.6',
@@ -131,7 +131,7 @@ manifest.mainAttributes(
        'S4-Version': s4Version
        )
 
-appDependencies = ( configurations.compile )
+project.ext["appDependencies"] = ( configurations.compile )
 
 /* This task will extract all the class files and create a fat jar. We set the manifest and the extension to make it an S4 archive file. */
 // TODO: exclude schenma files as needed (not critical) see: http://forums.gradle.org/gradle/topics/using_gradle_to_fat_jar_a_spring_project
@@ -191,7 +191,8 @@ task installS4R (type: Copy) {
 */
 def getAppClassname(file) {
    def classname = "UNKNOWN"
-   lines= file.readLines()
+   def lines= file.readLines()
+   def packageName=""
    for(line in lines) {
 
        def pn = line =~ /.*package\s+([\w\.]+)\s*;.*/

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/test-apps/simple-deployable-app-1/build.gradle
----------------------------------------------------------------------
diff --git a/test-apps/simple-deployable-app-1/build.gradle b/test-apps/simple-deployable-app-1/build.gradle
index 87512df..ad4dca5 100644
--- a/test-apps/simple-deployable-app-1/build.gradle
+++ b/test-apps/simple-deployable-app-1/build.gradle
@@ -34,9 +34,9 @@
 /* Set the destination where we want to install the apps. */
 //s4AppInstallDir = "/tmp/s4Apps" // TODO: decide how to standarize dirs, use env var?
 
-s4AppInstallDir = hasProperty('appsDir') ? "$appsDir" : "/tmp/appsDir"
+project.ext["s4AppInstallDir"] = hasProperty('appsDir') ? "$appsDir" : "/tmp/appsDir"
 
-s4Version = '0.5.0-SNAPSHOT'
+project.ext["s4Version"] = '0.5.0-SNAPSHOT'
 description = 'Apache S4 App'
 //defaultTasks 'installS4R'
 archivesBaseName = "$project.name"
@@ -60,7 +60,7 @@ targetCompatibility = 1.6
 
 
 /* All project libraries must be defined here. */
-libraries = [
+project.ext["libraries"] = [
            json:               'org.json:json:20090211',
            guava:              'com.google.guava:guava:10.0.1',
            gson:               'com.google.code.gson:gson:1.6',
@@ -131,7 +131,7 @@ manifest.mainAttributes(
        'S4-Version': s4Version
        )
 
-appDependencies = ( configurations.compile )
+project.ext["appDependencies"] = ( configurations.compile )
 
 /* This task will extract all the class files and create a fat jar. We set the manifest and the extension to make it an S4 archive file. */
 // TODO: exclude schenma files as needed (not critical) see: http://forums.gradle.org/gradle/topics/using_gradle_to_fat_jar_a_spring_project
@@ -193,7 +193,8 @@ task wrapper(type: Wrapper) { gradleVersion = '1.0-milestone-3' }
 */
 def getAppClassname(file) {
    def classname = "UNKNOWN"
-   lines= file.readLines()
+   def lines= file.readLines()
+   def packageName = ""
    for(line in lines) {
 
        def pn = line =~ /.*package\s+([\w\.]+)\s*;.*/

http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/ab7f0206/test-apps/simple-deployable-app-2/build.gradle
----------------------------------------------------------------------
diff --git a/test-apps/simple-deployable-app-2/build.gradle b/test-apps/simple-deployable-app-2/build.gradle
index 87512df..ad4dca5 100644
--- a/test-apps/simple-deployable-app-2/build.gradle
+++ b/test-apps/simple-deployable-app-2/build.gradle
@@ -34,9 +34,9 @@
 /* Set the destination where we want to install the apps. */
 //s4AppInstallDir = "/tmp/s4Apps" // TODO: decide how to standarize dirs, use env var?
 
-s4AppInstallDir = hasProperty('appsDir') ? "$appsDir" : "/tmp/appsDir"
+project.ext["s4AppInstallDir"] = hasProperty('appsDir') ? "$appsDir" : "/tmp/appsDir"
 
-s4Version = '0.5.0-SNAPSHOT'
+project.ext["s4Version"] = '0.5.0-SNAPSHOT'
 description = 'Apache S4 App'
 //defaultTasks 'installS4R'
 archivesBaseName = "$project.name"
@@ -60,7 +60,7 @@ targetCompatibility = 1.6
 
 
 /* All project libraries must be defined here. */
-libraries = [
+project.ext["libraries"] = [
            json:               'org.json:json:20090211',
            guava:              'com.google.guava:guava:10.0.1',
            gson:               'com.google.code.gson:gson:1.6',
@@ -131,7 +131,7 @@ manifest.mainAttributes(
        'S4-Version': s4Version
        )
 
-appDependencies = ( configurations.compile )
+project.ext["appDependencies"] = ( configurations.compile )
 
 /* This task will extract all the class files and create a fat jar. We set the manifest and the extension to make it an S4 archive file. */
 // TODO: exclude schenma files as needed (not critical) see: http://forums.gradle.org/gradle/topics/using_gradle_to_fat_jar_a_spring_project
@@ -193,7 +193,8 @@ task wrapper(type: Wrapper) { gradleVersion = '1.0-milestone-3' }
 */
 def getAppClassname(file) {
    def classname = "UNKNOWN"
-   lines= file.readLines()
+   def lines= file.readLines()
+   def packageName = ""
    for(line in lines) {
 
        def pn = line =~ /.*package\s+([\w\.]+)\s*;.*/