Add Helper Client To Interface With Cluster HTTP APIs

- updated start / stop sample cluster scripts
- align args4j versions with latest released
- removed sample scripts from asterix-server jar
- extendable

Change-Id: Ib44cc3617c4ff6e995f26c1853bc9d78a1faacd7
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1126
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/asterixdb/asterix-client-helper/pom.xml b/asterixdb/asterix-client-helper/pom.xml
new file mode 100644
index 0000000..7068cf6
--- /dev/null
+++ b/asterixdb/asterix-client-helper/pom.xml
@@ -0,0 +1,88 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>asterix-client-helper</artifactId>
+  <parent>
+    <groupId>org.apache.asterix</groupId>
+    <artifactId>apache-asterixdb</artifactId>
+    <version>0.8.9-SNAPSHOT</version>
+  </parent>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>appassembler-maven-plugin</artifactId>
+        <version>1.3</version>
+        <configuration>
+          <assembleDirectory>
+            ${project.build.directory}/appassembler
+          </assembleDirectory>
+          <repositoryLayout>flat</repositoryLayout>
+          <repositoryName>lib</repositoryName>
+          <useWildcardClassPath>false</useWildcardClassPath>
+          <programs>
+            <program>
+              <platforms>
+                <platform>unix</platform>
+              </platforms>
+              <name>asterixhelper</name>
+              <mainClass>org.apache.asterix.clienthelper.AsterixHelper</mainClass>
+            </program>
+          </programs>
+          <daemons/>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>assemble</goal>
+              <goal>generate-daemons</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.6</version>
+        <executions>
+          <execution>
+            <configuration>
+              <attach>true</attach>
+              <descriptor>src/main/assembly/assembly.xml</descriptor>
+            </configuration>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>args4j</groupId>
+      <artifactId>args4j</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/asterixdb/asterix-client-helper/src/main/assembly/assembly.xml b/asterixdb/asterix-client-helper/src/main/assembly/assembly.xml
new file mode 100644
index 0000000..2e4e133
--- /dev/null
+++ b/asterixdb/asterix-client-helper/src/main/assembly/assembly.xml
@@ -0,0 +1,38 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
+  <id>assembly</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <fileSets>
+    <fileSet>
+      <directory>target/appassembler/lib</directory>
+      <outputDirectory>lib</outputDirectory>
+    </fileSet>
+    <fileSet>
+      <directory>target/appassembler/bin</directory>
+      <outputDirectory>bin</outputDirectory>
+      <fileMode>0755</fileMode>
+    </fileSet>
+  </fileSets>
+</assembly>
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/Args.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/Args.java
new file mode 100644
index 0000000..e767f28
--- /dev/null
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/Args.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.clienthelper;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@SuppressWarnings("FieldCanBeLocal")
+public class Args {
+
+    @Option(name = "-clusteraddress", metaVar = "<address>",
+            usage = "Hostname or IP Address of the cluster")
+    protected String clusterAddress = InetAddress.getLoopbackAddress().getHostAddress();
+
+    @Option(name = "-clusterport", metaVar = "<port>", usage = "Port of the cluster to connect to")
+    protected int clusterPort = 19002;
+
+    @Option(name = "-clusterstatepath", metaVar = "<path>",
+            usage = "Path on host:port to check for cluster readiness")
+    protected String clusterStatePath = "admin/cluster";
+
+    @Option(name = "-shutdownpath", metaVar = "<path>",
+            usage = "Path on host:port to invoke to initiate shutdown")
+    protected String shutdownPath = "admin/shutdown";
+
+
+    @Option(name = "-timeout", metaVar = "<secs>", usage = "Timeout for wait commands in seconds")
+    protected int timeoutSecs = -1;
+
+    @Option(name = "-quiet", aliases = "-q", usage = "Suppress all normal output")
+    protected boolean quiet;
+
+    @Argument
+    protected List<String> arguments = new ArrayList<>();
+
+    public String getClusterAddress() {
+        return clusterAddress;
+    }
+
+    public int getClusterPort() {
+        return clusterPort;
+    }
+
+    public int getTimeoutSecs() {
+        return timeoutSecs;
+    }
+
+    public boolean isQuiet() {
+        return quiet;
+    }
+
+    public String getClusterStatePath() {
+        return clusterStatePath;
+    }
+
+    public List<String> getArguments() {
+        return arguments;
+    }
+
+    public String getShutdownPath() {
+        return shutdownPath;
+    }
+}
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelper.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelper.java
new file mode 100644
index 0000000..7dfede9
--- /dev/null
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelper.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.clienthelper;
+
+import java.io.IOException;
+
+public class AsterixHelper {
+
+    private AsterixHelper() {
+    }
+
+    public static void main(String [] args) throws IOException {
+        AsterixHelperExecution execution = new AsterixHelperExecution();
+        System.exit(execution.execute(args));
+    }
+}
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelperExecution.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelperExecution.java
new file mode 100644
index 0000000..82e8386
--- /dev/null
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelperExecution.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.clienthelper;
+
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.apache.asterix.clienthelper.commands.ClientCommand;
+import org.apache.asterix.clienthelper.commands.ClientCommand.Command;
+import org.apache.asterix.clienthelper.commands.GetClusterStateCommand;
+import org.apache.asterix.clienthelper.commands.ShutdownCommand;
+import org.apache.asterix.clienthelper.commands.WaitForClusterCommand;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.ParserProperties;
+
+public class AsterixHelperExecution {
+
+    public static final String ASTERIX_HELPER = "asterixhelper";
+
+    protected AsterixHelperExecution() {
+    }
+
+    @SuppressWarnings({
+            "squid:S106", // use of System.err
+            "squid:S1166" // rethrow or log exception
+    })
+    protected int execute(String [] argArray) throws IOException {
+        Args args = createArgs();
+        CmdLineParser parser = createParser(args);
+        try {
+            parser.parseArgument(argArray);
+            if (args.getArguments().isEmpty()) {
+                throw new CmdLineException(parser, "No command specified.", null);
+            }
+            ClientCommand command = getCommand(args);
+            if (command == null) {
+                throw new CmdLineException(parser, "Unknown command specified: " + args.getArguments().get(0), null);
+            } else {
+                return command.execute();
+            }
+        } catch (CmdLineException e) {
+            System.err.println("ERROR: " + e.getMessage() + "\n\n"
+                    + "Usage: " + getHelperCommandName() + " [options] <command>\n\n"
+                    + "Commands:");
+            printCommandUsage(System.err);
+            System.err.println("Options:");
+            parser.printUsage(System.err);
+            System.err.flush();
+            return 99;
+        }
+    }
+
+    protected String getHelperCommandName() {
+        return ASTERIX_HELPER;
+    }
+
+    protected void printCommandUsage(PrintStream out) {
+        for (Command command : Command.values()) {
+            out.println("  " + command.name().toLowerCase() + " " + command.usage());
+        }
+    }
+
+    protected CmdLineParser createParser(Args args) {
+        return new CmdLineParser(args, ParserProperties.defaults().withUsageWidth(120));
+    }
+
+    protected Args createArgs() {
+        return new Args();
+    }
+
+    @SuppressWarnings("squid:S1166") // rethrow or log IllegalArgumentException
+    protected ClientCommand getCommand(Args args) {
+
+        Command command = Command.valueOfSafe(args.getArguments().get(0));
+        if (command == null) {
+            return null;
+        }
+        switch (command) {
+            case GET_CLUSTER_STATE:
+                return new GetClusterStateCommand(args);
+            case WAIT_FOR_CLUSTER:
+                return new WaitForClusterCommand(args);
+            case SHUTDOWN_CLUSTER:
+                return new ShutdownCommand(args);
+            default:
+                throw new IllegalStateException("NYI: " + command);
+        }
+    }
+}
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ClientCommand.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ClientCommand.java
new file mode 100644
index 0000000..734d87b
--- /dev/null
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ClientCommand.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.clienthelper.commands;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+
+import org.apache.asterix.clienthelper.Args;
+
+public abstract class ClientCommand {
+
+    public enum Command {
+        GET_CLUSTER_STATE("- Get state of cluster (errorcode 0 = UP, non-zero = DOWN)"),
+        WAIT_FOR_CLUSTER(" - Wait for cluster to be ready (errorcode 0 = UP, non-zero = UNKNOWN)\")"),
+        SHUTDOWN_CLUSTER(" - Instructs the cluster to shut down"),;
+
+        private final String usage;
+        private static final Map<String, Command> nameMap = new HashMap<>();
+
+        static {
+            for (Command command : values()) {
+                nameMap.put(command.name(), command);
+            }
+        }
+
+        Command(String usage) {
+            this.usage = usage;
+        }
+
+        public String usage() {
+            return usage;
+        }
+
+        public static Command valueOfSafe(String name) {
+            return nameMap.get(name.toUpperCase());
+        }
+    }
+
+    protected final Args args;
+
+    public ClientCommand(Args args) {
+        this.args = args;
+    }
+
+    @SuppressWarnings("squid:S106")
+    protected void log(Level severity, String message) {
+        if (!args.isQuiet()) {
+            System.out.println(severity + ": " + message);
+        }
+    }
+
+    protected void log(String message) {
+        log(Level.INFO, message);
+    }
+
+    public abstract int execute() throws IOException;
+}
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/GetClusterStateCommand.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/GetClusterStateCommand.java
new file mode 100644
index 0000000..275583e
--- /dev/null
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/GetClusterStateCommand.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.clienthelper.commands;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.asterix.clienthelper.Args;
+
+public class GetClusterStateCommand extends RemoteCommand {
+
+    public GetClusterStateCommand(Args args) {
+        super(args);
+    }
+
+    private void logState(String state) {
+        final String hostPort = args.getClusterAddress() + ":" + args.getClusterPort();
+        log("Cluster " + hostPort + " is " + state + ".");
+    }
+
+    @Override
+    public int execute() throws IOException {
+        log("Attempting to determine state of cluster " + hostPort + "...");
+        int statusCode = tryGet(args.getClusterStatePath());
+        // TODO (mblow): interrogate result to determine cluster readiness, not rely on HTTP 200
+        switch (statusCode) {
+            case HttpServletResponse.SC_OK:
+                logState("UP");
+                return 0;
+            case -1:
+                logState("DOWN");
+                return 1;
+            default:
+                logState("UNKNOWN");
+                return 2;
+        }
+    }
+}
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/RemoteCommand.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/RemoteCommand.java
new file mode 100644
index 0000000..1440b70
--- /dev/null
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/RemoteCommand.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.clienthelper.commands;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.asterix.clienthelper.Args;
+
+public abstract class RemoteCommand extends ClientCommand {
+    enum Method {
+        GET,
+        POST
+    }
+
+    protected final String hostPort;
+
+    public RemoteCommand(Args args) {
+        super(args);
+        hostPort = args.getClusterAddress() + ":" + args.getClusterPort();
+    }
+
+    @SuppressWarnings("squid:S1166") // log or rethrow exception
+    protected int tryConnect(String path, Method method) throws MalformedURLException {
+        URL url = new URL("http://" + hostPort + "/" + path);
+        try {
+            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
+            conn.setRequestMethod(method.name());
+            return conn.getResponseCode();
+
+        } catch (IOException e) {
+            return -1;
+        }
+    }
+
+    protected int tryGet(String path) throws MalformedURLException {
+        return tryConnect(path, Method.GET);
+    }
+
+    protected int tryPost(String path) throws MalformedURLException {
+        return tryConnect(path, Method.POST);
+    }
+}
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ShutdownCommand.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ShutdownCommand.java
new file mode 100644
index 0000000..ee6e1a7
--- /dev/null
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/ShutdownCommand.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.clienthelper.commands;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.asterix.clienthelper.Args;
+
+public class ShutdownCommand extends RemoteCommand {
+    private final String shutdownPath;
+
+    public ShutdownCommand(Args args) {
+        super(args);
+        shutdownPath = args.getShutdownPath();
+    }
+
+    private void clusterLog(String suffix) {
+        log("Cluster " + hostPort + " " + suffix);
+    }
+
+    @Override
+    public int execute() throws IOException {
+        log("Attempting to shutdown cluster " + hostPort + "...");
+        int statusCode = tryPost(shutdownPath);
+        // TODO (mblow): interrogate result to determine acceptance, not rely on HTTP 200
+        switch (statusCode) {
+            case HttpServletResponse.SC_ACCEPTED:
+                clusterLog("accepted shutdown request.");
+                return 0;
+            case -1:
+                clusterLog("not reachable.");
+                return 1;
+            default:
+                clusterLog("shutdown request failed, with response code:" + statusCode);
+        }
+        return 1;
+
+    }
+}
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/WaitForClusterCommand.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/WaitForClusterCommand.java
new file mode 100644
index 0000000..fda22ee
--- /dev/null
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/WaitForClusterCommand.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.clienthelper.commands;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.asterix.clienthelper.Args;
+
+public class WaitForClusterCommand extends RemoteCommand {
+
+    public WaitForClusterCommand(Args args) {
+        super(args);
+    }
+
+    @Override
+    @SuppressWarnings("squid:S2142") // interrupted exception
+    public int execute() throws IOException {
+        log("Waiting "
+                + (args.getTimeoutSecs() > 0 ? "up to " + args.getTimeoutSecs() + " seconds " : "")
+                + "for cluster " + hostPort + " to be available.");
+
+        long startTime = System.currentTimeMillis();
+        while (true) {
+            if (tryGet(args.getClusterStatePath()) == HttpServletResponse.SC_OK) {
+                log("Cluster started.");
+                return 0;
+            }
+            if (args.getTimeoutSecs() >= 0
+                    && (startTime + (args.getTimeoutSecs() * 1000) < System.currentTimeMillis())) {
+                break;
+            }
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException e) {
+                return 22;
+            }
+        }
+        log("Cluster " + hostPort + " was not available before timeout of " + args.getTimeoutSecs()
+                + " seconds was exhausted.");
+        return 1;
+    }
+}
diff --git a/asterixdb/asterix-events/pom.xml b/asterixdb/asterix-events/pom.xml
index 97bf78f..4bd66df 100644
--- a/asterixdb/asterix-events/pom.xml
+++ b/asterixdb/asterix-events/pom.xml
@@ -146,9 +146,6 @@
     <dependency>
       <groupId>args4j</groupId>
       <artifactId>args4j</artifactId>
