You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@falcon.apache.org by aj...@apache.org on 2016/08/03 12:09:53 UTC

[1/3] falcon git commit: FALCON-1596 Spring shell based CLI for falcon

Repository: falcon
Updated Branches:
  refs/heads/master 075f02c51 -> da767c2f6


http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/java/org/apache/falcon/shell/commands/FalconEntityCommands.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/falcon/shell/commands/FalconEntityCommands.java b/shell/src/main/java/org/apache/falcon/shell/commands/FalconEntityCommands.java
new file mode 100644
index 0000000..35a6f2a
--- /dev/null
+++ b/shell/src/main/java/org/apache/falcon/shell/commands/FalconEntityCommands.java
@@ -0,0 +1,330 @@
+/**
+ * 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.falcon.shell.commands;
+
+import org.apache.falcon.ValidationUtil;
+import org.apache.falcon.ResponseHelper;
+import org.apache.falcon.entity.v0.EntityType;
+import org.apache.falcon.resource.EntityList;
+import org.apache.falcon.resource.FeedLookupResult;
+import org.apache.falcon.resource.SchedulableEntityInstanceResult;
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.shell.core.annotation.CliOption;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+
+import static org.apache.falcon.client.FalconCLIConstants.DEFINITION_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.DELETE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LOOKUP_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SLA_MISS_ALERT_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_ONLY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.UPDATE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.COLO_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.COLO_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEFINITION_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DELETE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEPENDENCY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.DEPENDENCY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.END_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.END_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ENTITY_NAME_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.ENTITY_NAME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FIELDS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FIELDS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FILE_PATH_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FILE_PATH_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FILTER_BY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FILTER_BY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LOOKUP_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NAMESEQ_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.NAMESEQ_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_INSTANCES_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_INSTANCES_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.OFFSET_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.OFFSET_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ORDER_BY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.ORDER_BY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.PATH_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.PATH_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.PROPS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.PROPS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RESUME_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.RESUME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SCHEDULE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SCHEDULE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SHOWSCHEDULER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SHOWSCHEDULER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SKIPDRYRUN_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SKIPDRYRUN_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SLA_MISS_ALERT_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SORT_ORDER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SORT_ORDER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.START_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.START_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_AND_SCHEDULE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_AND_SCHEDULE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUMMARY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SUMMARY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUSPEND_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SUSPEND_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TAGKEYS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TAGKEYS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TAGS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TAGS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.UPDATE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VALIDATE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.VALIDATE_OPT_DESCRIPTION;
+
+/**
+ * Entity Commands.
+ */
+@Component
+public class FalconEntityCommands extends BaseFalconCommands {
+    public static final String ENTITY_PREFIX = "entity";
+    public static final String ENTITY_COMMAND_PREFIX = ENTITY_PREFIX + " ";
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + SLA_MISS_ALERT_OPT, help = SLA_MISS_ALERT_OPT_DESCRIPTION)
+    public String slaAlert(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = false, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
+                    unspecifiedDefaultValue = "*") final String colo,
+            @CliOption(key = {START_OPT}, mandatory = true, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {END_OPT}, mandatory = false, help = END_OPT_DESCRIPTION) final String end
+    ) {
+        SchedulableEntityInstanceResult response = getFalconClient()
+                .getFeedSlaMissPendingAlerts(entityType.name().toLowerCase(), entityName, start, end, getColo(colo));
+        return ResponseHelper.getString(response);
+    }
+    //The command here is submitOnly in place of submit as it conflicts with submitAndSchedule and tab feature will not
+    //work of shell
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + SUBMIT_ONLY_OPT, help = SUBMIT_OPT_DESCRIPTION)
+    public String submit(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION) final File filePath
+    ) {
+
+        return getFalconClient().submit(entityType.name().toLowerCase(), filePath.getPath(),
+                getDoAs()).getMessage();
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + LOOKUP_OPT, help = LOOKUP_OPT_DESCRIPTION)
+    public String lookup(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {PATH_OPT}, mandatory = true, help = PATH_OPT_DESCRIPTION) final String feedInstancePath
+    ) {
+
+        FeedLookupResult resp = getFalconClient().reverseLookUp(entityType.name().toLowerCase(),
+                feedInstancePath, getDoAs());
+        return ResponseHelper.getString(resp);
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + UPDATE_OPT, help = UPDATE_OPT_DESCRIPTION)
+    public String update(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION)
+            final File filePath,
+            @CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
+                    unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun
+    ) {
+        return getFalconClient()
+                .update(entityType.name().toLowerCase(), entityName, filePath.getPath(), skipDryRun, getDoAs())
+                .getMessage();
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + SUBMIT_AND_SCHEDULE_OPT, help = SUBMIT_AND_SCHEDULE_OPT_DESCRIPTION)
+    public String submitAndSchedule(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION) final File filePath,
+            @CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
+                    unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun,
+            @CliOption(key = {PROPS_OPT}, mandatory = false, help = PROPS_OPT_DESCRIPTION) final String properties
+    ) {
+
+        return getFalconClient()
+                .submitAndSchedule(entityType.name().toLowerCase(), filePath.getPath(), skipDryRun, getDoAs(),
+                        properties)
+                .getMessage();
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + VALIDATE_OPT, help = VALIDATE_OPT_DESCRIPTION)
+    public String validate(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION) final File filePath,
+            @CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
+                    unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun
+    ) {
+
+        return getFalconClient()
+                .validate(entityType.name().toLowerCase(), filePath.getPath(), skipDryRun, getDoAs())
+                .getMessage();
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + SCHEDULE_OPT, help = SCHEDULE_OPT_DESCRIPTION)
+    public String schedule(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
+                    unspecifiedDefaultValue = "*") final String colo,
+            @CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
+                    unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun,
+            @CliOption(key = {PROPS_OPT}, mandatory = false, help = PROPS_OPT_DESCRIPTION) final String properties
+    ) {
+
+        return getFalconClient().schedule(entityType, entityName, colo, skipDryRun, getDoAs(),
+                properties).getMessage();
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + SUSPEND_OPT, help = SUSPEND_OPT_DESCRIPTION)
+    public String suspend(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
+                    unspecifiedDefaultValue = "*") final String colo
+    ) {
+
+        return getFalconClient().suspend(entityType, entityName, colo, getDoAs()).getMessage();
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + RESUME_OPT, help = RESUME_OPT_DESCRIPTION)
+    public String resume(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
+                    unspecifiedDefaultValue = "*") final String colo
+    ) {
+
+        return getFalconClient().resume(entityType, entityName, colo, getDoAs()).getMessage();
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + DELETE_OPT, help = DELETE_OPT_DESCRIPTION)
+    public String delete(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName
+    ) {
+
+        return getFalconClient().delete(entityType, entityName, getDoAs()).getMessage();
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + STATUS_OPT, help = STATUS_OPT_DESCRIPTION)
+    public String getStatus(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
+                    unspecifiedDefaultValue = "*") final String colo,
+            @CliOption(key = {SHOWSCHEDULER_OPT}, mandatory = true,
+                    help = SHOWSCHEDULER_OPT_DESCRIPTION) final boolean showScheduler
+    ) {
+
+        return getFalconClient().getStatus(entityType, entityName, colo, getDoAs(),
+                showScheduler).getMessage();
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + DEFINITION_OPT, help = DEFINITION_OPT_DESCRIPTION)
+    public String getDefinition(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName
+    ) {
+
+        return getFalconClient().getDefinition(entityType.name().toLowerCase(),
+                entityName, getDoAs()).toString();
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + DEPENDENCY_OPT, help = DEPENDENCY_OPT_DESCRIPTION)
+    public String getDependency(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName
+    ) {
+
+        return getFalconClient().getDependency(entityType.name().toLowerCase(), entityName,
+                getDoAs()).toString();
+    }
+
+    // SUSPEND CHECKSTYLE CHECK ParameterNumberCheck
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + LIST_OPT, help = LIST_OPT_DESCRIPTION)
+    public String list(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {FIELDS_OPT}, mandatory = false, help = FIELDS_OPT_DESCRIPTION) final String fields,
+            @CliOption(key = {ORDER_BY_OPT}, mandatory = false, help = ORDER_BY_OPT_DESCRIPTION) final String orderBy,
+            @CliOption(key = {SORT_ORDER_OPT}, mandatory = false,
+                    help = SORT_ORDER_OPT_DESCRIPTION) final String sortOrder,
+            @CliOption(key = {FILTER_BY_OPT}, mandatory = false,
+                    help = FILTER_BY_OPT_DESCRIPTION) final String filterBy,
+            @CliOption(key = {TAGS_OPT}, mandatory = false, help = TAGS_OPT_DESCRIPTION) final String filterTags,
+            @CliOption(key = {NAMESEQ_OPT}, mandatory = false,
+                    help = NAMESEQ_OPT_DESCRIPTION) final String nameSubsequence,
+            @CliOption(key = {TAGKEYS_OPT}, mandatory = false, help = TAGKEYS_OPT_DESCRIPTION) final String tagKeywords,
+            @CliOption(key = {OFFSET_OPT}, mandatory = false, help = OFFSET_OPT_DESCRIPTION) final Integer offset,
+            @CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
+                    help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults
+
+    ) {
+        ValidationUtil.validateEntityFields(fields);
+        ValidationUtil.validateOrderBy(orderBy, ENTITY_PREFIX);
+        ValidationUtil.validateFilterBy(filterBy, ENTITY_PREFIX);
+        EntityList entityList = getFalconClient().getEntityList(entityType.name().toLowerCase(),
+                fields, nameSubsequence, tagKeywords, filterBy, filterTags, orderBy, sortOrder, offset,
+                numResults, getDoAs());
+        return entityList != null ? entityList.toString() : "No entity of type (" + entityType + ") found.";
+    }
+
+    @CliCommand(value = ENTITY_COMMAND_PREFIX + SUMMARY_OPT, help = SUMMARY_OPT_DESCRIPTION)
+    public String summary(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {CLUSTER_OPT}, mandatory = true, help = CLUSTER_OPT_DESCRIPTION) final String cluster,
+            @CliOption(key = {START_OPT}, mandatory = false, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {END_OPT}, mandatory = false, help = END_OPT_DESCRIPTION) final String end,
+            @CliOption(key = {FIELDS_OPT}, mandatory = false, help = FIELDS_OPT_DESCRIPTION) final String fields,
+            @CliOption(key = {ORDER_BY_OPT}, mandatory = false, help = ORDER_BY_OPT_DESCRIPTION) final String orderBy,
+            @CliOption(key = {SORT_ORDER_OPT}, mandatory = false,
+                    help = SORT_ORDER_OPT_DESCRIPTION) final String sortOrder,
+            @CliOption(key = {FILTER_BY_OPT}, mandatory = false, help = FILTER_BY_OPT_DESCRIPTION) final String filterBy,
+            @CliOption(key = {TAGS_OPT}, mandatory = false, help = TAGS_OPT_DESCRIPTION) final String filterTags,
+            @CliOption(key = {OFFSET_OPT}, mandatory = false, help = OFFSET_OPT_DESCRIPTION) final Integer offset,
+            @CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
+                    help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults,
+            @CliOption(key = {NUM_INSTANCES_OPT}, mandatory = false,
+                    help = NUM_INSTANCES_OPT_DESCRIPTION) final Integer numInstances
+
+    ) {
+        ValidationUtil.validateEntityTypeForSummary(entityType.name().toLowerCase());
+        ValidationUtil.validateEntityFields(fields);
+        ValidationUtil.validateFilterBy(filterBy, ENTITY_PREFIX);
+        ValidationUtil.validateOrderBy(orderBy, ENTITY_PREFIX);
+        return ResponseHelper.getString(getFalconClient().getEntitySummary(
+                entityType.name().toLowerCase(), cluster, start, end, fields, filterBy, filterTags,
+                orderBy, sortOrder, offset, numResults, numInstances, getDoAs()));
+    }
+    // RESUME CHECKSTYLE CHECK ParameterNumberCheck
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/java/org/apache/falcon/shell/commands/FalconInstanceCommands.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/falcon/shell/commands/FalconInstanceCommands.java b/shell/src/main/java/org/apache/falcon/shell/commands/FalconInstanceCommands.java
new file mode 100644
index 0000000..f20e201
--- /dev/null
+++ b/shell/src/main/java/org/apache/falcon/shell/commands/FalconInstanceCommands.java
@@ -0,0 +1,358 @@
+/**
+ * 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.falcon.shell.commands;
+
+import org.apache.falcon.ResponseHelper;
+import org.apache.falcon.entity.v0.EntityType;
+
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.shell.core.annotation.CliOption;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+
+import static org.apache.falcon.client.FalconCLIConstants.COLO_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.COLO_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEPENDENCY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.DEPENDENCY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.END_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.END_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ENTITY_NAME_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.ENTITY_NAME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FILE_PATH_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FILE_PATH_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FILTER_BY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FILTER_BY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.OFFSET_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.OFFSET_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ORDER_BY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.ORDER_BY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RESUME_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.RESUME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SORT_ORDER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SORT_ORDER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.START_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.START_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUMMARY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SUMMARY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUSPEND_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SUSPEND_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT_DESCRIPTION;
+
+import static org.apache.falcon.ValidationUtil.validateFilterBy;
+import static org.apache.falcon.ValidationUtil.validateOrderBy;
+import static org.apache.falcon.client.FalconCLIConstants.ALL_ATTEMPTS;
+import static org.apache.falcon.client.FalconCLIConstants.ALL_ATTEMPTS_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTERS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTERS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FORCE_RERUN_FLAG;
+import static org.apache.falcon.client.FalconCLIConstants.FORCE_RERUN_FLAG_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.KILL_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.KILL_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LIFECYCLE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LIFECYCLE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LISTING_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LISTING_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LOG_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LOG_OPT_DESCRIPTION;
+
+import static org.apache.falcon.client.FalconCLIConstants.PARARMS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.PARARMS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RERUN_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.RERUN_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RUNID_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.RUNID_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RUNNING_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.RUNNING_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SOURCECLUSTER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SOURCECLUSTER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TRIAGE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TRIAGE_OPT_DESCRIPTION;
+import static org.apache.falcon.ValidationUtil.getLifeCycle;
+
+/**
+ * Instance commands.
+ */
+@Component
+public class FalconInstanceCommands extends BaseFalconCommands {
+    public static final String INSTANCE_PREFIX = "instance";
+    public static final String INSTANCE_COMMAND_PREFIX = INSTANCE_PREFIX + " ";
+
+    @CliCommand(value = INSTANCE_COMMAND_PREFIX + TRIAGE_OPT, help = TRIAGE_OPT_DESCRIPTION)
+    public String triage(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {START_OPT}, mandatory = false, help = START_OPT_DESCRIPTION) final String start
+    ) {
+        return getFalconClient().triage(entityType.name(), entityName, start,
+                getColo(colo)).toString();
+    }
+
+    @CliCommand(value = INSTANCE_COMMAND_PREFIX + DEPENDENCY_OPT, help = DEPENDENCY_OPT_DESCRIPTION)
+    public String dependency(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {START_OPT}, mandatory = false, help = START_OPT_DESCRIPTION) final String start
+    ) {
+        return getFalconClient().getInstanceDependencies(entityType.name(), entityName,
+                start, getColo(colo))
+                .toString();
+    }
+    // SUSPEND CHECKSTYLE CHECK ParameterNumberCheck
+    @CliCommand(value = INSTANCE_COMMAND_PREFIX + RUNNING_OPT, help = RUNNING_OPT_DESCRIPTION)
+    public String running(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {LIFECYCLE_OPT}, mandatory = false, help = LIFECYCLE_OPT_DESCRIPTION)
+            final String lifeCycle,
+            @CliOption(key = {ORDER_BY_OPT}, mandatory = false, help = ORDER_BY_OPT_DESCRIPTION) final String orderBy,
+            @CliOption(key = {SORT_ORDER_OPT}, mandatory = false,
+                    help = SORT_ORDER_OPT_DESCRIPTION) final String sortOrder,
+            @CliOption(key = {FILTER_BY_OPT}, mandatory = false,
+                    help = FILTER_BY_OPT_DESCRIPTION) final String filterBy,
+            @CliOption(key = {OFFSET_OPT}, mandatory = false, help = OFFSET_OPT_DESCRIPTION) final Integer offset,
+            @CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
+                    help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults
+    ) {
+        validateOrderBy(orderBy, INSTANCE_PREFIX);
+        validateFilterBy(filterBy, INSTANCE_PREFIX);
+        return ResponseHelper.getString(getFalconClient().getRunningInstances(entityType.name(),
+                entityName, colo, getLifeCycle(lifeCycle), filterBy, orderBy, sortOrder, offset, numResults,
+                getDoAs()));
+    }
+
+    @CliCommand(value = {INSTANCE_COMMAND_PREFIX + STATUS_OPT, INSTANCE_COMMAND_PREFIX + LIST_OPT},
+            help = STATUS_OPT_DESCRIPTION)
+    public String status(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {START_OPT}, mandatory = false, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {END_OPT}, mandatory = false, help = END_OPT_DESCRIPTION) final String end,
+            @CliOption(key = {LIFECYCLE_OPT}, mandatory = false, help = LIFECYCLE_OPT_DESCRIPTION)
+            final String lifeCycle,
+            @CliOption(key = {ORDER_BY_OPT}, mandatory = false, help = ORDER_BY_OPT_DESCRIPTION) final String orderBy,
+            @CliOption(key = {SORT_ORDER_OPT}, mandatory = false,
+                    help = SORT_ORDER_OPT_DESCRIPTION) final String sortOrder,
+            @CliOption(key = {FILTER_BY_OPT}, mandatory = false,
+                    help = FILTER_BY_OPT_DESCRIPTION) final String filterBy,
+            @CliOption(key = {OFFSET_OPT}, mandatory = false, help = OFFSET_OPT_DESCRIPTION) final Integer offset,
+            @CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
+                    help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults,
+            @CliOption(key = {ALL_ATTEMPTS}, mandatory = false, specifiedDefaultValue = "true",
+                    help = ALL_ATTEMPTS_DESCRIPTION) final Boolean allAttempts
+    ) {
+        validateOrderBy(orderBy, INSTANCE_PREFIX);
+        validateFilterBy(filterBy, INSTANCE_PREFIX);
+        return ResponseHelper.getString(getFalconClient().getStatusOfInstances(entityType.name(),
+                entityName, start, end, getColo(colo), getLifeCycle(lifeCycle), filterBy, orderBy, sortOrder,
+                offset, numResults, getDoAs(), allAttempts));
+    }
+
+    @CliCommand(value = {INSTANCE_COMMAND_PREFIX + SUMMARY_OPT},
+            help = SUMMARY_OPT_DESCRIPTION)
+    public String summary(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {START_OPT}, mandatory = false, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {END_OPT}, mandatory = false, help = END_OPT_DESCRIPTION) final String end,
+            @CliOption(key = {LIFECYCLE_OPT}, mandatory = false, help = LIFECYCLE_OPT_DESCRIPTION)
+            final String lifeCycle,
+            @CliOption(key = {ORDER_BY_OPT}, mandatory = false, help = ORDER_BY_OPT_DESCRIPTION) final String orderBy,
+            @CliOption(key = {SORT_ORDER_OPT}, mandatory = false,
+                    help = SORT_ORDER_OPT_DESCRIPTION) final String sortOrder,
+            @CliOption(key = {FILTER_BY_OPT}, mandatory = false,
+                    help = FILTER_BY_OPT_DESCRIPTION) final String filterBy
+    ) {
+        validateOrderBy(orderBy, INSTANCE_PREFIX);
+        validateFilterBy(filterBy, INSTANCE_PREFIX);
+        return ResponseHelper.getString(getFalconClient().getSummaryOfInstances(entityType.name(),
+                entityName, start, end, getColo(colo), getLifeCycle(lifeCycle), filterBy, orderBy,
+                sortOrder, getDoAs()));
+    }
+
+    @CliCommand(value = {INSTANCE_COMMAND_PREFIX + KILL_OPT},
+            help = KILL_OPT_DESCRIPTION)
+    public String kill(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {START_OPT}, mandatory = true, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {END_OPT}, mandatory = true, help = END_OPT_DESCRIPTION) final String end,
+            @CliOption(key = {CLUSTERS_OPT}, mandatory = false, help = CLUSTERS_OPT_DESCRIPTION) final String clusters,
+            @CliOption(key = {SOURCECLUSTER_OPT}, mandatory = false, help = SOURCECLUSTER_OPT_DESCRIPTION)
+            final String sourceClusters,
+            @CliOption(key = {LIFECYCLE_OPT}, mandatory = false, help = LIFECYCLE_OPT_DESCRIPTION)
+            final String lifeCycle
+    ) throws UnsupportedEncodingException {
+        return ResponseHelper.getString(getFalconClient().killInstances(entityType.name(),
+                entityName, start, end, getColo(colo), clusters, sourceClusters, getLifeCycle(lifeCycle), getDoAs()));
+    }
+
+    @CliCommand(value = {INSTANCE_COMMAND_PREFIX + SUSPEND_OPT},
+            help = SUSPEND_OPT_DESCRIPTION)
+    public String suspend(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {START_OPT}, mandatory = true, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {END_OPT}, mandatory = true, help = END_OPT_DESCRIPTION) final String end,
+            @CliOption(key = {CLUSTERS_OPT}, mandatory = false, help = CLUSTERS_OPT_DESCRIPTION) final String clusters,
+            @CliOption(key = {SOURCECLUSTER_OPT}, mandatory = false, help = SOURCECLUSTER_OPT_DESCRIPTION)
+            final String sourceClusters,
+            @CliOption(key = {LIFECYCLE_OPT}, mandatory = false, help = LIFECYCLE_OPT_DESCRIPTION)
+            final String lifeCycle
+    ) throws UnsupportedEncodingException {
+        return ResponseHelper.getString(getFalconClient().suspendInstances(entityType.name(),
+                entityName, start, end, getColo(colo), clusters, sourceClusters, getLifeCycle(lifeCycle), getDoAs()));
+    }
+
+    @CliCommand(value = {INSTANCE_COMMAND_PREFIX + RESUME_OPT},
+            help = RESUME_OPT_DESCRIPTION)
+    public String resume(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {START_OPT}, mandatory = true, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {END_OPT}, mandatory = true, help = END_OPT_DESCRIPTION) final String end,
+            @CliOption(key = {CLUSTERS_OPT}, mandatory = false, help = CLUSTERS_OPT_DESCRIPTION) final String clusters,
+            @CliOption(key = {SOURCECLUSTER_OPT}, mandatory = false, help = SOURCECLUSTER_OPT_DESCRIPTION)
+            final String sourceClusters,
+            @CliOption(key = {LIFECYCLE_OPT}, mandatory = false, help = LIFECYCLE_OPT_DESCRIPTION)
+            final String lifeCycle
+    ) throws UnsupportedEncodingException {
+        return ResponseHelper.getString(getFalconClient().resumeInstances(entityType.name(),
+                entityName, start, end, getColo(colo), clusters, sourceClusters, getLifeCycle(lifeCycle), getDoAs()));
+    }
+
+    @CliCommand(value = {INSTANCE_COMMAND_PREFIX + RERUN_OPT},
+            help = RERUN_OPT_DESCRIPTION)
+    public String rerun(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {START_OPT}, mandatory = true, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {END_OPT}, mandatory = true, help = END_OPT_DESCRIPTION) final String end,
+            @CliOption(key = {FILE_PATH_OPT}, mandatory = false, help = FILE_PATH_OPT_DESCRIPTION)
+            final String filePath,
+            @CliOption(key = {CLUSTERS_OPT}, mandatory = false, help = CLUSTERS_OPT_DESCRIPTION) final String clusters,
+            @CliOption(key = {SOURCECLUSTER_OPT}, mandatory = false, help = SOURCECLUSTER_OPT_DESCRIPTION)
+            final String sourceClusters,
+            @CliOption(key = {LIFECYCLE_OPT}, mandatory = false, help = LIFECYCLE_OPT_DESCRIPTION)
+            final String lifeCycle,
+            @CliOption(key = {FORCE_RERUN_FLAG}, mandatory = false, specifiedDefaultValue = "true",
+                    help = FORCE_RERUN_FLAG_DESCRIPTION) final Boolean forceRerun
+    ) throws IOException {
+        return ResponseHelper.getString(getFalconClient().rerunInstances(entityType.name(),
+                entityName, start, end, filePath, getColo(colo), clusters, sourceClusters, getLifeCycle(lifeCycle),
+                forceRerun, getDoAs()));
+    }
+
+    @CliCommand(value = {INSTANCE_COMMAND_PREFIX + LOG_OPT},
+            help = LOG_OPT_DESCRIPTION)
+    public String log(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {RUNID_OPT}, mandatory = true, help = RUNID_OPT_DESCRIPTION)
+            final String runId,
+            @CliOption(key = {START_OPT}, mandatory = false, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {END_OPT}, mandatory = false, help = END_OPT_DESCRIPTION) final String end,
+            @CliOption(key = {CLUSTERS_OPT}, mandatory = false, help = CLUSTERS_OPT_DESCRIPTION) final String clusters,
+            @CliOption(key = {LIFECYCLE_OPT}, mandatory = false, help = LIFECYCLE_OPT_DESCRIPTION)
+            final String lifeCycle,
+            @CliOption(key = {ORDER_BY_OPT}, mandatory = false, help = ORDER_BY_OPT_DESCRIPTION) final String orderBy,
+            @CliOption(key = {SORT_ORDER_OPT}, mandatory = false,
+                    help = SORT_ORDER_OPT_DESCRIPTION) final String sortOrder,
+            @CliOption(key = {FILTER_BY_OPT}, mandatory = false,
+                    help = FILTER_BY_OPT_DESCRIPTION) final String filterBy,
+            @CliOption(key = {OFFSET_OPT}, mandatory = false, help = OFFSET_OPT_DESCRIPTION) final Integer offset,
+            @CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
+                    help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults
+    ) {
+        validateOrderBy(orderBy, INSTANCE_PREFIX);
+        validateFilterBy(filterBy, INSTANCE_PREFIX);
+        return ResponseHelper.getString(getFalconClient().getLogsOfInstances(entityType.name(),
+                entityName, start, end, getColo(colo), runId, getLifeCycle(lifeCycle), filterBy, orderBy, sortOrder,
+                offset, numResults, getDoAs()));
+    }
+    // RESUME CHECKSTYLE CHECK ParameterNumberCheck
+    @CliCommand(value = {INSTANCE_COMMAND_PREFIX + PARARMS_OPT},
+            help = PARARMS_OPT_DESCRIPTION)
+    public String params(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {START_OPT}, mandatory = false, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {LIFECYCLE_OPT}, mandatory = false, help = LIFECYCLE_OPT_DESCRIPTION)
+            final String lifeCycle
+    ) throws IOException {
+        return ResponseHelper.getString(getFalconClient().getParamsOfInstance(entityType.name(),
+                entityName, start, getColo(colo), getLifeCycle(lifeCycle), getDoAs()));
+    }
+
+    @CliCommand(value = {INSTANCE_COMMAND_PREFIX + LISTING_OPT},
+            help = LISTING_OPT_DESCRIPTION)
+    public String listing(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
+            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
+            final String entityName,
+            @CliOption(key = {COLO_OPT}, mandatory = true, help = COLO_OPT_DESCRIPTION)
+            final String colo,
+            @CliOption(key = {START_OPT}, mandatory = false, help = START_OPT_DESCRIPTION) final String start,
+            @CliOption(key = {END_OPT}, mandatory = false, help = END_OPT_DESCRIPTION) final String end
+    ) {
+        return ResponseHelper.getString(getFalconClient().getFeedInstanceListing(entityType.name(),
+                entityName, start, end, getColo(colo), getDoAs()));
+    }
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/java/org/apache/falcon/shell/commands/FalconMetadataCommands.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/falcon/shell/commands/FalconMetadataCommands.java b/shell/src/main/java/org/apache/falcon/shell/commands/FalconMetadataCommands.java
new file mode 100644
index 0000000..5b7f7e1
--- /dev/null
+++ b/shell/src/main/java/org/apache/falcon/shell/commands/FalconMetadataCommands.java
@@ -0,0 +1,162 @@
+/**
+ * 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.falcon.shell.commands;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.falcon.entity.v0.EntityType;
+import org.apache.falcon.metadata.RelationshipType;
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.shell.core.annotation.CliOption;
+import org.springframework.stereotype.Component;
+
+import static org.apache.falcon.client.FalconCLIConstants.NAME_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.PIPELINE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.RELATIONS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DIRECTION_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.DIRECTION_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.EDGE_CMD;
+import static org.apache.falcon.client.FalconCLIConstants.EDGE_CMD_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FEED_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FEED_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ID_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.ID_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.KEY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.KEY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LINEAGE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LINEAGE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NAME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.PIPELINE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.PROCESS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.PROCESS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RELATIONS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VALUE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.VALUE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VERTEX_CMD;
+import static org.apache.falcon.client.FalconCLIConstants.VERTEX_CMD_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VERTEX_EDGES_CMD;
+import static org.apache.falcon.client.FalconCLIConstants.VERTEX_EDGES_CMD_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VERTICES_CMD;
+import static org.apache.falcon.client.FalconCLIConstants.VERTICES_CMD_DESCRIPTION;
+import static org.apache.falcon.ValidationUtil.validateDimensionName;
+import static org.apache.falcon.ValidationUtil.validateDimensionType;
+import static org.apache.falcon.ValidationUtil.validateId;
+import static org.apache.falcon.ValidationUtil.validateScheduleEntity;
+import static org.apache.falcon.ValidationUtil.validateVertexEdgesCommand;
+import static org.apache.falcon.ValidationUtil.validateVerticesCommand;
+
+/**
+ * Metadata commands.
+ */
+@Component
+public class FalconMetadataCommands extends BaseFalconCommands {
+    public static final String METADATA_PREFIX = "metadata";
+    public static final String METADATA_COMMAND_PREFIX = METADATA_PREFIX + " ";
+
+    @CliCommand(value = {METADATA_COMMAND_PREFIX + LINEAGE_OPT}, help = LINEAGE_OPT_DESCRIPTION)
+    public String lineage(
+            @CliOption(key = {PIPELINE_OPT}, mandatory = true, help = PIPELINE_OPT_DESCRIPTION) final String pipeline
+    ) {
+        return getFalconClient().getEntityLineageGraph(pipeline, getDoAs()).getDotNotation();
+    }
+
+    @CliCommand(value = {METADATA_COMMAND_PREFIX + LIST_OPT}, help = LIST_OPT_DESCRIPTION)
+    public String list(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final String dimensionType,
+            @CliOption(key = {CLUSTER_OPT}, mandatory = false, help = CLUSTER_OPT_DESCRIPTION) final String cluster,
+            @CliOption(key = {FEED_OPT}, mandatory = false, help = FEED_OPT_DESCRIPTION) final String feed,
+            @CliOption(key = {PROCESS_OPT}, mandatory = false, help = PROCESS_OPT_DESCRIPTION) final String process,
+            @CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
+                    help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults
+    ) {
+        validateDimensionType(dimensionType.toUpperCase());
+        if (!(dimensionType.toUpperCase())
+                .equals(RelationshipType.REPLICATION_METRICS.name())) {
+            return getFalconClient().getDimensionList(dimensionType, cluster, getDoAs());
+        } else {
+            String schedEntityType = null;
+            String schedEntityName = null;
+            if (StringUtils.isNotEmpty(feed)) {
+                schedEntityType = EntityType.getEnum(FEED_OPT).name();
+                schedEntityName = feed;
+            } else if (StringUtils.isNotEmpty(process)) {
+                schedEntityType = EntityType.getEnum(PROCESS_OPT).name();
+                schedEntityName = process;
+            }
+            validateScheduleEntity(schedEntityType, schedEntityName);
+
+            return getFalconClient().getReplicationMetricsDimensionList(schedEntityType, schedEntityName,
+                    numResults, getDoAs());
+        }
+    }
+
+    @CliCommand(value = {METADATA_COMMAND_PREFIX + RELATIONS_OPT}, help = RELATIONS_OPT_DESCRIPTION)
+    public String relations(
+            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final String dimensionType,
+            @CliOption(key = {NAME_OPT}, mandatory = true, help = NAME_OPT_DESCRIPTION) final String dimensionName,
+            @CliOption(key = {CLUSTER_OPT}, mandatory = false, help = CLUSTER_OPT_DESCRIPTION) final String cluster,
+            @CliOption(key = {FEED_OPT}, mandatory = false, help = FEED_OPT_DESCRIPTION) final String feed,
+            @CliOption(key = {PROCESS_OPT}, mandatory = false, help = PROCESS_OPT_DESCRIPTION) final String process,
+            @CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
+                    help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults
+    ) {
+        validateDimensionType(dimensionType.toUpperCase());
+        validateDimensionName(dimensionName, RELATIONS_OPT);
+        return getFalconClient().getDimensionRelations(dimensionType, dimensionName, getDoAs());
+    }
+
+    @CliCommand(value = {METADATA_COMMAND_PREFIX + VERTEX_CMD}, help = VERTEX_CMD_DESCRIPTION)
+    public String vertex(
+            @CliOption(key = {ID_OPT}, mandatory = true, help = ID_OPT_DESCRIPTION) final String id
+    ) {
+        validateId(id);
+        return getFalconClient().getVertex(id, getDoAs());
+    }
+    @CliCommand(value = {METADATA_COMMAND_PREFIX + EDGE_CMD}, help = EDGE_CMD_DESCRIPTION)
+    public String edge(
+            @CliOption(key = {ID_OPT}, mandatory = true, help = ID_OPT_DESCRIPTION) final String id
+    ) {
+        validateId(id);
+        return getFalconClient().getEdge(id, getDoAs());
+    }
+    @CliCommand(value = {METADATA_COMMAND_PREFIX + VERTICES_CMD}, help = VERTICES_CMD_DESCRIPTION)
+    public String vertices(
+            @CliOption(key = {KEY_OPT}, mandatory = true, help = KEY_OPT_DESCRIPTION) final String key,
+            @CliOption(key = {VALUE_OPT}, mandatory = true, help = VALUE_OPT_DESCRIPTION) final String value
+    ) {
+        validateVerticesCommand(key, value);
+        return getFalconClient().getVertices(key, value, getDoAs());
+    }
+    @CliCommand(value = {METADATA_COMMAND_PREFIX + VERTEX_EDGES_CMD}, help = VERTEX_EDGES_CMD_DESCRIPTION)
+    public String vertexEdges(
+            @CliOption(key = {ID_OPT}, mandatory = true, help = ID_OPT_DESCRIPTION) final String id,
+            @CliOption(key = {DIRECTION_OPT}, mandatory = true, help = DIRECTION_OPT_DESCRIPTION) final String direction
+    ) {
+        validateVertexEdgesCommand(id, direction);
+        return getFalconClient().getVertexEdges(id, direction, getDoAs());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/java/org/apache/falcon/shell/commands/FalconProfileCommands.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/falcon/shell/commands/FalconProfileCommands.java b/shell/src/main/java/org/apache/falcon/shell/commands/FalconProfileCommands.java
new file mode 100644
index 0000000..20562af
--- /dev/null
+++ b/shell/src/main/java/org/apache/falcon/shell/commands/FalconProfileCommands.java
@@ -0,0 +1,86 @@
+/**
+ * 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.falcon.shell.commands;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.falcon.client.FalconCLIException;
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.shell.core.annotation.CliOption;
+import org.springframework.shell.support.util.OsUtils;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.Properties;
+
+
+/**
+ * To update falcon.url.
+ */
+@Component
+public class FalconProfileCommands extends BaseFalconCommands{
+
+    public static final String LIST_PROFILE = "listProfile";
+    public static final String LIST_HELP = "lists the colos available to set in falcon.url";
+    public static final String SET_PROFILE = "updateProfile";
+    public static final String SET_HELP = "update falcon.url with new url";
+    public static final String PROFILE = "profile";
+    private static final String SHELL_PROPERTIES = "/shell.properties";
+    private static  Properties prop = new Properties();
+
+    static {
+        InputStream inputStream = null;
+        //Need new properties as clientProperties has the system properties as well
+        try {
+            inputStream = BaseFalconCommands.class.getResourceAsStream(SHELL_PROPERTIES);
+            if (inputStream != null) {
+                try {
+                    prop.load(inputStream);
+                } catch (IOException e) {
+                    throw new FalconCLIException(e);
+                }
+            }
+        } finally {
+            IOUtils.closeQuietly(inputStream);
+        }
+    }
+
+    @CliCommand(value = LIST_PROFILE , help = LIST_HELP)
+    public String listProfile() {
+        StringBuilder stringBuilder = new StringBuilder();
+
+        Enumeration e =  prop.propertyNames();
+        while(e.hasMoreElements()){
+            Object o = e.nextElement();
+            stringBuilder.append(o.toString()).append(OsUtils.LINE_SEPARATOR);
+        }
+        return stringBuilder.toString();
+    }
+
+    @CliCommand(value = SET_PROFILE , help = SET_HELP)
+    public String setProfile(@CliOption(key = {PROFILE}, mandatory = true, help = "key")
+        @Nonnull final String key){
+        Properties properties =  getShellProperties();
+        String profile = prop.getProperty(key);
+        properties.setProperty(FALCON_URL_PROPERTY, profile);
+        setClientProperty(FALCON_URL_PROPERTY, profile);
+        return FALCON_URL_PROPERTY +"="+profile;
+    }
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/java/org/apache/falcon/shell/skel/FalconBanner.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/falcon/shell/skel/FalconBanner.java b/shell/src/main/java/org/apache/falcon/shell/skel/FalconBanner.java
new file mode 100644
index 0000000..0f62365
--- /dev/null
+++ b/shell/src/main/java/org/apache/falcon/shell/skel/FalconBanner.java
@@ -0,0 +1,64 @@
+/**
+ * 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.falcon.shell.skel;
+
+import org.apache.falcon.shell.commands.BaseFalconCommands;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.shell.plugin.support.DefaultBannerProvider;
+import org.springframework.shell.support.util.OsUtils;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class FalconBanner.
+ */
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class FalconBanner extends DefaultBannerProvider {
+
+    @Override
+    public String getBanner() {
+        return new StringBuilder()
+                .append("=======================================").append(OsUtils.LINE_SEPARATOR)
+                .append("*                                     *").append(OsUtils.LINE_SEPARATOR)
+                .append("*            Falcon CLI               *").append(OsUtils.LINE_SEPARATOR)
+                .append("*                                     *").append(OsUtils.LINE_SEPARATOR)
+                .append("=======================================").append(OsUtils.LINE_SEPARATOR)
+                .append("falcon.url:"+ BaseFalconCommands.getShellProperties().get("falcon.url"))
+                .append(OsUtils.LINE_SEPARATOR)
+                .toString();
+
+    }
+
+    @Override
+    public String getWelcomeMessage() {
+        return "Welcome to Falcon CLI";
+    }
+
+    @Override
+    public String getVersion() {
+        return getClass().getPackage().getImplementationVersion();
+    }
+
+    @Override
+    public String getProviderName() {
+        return "Falcon CLI";
+    }
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/java/org/apache/falcon/shell/skel/FalconHistoryFileProvider.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/falcon/shell/skel/FalconHistoryFileProvider.java b/shell/src/main/java/org/apache/falcon/shell/skel/FalconHistoryFileProvider.java
new file mode 100644
index 0000000..397452b
--- /dev/null
+++ b/shell/src/main/java/org/apache/falcon/shell/skel/FalconHistoryFileProvider.java
@@ -0,0 +1,46 @@
+/**
+ * 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.falcon.shell.skel;
+
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.shell.plugin.support.DefaultHistoryFileNameProvider;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class FalconHistoryFileProvider.
+ */
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class FalconHistoryFileProvider extends DefaultHistoryFileNameProvider {
+
+    public String getHistoryFileName() {
+        return "falcon-cli-hist.log";
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.springframework.shell.plugin.support.DefaultHistoryFileNameProvider#name()
+     */
+    @Override
+    public String getProviderName() {
+        return "falcon client history provider";
+    }
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/java/org/apache/falcon/shell/skel/FalconPromptProvider.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/falcon/shell/skel/FalconPromptProvider.java b/shell/src/main/java/org/apache/falcon/shell/skel/FalconPromptProvider.java
new file mode 100644
index 0000000..738fc3b
--- /dev/null
+++ b/shell/src/main/java/org/apache/falcon/shell/skel/FalconPromptProvider.java
@@ -0,0 +1,47 @@
+/**
+ * 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.falcon.shell.skel;
+
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.shell.plugin.support.DefaultPromptProvider;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class FalconPromptProvider.
+ */
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class FalconPromptProvider extends DefaultPromptProvider {
+
+    @Override
+    public String getPrompt() {
+        return "falcon-shell>";
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.springframework.shell.plugin.support.DefaultPromptProvider#name()
+     */
+    @Override
+    public String getProviderName() {
+        return "falcon prompt provider";
+    }
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/resources/META-INF/spring/spring-shell-plugin.xml
----------------------------------------------------------------------
diff --git a/shell/src/main/resources/META-INF/spring/spring-shell-plugin.xml b/shell/src/main/resources/META-INF/spring/spring-shell-plugin.xml
new file mode 100644
index 0000000..d7a6414
--- /dev/null
+++ b/shell/src/main/resources/META-INF/spring/spring-shell-plugin.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xsi:schemaLocation="
+  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
+  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
+
+    <context:component-scan base-package="org.apache.falcon.shell"/>
+
+    <bean id="falconConnectionCommands"
+          class="org.apache.falcon.shell.commands.FalconConnectionCommands">
+    </bean>
+    <bean id="falconEntityCommands"
+          class="org.apache.falcon.shell.commands.FalconEntityCommands">
+    </bean>
+    <bean id="falconInstanceCommands"
+          class="org.apache.falcon.shell.commands.FalconInstanceCommands">
+    </bean>
+</beans>

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/resources/shell.properties
----------------------------------------------------------------------
diff --git a/shell/src/main/resources/shell.properties b/shell/src/main/resources/shell.properties
new file mode 100644
index 0000000..815e731
--- /dev/null
+++ b/shell/src/main/resources/shell.properties
@@ -0,0 +1,25 @@
+#
+# 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.
+#
+
+####################################################
+####    This is used for falcon packaging only. ####
+####################################################
+
+falcon.url=http://localhost:16000
+colo1=http://foo:15000
+colo2=http://bar:15000
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/test/FalconConnectionCommandsTest.java
----------------------------------------------------------------------
diff --git a/shell/src/test/FalconConnectionCommandsTest.java b/shell/src/test/FalconConnectionCommandsTest.java
new file mode 100644
index 0000000..21a3be4
--- /dev/null
+++ b/shell/src/test/FalconConnectionCommandsTest.java
@@ -0,0 +1,47 @@
+/**
+ * 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.falcon.cli.commands;
+
+import org.apache.falcon.client.FalconCLIException;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * Tests for Connection commands.
+ */
+public class FalconConnectionCommandsTest extends FalconCLITest {
+    @DataProvider(name = "params-commands", parallel = false)
+    public Object[][] provideCommands() {
+        FalconCLIException e = new FalconCLIException(BaseFalconCommands.FALCON_URL_ABSENT);
+        return new Object[][]{
+            {"get", null, e},
+            {"set a=b", null, null},
+            {"get", null, e},
+            {"get a", null, e},
+            {"set falcon.url=DUMMY", null, null},
+            {"get", "{a=b, falcon.url=DUMMY}", null},
+            {"get a", "b", null},
+        };
+    }
+
+//    @Test(dataProvider = "params-commands")
+    public void testGetAndSetParams(String command, Object result, Throwable throwable) throws Throwable {
+        execute(command, result, throwable);
+    }
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/src/bin/falcon-shell
----------------------------------------------------------------------
diff --git a/src/bin/falcon-shell b/src/bin/falcon-shell
new file mode 100644
index 0000000..9e2b7e5
--- /dev/null
+++ b/src/bin/falcon-shell
@@ -0,0 +1,39 @@
+#!/bin/bash
+#
+# 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. See accompanying LICENSE file.
+#
+
+# resolve links - $0 may be a softlink
+PRG="${0}"
+
+while [ -h "${PRG}" ]; do
+  ls=`ls -ld "${PRG}"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "${PRG}"`/"$link"
+  fi
+done
+
+BASEDIR=`dirname ${PRG}`
+BASEDIR=`cd ${BASEDIR}/..;pwd`
+. ${BASEDIR}/bin/falcon-config.sh 'client'
+
+JAVA_PROPERTIES="$FALCON_OPTS"
+while [[ ${1} =~ ^\-D ]]; do
+  JAVA_PROPERTIES="${JAVA_PROPERTIES} ${1}"
+  shift
+done
+
+${JAVA_BIN} ${JAVA_PROPERTIES} -cp ${FALCONCPPATH} -Dfalcon.log.dir=$HOME -Dfalcon.app.type=shell org.springframework.shell.Bootstrap "${@}"
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/src/conf/shell.properties
----------------------------------------------------------------------
diff --git a/src/conf/shell.properties b/src/conf/shell.properties
new file mode 100644
index 0000000..815e731
--- /dev/null
+++ b/src/conf/shell.properties
@@ -0,0 +1,25 @@
+#
+# 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.
+#
+
+####################################################
+####    This is used for falcon packaging only. ####
+####################################################
+
+falcon.url=http://localhost:16000
+colo1=http://foo:15000
+colo2=http://bar:15000
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/src/main/assemblies/standalone-package.xml
----------------------------------------------------------------------
diff --git a/src/main/assemblies/standalone-package.xml b/src/main/assemblies/standalone-package.xml
index c291697..cfc3a26 100644
--- a/src/main/assemblies/standalone-package.xml
+++ b/src/main/assemblies/standalone-package.xml
@@ -286,6 +286,12 @@
         </file>
 
         <file>
+            <source>../shell/target/falcon-shell-${project.version}.jar</source>
+            <outputDirectory>client/lib</outputDirectory>
+            <fileMode>0644</fileMode>
+        </file>
+
+        <file>
             <source>../prism/target/prism.keystore</source>
             <outputDirectory>conf</outputDirectory>
             <destName>prism.keystore</destName>

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/unit/src/main/java/org/apache/falcon/unit/FalconUnitClient.java
----------------------------------------------------------------------
diff --git a/unit/src/main/java/org/apache/falcon/unit/FalconUnitClient.java b/unit/src/main/java/org/apache/falcon/unit/FalconUnitClient.java
index 1025ced..53073f0 100644
--- a/unit/src/main/java/org/apache/falcon/unit/FalconUnitClient.java
+++ b/unit/src/main/java/org/apache/falcon/unit/FalconUnitClient.java
@@ -39,7 +39,9 @@ import org.apache.falcon.resource.FeedLookupResult;
 import org.apache.falcon.resource.InstanceDependencyResult;
 import org.apache.falcon.resource.InstancesResult;
 import org.apache.falcon.resource.InstancesSummaryResult;
+import org.apache.falcon.resource.LineageGraphResult;
 import org.apache.falcon.resource.SchedulableEntityInstanceResult;
+import org.apache.falcon.resource.TriageResult;
 import org.apache.falcon.resource.admin.AdminResource;
 import org.apache.falcon.util.DateUtil;
 import org.apache.falcon.workflow.WorkflowEngineFactory;
@@ -385,6 +387,75 @@ public class FalconUnitClient extends AbstractFalconClient {
         return null;
     }
 
+    @Override
+    public TriageResult triage(String name, String entityName, String start, String colo) {
+        return null;
+    }
+    // SUSPEND CHECKSTYLE CHECK ParameterNumberCheck
+    @Override
+    public InstancesResult getRunningInstances(String type, String entity, String colo, List<LifeCycle> lifeCycles,
+                                               String filterBy, String orderBy, String sortOrder,
+                                               Integer offset, Integer numResults, String doAsUser) {
+        return null;
+    }
+    // RESUME CHECKSTYLE CHECK ParameterNumberCheck
+    @Override
+    public FeedInstanceResult getFeedInstanceListing(String type, String entity, String start, String end,
+                                                     String colo, String doAsUser) {
+        return null;
+    }
+
+    @Override
+    public int getStatus(String doAsUser) {
+        return 200;
+    }
+
+    @Override
+    public String getThreadDump(String doAs) {
+        return "";
+    }
+
+    @Override
+    public LineageGraphResult getEntityLineageGraph(String pipeline, String doAs) {
+        return null;
+    }
+
+    @Override
+    public String getDimensionList(String dimensionType, String cluster, String doAs) {
+        return null;
+    }
+
+    @Override
+    public String getReplicationMetricsDimensionList(String schedEntityType, String schedEntityName,
+                                                     Integer numResults, String doAs) {
+        return null;
+    }
+
+    @Override
+    public String getDimensionRelations(String dimensionType, String dimensionName, String doAs) {
+        return null;
+    }
+
+    @Override
+    public String getVertex(String id, String doAs) {
+        return null;
+    }
+
+    @Override
+    public String getVertices(String key, String value, String doAs) {
+        return null;
+    }
+
+    @Override
+    public String getVertexEdges(String id, String direction, String doAs) {
+        return null;
+    }
+
+    @Override
+    public String getEdge(String id, String doAs) {
+        return null;
+    }
+
     private boolean checkAndUpdateCluster(Entity entity, EntityType entityType, String cluster) {
         if (entityType == EntityType.FEED) {
             return checkAndUpdateFeedClusters(entity, cluster);

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/webapp/src/test/java/org/apache/falcon/cli/FalconCLIIT.java
----------------------------------------------------------------------
diff --git a/webapp/src/test/java/org/apache/falcon/cli/FalconCLIIT.java b/webapp/src/test/java/org/apache/falcon/cli/FalconCLIIT.java
index 4f72d82..5cdbf93 100644
--- a/webapp/src/test/java/org/apache/falcon/cli/FalconCLIIT.java
+++ b/webapp/src/test/java/org/apache/falcon/cli/FalconCLIIT.java
@@ -18,7 +18,7 @@
 
 package org.apache.falcon.cli;
 
-import org.apache.falcon.FalconCLIConstants;
+import org.apache.falcon.client.FalconCLIConstants;
 import org.apache.falcon.entity.v0.SchemaHelper;
 import org.apache.falcon.metadata.RelationshipType;
 import org.apache.falcon.resource.TestContext;

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/webapp/src/test/java/org/apache/falcon/resource/TestContext.java
----------------------------------------------------------------------
diff --git a/webapp/src/test/java/org/apache/falcon/resource/TestContext.java b/webapp/src/test/java/org/apache/falcon/resource/TestContext.java
index 42a5247..fd4d364 100644
--- a/webapp/src/test/java/org/apache/falcon/resource/TestContext.java
+++ b/webapp/src/test/java/org/apache/falcon/resource/TestContext.java
@@ -27,7 +27,7 @@ import com.sun.jersey.client.urlconnection.HTTPSProperties;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.net.util.TrustManagerUtils;
-import org.apache.falcon.FalconCLIConstants;
+import org.apache.falcon.client.FalconCLIConstants;
 import org.apache.falcon.FalconException;
 import org.apache.falcon.FalconRuntimException;
 import org.apache.falcon.catalog.HiveCatalogService;


[3/3] falcon git commit: FALCON-1596 Spring shell based CLI for falcon

Posted by aj...@apache.org.
FALCON-1596 Spring shell based CLI for falcon

Author: Praveen Adlakha <ad...@gmail.com>

Reviewers: Ajay Yadava <aj...@apache.org>, Venkat Ranganathan<vr...@apache.org>

Closes #249 from PraveenAdlakha/shell_final


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

Branch: refs/heads/master
Commit: da767c2f6b2cc80af9b8bf663cdd45515bd440f0
Parents: 075f02c
Author: Praveen Adlakha <ad...@gmail.com>
Authored: Wed Aug 3 17:12:48 2016 +0530
Committer: Ajay Yadava <aj...@apache.org>
Committed: Wed Aug 3 17:12:48 2016 +0530

----------------------------------------------------------------------
 cli/pom.xml                                     |   9 -
 .../org/apache/falcon/cli/FalconAdminCLI.java   |   9 +-
 .../java/org/apache/falcon/cli/FalconCLI.java   | 117 +-----
 .../org/apache/falcon/cli/FalconEntityCLI.java  | 168 +++++----
 .../apache/falcon/cli/FalconExtensionCLI.java   |   2 +-
 .../apache/falcon/cli/FalconInstanceCLI.java    | 240 +++++++------
 .../apache/falcon/cli/FalconMetadataCLI.java    | 177 ++++-----
 .../falcon/cli/commands/BaseFalconCommands.java | 150 --------
 .../cli/commands/FalconConnectionCommands.java  |  58 ---
 .../cli/commands/FalconEntityCommands.java      | 326 -----------------
 .../cli/commands/FalconInstanceCommands.java    |  29 --
 .../apache/falcon/cli/skel/FalconBanner.java    |  61 ----
 .../cli/skel/FalconHistoryFileProvider.java     |  46 ---
 .../falcon/cli/skel/FalconPromptProvider.java   |  47 ---
 .../META-INF/spring/spring-shell-plugin.xml     |  40 ---
 .../commands/FalconConnectionCommandsTest.java  |  47 ---
 .../org/apache/falcon/FalconCLIConstants.java   |  81 -----
 .../java/org/apache/falcon/ValidationUtil.java  | 199 +++++++++++
 .../falcon/client/AbstractFalconClient.java     |  32 ++
 .../falcon/client/FalconCLIConstants.java       | 220 ++++++++++++
 .../org/apache/falcon/client/FalconClient.java  |   6 +-
 common/pom.xml                                  |  11 +-
 pom.xml                                         |   1 +
 shell/pom.xml                                   | 196 ++++++++++
 .../shell/commands/BaseFalconCommands.java      | 155 ++++++++
 .../shell/commands/FalconAdminCommands.java     |  64 ++++
 .../commands/FalconConnectionCommands.java      |  58 +++
 .../shell/commands/FalconEntityCommands.java    | 330 +++++++++++++++++
 .../shell/commands/FalconInstanceCommands.java  | 358 +++++++++++++++++++
 .../shell/commands/FalconMetadataCommands.java  | 162 +++++++++
 .../shell/commands/FalconProfileCommands.java   |  86 +++++
 .../apache/falcon/shell/skel/FalconBanner.java  |  64 ++++
 .../shell/skel/FalconHistoryFileProvider.java   |  46 +++
 .../falcon/shell/skel/FalconPromptProvider.java |  47 +++
 .../META-INF/spring/spring-shell-plugin.xml     |  40 +++
 shell/src/main/resources/shell.properties       |  25 ++
 .../src/test/FalconConnectionCommandsTest.java  |  47 +++
 src/bin/falcon-shell                            |  39 ++
 src/conf/shell.properties                       |  25 ++
 src/main/assemblies/standalone-package.xml      |   6 +
 .../apache/falcon/unit/FalconUnitClient.java    |  71 ++++
 .../java/org/apache/falcon/cli/FalconCLIIT.java |   2 +-
 .../org/apache/falcon/resource/TestContext.java |   2 +-
 43 files changed, 2570 insertions(+), 1329 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/pom.xml
----------------------------------------------------------------------
diff --git a/cli/pom.xml b/cli/pom.xml
index e0a8968..a41e6d9 100644
--- a/cli/pom.xml
+++ b/cli/pom.xml
@@ -215,15 +215,6 @@
                     </execution>
                 </executions>
             </plugin>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>falcon-cli-hist.log</exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
         </plugins>
     </build>
 </project>

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/FalconAdminCLI.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/FalconAdminCLI.java b/cli/src/main/java/org/apache/falcon/cli/FalconAdminCLI.java
index 1b6d289..2c2d392 100644
--- a/cli/src/main/java/org/apache/falcon/cli/FalconAdminCLI.java
+++ b/cli/src/main/java/org/apache/falcon/cli/FalconAdminCLI.java
@@ -23,20 +23,22 @@ import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.OptionGroup;
 import org.apache.commons.cli.Options;
-import org.apache.falcon.FalconCLIConstants;
+import org.apache.falcon.client.FalconCLIConstants;
 import org.apache.falcon.client.FalconCLIException;
 import org.apache.falcon.client.FalconClient;
 
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
+import static org.apache.falcon.client.FalconCLIConstants.STACK_OPTION;
 
 /**
  * Admin extension to Falcon Command Line Interface - wraps the RESTful API for admin commands.
  */
 public class FalconAdminCLI extends FalconCLI {
 
-    private static final String STACK_OPTION = "stack";
+
+
 
     public FalconAdminCLI() throws Exception {
         super();
@@ -73,8 +75,7 @@ public class FalconAdminCLI extends FalconCLI {
         return adminOptions;
     }
 
-    public int adminCommand(CommandLine commandLine, FalconClient client,
-                             String falconUrl) throws IOException {
+    public int adminCommand(CommandLine commandLine, FalconClient client, String falconUrl) throws IOException {
         String result;
         Set<String> optionsList = new HashSet<String>();
         for (Option option : commandLine.getOptions()) {

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/FalconCLI.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/FalconCLI.java b/cli/src/main/java/org/apache/falcon/cli/FalconCLI.java
index bff818a..0dd11f6 100644
--- a/cli/src/main/java/org/apache/falcon/cli/FalconCLI.java
+++ b/cli/src/main/java/org/apache/falcon/cli/FalconCLI.java
@@ -24,21 +24,18 @@ import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.falcon.FalconCLIConstants;
+import org.apache.falcon.client.FalconCLIConstants;
 import org.apache.falcon.cliParser.CLIParser;
 import org.apache.falcon.client.FalconCLIException;
 import org.apache.falcon.client.FalconClient;
-import org.apache.falcon.entity.v0.EntityType;
-import org.apache.falcon.resource.EntityList;
-import org.apache.falcon.resource.InstancesResult;
-import org.apache.falcon.resource.InstancesSummaryResult;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintStream;
-import java.util.Arrays;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicReference;
+import static org.apache.falcon.client.FalconCLIConstants.FALCON_URL;
+
 
 /**
  * Falcon Command Line Interface - wraps the RESTful API.
@@ -48,45 +45,6 @@ public class FalconCLI {
     public static final AtomicReference<PrintStream> ERR = new AtomicReference<PrintStream>(System.err);
     public static final AtomicReference<PrintStream> OUT = new AtomicReference<PrintStream>(System.out);
 
-    public static final String ENV_FALCON_DEBUG = "FALCON_DEBUG";
-    public static final String DEBUG_OPTION = "debug";
-    public static final String URL_OPTION = "url";
-    public static final String FALCON_URL = "FALCON_URL";
-
-    public static final String ADMIN_CMD = "admin";
-    public static final String HELP_CMD = "help";
-    public static final String METADATA_CMD = "metadata";
-    public static final String ENTITY_CMD = "entity";
-    public static final String INSTANCE_CMD = "instance";
-    public static final String RECIPE_CMD = "recipe";
-
-    public static final String TYPE_OPT = "type";
-    public static final String COLO_OPT = "colo";
-    public static final String CLUSTER_OPT = "cluster";
-    public static final String FEED_OPT = "feed";
-    public static final String PROCESS_OPT = "process";
-    public static final String ENTITY_NAME_OPT = "name";
-    public static final String FILE_PATH_OPT = "file";
-    public static final String VERSION_OPT = "version";
-    public static final String SCHEDULE_OPT = "schedule";
-    public static final String SUSPEND_OPT = "suspend";
-    public static final String RESUME_OPT = "resume";
-    public static final String STATUS_OPT = "status";
-    public static final String SUMMARY_OPT = "summary";
-    public static final String DEPENDENCY_OPT = "dependency";
-    public static final String LIST_OPT = "list";
-    public static final String SKIPDRYRUN_OPT = "skipDryRun";
-    public static final String FILTER_BY_OPT = "filterBy";
-    public static final String ORDER_BY_OPT = "orderBy";
-    public static final String SORT_ORDER_OPT = "sortOrder";
-    public static final String OFFSET_OPT = "offset";
-    public static final String NUM_RESULTS_OPT = "numResults";
-    public static final String START_OPT = "start";
-    public static final String END_OPT = "end";
-    public static final String CURRENT_COLO = "current.colo";
-    public static final String CLIENT_PROPERTIES = "/client.properties";
-    public static final String DO_AS_OPT = "doAs";
-
     private final Properties clientProperties;
 
     public FalconCLI() throws Exception {
@@ -206,29 +164,6 @@ public class FalconCLI {
         return integer;
     }
 
-    public static void validateEntityTypeForSummary(String type) {
-        EntityType entityType = EntityType.getEnum(type);
-        if (!entityType.isSchedulable()) {
-            throw new FalconCLIException("Invalid entity type " + entityType
-                    + " for EntitySummary API. Valid options are feed or process");
-        }
-    }
-
-    protected void validateNotEmpty(String paramVal, String paramName) {
-        if (StringUtils.isBlank(paramVal)) {
-            throw new FalconCLIException("Missing argument : " + paramName);
-        }
-    }
-
-    protected void validateSortOrder(String sortOrder) {
-        if (!StringUtils.isBlank(sortOrder)) {
-            if (!sortOrder.equalsIgnoreCase("asc") && !sortOrder.equalsIgnoreCase("desc")) {
-                throw new FalconCLIException("Value for param sortOrder should be \"asc\" or \"desc\". It is  : "
-                        + sortOrder);
-            }
-        }
-    }
-
     protected String getColo(String colo) throws IOException {
         if (colo == null) {
             Properties prop = getClientProperties();
@@ -237,52 +172,6 @@ public class FalconCLI {
         return colo;
     }
 
-    public static void validateFilterBy(String filterBy, String filterType) {
-        if (StringUtils.isEmpty(filterBy)) {
-            return;
-        }
-        String[] filterSplits = filterBy.split(",");
-        for (String s : filterSplits) {
-            String[] tempKeyVal = s.split(":", 2);
-            try {
-                if (filterType.equals("entity")) {
-                    EntityList.EntityFilterByFields.valueOf(tempKeyVal[0].toUpperCase());
-                } else if (filterType.equals("instance")) {
-                    InstancesResult.InstanceFilterFields.valueOf(tempKeyVal[0].toUpperCase());
-                }else if (filterType.equals("summary")) {
-                    InstancesSummaryResult.InstanceSummaryFilterFields.valueOf(tempKeyVal[0].toUpperCase());
-                } else {
-                    throw new IllegalArgumentException("Invalid API call: filterType is not valid");
-                }
-            } catch (IllegalArgumentException ie) {
-                throw new FalconCLIException("Invalid filterBy argument : " + tempKeyVal[0] + " in : " + s);
-            }
-        }
-    }
-
-    public static void validateOrderBy(String orderBy, String action) {
-        if (StringUtils.isBlank(orderBy)) {
-            return;
-        }
-        if (action.equals("instance")) {
-            if (Arrays.asList(new String[]{"status", "cluster", "starttime", "endtime"})
-                .contains(orderBy.toLowerCase())) {
-                return;
-            }
-        } else if (action.equals("entity")) {
-            if (Arrays.asList(new String[] {"type", "name"}).contains(orderBy.toLowerCase())) {
-                return;
-            }
-        } else if (action.equals("summary")) {
-            if (Arrays.asList(new String[]{"cluster"})
-                    .contains(orderBy.toLowerCase())) {
-                return;
-            }
-        }
-        throw new FalconCLIException("Invalid orderBy argument : " + orderBy);
-    }
-
-
     protected String getFalconEndpoint(CommandLine commandLine) throws IOException {
         String url = commandLine.getOptionValue(FalconCLIConstants.URL_OPTION);
         if (url == null) {

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/FalconEntityCLI.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/FalconEntityCLI.java b/cli/src/main/java/org/apache/falcon/cli/FalconEntityCLI.java
index facb147..a8aea52 100644
--- a/cli/src/main/java/org/apache/falcon/cli/FalconEntityCLI.java
+++ b/cli/src/main/java/org/apache/falcon/cli/FalconEntityCLI.java
@@ -23,7 +23,8 @@ import org.apache.commons.cli.Option;
 import org.apache.commons.cli.OptionGroup;
 import org.apache.commons.cli.Options;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.falcon.FalconCLIConstants;
+import org.apache.falcon.client.FalconCLIConstants;
+import org.apache.falcon.ValidationUtil;
 import org.apache.falcon.ResponseHelper;
 import org.apache.falcon.client.FalconCLIException;
 import org.apache.falcon.client.FalconClient;
@@ -38,71 +39,82 @@ import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
 
+import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.UPDATE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SCHEDULE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUSPEND_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RESUME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DELETE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_AND_SCHEDULE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.VALIDATE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUBMIT_AND_SCHEDULE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VALIDATE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEFINITION_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEPENDENCY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LOOKUP_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SLA_MISS_ALERT_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUMMARY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TOUCH_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.UPDATE_CLUSTER_DEPENDENTS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.URL_OPTION_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.URL_OPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FILE_PATH_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FILE_PATH_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ENTITY_NAME_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.ENTITY_NAME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.START_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.START_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.END_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.END_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.COLO_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.COLO_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FIELDS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FIELDS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FILTER_BY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FILTER_BY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TAGS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TAGS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NAMESEQ_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TAGKEYS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TAGKEYS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ORDER_BY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.ORDER_BY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SORT_ORDER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SORT_ORDER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.OFFSET_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.OFFSET_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_INSTANCES_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_INSTANCES_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.PATH_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.PATH_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SKIPDRYRUN_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SKIPDRYRUN_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DO_AS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.DO_AS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.PROPS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.PROPS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SHOWSCHEDULER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SHOWSCHEDULER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEBUG_OPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEBUG_OPTION_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NAMESEQ_OPT_DESCRIPTION;
+import static org.apache.falcon.ValidationUtil.validateNotEmpty;
+import static org.apache.falcon.ValidationUtil.validateSortOrder;
+
+
 /**
  * Entity extension to Falcon Command Line Interface - wraps the RESTful API for entities.
  */
 public class FalconEntityCLI extends FalconCLI {
 
-    public static final String SUBMIT_OPT_DESCRIPTION = "Submits an entity xml to Falcon";
-    public static final String UPDATE_OPT_DESCRIPTION = "Updates an existing entity";
-    public static final String DELETE_OPT_DESCRIPTION = "Deletes an entity in Falcon, and kills its instance from "
-            + "workflow engine";
-    public static final String SUBMIT_AND_SCHEDULE_OPT = "submitAndSchedule";
-    public static final String SUBMIT_AND_SCHEDULE_OPT_DESCRIPTION = "Submits an entity to Falcon and "
-            + "schedules it immediately";
-    public static final String VALIDATE_OPT = "validate";
-    public static final String VALIDATE_OPT_DESCRIPTION = "Validates an entity based on the entity type";
-    public static final String DEFINITION_OPT_DESCRIPTION = "Gets the Definition of entity";
-    public static final String SLA_MISS_ALERT_OPT_DESCRIPTION = "Get missing feed instances which missed SLA";
-
-
-    public static final String LOOKUP_OPT_DESCRIPTION = "Lookup a feed given its instance's path";
-    public static final String PATH_OPT = "path";
-    public static final String PATH_OPT_DESCRIPTION = "Path for a feed's instance";
-    public static final String TOUCH_OPT_DESCRIPTION = "Force update the entity in workflow engine"
-            + "(even without any changes to entity)";
-    public static final String PROPS_OPT = "properties";
-    public static final String PROPS_OPT_DESCRIPTION = "User supplied comma separated key value properties";
-    public static final String FIELDS_OPT = "fields";
-    public static final String FIELDS_OPT_DESCRIPTION = "Entity fields to show for a request";
-    public static final String TAGS_OPT = "tags";
-    public static final String TAGS_OPT_DESCRIPTION = "Filter returned entities by the specified tags";
-    public static final String NUM_INSTANCES_OPT = "numInstances";
-    public static final String NUM_INSTANCES_OPT_DESCRIPTION = "Number of instances to return per entity "
-            + "summary request";
-    public static final String NAMESEQ_OPT = "nameseq";
-    public static final String NAMESEQ_OPT_DESCRIPTION = "Subsequence of entity name";
-    public static final String TAGKEYS_OPT = "tagkeys";
-    public static final String TAGKEYS_OPT_DESCRIPTION = "Keywords in tags";
-    public static final String OFFSET_OPT_DESCRIPTION = "Start returning entities from this offset";
-    public static final String SHOWSCHEDULER_OPT = "showScheduler";
-    public static final String SHOWSCHEDULER_OPT_DESCRIPTION = "To return the scheduler "
-            + "on which the entity is scheduled.";
-    public static final String DEBUG_OPTION_DESCRIPTION = "Use debug mode to see debugging statements on stdout";
-    public static final String URL_OPTION_DESCRIPTION = "Falcon URL";
-    public static final String TYPE_OPT_DESCRIPTION = "Type of the entity. Valid entity types are: cluster, feed, "
-        + "process and datasource.";
-    public static final String COLO_OPT_DESCRIPTION = "Colo name";
-    public static final String END_OPT_DESCRIPTION = "End time is optional for summary";
-    public static final String CLUSTER_OPT_DESCRIPTION = "Cluster name";
-    public static final String ENTITY_NAME_OPT_DESCRIPTION = "Name of the entity, recommended but not mandatory "
-        + "to be unique.";
-    public static final String FILE_PATH_OPT_DESCRIPTION = "Path to entity xml file";
-    public static final String SCHEDULE_OPT_DESCRIPTION = "Schedules a submited entity in Falcon";
-    public static final String SUSPEND_OPT_DESCRIPTION = "Suspends a running entity in Falcon";
-    public static final String RESUME_OPT_DESCRIPTION = "Resumes a suspended entity in Falcon";
-    public static final String STATUS_OPT_DESCRIPTION = "Gets the status of entity";
-    public static final String SUMMARY_OPT_DESCRIPTION = "Get summary of instances for list of entities";
-    public static final String DEPENDENCY_OPT_DESCRIPTION = "Gets the dependencies of entity";
-    public static final String LIST_OPT_DESCRIPTION = "List entities registered for a type";
-    public static final String SKIPDRYRUN_OPT_DESCRIPTION = "skip dry run in workflow engine";
-    public static final String FILTER_BY_OPT_DESCRIPTION = "Filter returned entities by the specified status";
-    public static final String ORDER_BY_OPT_DESCRIPTION = "Order returned entities by this field";
-    public static final String SORT_ORDER_OPT_DESCRIPTION = "asc or desc order for results";
-    public static final String NUM_RESULTS_OPT_DESCRIPTION = "Number of results to return per request";
-    public static final String START_OPT_DESCRIPTION = "Start time is optional for summary";
-    public static final String DO_AS_OPT_DESCRIPTION = "doAs user";
-
     public FalconEntityCLI() throws Exception {
         super();
     }
@@ -129,11 +141,10 @@ public class FalconEntityCLI extends FalconCLI {
         Option entitySummary = new Option(FalconCLIConstants.SUMMARY_OPT, false, SUMMARY_OPT_DESCRIPTION);
         Option touch = new Option(FalconCLIConstants.TOUCH_OPT, false, TOUCH_OPT_DESCRIPTION);
 
-        Option updateClusterDependents = new Option(FalconCLIConstants.UPDATE_CLUSTER_DEPENDENTS_OPT, false,
+        Option updateClusterDependents = new Option(UPDATE_CLUSTER_DEPENDENTS_OPT, false,
                 "Updates dependent entities of a cluster in workflow engine");
 
         OptionGroup group = new OptionGroup();
-        group.addOption(submit);
         group.addOption(update);
         group.addOption(updateClusterDependents);
         group.addOption(schedule);
@@ -150,6 +161,7 @@ public class FalconEntityCLI extends FalconCLI {
         group.addOption(slaAlert);
         group.addOption(entitySummary);
         group.addOption(touch);
+        group.addOption(submit);
 
         Option url = new Option(URL_OPTION, true, URL_OPTION_DESCRIPTION);
         Option entityType = new Option(TYPE_OPT, true, TYPE_OPT_DESCRIPTION);
@@ -245,7 +257,7 @@ public class FalconEntityCLI extends FalconCLI {
         }
         EntityType entityTypeEnum = null;
         if (optionsList.contains(FalconCLIConstants.LIST_OPT)
-                || optionsList.contains(FalconCLIConstants.UPDATE_CLUSTER_DEPENDENTS_OPT)) {
+                || optionsList.contains(UPDATE_CLUSTER_DEPENDENTS_OPT)) {
             if (entityType == null) {
                 entityType = "";
             }
@@ -328,18 +340,18 @@ public class FalconEntityCLI extends FalconCLI {
             result = client.getDependency(entityType, entityName, doAsUser).toString();
         } else if (optionsList.contains(FalconCLIConstants.LIST_OPT)) {
             validateColo(optionsList);
-            validateEntityFields(fields);
-            validateOrderBy(orderBy, entityAction);
-            validateFilterBy(filterBy, entityAction);
+            ValidationUtil.validateEntityFields(fields);
+            ValidationUtil.validateOrderBy(orderBy, entityAction);
+            ValidationUtil.validateFilterBy(filterBy, entityAction);
             EntityList entityList = client.getEntityList(entityType, fields, nameSubsequence, tagKeywords,
                     filterBy, filterTags, orderBy, sortOrder, offset, numResults, doAsUser);
             result = entityList != null ? entityList.toString() : "No entity of type (" + entityType + ") found.";
         }  else if (optionsList.contains(FalconCLIConstants.SUMMARY_OPT)) {
-            validateEntityTypeForSummary(entityType);
+            ValidationUtil.validateEntityTypeForSummary(entityType);
             validateNotEmpty(cluster, FalconCLIConstants.CLUSTER_OPT);
-            validateEntityFields(fields);
-            validateFilterBy(filterBy, entityAction);
-            validateOrderBy(orderBy, entityAction);
+            ValidationUtil.validateEntityFields(fields);
+            ValidationUtil.validateFilterBy(filterBy, entityAction);
+            ValidationUtil.validateOrderBy(orderBy, entityAction);
             result = ResponseHelper.getString(client.getEntitySummary(
                     entityType, cluster, start, end, fields, filterBy, filterTags,
                     orderBy, sortOrder, offset, numResults, numInstances, doAsUser));
@@ -363,20 +375,6 @@ public class FalconEntityCLI extends FalconCLI {
         }
     }
 
-    public static void validateEntityFields(String fields) {
-        if (StringUtils.isEmpty(fields)) {
-            return;
-        }
-        String[] fieldsList = fields.split(",");
-        for (String s : fieldsList) {
-            try {
-                EntityList.EntityFieldList.valueOf(s.toUpperCase());
-            } catch (IllegalArgumentException ie) {
-                throw new FalconCLIException("Invalid fields argument : " + FalconCLIConstants.FIELDS_OPT);
-            }
-        }
-    }
-
     private Date parseDateString(String time) {
         if (time != null && !time.isEmpty()) {
             try {

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/FalconExtensionCLI.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/FalconExtensionCLI.java b/cli/src/main/java/org/apache/falcon/cli/FalconExtensionCLI.java
index a8a30ab..dafd7a8 100644
--- a/cli/src/main/java/org/apache/falcon/cli/FalconExtensionCLI.java
+++ b/cli/src/main/java/org/apache/falcon/cli/FalconExtensionCLI.java
@@ -27,7 +27,7 @@ import org.apache.commons.cli.Option;
 import org.apache.commons.cli.OptionGroup;
 import org.apache.commons.cli.Options;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.falcon.FalconCLIConstants;
+import org.apache.falcon.client.FalconCLIConstants;
 import org.apache.falcon.client.FalconCLIException;
 import org.apache.falcon.client.FalconClient;
 import org.apache.falcon.resource.ExtensionInstanceList;

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java b/cli/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java
index f882eb5..cd2ade0 100644
--- a/cli/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java
+++ b/cli/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java
@@ -22,7 +22,8 @@ import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.OptionGroup;
 import org.apache.commons.cli.Options;
-import org.apache.falcon.FalconCLIConstants;
+import org.apache.falcon.client.FalconCLIConstants;
+import org.apache.falcon.ValidationUtil;
 import org.apache.falcon.LifeCycle;
 import org.apache.falcon.ResponseHelper;
 import org.apache.falcon.client.FalconCLIException;
@@ -30,32 +31,89 @@ import org.apache.falcon.client.FalconClient;
 import org.apache.falcon.resource.InstanceDependencyResult;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import static org.apache.falcon.client.FalconCLIConstants.RUNNING_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.RUNNING_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUMMARY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SUMMARY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.KILL_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.KILL_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SUSPEND_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SUSPEND_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RESUME_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.RESUME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RERUN_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LOG_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LOG_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.PARARMS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.PARARMS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LISTING_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LISTING_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEPENDENCY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEPENDENCY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TRIAGE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TRIAGE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SEARCH_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.URL_OPTION;
+import static org.apache.falcon.client.FalconCLIConstants.START_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.START_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.END_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.END_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RUNID_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTERS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTERS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SOURCECLUSTER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SOURCECLUSTER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FILE_PATH_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FILE_PATH_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ENTITY_NAME_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.ENTITY_NAME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.COLO_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.COLO_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RERUN_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.URL_OPTION_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RUNID_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LIFECYCLE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LIFECYCLE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FILTER_BY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FILTER_BY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ORDER_BY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.ORDER_BY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.SORT_ORDER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.SORT_ORDER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.OFFSET_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.OFFSET_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FORCE_RERUN_FLAG;
+import static org.apache.falcon.client.FalconCLIConstants.FORCE_RERUN_FLAG_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DO_AS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.DO_AS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEBUG_OPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEBUG_OPTION_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.INSTANCE_TIME_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.INSTANCE_TIME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ALL_ATTEMPTS;
+import static org.apache.falcon.client.FalconCLIConstants.ALL_ATTEMPTS_DESCRIPTION;
+import static org.apache.falcon.ValidationUtil.getLifeCycle;
+import static org.apache.falcon.ValidationUtil.validateSortOrder;
+import static org.apache.falcon.ValidationUtil.validateNotEmpty;
+
+
 /**
  * Instance extension to Falcon Command Line Interface - wraps the RESTful API for instances.
  */
 public class FalconInstanceCLI extends FalconCLI {
 
-    private static final String FORCE_RERUN_FLAG = "force";
-    private static final String INSTANCE_TIME_OPT = "instanceTime";
-    private static final String RUNNING_OPT = "running";
-    private static final String KILL_OPT = "kill";
-    private static final String RERUN_OPT = "rerun";
-    private static final String LOG_OPT = "logs";
-    private static final String SEARCH_OPT = "search";
-    private static final String ALL_ATTEMPTS = "allAttempts";
-    private static final String RUNID_OPT = "runid";
-    private static final String CLUSTERS_OPT = "clusters";
-    private static final String SOURCECLUSTER_OPT = "sourceClusters";
-    private static final String LIFECYCLE_OPT = "lifecycle";
-    private static final String PARARMS_OPT = "params";
-    private static final String LISTING_OPT = "listing";
-    private static final String TRIAGE_OPT = "triage";
-
     public FalconInstanceCLI() throws Exception {
         super();
     }
@@ -63,40 +121,21 @@ public class FalconInstanceCLI extends FalconCLI {
     public Options createInstanceOptions() {
 
         Options instanceOptions = new Options();
-
-        Option running = new Option(RUNNING_OPT, false,
-                "Gets running process instances for a given process");
-        Option list = new Option(FalconCLIConstants.LIST_OPT, false,
-                "Gets all instances for a given process in the range start time and optional end time");
-        Option status = new Option(FalconCLIConstants.STATUS_OPT, false,
-                "Gets status of process instances for a given process in the range start time and optional end time");
-        Option summary = new Option(FalconCLIConstants.SUMMARY_OPT, false,
-                "Gets summary of instances for a given process in the range start time and optional end time");
-        Option kill = new Option(KILL_OPT, false,
-                "Kills active process instances for a given process in the range start time and optional end time");
-        Option suspend = new Option(FalconCLIConstants.SUSPEND_OPT, false,
-                "Suspends active process instances for a given process in the range start time and optional end time");
-        Option resume = new Option(FalconCLIConstants.RESUME_OPT, false,
-                "Resumes suspended process instances for a given process "
-                        + "in the range start time and optional end time");
-        Option rerun = new Option(RERUN_OPT, false,
-                "Reruns process instances for a given process in the range start time and "
-                        + "optional end time and overrides properties present in job.properties file");
-        Option logs = new Option(LOG_OPT, false,
-                "Logs print the logs for process instances for a given process in "
-                        + "the range start time and optional end time");
-        Option params = new Option(PARARMS_OPT, false,
-                "Displays the workflow parameters for a given instance of specified nominal time"
-                        + "start time represents nominal time and end time is not considered");
-        Option listing = new Option(LISTING_OPT, false,
-                "Displays feed listing and their status between a start and end time range.");
-        Option dependency = new Option(FalconCLIConstants.DEPENDENCY_OPT, false,
-                "Displays dependent instances for a specified instance.");
-        Option triage = new Option(TRIAGE_OPT, false,
-                "Triage a feed or process instance and find the failures in it's lineage.");
+        Option running = new Option(RUNNING_OPT, false, RUNNING_OPT_DESCRIPTION);
+        Option list = new Option(LIST_OPT, false, LIST_OPT_DESCRIPTION);
+        Option status = new Option(STATUS_OPT, false, STATUS_OPT_DESCRIPTION);
+        Option summary = new Option(SUMMARY_OPT, false, SUMMARY_OPT_DESCRIPTION);
+        Option kill = new Option(KILL_OPT, false, KILL_OPT_DESCRIPTION);
+        Option suspend = new Option(SUSPEND_OPT, false, SUSPEND_OPT_DESCRIPTION);
+        Option resume = new Option(RESUME_OPT, false, RESUME_OPT_DESCRIPTION);
+        Option rerun = new Option(RERUN_OPT, false, RERUN_OPT_DESCRIPTION);
+        Option logs = new Option(LOG_OPT, false, LOG_OPT_DESCRIPTION);
+        Option params = new Option(PARARMS_OPT, false, PARARMS_OPT_DESCRIPTION);
+        Option listing = new Option(LISTING_OPT, false, LISTING_OPT_DESCRIPTION);
+        Option dependency = new Option(DEPENDENCY_OPT, false, DEPENDENCY_OPT_DESCRIPTION);
+        Option triage = new Option(TRIAGE_OPT, false, TRIAGE_OPT_DESCRIPTION);
         Option search = new Option(SEARCH_OPT, false,
                 "Search instances with filtering criteria on the entity, instance time and status.");
-
         OptionGroup group = new OptionGroup();
         group.addOption(running);
         group.addOption(list);
@@ -114,52 +153,32 @@ public class FalconInstanceCLI extends FalconCLI {
         group.addOption(triage);
         group.addOption(search);
 
-        Option url = new Option(FalconCLIConstants.URL_OPTION, true, "Falcon URL");
-        Option start = new Option(FalconCLIConstants.START_OPT, true,
-                "Start time is required for commands, status, kill, suspend, resume and re-run"
-                        + "and it is nominal time while displaying workflow params");
-        Option end = new Option(FalconCLIConstants.END_OPT, true,
-                "End time is optional for commands, status, kill, suspend, resume and re-run; "
-                        + "if not specified then current time is considered as end time");
-        Option runid = new Option(RUNID_OPT, true,
-                "Instance runid  is optional and user can specify the runid, defaults to 0");
-        Option clusters = new Option(CLUSTERS_OPT, true,
-                "clusters is optional for commands kill, suspend and resume, "
-                        + "should not be specified for other commands");
-        Option sourceClusters = new Option(SOURCECLUSTER_OPT, true,
-                " source cluster is optional for commands kill, suspend and resume, "
-                        + "should not be specified for other commands (required for only feed)");
-        Option filePath = new Option(FalconCLIConstants.FILE_PATH_OPT, true,
-                "Path to job.properties file is required for rerun command, "
-                        + "it should contain name=value pair for properties to override for rerun");
-        Option entityType = new Option(FalconCLIConstants.TYPE_OPT, true,
-                "Entity type, can be feed or process xml");
-        Option entityName = new Option(FalconCLIConstants.ENTITY_NAME_OPT, true,
-                "Entity name, can be feed or process name");
-        Option colo = new Option(FalconCLIConstants.COLO_OPT, true,
-                "Colo on which the cmd has to be executed");
-        Option lifecycle = new Option(LIFECYCLE_OPT, true,
-                "describes life cycle of entity , for feed it can be replication/retention "
-                        + "and for process it can be execution");
-        Option filterBy = new Option(FalconCLIConstants.FILTER_BY_OPT, true,
-                "Filter returned instances by the specified fields");
-        Option orderBy = new Option(FalconCLIConstants.ORDER_BY_OPT, true,
-                "Order returned instances by this field");
-        Option sortOrder = new Option(FalconCLIConstants.SORT_ORDER_OPT, true, "asc or desc order for results");
-        Option offset = new Option(FalconCLIConstants.OFFSET_OPT, true,
-                "Start returning instances from this offset");
-        Option numResults = new Option(FalconCLIConstants.NUM_RESULTS_OPT, true,
-                "Number of results to return per request");
-        Option forceRerun = new Option(FORCE_RERUN_FLAG, false,
-                "Flag to forcefully rerun entire workflow of an instance");
-        Option doAs = new Option(FalconCLIConstants.DO_AS_OPT, true, "doAs user");
-        Option debug = new Option(FalconCLIConstants.DEBUG_OPTION, false, "Use debug mode to see"
-                + " debugging statements on stdout");
-        Option instanceTime = new Option(INSTANCE_TIME_OPT, true, "Time for an instance");
+        Option url = new Option(URL_OPTION, true, URL_OPTION_DESCRIPTION);
+        Option start = new Option(START_OPT, true, START_OPT_DESCRIPTION);
+        Option end = new Option(END_OPT, true, END_OPT_DESCRIPTION);
+        Option runid = new Option(RUNID_OPT, true, RUNID_OPT_DESCRIPTION);
+        Option clusters = new Option(CLUSTERS_OPT, true, CLUSTERS_OPT_DESCRIPTION);
+        Option sourceClusters = new Option(SOURCECLUSTER_OPT, true, SOURCECLUSTER_OPT_DESCRIPTION);
+        Option filePath = new Option(FILE_PATH_OPT, true, FILE_PATH_OPT_DESCRIPTION);
+        Option entityType = new Option(TYPE_OPT, true, TYPE_OPT_DESCRIPTION);
+        Option entityName = new Option(ENTITY_NAME_OPT, true, ENTITY_NAME_OPT_DESCRIPTION);
+        Option colo = new Option(COLO_OPT, true, COLO_OPT_DESCRIPTION);
+        Option lifecycle = new Option(LIFECYCLE_OPT, true, LIFECYCLE_OPT_DESCRIPTION);
+        Option filterBy = new Option(FILTER_BY_OPT, true, FILTER_BY_OPT_DESCRIPTION);
+        Option orderBy = new Option(ORDER_BY_OPT, true, ORDER_BY_OPT_DESCRIPTION);
+        Option sortOrder = new Option(SORT_ORDER_OPT, true, SORT_ORDER_OPT_DESCRIPTION);
+        Option offset = new Option(OFFSET_OPT, true, OFFSET_OPT_DESCRIPTION);
+        Option numResults = new Option(NUM_RESULTS_OPT, true, NUM_RESULTS_OPT_DESCRIPTION);
+        Option forceRerun = new Option(FORCE_RERUN_FLAG, false, FORCE_RERUN_FLAG_DESCRIPTION);
+        Option doAs = new Option(DO_AS_OPT, true, DO_AS_OPT_DESCRIPTION);
+        Option debug = new Option(DEBUG_OPTION, false, DEBUG_OPTION_DESCRIPTION);
+
+        Option instanceTime = new Option(INSTANCE_TIME_OPT, true, INSTANCE_TIME_OPT_DESCRIPTION);
+
+        Option allAttempts = new Option(ALL_ATTEMPTS, false, ALL_ATTEMPTS_DESCRIPTION);
         Option instanceStatus = new Option(FalconCLIConstants.INSTANCE_STATUS_OPT, true, "Instance status");
         Option nameSubsequence = new Option(FalconCLIConstants.NAMESEQ_OPT, true, "Subsequence of entity name");
         Option tagKeywords = new Option(FalconCLIConstants.TAGKEYS_OPT, true, "Keywords in tags");
-        Option allAttempts = new Option(ALL_ATTEMPTS, false, "To get all attempts of corresponding instances");
 
         instanceOptions.addOption(url);
         instanceOptions.addOptionGroup(group);
@@ -230,7 +249,7 @@ public class FalconInstanceCLI extends FalconCLI {
             validateNotEmpty(colo, FalconCLIConstants.COLO_OPT);
             validateNotEmpty(start, FalconCLIConstants.START_OPT);
             validateNotEmpty(type, FalconCLIConstants.TYPE_OPT);
-            validateEntityTypeForSummary(type);
+            ValidationUtil.validateEntityTypeForSummary(type);
             validateNotEmpty(entity, FalconCLIConstants.ENTITY_NAME_OPT);
             result = client.triage(type, entity, start, colo).toString();
         } else if (optionsList.contains(FalconCLIConstants.DEPENDENCY_OPT)) {
@@ -239,8 +258,8 @@ public class FalconInstanceCLI extends FalconCLI {
             result = ResponseHelper.getString(response);
 
         } else if (optionsList.contains(RUNNING_OPT)) {
-            validateOrderBy(orderBy, instanceAction);
-            validateFilterBy(filterBy, instanceAction);
+            ValidationUtil.validateOrderBy(orderBy, instanceAction);
+            ValidationUtil.validateFilterBy(filterBy, instanceAction);
             result = ResponseHelper.getString(client.getRunningInstances(type,
                     entity, colo, lifeCycles, filterBy, orderBy, sortOrder, offset, numResults, doAsUser));
         } else if (optionsList.contains(FalconCLIConstants.STATUS_OPT)
@@ -249,13 +268,13 @@ public class FalconInstanceCLI extends FalconCLI {
             if (optionsList.contains(ALL_ATTEMPTS)) {
                 allAttempts = true;
             }
-            validateOrderBy(orderBy, instanceAction);
-            validateFilterBy(filterBy, instanceAction);
+            ValidationUtil.validateOrderBy(orderBy, instanceAction);
+            ValidationUtil.validateFilterBy(filterBy, instanceAction);
             result = ResponseHelper.getString(client.getStatusOfInstances(type, entity, start, end, colo,
                     lifeCycles, filterBy, orderBy, sortOrder, offset, numResults, doAsUser, allAttempts));
         } else if (optionsList.contains(FalconCLIConstants.SUMMARY_OPT)) {
-            validateOrderBy(orderBy, "summary");
-            validateFilterBy(filterBy, "summary");
+            ValidationUtil.validateOrderBy(orderBy, "summary");
+            ValidationUtil.validateFilterBy(filterBy, "summary");
             result = ResponseHelper.getString(client.getSummaryOfInstances(type, entity, start, end, colo,
                     lifeCycles, filterBy, orderBy, sortOrder, doAsUser));
         } else if (optionsList.contains(KILL_OPT)) {
@@ -283,8 +302,8 @@ public class FalconInstanceCLI extends FalconCLI {
             result = ResponseHelper.getString(client.rerunInstances(type, entity, start, end, filePath, colo,
                     clusters, sourceClusters, lifeCycles, isForced, doAsUser));
         } else if (optionsList.contains(LOG_OPT)) {
-            validateOrderBy(orderBy, instanceAction);
-            validateFilterBy(filterBy, instanceAction);
+            ValidationUtil.validateOrderBy(orderBy, instanceAction);
+            ValidationUtil.validateFilterBy(filterBy, instanceAction);
             result = ResponseHelper.getString(client.getLogsOfInstances(type, entity, start, end, colo, runId,
                     lifeCycles, filterBy, orderBy, sortOrder, offset, numResults, doAsUser), runId);
         } else if (optionsList.contains(PARARMS_OPT)) {
@@ -338,21 +357,4 @@ public class FalconInstanceCLI extends FalconCLI {
         }
     }
 
-    private List<LifeCycle> getLifeCycle(String lifeCycleValue) {
-
-        if (lifeCycleValue != null) {
-            String[] lifeCycleValues = lifeCycleValue.split(",");
-            List<LifeCycle> lifeCycles = new ArrayList<LifeCycle>();
-            try {
-                for (String lifeCycle : lifeCycleValues) {
-                    lifeCycles.add(LifeCycle.valueOf(lifeCycle.toUpperCase().trim()));
-                }
-            } catch (IllegalArgumentException e) {
-                throw new FalconCLIException("Invalid life cycle values: " + lifeCycles, e);
-            }
-            return lifeCycles;
-        }
-        return null;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/FalconMetadataCLI.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/FalconMetadataCLI.java b/cli/src/main/java/org/apache/falcon/cli/FalconMetadataCLI.java
index 98a29ef..ec53e7c 100644
--- a/cli/src/main/java/org/apache/falcon/cli/FalconMetadataCLI.java
+++ b/cli/src/main/java/org/apache/falcon/cli/FalconMetadataCLI.java
@@ -23,7 +23,7 @@ import org.apache.commons.cli.Option;
 import org.apache.commons.cli.OptionGroup;
 import org.apache.commons.cli.Options;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.falcon.FalconCLIConstants;
+import org.apache.falcon.client.FalconCLIConstants;
 import org.apache.falcon.client.FalconCLIException;
 import org.apache.falcon.client.FalconClient;
 import org.apache.falcon.entity.v0.EntityType;
@@ -34,6 +34,60 @@ import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 
+import static org.apache.falcon.client.FalconCLIConstants.DISCOVERY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.DISCOVERY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LINEAGE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LINEAGE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.PIPELINE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.PIPELINE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.LIST_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.RELATIONS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.RELATIONS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.URL_OPTION;
+import static org.apache.falcon.client.FalconCLIConstants.URL_OPTION_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.TYPE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NAME_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.NAME_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEBUG_OPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DEBUG_OPTION_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DIRECTION_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.DIRECTION_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.VALUE_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VALUE_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.KEY_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.KEY_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.ID_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.ID_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.EDGE_CMD_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.EDGE_CMD;
+import static org.apache.falcon.client.FalconCLIConstants.VERTEX_EDGES_CMD_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VERTEX_EDGES_CMD;
+import static org.apache.falcon.client.FalconCLIConstants.VERTICES_CMD_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VERTICES_CMD;
+import static org.apache.falcon.client.FalconCLIConstants.VERTEX_CMD_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VERTEX_CMD;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.NUM_RESULTS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.PROCESS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.PROCESS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.FEED_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.FEED_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTER_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.CLUSTER_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.DO_AS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.DO_AS_DESCRIPTION;
+import static org.apache.falcon.ValidationUtil.validateDimensionName;
+import static org.apache.falcon.ValidationUtil.validateDimensionType;
+import static org.apache.falcon.ValidationUtil.validateId;
+import static org.apache.falcon.ValidationUtil.validateScheduleEntity;
+import static org.apache.falcon.ValidationUtil.validateVertexEdgesCommand;
+import static org.apache.falcon.ValidationUtil.validateVerticesCommand;
+import static org.apache.falcon.ValidationUtil.validatePipelineName;
+
+
+
 /**
  * Metadata extension to Falcon Command Line Interface - wraps the RESTful API for Metadata.
  */
@@ -41,21 +95,6 @@ public class FalconMetadataCLI extends FalconCLI {
 
     public static final AtomicReference<PrintStream> OUT = new AtomicReference<PrintStream>(System.out);
 
-    // Discovery Commands
-    public static final String DISCOVERY_OPT = "discovery";
-    public static final String LIST_OPT = "list";
-    public static final String URL_OPTION = "url";
-
-    // Lineage Commands
-    public static final String LINEAGE_OPT = "lineage";
-    public static final String VERTEX_CMD = "vertex";
-    public static final String VERTICES_CMD = "vertices";
-    public static final String VERTEX_EDGES_CMD = "edges";
-    public static final String EDGE_CMD = "edge";
-    public static final String ID_OPT = "id";
-    public static final String KEY_OPT = "key";
-    public static final String VALUE_OPT = "value";
-    public static final String DIRECTION_OPT = "direction";
 
     public FalconMetadataCLI() throws Exception {
         super();
@@ -65,29 +104,27 @@ public class FalconMetadataCLI extends FalconCLI {
         Options metadataOptions = new Options();
 
         OptionGroup group = new OptionGroup();
-        Option discovery = new Option(DISCOVERY_OPT, false, "Discover falcon metadata relations");
-        Option lineage = new Option(LINEAGE_OPT, false, "Get falcon metadata lineage information");
+        Option discovery = new Option(DISCOVERY_OPT, false, DISCOVERY_OPT_DESCRIPTION);
+        Option lineage = new Option(LINEAGE_OPT, false, LINEAGE_OPT_DESCRIPTION);
         group.addOption(discovery);
         group.addOption(lineage);
-        Option pipeline = new Option(FalconCLIConstants.PIPELINE_OPT, true,
-                "Get lineage graph for the entities in a pipeline");
+        Option pipeline = new Option(PIPELINE_OPT, true, PIPELINE_OPT_DESCRIPTION);
         metadataOptions.addOptionGroup(group);
 
         // Add discovery options
 
-        Option list = new Option(LIST_OPT, false, "List all dimensions");
-        Option relations = new Option(FalconCLIConstants.RELATIONS_OPT, false, "List all relations for a dimension");
+        Option list = new Option(LIST_OPT, false, LIST_OPT_DESCRIPTION);
+        Option relations = new Option(RELATIONS_OPT, false, RELATIONS_OPT_DESCRIPTION);
         metadataOptions.addOption(list);
         metadataOptions.addOption(relations);
 
-        Option url = new Option(URL_OPTION, true, "Falcon URL");
-        Option type = new Option(FalconCLIConstants.TYPE_OPT, true, "Dimension type");
-        Option name = new Option(FalconCLIConstants.NAME_OPT, true, "Dimension name");
-        Option cluster = new Option(FalconCLIConstants.CLUSTER_OPT, true, "Cluster name");
-        Option feed = new Option(FalconCLIConstants.FEED_OPT, true, "Feed Entity name");
-        Option process = new Option(FalconCLIConstants.PROCESS_OPT, true, "Process Entity name");
-        Option numResults = new Option(FalconCLIConstants.NUM_RESULTS_OPT, true,
-                "Number of results to return per request");
+        Option url = new Option(URL_OPTION, true, URL_OPTION_DESCRIPTION);
+        Option type = new Option(TYPE_OPT, true, TYPE_OPT_DESCRIPTION);
+        Option name = new Option(NAME_OPT, true, NAME_OPT_DESCRIPTION);
+        Option cluster = new Option(CLUSTER_OPT, true, CLUSTER_OPT_DESCRIPTION);
+        Option feed = new Option(FEED_OPT, true, FEED_OPT_DESCRIPTION);
+        Option process = new Option(PROCESS_OPT, true, PROCESS_OPT_DESCRIPTION);
+        Option numResults = new Option(NUM_RESULTS_OPT, true, NUM_RESULTS_OPT_DESCRIPTION);
 
         // Add lineage options
         metadataOptions.addOption(pipeline);
@@ -100,16 +137,15 @@ public class FalconMetadataCLI extends FalconCLI {
         metadataOptions.addOption(process);
         metadataOptions.addOption(numResults);
 
-        Option vertex = new Option(VERTEX_CMD, false, "show the vertices");
-        Option vertices = new Option(VERTICES_CMD, false, "show the vertices");
-        Option vertexEdges = new Option(VERTEX_EDGES_CMD, false, "show the edges for a given vertex");
-        Option edges = new Option(EDGE_CMD, false, "show the edges");
-        Option id = new Option(ID_OPT, true, "vertex or edge id");
-        Option key = new Option(KEY_OPT, true, "key property");
-        Option value = new Option(VALUE_OPT, true, "value property");
-        Option direction = new Option(DIRECTION_OPT, true, "edge direction property");
-        Option debug = new Option(FalconCLIConstants.DEBUG_OPTION, false,
-                "Use debug mode to see debugging statements on stdout");
+        Option vertex = new Option(VERTEX_CMD, false, VERTEX_CMD_DESCRIPTION);
+        Option vertices = new Option(VERTICES_CMD, false, VERTICES_CMD_DESCRIPTION);
+        Option vertexEdges = new Option(VERTEX_EDGES_CMD, false, VERTEX_EDGES_CMD_DESCRIPTION);
+        Option edges = new Option(EDGE_CMD, false, EDGE_CMD_DESCRIPTION);
+        Option id = new Option(ID_OPT, true, ID_OPT_DESCRIPTION);
+        Option key = new Option(KEY_OPT, true, KEY_OPT_DESCRIPTION);
+        Option value = new Option(VALUE_OPT, true, VALUE_OPT_DESCRIPTION);
+        Option direction = new Option(DIRECTION_OPT, true, DIRECTION_OPT_DESCRIPTION);
+        Option debug = new Option(DEBUG_OPTION, false, DEBUG_OPTION_DESCRIPTION);
 
         metadataOptions.addOption(vertex);
         metadataOptions.addOption(vertices);
@@ -121,7 +157,8 @@ public class FalconMetadataCLI extends FalconCLI {
         metadataOptions.addOption(direction);
         metadataOptions.addOption(debug);
 
-        Option doAs = new Option(FalconCLIConstants.DO_AS_OPT, true, "doAs user");
+        Option doAs = new Option(DO_AS_OPT, true, DO_AS_DESCRIPTION);
+
         metadataOptions.addOption(doAs);
 
         return metadataOptions;
@@ -196,63 +233,5 @@ public class FalconMetadataCLI extends FalconCLI {
         OUT.get().println(result);
     }
 
-    private void validatePipelineName(String pipeline) {
-        if (StringUtils.isEmpty(pipeline)) {
-            throw new FalconCLIException("Invalid value for pipeline");
-        }
-    }
-
-    private void validateDimensionType(String dimensionType) {
-        if (StringUtils.isEmpty(dimensionType)
-                ||  dimensionType.contains("INSTANCE")) {
-            throw new FalconCLIException("Invalid value provided for queryParam \"type\" " + dimensionType);
-        }
-        try {
-            RelationshipType.valueOf(dimensionType);
-        } catch (IllegalArgumentException iae) {
-            throw new FalconCLIException("Invalid value provided for queryParam \"type\" " + dimensionType);
-        }
-    }
-
-    private void validateDimensionName(String dimensionName, String action) {
-        if (StringUtils.isEmpty(dimensionName)) {
-            throw new FalconCLIException("Dimension ID cannot be empty or null for action " + action);
-        }
-    }
-
-    private void validateScheduleEntity(String schedEntityType, String schedEntityName) {
-        if (StringUtils.isBlank(schedEntityType)) {
-            throw new FalconCLIException("Entity must be schedulable type : -feed/process");
-        }
 
-        if (StringUtils.isBlank(schedEntityName)) {
-            throw new FalconCLIException("Entity name is missing");
-        }
-    }
-
-    private void validateId(String id) {
-        if (id == null || id.length() == 0) {
-            throw new FalconCLIException("Missing argument: id");
-        }
-    }
-
-    private void validateVerticesCommand(String key, String value) {
-        if (key == null || key.length() == 0) {
-            throw new FalconCLIException("Missing argument: key");
-        }
-
-        if (value == null || value.length() == 0) {
-            throw new FalconCLIException("Missing argument: value");
-        }
-    }
-
-    private void validateVertexEdgesCommand(String id, String direction) {
-        if (id == null || id.length() == 0) {
-            throw new FalconCLIException("Missing argument: id");
-        }
-
-        if (direction == null || direction.length() == 0) {
-            throw new FalconCLIException("Missing argument: direction");
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/commands/BaseFalconCommands.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/commands/BaseFalconCommands.java b/cli/src/main/java/org/apache/falcon/cli/commands/BaseFalconCommands.java
deleted file mode 100644
index acff70e..0000000
--- a/cli/src/main/java/org/apache/falcon/cli/commands/BaseFalconCommands.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * 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.falcon.cli.commands;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.falcon.client.AbstractFalconClient;
-import org.apache.falcon.client.FalconCLIException;
-import org.apache.falcon.client.FalconClient;
-import org.springframework.shell.core.ExecutionProcessor;
-import org.springframework.shell.event.ParseResult;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-import static org.apache.falcon.cli.FalconCLI.CURRENT_COLO;
-import static org.apache.falcon.cli.FalconCLI.FALCON_URL;
-
-/**
- * Common code for all falcon command classes.
- */
-public class BaseFalconCommands implements ExecutionProcessor {
-    private static final String FALCON_URL_PROPERTY = "falcon.url";
-    private static final String DO_AS = "DO_AS";
-    private static final String DO_AS_PROPERTY = "do.as";
-    private static final String CLIENT_PROPERTIES = "/client.properties";
-    protected static final String FALCON_URL_ABSENT = "Failed to get falcon url from environment or client properties";
-    private static Properties clientProperties;
-    private static Properties backupProperties = new Properties();
-    private static AbstractFalconClient client;
-
-    protected static Properties getClientProperties() {
-        if (clientProperties == null) {
-            InputStream inputStream = null;
-            Properties prop = new Properties(System.getProperties());
-            prop.putAll(backupProperties);
-            try {
-                inputStream = BaseFalconCommands.class.getResourceAsStream(CLIENT_PROPERTIES);
-                if (inputStream != null) {
-                    try {
-                        prop.load(inputStream);
-                    } catch (IOException e) {
-                        throw new FalconCLIException(e);
-                    }
-                }
-            } finally {
-                IOUtils.closeQuietly(inputStream);
-            }
-            String urlOverride = System.getenv(FALCON_URL);
-            if (urlOverride != null) {
-                prop.setProperty(FALCON_URL_PROPERTY, urlOverride);
-            }
-            if (prop.getProperty(FALCON_URL_PROPERTY) == null) {
-                throw new FalconCLIException(FALCON_URL_ABSENT);
-            }
-            String doAsOverride = System.getenv(DO_AS);
-            if (doAsOverride != null) {
-                prop.setProperty(DO_AS_PROPERTY, doAsOverride);
-            }
-            clientProperties = prop;
-            backupProperties.clear();
-        }
-        return clientProperties;
-    }
-
-    static void setClientProperty(String key, String value) {
-        Properties props;
-        try {
-            props = getClientProperties();
-        } catch (FalconCLIException e) {
-            props = backupProperties;
-        }
-        if (StringUtils.isBlank(value)) {
-            props.remove(key);
-        } else {
-            props.setProperty(key, value);
-        }
-        // Re-load client in the next call
-        client = null;
-    }
-
-    public static AbstractFalconClient getFalconClient() {
-        if (client == null) {
-            client = new FalconClient(getClientProperties().getProperty(FALCON_URL_PROPERTY), getClientProperties());
-        }
-        return client;
-    }
-
-    public static void setFalconClient(AbstractFalconClient abstractFalconClient) {
-        client = abstractFalconClient;
-    }
-
-    protected String getColo(String colo) {
-        if (colo == null) {
-            Properties prop = getClientProperties();
-            colo = prop.getProperty(CURRENT_COLO, "*");
-        }
-        return colo;
-    }
-
-    protected String getDoAs() {
-        return getClientProperties().getProperty(DO_AS_PROPERTY);
-    }
-
-    @Override
-    public ParseResult beforeInvocation(ParseResult parseResult) {
-        Object[] args = parseResult.getArguments();
-        if (args != null) {
-            boolean allEqual = true;
-            for (int i = 1; i < args.length; i++) {
-                allEqual &= args[0].equals(args[i]);
-            }
-            if (allEqual) {
-                if (args[0] instanceof String) {
-                    String[] split = ((String) args[0]).split("\\s+");
-                    Object[] newArgs = new String[args.length];
-                    System.arraycopy(split, 0, newArgs, 0, split.length);
-                    parseResult = new ParseResult(parseResult.getMethod(), parseResult.getInstance(), newArgs);
-                }
-            }
-        }
-        return parseResult;
-    }
-
-    @Override
-    public void afterReturningInvocation(ParseResult parseResult, Object o) {
-
-    }
-
-    @Override
-    public void afterThrowingInvocation(ParseResult parseResult, Throwable throwable) {
-    }
-}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/commands/FalconConnectionCommands.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/commands/FalconConnectionCommands.java b/cli/src/main/java/org/apache/falcon/cli/commands/FalconConnectionCommands.java
deleted file mode 100644
index c1e7e30..0000000
--- a/cli/src/main/java/org/apache/falcon/cli/commands/FalconConnectionCommands.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * 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.falcon.cli.commands;
-
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.shell.core.annotation.CliCommand;
-import org.springframework.shell.core.annotation.CliOption;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nonnull;
-
-/**
- * Connection Commands.
- */
-@Component
-public class FalconConnectionCommands extends BaseFalconCommands {
-
-    @CliCommand(value = "get", help = "get properties")
-    public String getParameter(@CliOption(key = {"", "key"}, mandatory = false, help = "<key>") final String key) {
-        if (StringUtils.isBlank(key)) {
-            return getClientProperties().toString();
-        }
-        return getClientProperties().getProperty(key);
-    }
-
-    @CliCommand(value = "set", help = "set properties")
-    public void setParameter(@CliOption(key = {"", "keyval"}, mandatory = true, help = "<key-val>")
-                             @Nonnull final String keyVal) {
-        String[] kvArray = keyVal.split("=");
-        String key = "";
-        String value = "";
-        if (kvArray.length > 0) {
-            key = kvArray[0];
-        }
-        if (kvArray.length > 1) {
-            value = kvArray[1];
-        }
-        setClientProperty(key, value);
-    }
-}


[2/3] falcon git commit: FALCON-1596 Spring shell based CLI for falcon

Posted by aj...@apache.org.
http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/commands/FalconEntityCommands.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/commands/FalconEntityCommands.java b/cli/src/main/java/org/apache/falcon/cli/commands/FalconEntityCommands.java
deleted file mode 100644
index 427ba1c..0000000
--- a/cli/src/main/java/org/apache/falcon/cli/commands/FalconEntityCommands.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/**
- * 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.falcon.cli.commands;
-
-import org.apache.falcon.ResponseHelper;
-import org.apache.falcon.entity.v0.EntityType;
-import org.apache.falcon.resource.EntityList;
-import org.apache.falcon.resource.FeedLookupResult;
-import org.apache.falcon.resource.SchedulableEntityInstanceResult;
-import org.springframework.shell.core.annotation.CliCommand;
-import org.springframework.shell.core.annotation.CliOption;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-
-import static org.apache.falcon.FalconCLIConstants.DEFINITION_OPT;
-import static org.apache.falcon.FalconCLIConstants .DELETE_OPT;
-import static org.apache.falcon.FalconCLIConstants .LOOKUP_OPT;
-import static org.apache.falcon.FalconCLIConstants.SLA_MISS_ALERT_OPT;
-import static org.apache.falcon.FalconCLIConstants.SUBMIT_OPT;
-import static org.apache.falcon.FalconCLIConstants.UPDATE_OPT;
-import static org.apache.falcon.cli.FalconCLI.validateEntityTypeForSummary;
-import static org.apache.falcon.cli.FalconCLI.validateFilterBy;
-import static org.apache.falcon.cli.FalconCLI.validateOrderBy;
-import static org.apache.falcon.cli.FalconEntityCLI.CLUSTER_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.CLUSTER_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.COLO_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.COLO_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.DEFINITION_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.DELETE_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.DEPENDENCY_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.DEPENDENCY_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.END_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.END_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.ENTITY_NAME_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.ENTITY_NAME_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.FIELDS_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.FIELDS_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.FILE_PATH_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.FILE_PATH_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.FILTER_BY_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.FILTER_BY_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.LIST_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.LIST_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.LOOKUP_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.NAMESEQ_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.NAMESEQ_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.NUM_INSTANCES_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.NUM_INSTANCES_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.NUM_RESULTS_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.NUM_RESULTS_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.OFFSET_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.OFFSET_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.ORDER_BY_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.ORDER_BY_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.PATH_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.PATH_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.PROPS_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.PROPS_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.RESUME_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.RESUME_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.SCHEDULE_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.SCHEDULE_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.SHOWSCHEDULER_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.SHOWSCHEDULER_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.SKIPDRYRUN_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.SKIPDRYRUN_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.SLA_MISS_ALERT_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.SORT_ORDER_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.SORT_ORDER_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.START_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.START_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.STATUS_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.STATUS_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.SUBMIT_AND_SCHEDULE_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.SUBMIT_AND_SCHEDULE_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.SUBMIT_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.SUMMARY_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.SUMMARY_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.SUSPEND_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.SUSPEND_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.TAGKEYS_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.TAGKEYS_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.TAGS_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.TAGS_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.TYPE_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.TYPE_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.UPDATE_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.VALIDATE_OPT;
-import static org.apache.falcon.cli.FalconEntityCLI.VALIDATE_OPT_DESCRIPTION;
-import static org.apache.falcon.cli.FalconEntityCLI.validateEntityFields;
-
-/**
- * Entity Commands.
- */
-@Component
-public class FalconEntityCommands extends BaseFalconCommands {
-    public static final String ENTITY_PREFIX = "entity";
-    public static final String ENTITY_COMMAND_PREFIX = ENTITY_PREFIX + " ";
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + SLA_MISS_ALERT_OPT, help = SLA_MISS_ALERT_OPT_DESCRIPTION)
-    public String slaAlert(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = false, help = ENTITY_NAME_OPT_DESCRIPTION)
-            final String entityName,
-            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
-                    unspecifiedDefaultValue = "*") final String colo,
-            @CliOption(key = {START_OPT}, mandatory = true, help = START_OPT_DESCRIPTION) final String start,
-            @CliOption(key = {END_OPT}, mandatory = false, help = END_OPT_DESCRIPTION) final String end
-    ) {
-        SchedulableEntityInstanceResult response = getFalconClient()
-                .getFeedSlaMissPendingAlerts(entityType.name().toLowerCase(), entityName, start, end, getColo(colo));
-        return ResponseHelper.getString(response);
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + SUBMIT_OPT, help = SUBMIT_OPT_DESCRIPTION)
-    public String submit(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION) final File filePath
-    ) {
-
-        return getFalconClient().submit(entityType.name().toLowerCase(), filePath.getPath(), getDoAs()).getMessage();
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + LOOKUP_OPT, help = LOOKUP_OPT_DESCRIPTION)
-    public String lookup(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {PATH_OPT}, mandatory = true, help = PATH_OPT_DESCRIPTION) final String feedInstancePath
-    ) {
-
-        FeedLookupResult resp = getFalconClient().reverseLookUp(entityType.name().toLowerCase(),
-                feedInstancePath, getDoAs());
-        return ResponseHelper.getString(resp);
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + UPDATE_OPT, help = UPDATE_OPT_DESCRIPTION)
-    public String update(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION)
-            final String entityName,
-            @CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION)
-            final File filePath,
-            @CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
-                    unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun
-    ) {
-        return getFalconClient()
-                .update(entityType.name().toLowerCase(), entityName, filePath.getPath(), skipDryRun, getDoAs())
-                .getMessage();
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + SUBMIT_AND_SCHEDULE_OPT, help = SUBMIT_AND_SCHEDULE_OPT_DESCRIPTION)
-    public String submitAndSchedule(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION) final File filePath,
-            @CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
-                    unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun,
-            @CliOption(key = {PROPS_OPT}, mandatory = false, help = PROPS_OPT_DESCRIPTION) final String properties
-    ) {
-
-        return getFalconClient()
-                .submitAndSchedule(entityType.name().toLowerCase(), filePath.getPath(), skipDryRun, getDoAs(),
-                        properties)
-                .getMessage();
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + VALIDATE_OPT, help = VALIDATE_OPT_DESCRIPTION)
-    public String validate(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {FILE_PATH_OPT}, mandatory = true, help = FILE_PATH_OPT_DESCRIPTION) final File filePath,
-            @CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
-                    unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun
-    ) {
-
-        return getFalconClient()
-                .validate(entityType.name().toLowerCase(), filePath.getPath(), skipDryRun, getDoAs())
-                .getMessage();
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + SCHEDULE_OPT, help = SCHEDULE_OPT_DESCRIPTION)
-    public String schedule(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
-            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
-                    unspecifiedDefaultValue = "*") final String colo,
-            @CliOption(key = {SKIPDRYRUN_OPT}, mandatory = false, help = SKIPDRYRUN_OPT_DESCRIPTION,
-                    unspecifiedDefaultValue = "false", specifiedDefaultValue = "true") boolean skipDryRun,
-            @CliOption(key = {PROPS_OPT}, mandatory = false, help = PROPS_OPT_DESCRIPTION) final String properties
-    ) {
-
-        return getFalconClient().schedule(entityType, entityName, colo, skipDryRun, getDoAs(), properties).getMessage();
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + SUSPEND_OPT, help = SUSPEND_OPT_DESCRIPTION)
-    public String suspend(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
-            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
-                    unspecifiedDefaultValue = "*") final String colo
-    ) {
-
-        return getFalconClient().suspend(entityType, entityName, colo, getDoAs()).getMessage();
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + RESUME_OPT, help = RESUME_OPT_DESCRIPTION)
-    public String resume(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
-            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
-                    unspecifiedDefaultValue = "*") final String colo
-    ) {
-
-        return getFalconClient().resume(entityType, entityName, colo, getDoAs()).getMessage();
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + DELETE_OPT, help = DELETE_OPT_DESCRIPTION)
-    public String delete(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName
-    ) {
-
-        return getFalconClient().delete(entityType, entityName, getDoAs()).getMessage();
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + STATUS_OPT, help = STATUS_OPT_DESCRIPTION)
-    public String getStatus(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName,
-            @CliOption(key = {COLO_OPT}, mandatory = false, help = COLO_OPT_DESCRIPTION,
-                    unspecifiedDefaultValue = "*") final String colo,
-            @CliOption(key = {SHOWSCHEDULER_OPT}, mandatory = true,
-                    help = SHOWSCHEDULER_OPT_DESCRIPTION) final boolean showScheduler
-    ) {
-
-        return getFalconClient().getStatus(entityType, entityName, colo, getDoAs(), showScheduler).getMessage();
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + DEFINITION_OPT, help = DEFINITION_OPT_DESCRIPTION)
-    public String getDefinition(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName
-    ) {
-
-        return getFalconClient().getDefinition(entityType.name().toLowerCase(), entityName, getDoAs()).toString();
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + DEPENDENCY_OPT, help = DEPENDENCY_OPT_DESCRIPTION)
-    public String getDependency(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {ENTITY_NAME_OPT}, mandatory = true, help = ENTITY_NAME_OPT_DESCRIPTION) String entityName
-    ) {
-
-        return getFalconClient().getDependency(entityType.name().toLowerCase(), entityName, getDoAs()).toString();
-    }
-
-    // SUSPEND CHECKSTYLE CHECK ParameterNumberCheck
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + LIST_OPT, help = LIST_OPT_DESCRIPTION)
-    public String list(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {FIELDS_OPT}, mandatory = false, help = FIELDS_OPT_DESCRIPTION) final String fields,
-            @CliOption(key = {ORDER_BY_OPT}, mandatory = false, help = ORDER_BY_OPT_DESCRIPTION) final String orderBy,
-            @CliOption(key = {SORT_ORDER_OPT}, mandatory = false,
-                    help = SORT_ORDER_OPT_DESCRIPTION) final String sortOrder,
-            @CliOption(key = {FILTER_BY_OPT}, mandatory = false,
-                    help = FILTER_BY_OPT_DESCRIPTION) final String filterBy,
-            @CliOption(key = {TAGS_OPT}, mandatory = false, help = TAGS_OPT_DESCRIPTION) final String filterTags,
-            @CliOption(key = {NAMESEQ_OPT}, mandatory = false,
-                    help = NAMESEQ_OPT_DESCRIPTION) final String nameSubsequence,
-            @CliOption(key = {TAGKEYS_OPT}, mandatory = false, help = TAGKEYS_OPT_DESCRIPTION) final String tagKeywords,
-            @CliOption(key = {OFFSET_OPT}, mandatory = false, help = OFFSET_OPT_DESCRIPTION) final Integer offset,
-            @CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
-                    help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults
-
-    ) {
-        validateEntityFields(fields);
-        validateOrderBy(orderBy, ENTITY_PREFIX);
-        validateFilterBy(filterBy, ENTITY_PREFIX);
-        EntityList entityList = getFalconClient().getEntityList(entityType.name().toLowerCase(), fields,
-                nameSubsequence, tagKeywords, filterBy, filterTags, orderBy, sortOrder, offset, numResults, getDoAs());
-        return entityList != null ? entityList.toString() : "No entity of type (" + entityType + ") found.";
-    }
-
-    @CliCommand(value = ENTITY_COMMAND_PREFIX + SUMMARY_OPT, help = SUMMARY_OPT_DESCRIPTION)
-    public String summary(
-            @CliOption(key = {TYPE_OPT}, mandatory = true, help = TYPE_OPT_DESCRIPTION) final EntityType entityType,
-            @CliOption(key = {CLUSTER_OPT}, mandatory = true, help = CLUSTER_OPT_DESCRIPTION) final String cluster,
-            @CliOption(key = {START_OPT}, mandatory = false, help = START_OPT_DESCRIPTION) final String start,
-            @CliOption(key = {END_OPT}, mandatory = false, help = END_OPT_DESCRIPTION) final String end,
-            @CliOption(key = {FIELDS_OPT}, mandatory = false, help = FIELDS_OPT_DESCRIPTION) final String fields,
-            @CliOption(key = {ORDER_BY_OPT}, mandatory = false, help = ORDER_BY_OPT_DESCRIPTION) final String orderBy,
-            @CliOption(key = {SORT_ORDER_OPT}, mandatory = false,
-                    help = SORT_ORDER_OPT_DESCRIPTION) final String sortOrder,
-            @CliOption(key = {FILTER_BY_OPT}, mandatory = false, help = FILTER_BY_OPT_DESCRIPTION) final String filterBy,
-            @CliOption(key = {TAGS_OPT}, mandatory = false, help = TAGS_OPT_DESCRIPTION) final String filterTags,
-            @CliOption(key = {OFFSET_OPT}, mandatory = false, help = OFFSET_OPT_DESCRIPTION) final Integer offset,
-            @CliOption(key = {NUM_RESULTS_OPT}, mandatory = false,
-                    help = NUM_RESULTS_OPT_DESCRIPTION) final Integer numResults,
-            @CliOption(key = {NUM_INSTANCES_OPT}, mandatory = false,
-                    help = NUM_INSTANCES_OPT_DESCRIPTION) final Integer numInstances
-
-    ) {
-        validateEntityTypeForSummary(entityType.name().toLowerCase());
-        validateEntityFields(fields);
-        validateFilterBy(filterBy, ENTITY_PREFIX);
-        validateOrderBy(orderBy, ENTITY_PREFIX);
-        return ResponseHelper.getString(getFalconClient().getEntitySummary(
-                entityType.name().toLowerCase(), cluster, start, end, fields, filterBy, filterTags,
-                orderBy, sortOrder, offset, numResults, numInstances, getDoAs()));
-    }
-    // RESUME CHECKSTYLE CHECK ParameterNumberCheck
-}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/commands/FalconInstanceCommands.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/commands/FalconInstanceCommands.java b/cli/src/main/java/org/apache/falcon/cli/commands/FalconInstanceCommands.java
deleted file mode 100644
index 5b62cf0..0000000
--- a/cli/src/main/java/org/apache/falcon/cli/commands/FalconInstanceCommands.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * 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.falcon.cli.commands;
-
-import org.springframework.stereotype.Component;
-
-/**
- * Instance commands.
- */
-@Component
-public class FalconInstanceCommands extends BaseFalconCommands {
-
-}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/skel/FalconBanner.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/skel/FalconBanner.java b/cli/src/main/java/org/apache/falcon/cli/skel/FalconBanner.java
deleted file mode 100644
index 03c56c9..0000000
--- a/cli/src/main/java/org/apache/falcon/cli/skel/FalconBanner.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * 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.falcon.cli.skel;
-
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.shell.plugin.support.DefaultBannerProvider;
-import org.springframework.shell.support.util.OsUtils;
-import org.springframework.stereotype.Component;
-
-/**
- * The Class FalconBanner.
- */
-@Component
-@Order(Ordered.HIGHEST_PRECEDENCE)
-public class FalconBanner extends DefaultBannerProvider {
-
-    @Override
-    public String getBanner() {
-        return new StringBuilder()
-                .append("=======================================").append(OsUtils.LINE_SEPARATOR)
-                .append("*                                     *").append(OsUtils.LINE_SEPARATOR)
-                .append("*            Falcon CLI               *").append(OsUtils.LINE_SEPARATOR)
-                .append("*                                     *").append(OsUtils.LINE_SEPARATOR)
-                .append("=======================================").append(OsUtils.LINE_SEPARATOR)
-                .toString();
-
-    }
-
-    @Override
-    public String getWelcomeMessage() {
-        return "Welcome to Falcon CLI";
-    }
-
-    @Override
-    public String getVersion() {
-        return getClass().getPackage().getImplementationVersion();
-    }
-
-    @Override
-    public String getProviderName() {
-        return "Falcon CLI";
-    }
-}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/skel/FalconHistoryFileProvider.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/skel/FalconHistoryFileProvider.java b/cli/src/main/java/org/apache/falcon/cli/skel/FalconHistoryFileProvider.java
deleted file mode 100644
index 74d003a..0000000
--- a/cli/src/main/java/org/apache/falcon/cli/skel/FalconHistoryFileProvider.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * 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.falcon.cli.skel;
-
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.shell.plugin.support.DefaultHistoryFileNameProvider;
-import org.springframework.stereotype.Component;
-
-/**
- * The Class FalconHistoryFileProvider.
- */
-@Component
-@Order(Ordered.HIGHEST_PRECEDENCE)
-public class FalconHistoryFileProvider extends DefaultHistoryFileNameProvider {
-
-    public String getHistoryFileName() {
-        return "falcon-cli-hist.log";
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.springframework.shell.plugin.support.DefaultHistoryFileNameProvider#name()
-     */
-    @Override
-    public String getProviderName() {
-        return "falcon client history provider";
-    }
-}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/java/org/apache/falcon/cli/skel/FalconPromptProvider.java
----------------------------------------------------------------------
diff --git a/cli/src/main/java/org/apache/falcon/cli/skel/FalconPromptProvider.java b/cli/src/main/java/org/apache/falcon/cli/skel/FalconPromptProvider.java
deleted file mode 100644
index d8ead5b..0000000
--- a/cli/src/main/java/org/apache/falcon/cli/skel/FalconPromptProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * 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.falcon.cli.skel;
-
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.shell.plugin.support.DefaultPromptProvider;
-import org.springframework.stereotype.Component;
-
-/**
- * The Class FalconPromptProvider.
- */
-@Component
-@Order(Ordered.HIGHEST_PRECEDENCE)
-public class FalconPromptProvider extends DefaultPromptProvider {
-
-    @Override
-    public String getPrompt() {
-        return "falcon-shell>";
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.springframework.shell.plugin.support.DefaultPromptProvider#name()
-     */
-    @Override
-    public String getProviderName() {
-        return "falcon prompt provider";
-    }
-}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/main/resources/META-INF/spring/spring-shell-plugin.xml
----------------------------------------------------------------------
diff --git a/cli/src/main/resources/META-INF/spring/spring-shell-plugin.xml b/cli/src/main/resources/META-INF/spring/spring-shell-plugin.xml
deleted file mode 100644
index bd0fed4..0000000
--- a/cli/src/main/resources/META-INF/spring/spring-shell-plugin.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    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.
-
--->
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xsi:schemaLocation="
-  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
-  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
-
-    <context:component-scan base-package="org.apache.falcon.cli"/>
-
-    <bean id="falconConnectionCommands"
-          class="org.apache.falcon.cli.commands.FalconConnectionCommands">
-    </bean>
-    <bean id="falconEntityCommands"
-          class="org.apache.falcon.cli.commands.FalconEntityCommands">
-    </bean>
-    <bean id="falconInstanceCommands"
-          class="org.apache.falcon.cli.commands.FalconInstanceCommands">
-    </bean>
-</beans>

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/cli/src/test/java/org/apache/falcon/cli/commands/FalconConnectionCommandsTest.java
----------------------------------------------------------------------
diff --git a/cli/src/test/java/org/apache/falcon/cli/commands/FalconConnectionCommandsTest.java b/cli/src/test/java/org/apache/falcon/cli/commands/FalconConnectionCommandsTest.java
deleted file mode 100644
index d6ad6f9..0000000
--- a/cli/src/test/java/org/apache/falcon/cli/commands/FalconConnectionCommandsTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * 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.falcon.cli.commands;
-
-import org.apache.falcon.client.FalconCLIException;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Tests for Connection commands.
- */
-public class FalconConnectionCommandsTest extends FalconCLITest {
-    @DataProvider(name = "params-commands", parallel = false)
-    public Object[][] provideCommands() {
-        FalconCLIException e = new FalconCLIException(BaseFalconCommands.FALCON_URL_ABSENT);
-        return new Object[][]{
-            {"get", null, e},
-            {"set a=b", null, null},
-            {"get", null, e},
-            {"get a", null, e},
-            {"set falcon.url=DUMMY", null, null},
-            {"get", "{a=b, falcon.url=DUMMY}", null},
-            {"get a", "b", null},
-        };
-    }
-
-    @Test(dataProvider = "params-commands")
-    public void testGetAndSetParams(String command, Object result, Throwable throwable) throws Throwable {
-        execute(command, result, throwable);
-    }
-}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/client/src/main/java/org/apache/falcon/FalconCLIConstants.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/falcon/FalconCLIConstants.java b/client/src/main/java/org/apache/falcon/FalconCLIConstants.java
deleted file mode 100644
index bcf3fe6..0000000
--- a/client/src/main/java/org/apache/falcon/FalconCLIConstants.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * 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.falcon;
-
-/**
-* FalconCLI Constants.
-*/
-public final class FalconCLIConstants {
-    private FalconCLIConstants(){
-
-    }
-    public static final String ENV_FALCON_DEBUG = "FALCON_DEBUG";
-    public static final String DEBUG_OPTION = "debug";
-    public static final String URL_OPTION = "url";
-    public static final String DEFINITION_OPT = "definition";
-    public static final String LOOKUP_OPT = "lookup";
-    public static final String SLA_MISS_ALERT_OPT = "slaAlert";
-    public static final String TOUCH_OPT = "touch";
-    public static final String ADMIN_CMD = "admin";
-    public static final String HELP_CMD = "help";
-    public static final String METADATA_CMD = "metadata";
-    public static final String ENTITY_CMD = "entity";
-    public static final String INSTANCE_CMD = "instance";
-    public static final String EXTENSION_CMD = "extension";
-    public static final String SAFE_MODE_OPT = "setsafemode";
-    public static final String TYPE_OPT = "type";
-    public static final String COLO_OPT = "colo";
-    public static final String CLUSTER_OPT = "cluster";
-    public static final String FEED_OPT = "feed";
-    public static final String PROCESS_OPT = "process";
-    public static final String ENTITY_NAME_OPT = "name";
-    public static final String FILE_PATH_OPT = "file";
-    public static final String VERSION_OPT = "version";
-    public static final String SUBMIT_OPT = "submit";
-    public static final String UPDATE_OPT = "update";
-    public static final String UPDATE_CLUSTER_DEPENDENTS_OPT = "updateClusterDependents";
-    public static final String DELETE_OPT = "delete";
-    public static final String SUBMIT_AND_SCHEDULE_OPT = "submitAndSchedule";
-    public static final String VALIDATE_OPT = "validate";
-    public static final String SCHEDULE_OPT = "schedule";
-    public static final String SUSPEND_OPT = "suspend";
-    public static final String RESUME_OPT = "resume";
-    public static final String STATUS_OPT = "status";
-    public static final String SUMMARY_OPT = "summary";
-    public static final String DEPENDENCY_OPT = "dependency";
-    public static final String LIST_OPT = "list";
-    public static final String SKIPDRYRUN_OPT = "skipDryRun";
-    public static final String FIELDS_OPT = "fields";
-    public static final String INSTANCE_STATUS_OPT = "instanceStatus";
-    public static final String NAMESEQ_OPT = "nameseq";
-    public static final String TAGKEYS_OPT = "tagkeys";
-    public static final String FILTER_BY_OPT = "filterBy";
-    public static final String ORDER_BY_OPT = "orderBy";
-    public static final String SORT_ORDER_OPT = "sortOrder";
-    public static final String OFFSET_OPT = "offset";
-    public static final String NUM_RESULTS_OPT = "numResults";
-    public static final String START_OPT = "start";
-    public static final String END_OPT = "end";
-    public static final String CURRENT_COLO = "current.colo";
-    public static final String CLIENT_PROPERTIES = "/client.properties";
-    public static final String DO_AS_OPT = "doAs";
-    public static final String RELATIONS_OPT = "relations";
-    public static final String PIPELINE_OPT = "pipeline";
-    public static final String NAME_OPT = "name";
-}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/client/src/main/java/org/apache/falcon/ValidationUtil.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/falcon/ValidationUtil.java b/client/src/main/java/org/apache/falcon/ValidationUtil.java
new file mode 100644
index 0000000..cdf1f05
--- /dev/null
+++ b/client/src/main/java/org/apache/falcon/ValidationUtil.java
@@ -0,0 +1,199 @@
+/**
+ * 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.falcon;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.falcon.client.FalconCLIConstants;
+import org.apache.falcon.client.FalconCLIException;
+import org.apache.falcon.entity.v0.EntityType;
+import org.apache.falcon.metadata.RelationshipType;
+import org.apache.falcon.resource.EntityList;
+import org.apache.falcon.resource.InstancesResult;
+import org.apache.falcon.resource.InstancesSummaryResult;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * All the validation methods to check the params from CLI and Shell.
+ */
+public final class ValidationUtil {
+
+    private ValidationUtil(){}
+
+    public static void validateEntityFields(String fields) {
+        if (StringUtils.isEmpty(fields)) {
+            return;
+        }
+        String[] fieldsList = fields.split(",");
+        for (String s : fieldsList) {
+            try {
+                EntityList.EntityFieldList.valueOf(s.toUpperCase());
+            } catch (IllegalArgumentException ie) {
+                throw new FalconCLIException("Invalid fields argument : " + FalconCLIConstants.FIELDS_OPT);
+            }
+        }
+    }
+
+    public static void validateOrderBy(String orderBy, String action) {
+        if (StringUtils.isBlank(orderBy)) {
+            return;
+        }
+        if (action.equals("instance")) {
+            if (Arrays.asList(new String[]{"status", "cluster", "starttime", "endtime"})
+                    .contains(orderBy.toLowerCase())) {
+                return;
+            }
+        } else if (action.equals("entity")) {
+            if (Arrays.asList(new String[] {"type", "name"}).contains(orderBy.toLowerCase())) {
+                return;
+            }
+        } else if (action.equals("summary")) {
+            if (Arrays.asList(new String[]{"cluster"})
+                    .contains(orderBy.toLowerCase())) {
+                return;
+            }
+        }
+        throw new FalconCLIException("Invalid orderBy argument : " + orderBy);
+    }
+
+    public static void validateFilterBy(String filterBy, String filterType) {
+        if (StringUtils.isBlank(filterBy)) {
+            return;
+        }
+        String[] filterSplits = filterBy.split(",");
+        for (String s : filterSplits) {
+            String[] tempKeyVal = s.split(":", 2);
+            try {
+                if (filterType.equals("entity")) {
+                    EntityList.EntityFilterByFields.valueOf(tempKeyVal[0].toUpperCase());
+                } else if (filterType.equals("instance")) {
+                    InstancesResult.InstanceFilterFields.valueOf(tempKeyVal[0].toUpperCase());
+                }else if (filterType.equals("summary")) {
+                    InstancesSummaryResult.InstanceSummaryFilterFields.valueOf(tempKeyVal[0].toUpperCase());
+                } else {
+                    throw new IllegalArgumentException("Invalid API call: filterType is not valid");
+                }
+            } catch (IllegalArgumentException ie) {
+                throw new FalconCLIException("Invalid filterBy argument : " + tempKeyVal[0] + " in : " + s);
+            }
+        }
+    }
+
+    public static void validateEntityTypeForSummary(String type) {
+        EntityType entityType = EntityType.getEnum(type);
+        if (!entityType.isSchedulable()) {
+            throw new FalconCLIException("Invalid entity type " + entityType
+                    + " for EntitySummary API. Valid options are feed or process");
+        }
+    }
+
+    public static List<LifeCycle> getLifeCycle(String lifeCycleValue) {
+        if (lifeCycleValue != null) {
+            String[] lifeCycleValues = lifeCycleValue.split(",");
+            List<LifeCycle> lifeCycles = new ArrayList<LifeCycle>();
+            try {
+                for (String lifeCycle : lifeCycleValues) {
+                    lifeCycles.add(LifeCycle.valueOf(lifeCycle.toUpperCase().trim()));
+                }
+            } catch (IllegalArgumentException e) {
+                throw new FalconCLIException("Invalid life cycle values: " + lifeCycles, e);
+            }
+            return lifeCycles;
+        }
+        return null;
+    }
+
+    public static void validateDimensionName(String dimensionName, String action) {
+        if (StringUtils.isBlank(dimensionName)) {
+            throw new FalconCLIException("Dimension ID cannot be empty or null for action " + action);
+        }
+    }
+
+    public static void validateDimensionType(String dimensionType) {
+        if (StringUtils.isBlank(dimensionType)
+                ||  dimensionType.contains("INSTANCE")) {
+            throw new FalconCLIException("Invalid value provided for queryParam \"type\" " + dimensionType);
+        }
+        try {
+            RelationshipType.valueOf(dimensionType);
+        } catch (IllegalArgumentException iae) {
+            throw new FalconCLIException("Invalid value provided for queryParam \"type\" " + dimensionType);
+        }
+    }
+
+    public static void validateId(String id) {
+        if (id == null || id.length() == 0) {
+            throw new FalconCLIException("Missing argument: id");
+        }
+    }
+
+    public static void validateScheduleEntity(String schedEntityType, String schedEntityName) {
+        if (StringUtils.isBlank(schedEntityType)) {
+            throw new FalconCLIException("Entity must be schedulable type : -feed/process");
+        }
+
+        if (StringUtils.isBlank(schedEntityName)) {
+            throw new FalconCLIException("Entity name is missing");
+        }
+    }
+
+    public static void validateVertexEdgesCommand(String id, String direction) {
+        if (id == null || id.length() == 0) {
+            throw new FalconCLIException("Missing argument: id");
+        }
+
+        if (direction == null || direction.length() == 0) {
+            throw new FalconCLIException("Missing argument: direction");
+        }
+    }
+
+    public static void validateVerticesCommand(String key, String value) {
+        if (key == null || key.length() == 0) {
+            throw new FalconCLIException("Missing argument: key");
+        }
+
+        if (value == null || value.length() == 0) {
+            throw new FalconCLIException("Missing argument: value");
+        }
+    }
+
+    public static void validatePipelineName(String pipeline) {
+        if (StringUtils.isBlank(pipeline)) {
+            throw new FalconCLIException("Invalid value for pipeline");
+        }
+    }
+
+    public static void validateNotEmpty(String paramVal, String paramName) {
+        if (StringUtils.isBlank(paramVal)) {
+            throw new FalconCLIException("Missing argument : " + paramName);
+        }
+    }
+
+    public static void validateSortOrder(String sortOrder) {
+        if (!StringUtils.isBlank(sortOrder)) {
+            if (!sortOrder.equalsIgnoreCase("asc") && !sortOrder.equalsIgnoreCase("desc")) {
+                throw new FalconCLIException("Value for param sortOrder should be \"asc\" or \"desc\". It is  : "
+                        + sortOrder);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/client/src/main/java/org/apache/falcon/client/AbstractFalconClient.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/falcon/client/AbstractFalconClient.java b/client/src/main/java/org/apache/falcon/client/AbstractFalconClient.java
index b3fd3ae..5d6eff5 100644
--- a/client/src/main/java/org/apache/falcon/client/AbstractFalconClient.java
+++ b/client/src/main/java/org/apache/falcon/client/AbstractFalconClient.java
@@ -28,7 +28,9 @@ import org.apache.falcon.resource.FeedLookupResult;
 import org.apache.falcon.resource.InstanceDependencyResult;
 import org.apache.falcon.resource.InstancesResult;
 import org.apache.falcon.resource.InstancesSummaryResult;
+import org.apache.falcon.resource.LineageGraphResult;
 import org.apache.falcon.resource.SchedulableEntityInstanceResult;
+import org.apache.falcon.resource.TriageResult;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -460,4 +462,34 @@ public abstract class AbstractFalconClient {
     public abstract FeedLookupResult reverseLookUp(String entityType, String path, String doAs);
 
     public abstract EntityList getDependency(String entityType, String entityName, String doAs);
+
+    public abstract TriageResult triage(String name, String entityName, String start, String colo);
+    // SUSPEND CHECKSTYLE CHECK ParameterNumberCheck
+    public abstract InstancesResult getRunningInstances(String type, String entity, String colo,
+                                                        List<LifeCycle> lifeCycles,
+                                                        String filterBy, String orderBy, String sortOrder,
+                                                        Integer offset, Integer numResults, String doAsUser);
+    // RESUME CHECKSTYLE CHECK ParameterNumberCheck
+    public abstract FeedInstanceResult getFeedInstanceListing(String type, String entity, String start, String end,
+                                                              String colo, String doAsUser);
+    public abstract int getStatus(String doAsUser);
+
+    public abstract String getThreadDump(String doAs);
+
+    public abstract LineageGraphResult getEntityLineageGraph(String pipeline, String doAs);
+
+    public abstract String getDimensionList(String dimensionType, String cluster, String doAs);
+
+    public abstract String getReplicationMetricsDimensionList(String schedEntityType, String schedEntityName,
+                                                              Integer numResults, String doAs);
+
+    public abstract String getDimensionRelations(String dimensionType, String dimensionName, String doAs);
+
+    public abstract String getVertex(String id, String doAs);
+
+    public abstract String getVertices(String key, String value, String doAs);
+
+    public abstract String getVertexEdges(String id, String direction, String doAs);
+
+    public abstract String getEdge(String id, String doAs);
 }

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/client/src/main/java/org/apache/falcon/client/FalconCLIConstants.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/falcon/client/FalconCLIConstants.java b/client/src/main/java/org/apache/falcon/client/FalconCLIConstants.java
new file mode 100644
index 0000000..04f1599
--- /dev/null
+++ b/client/src/main/java/org/apache/falcon/client/FalconCLIConstants.java
@@ -0,0 +1,220 @@
+/**
+ * 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.falcon.client;
+
+/**
+* FalconCLI Constants.
+*/
+public final class FalconCLIConstants {
+    private FalconCLIConstants(){
+
+    }
+    public static final String ENV_FALCON_DEBUG = "FALCON_DEBUG";
+    public static final String DEFINITION_OPT = "definition";
+    public static final String LOOKUP_OPT = "lookup";
+    public static final String SLA_MISS_ALERT_OPT = "slaAlert";
+    public static final String TOUCH_OPT = "touch";
+    public static final String ADMIN_CMD = "admin";
+    public static final String HELP_CMD = "help";
+    public static final String METADATA_CMD = "metadata";
+    public static final String ENTITY_CMD = "entity";
+    public static final String INSTANCE_CMD = "instance";
+    public static final String EXTENSION_CMD = "extension";
+    public static final String SAFE_MODE_OPT = "setsafemode";
+    public static final String VERSION_OPT = "version";
+    public static final String SUBMIT_OPT = "submit";
+    public static final String SUBMIT_ONLY_OPT = "submitOnly";
+    public static final String UPDATE_OPT = "update";
+    public static final String UPDATE_CLUSTER_DEPENDENTS_OPT = "updateClusterDependents";
+    public static final String DELETE_OPT = "delete";
+    public static final String SCHEDULE_OPT = "schedule";
+    public static final String CURRENT_COLO = "current.colo";
+    public static final String CLIENT_PROPERTIES = "/client.properties";
+    public static final String RELATIONS_OPT = "relations";
+    public static final String PIPELINE_OPT = "pipeline";
+    public static final String NAME_OPT = "name";
+    public static final String VERSION_OPT_DESCRIPTION = "show Falcon server build version";
+    public static final String STACK_OPTION_DESCRIPTION = "show the thread stack dump";
+    public static final String FALCON_URL = "FALCON_URL";
+    public static final String STACK_OPTION = "stack";
+    public static final String SUBMIT_OPT_DESCRIPTION = "Submits an entity xml to Falcon";
+    public static final String UPDATE_OPT_DESCRIPTION = "Updates an existing entity";
+    public static final String DELETE_OPT_DESCRIPTION = "Deletes an entity in Falcon, and kills its instance from "
+            + "workflow engine";
+    public static final String SUBMIT_AND_SCHEDULE_OPT = "submitAndSchedule";
+    public static final String SUBMIT_AND_SCHEDULE_OPT_DESCRIPTION = "Submits an entity to Falcon and "
+            + "schedules it immediately";
+    public static final String VALIDATE_OPT = "validate";
+    public static final String VALIDATE_OPT_DESCRIPTION = "Validates an entity based on the entity type";
+    public static final String DEFINITION_OPT_DESCRIPTION = "Gets the Definition of entity";
+    public static final String SLA_MISS_ALERT_OPT_DESCRIPTION = "Get missing feed instances which missed SLA";
+
+
+    public static final String LOOKUP_OPT_DESCRIPTION = "Lookup a feed given its instance's path";
+    public static final String PATH_OPT = "path";
+    public static final String PATH_OPT_DESCRIPTION = "Path for a feed's instance";
+    public static final String TOUCH_OPT_DESCRIPTION = "Force update the entity in workflow engine"
+            + "(even without any changes to entity)";
+    public static final String PROPS_OPT = "properties";
+    public static final String PROPS_OPT_DESCRIPTION = "User supplied comma separated key value properties";
+    public static final String FIELDS_OPT = "fields";
+    public static final String FIELDS_OPT_DESCRIPTION = "Entity fields to show for a request";
+    public static final String TAGS_OPT = "tags";
+    public static final String TAGS_OPT_DESCRIPTION = "Filter returned entities by the specified tags";
+    public static final String NUM_INSTANCES_OPT = "numInstances";
+    public static final String NUM_INSTANCES_OPT_DESCRIPTION = "Number of instances to return per entity "
+            + "summary request";
+    public static final String NAMESEQ_OPT = "nameseq";
+    public static final String NAMESEQ_OPT_DESCRIPTION = "Subsequence of entity name";
+    public static final String TAGKEYS_OPT = "tagkeys";
+    public static final String TAGKEYS_OPT_DESCRIPTION = "Keywords in tags";
+    public static final String SHOWSCHEDULER_OPT = "showScheduler";
+    public static final String SHOWSCHEDULER_OPT_DESCRIPTION = "To return the scheduler "
+            + "on which the entity is scheduled.";
+
+    public static final String DEBUG_OPTION = "debug";
+    public static final String URL_OPTION = "url";
+    public static final String TYPE_OPT = "type";
+    public static final String COLO_OPT = "colo";
+    public static final String CLUSTER_OPT = "cluster";
+    public static final String FEED_OPT = "feed";
+    public static final String PROCESS_OPT = "process";
+    public static final String ENTITY_NAME_OPT = "name";
+    public static final String FILE_PATH_OPT = "file";
+    public static final String SUSPEND_OPT = "suspend";
+    public static final String RESUME_OPT = "resume";
+    public static final String STATUS_OPT = "status";
+    public static final String SUMMARY_OPT = "summary";
+    public static final String DEPENDENCY_OPT = "dependency";
+    public static final String SKIPDRYRUN_OPT = "skipDryRun";
+    public static final String FILTER_BY_OPT = "filterBy";
+    public static final String ORDER_BY_OPT = "orderBy";
+    public static final String SORT_ORDER_OPT = "sortOrder";
+    public static final String OFFSET_OPT = "offset";
+    public static final String NUM_RESULTS_OPT = "numResults";
+    public static final String START_OPT = "start";
+    public static final String END_OPT = "end";
+    public static final String DO_AS_OPT = "doAs";
+    public static final String RUNNING_OPT_DESCRIPTION = "Gets running process instances for a given process";
+    public static final String LIST_OPT_DESCRIPTION = "Gets all instances for a given entity in the range start "
+            + "time and optional end time";
+    public static final String STATUS_OPT_DESCRIPTION = "Gets status of process instances for a given process in"
+            + " the range start time and optional end time";
+    public static final String SUMMARY_OPT_DESCRIPTION = "Gets summary of instances for a given process in the"
+            + " range start time and optional end time";
+    public static final String KILL_OPT_DESCRIPTION = "Kills active process instances for a given process in the"
+            + " range start time and optional end time";
+    public static final String SUSPEND_OPT_DESCRIPTION = "Suspends active process instances for a given process in"
+            + " the range start time and optional end time";
+    public static final String RESUME_OPT_DESCRIPTION = "Resumes suspended process instances for a given"
+            + " process in the range start time and optional end time";
+    public static final String RERUN_OPT_DESCRIPTION = "Reruns process instances for a given process in the"
+            + " range start time and optional end time and overrides properties present in job.properties file";
+    public static final String LOG_OPT_DESCRIPTION = "Logs print the logs for process instances for a given"
+            + " process in the range start time and optional end time";
+    public static final String PARARMS_OPT_DESCRIPTION = "Displays the workflow parameters for a given instance"
+            + " of specified nominal time start time represents nominal time and end time is not considered";
+    public static final String LISTING_OPT_DESCRIPTION = "Displays feed listing and their status between a"
+            + " start and end time range.";
+    public static final String DEPENDENCY_OPT_DESCRIPTION = "Displays dependent instances for a specified"
+            + " instance.";
+    public static final String TRIAGE_OPT_DESCRIPTION = "Triage a feed or process instance and find the failures"
+            + " in it's lineage.";
+    public static final String URL_OPTION_DESCRIPTION = "Falcon URL";
+    public static final String START_OPT_DESCRIPTION = "Start time is required for commands, status, kill, "
+            + "suspend, resume and re-runand it is nominal time while displaying workflow params";
+    public static final String END_OPT_DESCRIPTION = "End time is optional for commands, status, kill, suspend, "
+            + "resume and re-run; if not specified then current time is considered as end time";
+    public static final String RUNID_OPT_DESCRIPTION = "Instance runid  is optional and user can specify the "
+            + "runid, defaults to 0";
+    public static final String CLUSTERS_OPT_DESCRIPTION = "clusters is optional for commands kill, suspend and "
+            + "resume, should not be specified for other commands";
+    public static final String SOURCECLUSTER_OPT_DESCRIPTION = " source cluster is optional for commands kill, "
+            + "suspend and resume, should not be specified for other commands (required for only feed)";
+    public static final String FILE_PATH_OPT_DESCRIPTION = "Path to job.properties file is required for rerun "
+            + "command, it should contain name=value pair for properties to override for rerun";
+    public static final String TYPE_OPT_DESCRIPTION = "Entity type, can be feed or process xml";
+    public static final String ENTITY_NAME_OPT_DESCRIPTION = "Entity name, can be feed or process name";
+    public static final String COLO_OPT_DESCRIPTION = "Colo on which the cmd has to be executed";
+    public static final String LIFECYCLE_OPT_DESCRIPTION = "describes life cycle of entity , for feed it can be "
+            + "replication/retention and for process it can be execution";
+    public static final String FILTER_BY_OPT_DESCRIPTION = "Filter returned instances by the specified fields";
+    public static final String ORDER_BY_OPT_DESCRIPTION = "Order returned instances by this field";
+    public static final String SORT_ORDER_OPT_DESCRIPTION = "asc or desc order for results";
+    public static final String OFFSET_OPT_DESCRIPTION = "Start returning instances from this offset";
+    public static final String FORCE_RERUN_FLAG_DESCRIPTION = "Flag to forcefully rerun entire workflow "
+            + "of an instance";
+    public static final String DO_AS_OPT_DESCRIPTION = "doAs user";
+    public static final String INSTANCE_TIME_OPT_DESCRIPTION = "Time for an instance";
+    public static final String ALL_ATTEMPTS_DESCRIPTION = "To get all attempts of corresponding instances";
+    public static final String FORCE_RERUN_FLAG = "force";
+    public static final String INSTANCE_TIME_OPT = "instanceTime";
+    public static final String RUNNING_OPT = "running";
+    public static final String KILL_OPT = "kill";
+    public static final String RERUN_OPT = "rerun";
+    public static final String LOG_OPT = "logs";
+    public static final String CLUSTERS_OPT = "clusters";
+    public static final String SOURCECLUSTER_OPT = "sourceClusters";
+    public static final String LIFECYCLE_OPT = "lifecycle";
+    public static final String PARARMS_OPT = "params";
+    public static final String LISTING_OPT = "listing";
+    public static final String TRIAGE_OPT = "triage";
+    public static final String SKIPDRYRUN_OPT_DESCRIPTION = "skip dry run in workflow engine";
+    public static final String SCHEDULE_OPT_DESCRIPTION = "Schedules a submited entity in Falcon";
+    public static final String ALL_ATTEMPTS = "allAttempts";
+    public static final String RUNID_OPT = "runid";
+    public static final String INSTANCE_STATUS_OPT = "instanceStatus";
+    public static final String SEARCH_OPT = "search";
+
+
+    // Discovery Commands
+    public static final String DISCOVERY_OPT = "discovery";
+    public static final String LIST_OPT = "list";
+
+    // Lineage Commands
+    public static final String LINEAGE_OPT = "lineage";
+    public static final String VERTEX_CMD = "vertex";
+    public static final String VERTICES_CMD = "vertices";
+    public static final String VERTEX_EDGES_CMD = "edges";
+    public static final String EDGE_CMD = "edge";
+    public static final String ID_OPT = "id";
+    public static final String KEY_OPT = "key";
+    public static final String VALUE_OPT = "value";
+    public static final String DIRECTION_OPT = "direction";
+
+    public static final String DISCOVERY_OPT_DESCRIPTION = "Discover falcon metadata relations";
+    public static final String LINEAGE_OPT_DESCRIPTION = "Get falcon metadata lineage information";
+    public static final String PIPELINE_OPT_DESCRIPTION = "Get lineage graph for the entities in a pipeline";
+    public static final String RELATIONS_OPT_DESCRIPTION = "List all relations for a dimension";
+    public static final String NAME_OPT_DESCRIPTION = "Dimension name";
+    public static final String CLUSTER_OPT_DESCRIPTION = "Cluster name";
+    public static final String FEED_OPT_DESCRIPTION = "Feed Entity name";
+    public static final String PROCESS_OPT_DESCRIPTION = "Process Entity name";
+    public static final String NUM_RESULTS_OPT_DESCRIPTION = "Number of results to return per request";
+    public static final String VERTEX_CMD_DESCRIPTION = "show the vertices";
+    public static final String VERTICES_CMD_DESCRIPTION = "show the vertices";
+    public static final String VERTEX_EDGES_CMD_DESCRIPTION = "show the edges for a given vertex";
+    public static final String EDGE_CMD_DESCRIPTION = "show the edges";
+    public static final String ID_OPT_DESCRIPTION = "vertex or edge id";
+    public static final String KEY_OPT_DESCRIPTION = "key property";
+    public static final String VALUE_OPT_DESCRIPTION = "value property";
+    public static final String DIRECTION_OPT_DESCRIPTION = "edge direction property";
+    public static final String DEBUG_OPTION_DESCRIPTION = "Use debug mode to see debugging statements on stdout";
+    public static final String DO_AS_DESCRIPTION = "doAs user";
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/client/src/main/java/org/apache/falcon/client/FalconClient.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/falcon/client/FalconClient.java b/client/src/main/java/org/apache/falcon/client/FalconClient.java
index 4716019..8f77fad 100644
--- a/client/src/main/java/org/apache/falcon/client/FalconClient.java
+++ b/client/src/main/java/org/apache/falcon/client/FalconClient.java
@@ -26,7 +26,6 @@ import com.sun.jersey.client.urlconnection.HTTPSProperties;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.net.util.TrustManagerUtils;
-import org.apache.falcon.FalconCLIConstants;
 import org.apache.falcon.LifeCycle;
 import org.apache.falcon.entity.v0.DateValidator;
 import org.apache.falcon.entity.v0.Entity;
@@ -540,7 +539,6 @@ public class FalconClient extends AbstractFalconClient {
             .addQueryParam(DO_AS_OPT, doAsUser).call(operation);
         return getResponse(APIResult.class, clientResponse);
     }
-
     public InstancesResult getRunningInstances(String type, String entity, String colo, List<LifeCycle> lifeCycles,
                                       String filterBy, String orderBy, String sortOrder,
                                       Integer offset, Integer numResults, String doAsUser) {
@@ -551,7 +549,6 @@ public class FalconClient extends AbstractFalconClient {
             .addQueryParam(LIFECYCLE, lifeCycles, type).addQueryParam(USER, doAsUser).call(Instances.RUNNING);
         return getResponse(InstancesResult.class, clientResponse);
     }
-
     @Override
     public InstancesResult getStatusOfInstances(String type, String entity, String start, String end, String colo,
                                                 List<LifeCycle> lifeCycles, String filterBy, String orderBy,
@@ -759,8 +756,7 @@ public class FalconClient extends AbstractFalconClient {
         return stream;
     }
 
-    private <T> T getResponse(Class<T> clazz,
-                                                ClientResponse clientResponse) {
+    private <T> T getResponse(Class<T> clazz, ClientResponse clientResponse) {
         printClientResponse(clientResponse);
         checkIfSuccessful(clientResponse);
         return clientResponse.getEntity(clazz);

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/common/pom.xml
----------------------------------------------------------------------
diff --git a/common/pom.xml b/common/pom.xml
index 5b0188f..96cb7f5 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -211,12 +211,6 @@
         </dependency>
 
         <dependency>
-            <groupId>javax.validation</groupId>
-            <artifactId>validation-api</artifactId>
-            <version>${javax-validation.version}</version>
-        </dependency>
-
-        <dependency>
             <groupId>org.apache.spark</groupId>
             <artifactId>spark-core_2.10</artifactId>
             <exclusions>
@@ -241,6 +235,11 @@
             <version>0.9.3</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+            <version>${javax-validation.version}</version>
+        </dependency>
     </dependencies>
 
     <build>

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 7284277..fe94261 100644
--- a/pom.xml
+++ b/pom.xml
@@ -370,6 +370,7 @@
         <module>falcon-ui</module>
         <module>build-tools</module>
         <module>client</module>
+        <module>shell</module>
         <module>cli</module>
         <module>metrics</module>
         <module>titan</module>

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/pom.xml
----------------------------------------------------------------------
diff --git a/shell/pom.xml b/shell/pom.xml
new file mode 100644
index 0000000..fea6b54
--- /dev/null
+++ b/shell/pom.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.falcon</groupId>
+        <artifactId>falcon-main</artifactId>
+        <version>0.11-SNAPSHOT</version>
+    </parent>
+    <artifactId>falcon-shell</artifactId>
+    <name>Apache Falcon Shell</name>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.falcon</groupId>
+            <artifactId>falcon-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sun.jersey</groupId>
+            <artifactId>jersey-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sun.jersey</groupId>
+            <artifactId>jersey-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sun.jersey</groupId>
+            <artifactId>jersey-json</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>jline</groupId>
+            <artifactId>jline</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.stephenc.findbugs</groupId>
+            <artifactId>findbugs-annotations</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.shell</groupId>
+            <artifactId>spring-shell</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+            <version>4.0.3.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.code.findbugs</groupId>
+            <artifactId>jsr305</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!-- make the jar executable by adding a Main-Class and Class-Path to the manifest -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>2.4.1</version>
+                <configuration>
+                    <shadedArtifactAttached>false</shadedArtifactAttached>
+                    <createDependencyReducedPom>false</createDependencyReducedPom>
+                    <artifactSet>
+                        <includes>
+                            <include>org.apache.hadoop:hadoop-auth</include>
+                            <include>org.apache.hadoop.security.authentication.client.Authenticator</include>>
+                            <include>org.apache.falcon:*</include>
+                            <include>org.apache.commons:*</include>
+                            <include>commons-logging:*</include>
+                            <include>commons-net:*</include>
+                            <include>commons-codec:*</include>
+                            <include>commons-io:*</include>
+                            <include>jline:*</include>
+                            <include>org.slf4j:*</include>
+                            <include>log4j:*</include>
+                            <include>com.sun.jersey:*</include>
+                            <include>org.springframework:*</include>
+                            <include>org.springframework.shell:*</include>
+                        </includes>
+                    </artifactSet>
+                    <filters>
+                        <filter>
+                            <artifact>*:*</artifact>
+                            <excludes>
+                                <exclude>META-INF/*.SF</exclude>
+                                <exclude>META-INF/*.DSA</exclude>
+                                <exclude>META-INF/*.RSA</exclude>
+                            </excludes>
+                        </filter>
+                    </filters>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <transformers>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer"/>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer"/>
+                            </transformers>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>falcon-cli-hist.log</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/java/org/apache/falcon/shell/commands/BaseFalconCommands.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/falcon/shell/commands/BaseFalconCommands.java b/shell/src/main/java/org/apache/falcon/shell/commands/BaseFalconCommands.java
new file mode 100644
index 0000000..5d6467b
--- /dev/null
+++ b/shell/src/main/java/org/apache/falcon/shell/commands/BaseFalconCommands.java
@@ -0,0 +1,155 @@
+/**
+ * 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.falcon.shell.commands;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.falcon.client.AbstractFalconClient;
+import org.apache.falcon.client.FalconCLIException;
+import org.apache.falcon.client.FalconClient;
+import org.springframework.shell.core.ExecutionProcessor;
+import org.springframework.shell.event.ParseResult;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import static org.apache.falcon.client.FalconCLIConstants.CURRENT_COLO;
+import static org.apache.falcon.client.FalconCLIConstants.FALCON_URL;
+
+/**
+ * Common code for all falcon command classes.
+ */
+public class BaseFalconCommands implements ExecutionProcessor {
+    protected static final String FALCON_URL_PROPERTY = "falcon.url";
+    private static final String DO_AS = "DO_AS";
+    private static final String DO_AS_PROPERTY = "do.as";
+    private static final String SHELL_PROPERTIES = "/shell.properties";
+    protected static final String FALCON_URL_ABSENT = "Failed to get falcon url from environment or client properties";
+    private static Properties clientProperties;
+    private static Properties backupProperties = new Properties();
+    private static AbstractFalconClient client;
+
+    static {
+        clientProperties = getShellProperties();
+    }
+
+
+    public static Properties getShellProperties() {
+        if (clientProperties == null) {
+            InputStream inputStream = null;
+            Properties prop = new Properties(System.getProperties());
+            prop.putAll(backupProperties);
+            try {
+                inputStream = BaseFalconCommands.class.getResourceAsStream(SHELL_PROPERTIES);
+                if (inputStream != null) {
+                    try {
+                        prop.load(inputStream);
+                    } catch (IOException e) {
+                        throw new FalconCLIException(e);
+                    }
+                }
+            } finally {
+                IOUtils.closeQuietly(inputStream);
+            }
+            String urlOverride = System.getenv(FALCON_URL);
+            if (urlOverride != null) {
+                prop.setProperty(FALCON_URL_PROPERTY, urlOverride);
+            }
+            if (prop.getProperty(FALCON_URL_PROPERTY) == null) {
+                throw new FalconCLIException(FALCON_URL_ABSENT);
+            }
+            String doAsOverride = System.getenv(DO_AS);
+            if (doAsOverride != null) {
+                prop.setProperty(DO_AS_PROPERTY, doAsOverride);
+            }
+            clientProperties = prop;
+            backupProperties.clear();
+        }
+        return clientProperties;
+    }
+
+    static void setClientProperty(String key, String value) {
+        Properties props;
+        try {
+            props = getShellProperties();
+        } catch (FalconCLIException e) {
+            props = backupProperties;
+        }
+        if (StringUtils.isBlank(value)) {
+            props.remove(key);
+        } else {
+            props.setProperty(key, value);
+        }
+        // Re-load client in the next call
+        client = null;
+    }
+
+    public static AbstractFalconClient getFalconClient() {
+        if (client == null) {
+            client = new FalconClient(getShellProperties().getProperty(FALCON_URL_PROPERTY), getShellProperties());
+        }
+        return client;
+    }
+
+    public static void setFalconClient(AbstractFalconClient abstractFalconClient) {
+        client = abstractFalconClient;
+    }
+
+    protected String getColo(String colo) {
+        if (colo == null) {
+            Properties prop = getShellProperties();
+            colo = prop.getProperty(CURRENT_COLO, "*");
+        }
+        return colo;
+    }
+
+    protected String getDoAs() {
+        return getShellProperties().getProperty(DO_AS_PROPERTY);
+    }
+
+    @Override
+    public ParseResult beforeInvocation(ParseResult parseResult) {
+        Object[] args = parseResult.getArguments();
+        if (args != null) {
+            boolean allEqual = true;
+            for (int i = 1; i < args.length; i++) {
+                allEqual &= args[0].equals(args[i]);
+            }
+            if (allEqual) {
+                if (args[0] instanceof String) {
+                    String[] split = ((String) args[0]).split("\\s+");
+                    Object[] newArgs = new String[args.length];
+                    System.arraycopy(split, 0, newArgs, 0, split.length);
+                    parseResult = new ParseResult(parseResult.getMethod(), parseResult.getInstance(), newArgs);
+                }
+            }
+        }
+        return parseResult;
+    }
+
+    @Override
+    public void afterReturningInvocation(ParseResult parseResult, Object o) {
+
+    }
+
+    @Override
+    public void afterThrowingInvocation(ParseResult parseResult, Throwable throwable) {
+    }
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/java/org/apache/falcon/shell/commands/FalconAdminCommands.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/falcon/shell/commands/FalconAdminCommands.java b/shell/src/main/java/org/apache/falcon/shell/commands/FalconAdminCommands.java
new file mode 100644
index 0000000..e560248
--- /dev/null
+++ b/shell/src/main/java/org/apache/falcon/shell/commands/FalconAdminCommands.java
@@ -0,0 +1,64 @@
+/**
+ * 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.falcon.shell.commands;
+
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.stereotype.Component;
+
+import static org.apache.falcon.client.FalconCLIConstants.STACK_OPTION;
+import static org.apache.falcon.client.FalconCLIConstants.STACK_OPTION_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.STATUS_OPT_DESCRIPTION;
+import static org.apache.falcon.client.FalconCLIConstants.VERSION_OPT;
+import static org.apache.falcon.client.FalconCLIConstants.VERSION_OPT_DESCRIPTION;
+
+/**
+ * Admin commands.
+ */
+@Component
+public class FalconAdminCommands extends BaseFalconCommands {
+    public static final String ADMIN_PREFIX = "admin";
+    public static final String ADMIN_COMMAND_PREFIX = ADMIN_PREFIX + " ";
+
+    @CliCommand(value = {STATUS_OPT, ADMIN_COMMAND_PREFIX + STATUS_OPT}, help = STATUS_OPT_DESCRIPTION)
+    public String status(
+    ) {
+        int status = getFalconClient().getStatus(getDoAs());
+        String url = getShellProperties().getProperty(BaseFalconCommands.FALCON_URL_PROPERTY);
+        if (status != 200) {
+            throw new RuntimeException("Falcon server is not fully operational (on "
+                    + url + "). "
+                    + "Please check log files.");
+        } else {
+            return ("Falcon server is running (on " + url + ")");
+        }
+    }
+
+    @CliCommand(value = {ADMIN_COMMAND_PREFIX + STACK_OPTION}, help = STACK_OPTION_DESCRIPTION)
+    public String stack(
+    ) {
+        return getFalconClient().getThreadDump(getDoAs());
+    }
+
+    @CliCommand(value = {ADMIN_COMMAND_PREFIX + VERSION_OPT}, help = VERSION_OPT_DESCRIPTION)
+    public String version(
+    ) {
+        return getFalconClient().getVersion(getDoAs());
+    }
+}

http://git-wip-us.apache.org/repos/asf/falcon/blob/da767c2f/shell/src/main/java/org/apache/falcon/shell/commands/FalconConnectionCommands.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/falcon/shell/commands/FalconConnectionCommands.java b/shell/src/main/java/org/apache/falcon/shell/commands/FalconConnectionCommands.java
new file mode 100644
index 0000000..d14e916
--- /dev/null
+++ b/shell/src/main/java/org/apache/falcon/shell/commands/FalconConnectionCommands.java
@@ -0,0 +1,58 @@
+/**
+ * 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.falcon.shell.commands;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.shell.core.annotation.CliOption;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Connection Commands.
+ */
+@Component
+public class FalconConnectionCommands extends BaseFalconCommands {
+
+    @CliCommand(value = "get", help = "get properties")
+    public String getParameter(@CliOption(key = {"", "key"}, mandatory = false, help = "<key>") final String key) {
+        if (StringUtils.isBlank(key)) {
+            return BaseFalconCommands.getShellProperties().toString();
+        }
+        return getShellProperties().getProperty(key);
+    }
+
+    @CliCommand(value = "set", help = "set properties")
+    public void setParameter(@CliOption(key = {"", "keyval"}, mandatory = true, help = "<key-val>")
+                             @Nonnull final String keyVal) {
+        String[] kvArray = keyVal.split("=");
+        String key = "";
+        String value = "";
+        if (kvArray.length > 0) {
+            key = kvArray[0];
+        }
+        if (kvArray.length > 1) {
+            value = kvArray[1];
+        }
+        setClientProperty(key, value);
+    }
+}