-      <version>2.0.12</version>
-      <type>jar</type>
-      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.jvnet.jaxb2_commons</groupId>
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/AsterixEventServiceUtil.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/AsterixEventServiceUtil.java
index 08d89cb..02c06dc 100644
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/AsterixEventServiceUtil.java
+++ b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/AsterixEventServiceUtil.java
@@ -32,8 +32,10 @@
 import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Random;
+import java.util.Set;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.jar.JarOutputStream;
@@ -79,6 +81,8 @@
     public static final String MANAGIX_INTERNAL_DIR = ".installer";
     public static final String MANAGIX_CONF_XML = "conf" + File.separator + "managix-conf.xml";
 
+    private static final int BUFFER_SIZE = 4096;
+
     public static AsterixInstance createAsterixInstance(String asterixInstanceName, Cluster cluster,
             AsterixConfiguration asterixConfiguration) throws FileNotFoundException, IOException {
         Node metadataNode = getMetadataNode(asterixInstanceName, cluster);
@@ -316,25 +320,25 @@
     }
 
     public static void unzip(String sourceFile, String destDir) throws IOException {
-        BufferedOutputStream dest = null;
-        FileInputStream fis = new FileInputStream(sourceFile);
-        ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
-        ZipEntry entry = null;
+        final FileInputStream fis = new FileInputStream(sourceFile);
+        final ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
+        final File destDirFile = new File(destDir);
+        final byte [] data = new byte[BUFFER_SIZE];
 
-        int BUFFER_SIZE = 4096;
+        ZipEntry entry;
+        Set<String> visitedDirs = new HashSet<>();
         createDir(destDir);
         while ((entry = zis.getNextEntry()) != null) {
-            String dst = destDir + File.separator + entry.getName();
+            createDir(destDirFile, entry, visitedDirs);
             if (entry.isDirectory()) {
-                createDir(destDir, entry);
                 continue;
             }
             int count;
-            byte data[] = new byte[BUFFER_SIZE];
 
             // write the file to the disk
+            File dst = new File(destDir, entry.getName());
             FileOutputStream fos = new FileOutputStream(dst);
-            dest = new BufferedOutputStream(fos, BUFFER_SIZE);
+            BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER_SIZE);
             while ((count = zis.read(data, 0, BUFFER_SIZE)) != -1) {
                 dest.write(data, 0, count);
             }
@@ -424,12 +428,16 @@
         writer.close();
     }
 
-    private static void createDir(String destDirectory, ZipEntry entry) {
+    private static void createDir(File destDirectory, ZipEntry entry, Set<String> visitedDirs) {
         String name = entry.getName();
         int index = name.lastIndexOf(File.separator);
-        String dirSequence = name.substring(0, index);
-        File newDirs = new File(destDirectory + File.separator + dirSequence);
-        newDirs.mkdirs();
+        if (index != -1) {
+            String dirSequence = name.substring(0, index);
+            if (visitedDirs.add(dirSequence)) {
+                File newDirs = new File(destDirectory, dirSequence);
+                newDirs.mkdirs();
+            }
+        }
     }
 
     private static void createDir(String destDirectory) {
diff --git a/asterixdb/asterix-installer/pom.xml b/asterixdb/asterix-installer/pom.xml
index c1de4a4..2b849c2 100644
--- a/asterixdb/asterix-installer/pom.xml
+++ b/asterixdb/asterix-installer/pom.xml
@@ -240,9 +240,6 @@
     <dependency>
       <groupId>args4j</groupId>
       <artifactId>args4j</artifactId>
-      <version>2.0.12</version>
-      <type>jar</type>
-      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.zookeeper</groupId>
diff --git a/asterixdb/asterix-server/pom.xml b/asterixdb/asterix-server/pom.xml
index 78e990f..269c219 100644
--- a/asterixdb/asterix-server/pom.xml
+++ b/asterixdb/asterix-server/pom.xml
@@ -119,7 +119,6 @@
             <goals>
               <goal>assemble</goal>
               <goal>generate-daemons</goal>
-              <goal>create-repository</goal>
             </goals>
           </execution>
         </executions>
@@ -144,10 +143,11 @@
       </plugin>
       <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
-        <version>2.2-beta-5</version>
+        <version>2.6</version>
         <executions>
           <execution>
             <configuration>
+              <attach>true</attach>
               <filters>
                 <filter>${project.basedir}/src/main/assembly/filter.properties</filter>
               </filters>
@@ -157,7 +157,7 @@
             </configuration>
             <phase>package</phase>
             <goals>
-              <goal>attached</goal>
+              <goal>single</goal>
             </goals>
           </execution>
         </executions>
@@ -237,5 +237,12 @@
       <artifactId>appassembler-booter</artifactId>
       <version>1.3.1</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.asterix</groupId>
+      <artifactId>asterix-client-helper</artifactId>
+      <version>${project.version}</version>
+      <type>zip</type>
+      <classifier>assembly</classifier>
+    </dependency>
   </dependencies>
 </project>
diff --git a/asterixdb/asterix-server/src/main/assembly/binary-assembly.xml b/asterixdb/asterix-server/src/main/assembly/binary-assembly.xml
index 4afde5f..0c82f41 100644
--- a/asterixdb/asterix-server/src/main/assembly/binary-assembly.xml
+++ b/asterixdb/asterix-server/src/main/assembly/binary-assembly.xml
@@ -16,7 +16,9 @@
  ! specific language governing permissions and limitations
  ! under the License.
  !-->
-<assembly>
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
   <id>binary-assembly</id>
   <formats>
     <format>zip</format>
@@ -40,21 +42,18 @@
       </includes>
     </fileSet>
     <fileSet>
-      <directory>src/main/resources</directory>
-      <outputDirectory>.</outputDirectory>
-      <includes>
-        <include>samples/**</include>
-      </includes>
+      <directory>src/main/samples</directory>
+      <outputDirectory>samples</outputDirectory>
       <excludes>
         <exclude>**/*.sh</exclude>
       </excludes>
       <filtered>true</filtered>
     </fileSet>
     <fileSet>
-      <directory>src/main/resources</directory>
-      <outputDirectory>.</outputDirectory>
+      <directory>src/main/samples</directory>
+      <outputDirectory>samples</outputDirectory>
       <includes>
-        <include>samples/**/*.sh</include>
+        <include>**/*.sh</include>
       </includes>
       <filtered>true</filtered>
       <fileMode>0755</fileMode>
@@ -83,4 +82,14 @@
       <fileMode>0755</fileMode>
     </fileSet>
   </fileSets>
+  <dependencySets>
+    <dependencySet>
+      <useStrictFiltering>true</useStrictFiltering>
+      <unpack>true</unpack>
+      <outputDirectory>.</outputDirectory>
+      <includes>
+        <include>org.apache.asterix:asterix-client-helper:zip:assembly:*</include>
+      </includes>
+    </dependencySet>
+  </dependencySets>
 </assembly>
diff --git a/asterixdb/asterix-server/src/main/assembly/filter.properties b/asterixdb/asterix-server/src/main/assembly/filter.properties
index 301aeaf..f7a53b3 100644
--- a/asterixdb/asterix-server/src/main/assembly/filter.properties
+++ b/asterixdb/asterix-server/src/main/assembly/filter.properties
@@ -1,5 +1,5 @@
 NC_SERVICE_COMMAND=asterixncservice
 CC_COMMAND=asterixcc
 NC_COMMAND=asterixnc
+HELPER_COMMAND=asterixhelper
 LISTEN_PORT=19002
-SHUTDOWN_SERVLET_PATH=admin/shutdown
diff --git a/asterixdb/asterix-server/src/main/resources/samples/local/bin/start-sample-cluster.sh b/asterixdb/asterix-server/src/main/resources/samples/local/bin/start-sample-cluster.sh
deleted file mode 100755
index 932231f..0000000
--- a/asterixdb/asterix-server/src/main/resources/samples/local/bin/start-sample-cluster.sh
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash
-# ----------------------------------------------------------------------------
-#  Copyright 2001-2006 The Apache Software Foundation.
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-# ----------------------------------------------------------------------------
-#
-#   Copyright (c) 2001-2006 The Apache Software Foundation.  All rights
-#   reserved.
-
-if [ -z "$JAVA_HOME" -a -x /usr/libexec/java_home ]; then
-  JAVA_HOME=$(/usr/libexec/java_home)
-  export JAVA_HOME
-fi
-
-[ -z "$JAVA_HOME" ] && {
-  echo "JAVA_HOME not set"
-  exit 1
-}
-"$JAVA_HOME/bin/java" -version || {
-  echo "JAVA_HOME not valid"
-  exit 2
-}
-
-DIRNAME=$(dirname $0)
-[ $(echo $DIRNAME | wc -l) -ne 1 ] && {
-  echo "Paths with spaces are not supported"
-  exit 3
-}
-
-CLUSTERDIR=$(cd $DIRNAME/..; echo $PWD)
-INSTALLDIR=$(cd $CLUSTERDIR/../..; echo $PWD)
-LOGSDIR=$CLUSTERDIR/logs
-
-echo "CLUSTERDIR=$CLUSTERDIR"
-echo "INSTALLDIR=$INSTALLDIR"
-
-cd $CLUSTERDIR
-mkdir -p $LOGSDIR
-
-(
-  echo "--------------------------"
-  date
-  echo "--------------------------"
-) | tee -a $LOGSDIR/blue-service.log | tee -a $LOGSDIR/red-service.log >> $LOGSDIR/cc.log
-
-$INSTALLDIR/bin/${NC_SERVICE_COMMAND} -logdir - -config-file $CLUSTERDIR/conf/blue.conf >> $LOGSDIR/blue-service.log 2>&1 &
-$INSTALLDIR/bin/${NC_SERVICE_COMMAND} -logdir - >> $LOGSDIR/red-service.log 2>&1 &
-$INSTALLDIR/bin/${CC_COMMAND} -config-file $CLUSTERDIR/conf/cc.conf >> $LOGSDIR/cc.log 2>&1 &
-
-echo -n "Waiting for cluster to start."
-while [ 1 ]; do
-  curl -s -o /dev/null http://localhost:${LISTEN_PORT} && break
-  echo -n "."
-  sleep 1s
-done
-echo ".done"
-echo
-echo "See output in $LOGSDIR/"
diff --git a/asterixdb/asterix-server/src/main/resources/samples/local/bin/stop-sample-cluster.sh b/asterixdb/asterix-server/src/main/resources/samples/local/bin/stop-sample-cluster.sh
deleted file mode 100755
index 9836cb3..0000000
--- a/asterixdb/asterix-server/src/main/resources/samples/local/bin/stop-sample-cluster.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/bash
-# ----------------------------------------------------------------------------
-#  Copyright 2001-2006 The Apache Software Foundation.
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-# ----------------------------------------------------------------------------
-#
-#   Copyright (c) 2001-2006 The Apache Software Foundation.  All rights
-#   reserved.
-
-if [ -z "$JAVA_HOME" -a -x /usr/libexec/java_home ]; then
-  JAVA_HOME=$(/usr/libexec/java_home)
-  export JAVA_HOME
-fi
-
-[ -z "$JAVA_HOME" ] && {
-  echo "JAVA_HOME not set"
-  exit 1
-}
-"$JAVA_HOME/bin/java" -version || {
-  echo "JAVA_HOME not valid"
-  exit 2
-}
-
-curl -X POST http://localhost:${LISTEN_PORT}/${SHUTDOWN_SERVLET_PATH}
-$JAVA_HOME/bin/jps | awk '/NCService/ { print $1 }' | xargs kill
-echo
-echo -n "Waiting for CCDriver to terminate."
-while [ -n "$($JAVA_HOME/bin/jps | awk '/CCDriver/')" ]; do
-  sleep 2s
-  echo -n .
-done
-echo ".done."
diff --git a/asterixdb/asterix-server/src/main/samples/local/bin/start-sample-cluster.sh b/asterixdb/asterix-server/src/main/samples/local/bin/start-sample-cluster.sh
new file mode 100755
index 0000000..e97f900
--- /dev/null
+++ b/asterixdb/asterix-server/src/main/samples/local/bin/start-sample-cluster.sh
@@ -0,0 +1,69 @@
+#!/bin/bash
+# ------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ------------------------------------------------------------
+
+if [ -z "$JAVA_HOME" -a -x /usr/libexec/java_home ]; then
+  JAVA_HOME=$(/usr/libexec/java_home)
+  export JAVA_HOME
+fi
+
+[ -z "$JAVA_HOME" ] && {
+  echo "JAVA_HOME not set"
+  exit 1
+}
+"$JAVA_HOME/bin/java" -version 2>&1 | grep -q '1\.[89]' || {
+  echo "JAVA_HOME must be at version 1.8 or later:"
+  "$JAVA_HOME/bin/java" -version
+  exit 2
+}
+DIRNAME=$(dirname $0)
+[ $(echo $DIRNAME | wc -l) -ne 1 ] && {
+  echo "Paths with spaces are not supported"
+  exit 3
+}
+
+CLUSTERDIR=$(cd $DIRNAME/..; echo $PWD)
+INSTALLDIR=$(cd $CLUSTERDIR/../..; echo $PWD)
+LOGSDIR=$CLUSTERDIR/logs
+
+echo "CLUSTERDIR=$CLUSTERDIR"
+echo "INSTALLDIR=$INSTALLDIR"
+echo
+cd $CLUSTERDIR
+mkdir -p $LOGSDIR
+$INSTALLDIR/bin/${HELPER_COMMAND} get_cluster_state -quiet \
+    && echo "ERROR: sample cluster address (localhost:${LISTEN_PORT}) already in use" && exit 1
+
+(
+  echo "--------------------------"
+  date
+  echo "--------------------------"
+) | tee -a $LOGSDIR/blue-service.log | tee -a $LOGSDIR/red-service.log >> $LOGSDIR/cc.log
+echo "Starting sample cluster..."
+$INSTALLDIR/bin/${NC_SERVICE_COMMAND} -logdir - -config-file $CLUSTERDIR/conf/blue.conf >> $LOGSDIR/blue-service.log 2>&1 &
+$INSTALLDIR/bin/${NC_SERVICE_COMMAND} -logdir - >> $LOGSDIR/red-service.log 2>&1 &
+$INSTALLDIR/bin/${CC_COMMAND} -config-file $CLUSTERDIR/conf/cc.conf >> $LOGSDIR/cc.log 2>&1 &
+echo "Waiting for sample cluster (localhost:${LISTEN_PORT}) to be ready..."
+if $INSTALLDIR/bin/${HELPER_COMMAND} wait_for_cluster -quiet -timeout 30;
+then
+  echo "Sample cluster (localhost:${LISTEN_PORT}) is ready..."
+else
+  echo "ERROR: cluster did not start successfully"
+fi
+echo "See output in $LOGSDIR/"
diff --git a/asterixdb/asterix-server/src/main/samples/local/bin/stop-sample-cluster.sh b/asterixdb/asterix-server/src/main/samples/local/bin/stop-sample-cluster.sh
new file mode 100755
index 0000000..7451e4e
--- /dev/null
+++ b/asterixdb/asterix-server/src/main/samples/local/bin/stop-sample-cluster.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+# ------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ------------------------------------------------------------
+
+if [ -z "$JAVA_HOME" -a -x /usr/libexec/java_home ]; then
+  JAVA_HOME=$(/usr/libexec/java_home)
+  export JAVA_HOME
+fi
+
+[ -z "$JAVA_HOME" ] && {
+  echo "JAVA_HOME not set"
+  exit 1
+}
+"$JAVA_HOME/bin/java" -version 2>&1 | grep -q '1\.[89]' || {
+  echo "JAVA_HOME must be at version 1.8 or later:"
+  "$JAVA_HOME/bin/java" -version
+  exit 2
+}
+DIRNAME=$(dirname $0)
+[ $(echo $DIRNAME | wc -l) -ne 1 ] && {
+  echo "Paths with spaces are not supported"
+  exit 3
+}
+
+CLUSTERDIR=$(cd $DIRNAME/..; echo $PWD)
+INSTALLDIR=$(cd $CLUSTERDIR/../..; echo $PWD)
+
+if $INSTALLDIR/bin/${HELPER_COMMAND} get_cluster_state -quiet;
+then
+  $INSTALLDIR/bin/${HELPER_COMMAND} shutdown_cluster
+else
+  echo "WARNING: sample cluster does not appear to be running, will attempt to kill any running NCServices and"
+  echo "         wait for CCDriver to terminate if running."
+fi
+
+$JAVA_HOME/bin/jps | awk '/NCService/ { print $1 }' | xargs kill 2>/dev/null
+first=1
+while [ -n "$($JAVA_HOME/bin/jps | awk '/CCDriver/')" ]; do
+  if [ $first ]; then
+    echo
+    echo -n "Waiting for CCDriver to terminate."
+    unset first
+  fi
+  sleep 2s
+  echo -n .
+done
+[ ! $first ] && echo ".done."
diff --git a/asterixdb/asterix-server/src/main/resources/samples/local/conf/blue.conf b/asterixdb/asterix-server/src/main/samples/local/conf/blue.conf
similarity index 100%
rename from asterixdb/asterix-server/src/main/resources/samples/local/conf/blue.conf
rename to asterixdb/asterix-server/src/main/samples/local/conf/blue.conf
diff --git a/asterixdb/asterix-server/src/main/resources/samples/local/conf/cc.conf b/asterixdb/asterix-server/src/main/samples/local/conf/cc.conf
similarity index 100%
rename from asterixdb/asterix-server/src/main/resources/samples/local/conf/cc.conf
rename to asterixdb/asterix-server/src/main/samples/local/conf/cc.conf
diff --git a/asterixdb/pom.xml b/asterixdb/pom.xml
index 7285a5a..6cbe20a 100644
--- a/asterixdb/pom.xml
+++ b/asterixdb/pom.xml
@@ -594,6 +594,7 @@
     <module>asterix-experiments</module>
     <module>asterix-coverage</module>
     <module>asterix-active</module>
+    <module>asterix-client-helper</module>
   </modules>
 
   <repositories>
@@ -788,6 +789,11 @@
         <artifactId>xercesImpl</artifactId>
         <version>2.11.0</version>
       </dependency>
+      <dependency>
+        <groupId>args4j</groupId>
+        <artifactId>args4j</artifactId>
+        <version>2.33</version>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 </project>
diff --git a/hyracks-fullstack/hyracks/pom.xml b/hyracks-fullstack/hyracks/pom.xml
index 70dfa38..cb2d661 100644
--- a/hyracks-fullstack/hyracks/pom.xml
+++ b/hyracks-fullstack/hyracks/pom.xml
@@ -90,10 +90,6 @@
       <id>hyracks-public</id>
       <url>http://obelix.ics.uci.edu/nexus/content/groups/hyracks-public/</url>
     </repository>
-    <repository>
-      <id>jboss-public</id>
-      <url>https://repository.jboss.org/nexus/content/groups/public/</url>
-    </repository>
   </repositories>
 
   <pluginRepositories>