You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oozie.apache.org by pu...@apache.org on 2017/01/30 03:12:15 UTC

[2/4] oozie git commit: OOZIE-2770 Show missing dependencies for coord actions

OOZIE-2770 Show missing dependencies for coord actions


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

Branch: refs/heads/master
Commit: 9035d91cf352ad2e3328feef6e04f067e8e2bc8c
Parents: ff21b99
Author: puru <pu...@gmail.com>
Authored: Sun Jan 29 19:07:39 2017 -0800
Committer: puru <pu...@gmail.com>
Committed: Sun Jan 29 19:07:39 2017 -0800

----------------------------------------------------------------------
 .../java/org/apache/oozie/cli/OozieCLI.java     |  19 ++
 .../org/apache/oozie/client/OozieClient.java    | 100 ++++++-
 .../org/apache/oozie/client/rest/JsonTags.java  |   5 +
 .../apache/oozie/client/rest/RestConstants.java |   2 +
 .../org/apache/oozie/CoordinatorEngine.java     |  14 +
 .../main/java/org/apache/oozie/ErrorCode.java   |   3 +-
 .../oozie/command/SchemaCheckXCommand.java      |   4 +-
 .../CoordActionMissingDependenciesXCommand.java | 132 +++++++++
 .../oozie/command/coord/CoordCommandUtils.java  |  20 +-
 .../command/coord/CoordSLAAlertsXCommand.java   |  15 +-
 .../java/org/apache/oozie/coord/CoordUtils.java |  30 +-
 .../AbstractCoordInputDependency.java           |  15 +-
 .../input/dependency/CoordInputDependency.java  |  20 ++
 .../dependency/CoordOldInputDependency.java     | 125 +++++++-
 .../dependency/CoordPullInputDependency.java    |  19 ++
 .../oozie/dependency/ActionDependency.java      |   5 +
 .../executor/jpa/CoordActionQueryExecutor.java  |  22 +-
 .../apache/oozie/servlet/BaseJobServlet.java    |  21 +-
 .../org/apache/oozie/servlet/V0JobServlet.java  |  26 +-
 .../org/apache/oozie/servlet/V1JobServlet.java  |  29 +-
 .../org/apache/oozie/servlet/V2JobServlet.java  |  44 +++
 .../apache/oozie/sla/SLACalculatorMemory.java   |   2 +-
 .../main/java/org/apache/oozie/util/Pair.java   |   6 +-
 .../oozie/TestCoordinatorEngineSimple.java      |   4 +-
 .../org/apache/oozie/client/TestOozieCLI.java   |  16 ++
 ...tCoordActionMissingDependenciesXCommand.java | 288 +++++++++++++++++++
 .../input/logic/TestCoordInputLogicPush.java    |  59 ++--
 .../servlet/MockCoordinatorEngineService.java   |  10 +
 .../coord-multiple-output-instance5.xml         | 108 +++++++
 docs/src/site/twiki/DG_CommandLineTool.twiki    |  25 ++
 docs/src/site/twiki/WebServicesAPI.twiki        |  49 ++++
 release-log.txt                                 |   1 +
 webapp/src/main/webapp/oozie-console.js         | 125 +++++++-
 33 files changed, 1261 insertions(+), 102 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/client/src/main/java/org/apache/oozie/cli/OozieCLI.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/oozie/cli/OozieCLI.java b/client/src/main/java/org/apache/oozie/cli/OozieCLI.java
index 6e30d7e..f78c3aa 100644
--- a/client/src/main/java/org/apache/oozie/cli/OozieCLI.java
+++ b/client/src/main/java/org/apache/oozie/cli/OozieCLI.java
@@ -181,6 +181,8 @@ public class OozieCLI {
 
     public static final String WORKFLOW_ACTIONS_RETRIES = "retries";
 
+    public static final String COORD_ACTION_MISSING_DEPENDENCIES = "missingdeps";
+
     private static final String[] OOZIE_HELP = {
             "the env variable '" + ENV_OOZIE_URL + "' is used as default value for the '-" + OOZIE_OPTION + "' option",
             "the env variable '" + ENV_OOZIE_TIME_ZONE + "' is used as default value for the '-" + TIME_ZONE_OPTION + "' option",
@@ -382,6 +384,9 @@ public class OozieCLI {
                 "enables sla alerts for the job and its children");
         Option slaChange = new Option(SLA_CHANGE, true,
                 "Update sla param for jobs, supported param are should-start, should-end, nominal-time and max-duration");
+        Option coordActionMissingDependencies = new Option(COORD_ACTION_MISSING_DEPENDENCIES, true,
+                "List missing dependencies of a coord action. To specify multiple actions, use with -action or -date option.");
+
 
         Option doAs = new Option(DO_AS_OPTION, true, "doAs user, impersonates as the specified user");
 
@@ -411,6 +416,7 @@ public class OozieCLI {
         actions.addOption(slaEnableAlert);
         actions.addOption(slaChange);
         actions.addOption(workflowActionRetries);
+        actions.addOption(coordActionMissingDependencies);
         actions.setRequired(true);
         Options jobOptions = new Options();
         jobOptions.addOption(oozie);
@@ -1329,6 +1335,19 @@ public class OozieCLI {
                         wc.getWorkflowActionRetriesInfo(commandLine.getOptionValue(WORKFLOW_ACTIONS_RETRIES)),
                         commandLine.getOptionValue(WORKFLOW_ACTIONS_RETRIES));
             }
+            else if (options.contains(COORD_ACTION_MISSING_DEPENDENCIES)) {
+                String actions = null, dates = null;
+
+                if (options.contains(ACTION_OPTION)) {
+                    actions = commandLine.getOptionValue(ACTION_OPTION);
+                }
+
+                if (options.contains(DATE_OPTION)) {
+                    dates = commandLine.getOptionValue(DATE_OPTION);
+                }
+                wc.getCoordActionMissingDependencies(commandLine.getOptionValue(COORD_ACTION_MISSING_DEPENDENCIES),
+                        actions, dates, System.out);
+            }
 
         }
         catch (OozieClientException ex) {

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/client/src/main/java/org/apache/oozie/client/OozieClient.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/oozie/client/OozieClient.java b/client/src/main/java/org/apache/oozie/client/OozieClient.java
index a107c4a..84f41c9 100644
--- a/client/src/main/java/org/apache/oozie/client/OozieClient.java
+++ b/client/src/main/java/org/apache/oozie/client/OozieClient.java
@@ -35,6 +35,7 @@ import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
@@ -47,6 +48,7 @@ import java.io.Reader;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -592,6 +594,7 @@ public class OozieClient {
         }
 
         protected abstract T call(HttpURLConnection conn) throws IOException, OozieClientException;
+
     }
 
     protected abstract class MapClientCallable extends ClientCallable<Map<String, String>> {
@@ -1231,6 +1234,99 @@ public class OozieClient {
         return new JobDefinition(jobId).call();
     }
 
+    /**
+     * Get coord action missing dependencies
+     * @param jobId
+     * @param actionList
+     * @param dates
+     * @throws OozieClientException
+     */
+    public void getCoordActionMissingDependencies(String jobId, String actionList, String dates, PrintStream ps)
+            throws OozieClientException {
+        new CoordActionMissingDependencies(jobId, actionList, dates, ps).call();
+    }
+
+    /**
+     * Get coord action missing dependencies
+     * @param jobId
+     * @param actionList
+     * @param dates
+     * @throws OozieClientException
+     */
+    public void getCoordActionMissingDependencies(String jobId, String actionList, String dates)
+            throws OozieClientException {
+        new CoordActionMissingDependencies(jobId, actionList, dates).call();
+    }
+
+    private class CoordActionMissingDependencies extends ClientCallable<String> {
+        PrintStream printStream;
+        public CoordActionMissingDependencies(String jobId, String actionList, String dates, PrintStream ps) {
+            super("GET", RestConstants.JOB, notEmpty(jobId, "jobId"), prepareParams(RestConstants.JOB_SHOW_PARAM,
+                    RestConstants.COORD_ACTION_MISSING_DEPENDENCIES, RestConstants.JOB_COORD_SCOPE_ACTION_LIST, actionList,
+                    RestConstants.JOB_COORD_SCOPE_DATE, dates));
+            this.printStream = ps;
+        }
+
+        public CoordActionMissingDependencies(String jobId, String actionList, String dates) {
+            this(jobId, actionList, dates, System.out);
+        }
+
+
+        @SuppressWarnings("unchecked")
+        protected String call(HttpURLConnection conn) throws IOException, OozieClientException {
+            if ((conn.getResponseCode() == HttpURLConnection.HTTP_OK)) {
+                Reader reader = new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8);
+                JSONObject json = (JSONObject) JSONValue.parse(reader);
+                if (json != null) {
+                    JSONArray inputDependencies = (JSONArray) json.get(JsonTags.COORD_ACTION_MISSING_DEPENDENCIES);
+                    for (Object dependencies : inputDependencies) {
+                        printStream.println();
+                        printStream.println("CoordAction : "
+                                + ((JSONObject) dependencies).get(JsonTags.COORDINATOR_ACTION_ID));
+                        if (((JSONObject) dependencies).get(JsonTags.COORD_ACTION_FIRST_MISSING_DEPENDENCIES) != null) {
+                            printStream.println("Blocked on  : "
+                                    + ((JSONObject) dependencies)
+                                            .get(JsonTags.COORD_ACTION_FIRST_MISSING_DEPENDENCIES));
+                        }
+
+                        if (((JSONObject) dependencies).get(JsonTags.COORDINATOR_ACTION_DATASETS) != null) {
+
+                            JSONArray missingDependencies = (JSONArray) ((JSONObject) dependencies)
+                                    .get(JsonTags.COORDINATOR_ACTION_DATASETS);
+
+                            for (Object missingDependenciesJson : missingDependencies) {
+
+                                printStream.println("Dataset     : "
+                                        + ((JSONObject) missingDependenciesJson)
+                                                .get(JsonTags.COORDINATOR_ACTION_DATASET));
+
+                                JSONArray inputDependenciesList = (JSONArray) ((JSONObject) missingDependenciesJson)
+                                        .get(JsonTags.COORDINATOR_ACTION_MISSING_DEPS);
+                                printStream.println("Pending Dependencies : ");
+
+                                if (inputDependenciesList != null) {
+                                    Iterator<String> iterator = inputDependenciesList.iterator();
+                                    while (iterator.hasNext()) {
+                                        printStream.println("\t  " + iterator.next());
+                                    }
+                                }
+                                printStream.println();
+                            }
+                        }
+                    }
+                }
+                else {
+                    printStream.println(" No missing input dependencies found");
+                }
+
+            }
+            else {
+                handleError(conn);
+            }
+            return null;
+        }
+    }
+
     private class JobDefinition extends JobMetadata {
 
         JobDefinition(String jobId) {
@@ -1268,7 +1364,7 @@ public class OozieClient {
                 InputStreamReader isr = new InputStreamReader(is);
                 try {
                     if (printStream != null) {
-                        sendToOutputStream(isr, -1);
+                        sendToOutputStream(isr, -1, printStream);
                     }
                     else {
                         returnVal = getReaderAsString(isr, -1);
@@ -1291,7 +1387,7 @@ public class OozieClient {
          * @param maxLen max content length allowed, if -1 there is no limit.
          * @throws IOException
          */
-        private void sendToOutputStream(Reader reader, int maxLen) throws IOException {
+        private void sendToOutputStream(Reader reader, int maxLen, PrintStream printStream) throws IOException {
             notNull(reader, "reader");
             StringBuilder sb = new StringBuilder();
             char[] buffer = new char[2048];

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/client/src/main/java/org/apache/oozie/client/rest/JsonTags.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/oozie/client/rest/JsonTags.java b/client/src/main/java/org/apache/oozie/client/rest/JsonTags.java
index d670142..8f220b8 100644
--- a/client/src/main/java/org/apache/oozie/client/rest/JsonTags.java
+++ b/client/src/main/java/org/apache/oozie/client/rest/JsonTags.java
@@ -140,6 +140,8 @@ public interface JsonTags {
     String COORDINATOR_ACTIONS = "actions";
     String COORDINATOR_ACTION_DATA = "data";
     String COORDINATOR_JOB_DATA = "data";
+    String COORDINATOR_ACTION_DATASETS = "dataSets";
+    String COORDINATOR_ACTION_DATASET = "dataSet";
 
     String BUNDLE_JOB_ID = "bundleJobId";
     String BUNDLE_JOB_NAME = "bundleJobName";
@@ -246,5 +248,8 @@ public interface JsonTags {
     String STATUS = "status";
     String ACTION_ATTEMPT = "attempt";
     String VALIDATE = "validate";
+    String COORD_ACTION_MISSING_DEPENDENCIES = "missingDependencies";
+    String COORD_ACTION_FIRST_MISSING_DEPENDENCIES = "blockedOn";
+
 
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/client/src/main/java/org/apache/oozie/client/rest/RestConstants.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/oozie/client/rest/RestConstants.java b/client/src/main/java/org/apache/oozie/client/rest/RestConstants.java
index 9a3be97..4e38b4a 100644
--- a/client/src/main/java/org/apache/oozie/client/rest/RestConstants.java
+++ b/client/src/main/java/org/apache/oozie/client/rest/RestConstants.java
@@ -217,4 +217,6 @@ public interface RestConstants {
 
     String USER_PARAM = "user";
 
+    public static final String COORD_ACTION_MISSING_DEPENDENCIES = "missing-dependencies";
+
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/CoordinatorEngine.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/CoordinatorEngine.java b/core/src/main/java/org/apache/oozie/CoordinatorEngine.java
index 91fe5a1..2f9f822 100644
--- a/core/src/main/java/org/apache/oozie/CoordinatorEngine.java
+++ b/core/src/main/java/org/apache/oozie/CoordinatorEngine.java
@@ -49,6 +49,7 @@ import org.apache.oozie.command.coord.CoordActionInfoXCommand;
 import org.apache.oozie.command.coord.CoordActionsIgnoreXCommand;
 import org.apache.oozie.command.coord.CoordActionsKillXCommand;
 import org.apache.oozie.command.coord.CoordChangeXCommand;
+import org.apache.oozie.command.coord.CoordActionMissingDependenciesXCommand;
 import org.apache.oozie.command.coord.CoordJobXCommand;
 import org.apache.oozie.command.coord.CoordJobsXCommand;
 import org.apache.oozie.command.coord.CoordKillXCommand;
@@ -60,6 +61,7 @@ import org.apache.oozie.command.coord.CoordSLAChangeXCommand;
 import org.apache.oozie.command.coord.CoordSubmitXCommand;
 import org.apache.oozie.command.coord.CoordSuspendXCommand;
 import org.apache.oozie.command.coord.CoordUpdateXCommand;
+import org.apache.oozie.dependency.ActionDependency;
 import org.apache.oozie.executor.jpa.CoordActionQueryExecutor;
 import org.apache.oozie.executor.jpa.CoordJobQueryExecutor;
 import org.apache.oozie.executor.jpa.JPAExecutorException;
@@ -984,4 +986,16 @@ public class CoordinatorEngine extends BaseEngine {
             throw new CoordinatorEngineException(ex);
         }
     }
+    /**
+     * Get coord action missing dependencies
+     * @param id jobID
+     * @param actions action list
+     * @param dates nominal time list
+     * @return pair of coord action bean and list of missing input dependencies.
+     * @throws CommandException
+     */
+    public List<Pair<CoordinatorActionBean, Map<String, ActionDependency>>> getCoordActionMissingDependencies(String id,
+            String actions, String dates) throws CommandException {
+        return new CoordActionMissingDependenciesXCommand(id, actions, dates).call();
+    }
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/ErrorCode.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/ErrorCode.java b/core/src/main/java/org/apache/oozie/ErrorCode.java
index 9a843bd..ed1ca60 100644
--- a/core/src/main/java/org/apache/oozie/ErrorCode.java
+++ b/core/src/main/java/org/apache/oozie/ErrorCode.java
@@ -217,8 +217,7 @@ public enum ErrorCode {
     E1026(XLog.STD, "SLA alert update command failed: {0}"),
     E1027(XLog.STD, "SLA change command failed. {0}"),
     E1028(XLog.STD, "Coord input logic error. {0}"),
-
-
+    E1029(XLog.STD, "Coord action missing dependencies error. {0}"),
 
     E1100(XLog.STD, "Command precondition does not hold before execution, [{0}]"),
 

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/command/SchemaCheckXCommand.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/command/SchemaCheckXCommand.java b/core/src/main/java/org/apache/oozie/command/SchemaCheckXCommand.java
index 1cc086e..d1ea294 100644
--- a/core/src/main/java/org/apache/oozie/command/SchemaCheckXCommand.java
+++ b/core/src/main/java/org/apache/oozie/command/SchemaCheckXCommand.java
@@ -195,10 +195,10 @@ public class SchemaCheckXCommand extends XCommand<Void> {
             problem = true;
         } else {
             for (Map.Entry<String, Integer> ent : expectedColumnTypes.entrySet()) {
-                if (!foundColumns.get(ent.getKey()).getFist().equals(ent.getValue())) {
+                if (!foundColumns.get(ent.getKey()).getFirst().equals(ent.getValue())) {
                     LOG.error("Expected column [{0}] in table [{1}] to have type [{2}], but found type [{3}]",
                             ent.getKey(), table, getSQLTypeFromInt(ent.getValue()),
-                            getSQLTypeFromInt(foundColumns.get(ent.getKey()).getFist()));
+                            getSQLTypeFromInt(foundColumns.get(ent.getKey()).getFirst()));
                     problem = true;
                 } else if (foundColumns.get(ent.getKey()).getSecond() != null) {
                     LOG.error("Expected column [{0}] in table [{1}] to have default value [NULL], but found default vale [{2}]",

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/command/coord/CoordActionMissingDependenciesXCommand.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/command/coord/CoordActionMissingDependenciesXCommand.java b/core/src/main/java/org/apache/oozie/command/coord/CoordActionMissingDependenciesXCommand.java
new file mode 100644
index 0000000..d37cfe5
--- /dev/null
+++ b/core/src/main/java/org/apache/oozie/command/coord/CoordActionMissingDependenciesXCommand.java
@@ -0,0 +1,132 @@
+/**
+ * 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.oozie.command.coord;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.oozie.CoordinatorActionBean;
+import org.apache.oozie.ErrorCode;
+import org.apache.oozie.command.CommandException;
+import org.apache.oozie.command.PreconditionException;
+import org.apache.oozie.command.XCommand;
+import org.apache.oozie.coord.CoordUtils;
+import org.apache.oozie.coord.input.dependency.CoordInputDependency;
+import org.apache.oozie.dependency.ActionDependency;
+import org.apache.oozie.executor.jpa.CoordActionQueryExecutor;
+import org.apache.oozie.executor.jpa.CoordActionQueryExecutor.CoordActionQuery;
+import org.apache.oozie.executor.jpa.JPAExecutorException;
+import org.apache.oozie.util.Pair;
+
+public class CoordActionMissingDependenciesXCommand
+        extends XCommand<List<Pair<CoordinatorActionBean, Map<String, ActionDependency>>>> {
+
+    private String actions;
+    private String dates;
+    private String jobId;
+    private List<CoordinatorActionBean> coordActions = new ArrayList<CoordinatorActionBean>();
+
+    public CoordActionMissingDependenciesXCommand(String id, String actions, String dates) {
+        super("CoordActionMissingDependenciesXCommand", "CoordActionMissingDependenciesXCommand", 1);
+        this.jobId = id;
+        this.actions = actions;
+        this.dates = dates;
+
+        if (id.contains("@")) {
+            this.jobId = id.substring(0, id.indexOf("@"));
+            this.actions = id.substring(id.indexOf("@") + 1);
+        }
+    }
+
+    public CoordActionMissingDependenciesXCommand(String id) {
+        this(id, null, null);
+    }
+
+    @Override
+    protected boolean isLockRequired() {
+        return false;
+    }
+
+    @Override
+    public String getEntityKey() {
+        return null;
+    }
+
+    @Override
+    protected void eagerVerifyPrecondition() throws CommandException, PreconditionException {
+        if (actions == null && dates == null) {
+            throw new CommandException(ErrorCode.E1029, "Action(s) are missing.");
+        }
+    }
+
+    @Override
+    protected void loadState() throws CommandException {
+        String actionId = null;
+
+        try {
+            List<String> actionIds = CoordUtils.getActionListForScopeAndDate(jobId, actions, dates);
+            for (String id : actionIds) {
+                actionId = id;
+                coordActions.add(CoordActionQueryExecutor.getInstance()
+                        .get(CoordActionQuery.GET_COORD_ACTION_FOR_INPUTCHECK, actionId));
+            }
+        }
+        catch (JPAExecutorException e) {
+            if (e.getErrorCode().equals(ErrorCode.E0605)) {
+                throw new CommandException(ErrorCode.E0605, actionId);
+            }
+            else {
+                throw new CommandException(ErrorCode.E1029, e);
+            }
+        }
+
+    }
+
+    @Override
+    protected void verifyPrecondition() throws CommandException, PreconditionException {
+
+    }
+
+    @Override
+    protected List<Pair<CoordinatorActionBean, Map<String, ActionDependency>>> execute() throws CommandException {
+
+        List<Pair<CoordinatorActionBean, Map<String, ActionDependency>>> inputDependenciesListPair =
+                new ArrayList<Pair<CoordinatorActionBean, Map<String, ActionDependency>>>();
+        try {
+
+            for (CoordinatorActionBean coordAction : coordActions) {
+                CoordInputDependency coordPullInputDependency = coordAction.getPullInputDependencies();
+                CoordInputDependency coordPushInputDependency = coordAction.getPushInputDependencies();
+                Map<String, ActionDependency> dependencyMap = new HashMap<String, ActionDependency>();
+                dependencyMap.putAll(coordPullInputDependency.getMissingDependencies(coordAction));
+                dependencyMap.putAll(coordPushInputDependency.getMissingDependencies(coordAction));
+
+                inputDependenciesListPair.add(
+                        new Pair<CoordinatorActionBean, Map<String, ActionDependency>>(coordAction, dependencyMap));
+            }
+        }
+        catch (Exception e) {
+            throw new CommandException(ErrorCode.E1028, e.getMessage(), e);
+        }
+
+        return inputDependenciesListPair;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/command/coord/CoordCommandUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/command/coord/CoordCommandUtils.java b/core/src/main/java/org/apache/oozie/command/coord/CoordCommandUtils.java
index 63287b9..3a7a930 100644
--- a/core/src/main/java/org/apache/oozie/command/coord/CoordCommandUtils.java
+++ b/core/src/main/java/org/apache/oozie/command/coord/CoordCommandUtils.java
@@ -25,8 +25,6 @@ import java.net.URISyntaxException;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.TimeZone;
-import java.util.Map;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Date;
 import java.util.Calendar;
@@ -58,6 +56,7 @@ import org.apache.oozie.service.URIHandlerService;
 import org.apache.oozie.service.UUIDService;
 import org.apache.oozie.util.DateUtils;
 import org.apache.oozie.util.ELEvaluator;
+import org.apache.oozie.util.Pair;
 import org.apache.oozie.util.ParamChecker;
 import org.apache.oozie.util.XConfiguration;
 import org.apache.oozie.util.XmlUtils;
@@ -737,7 +736,7 @@ public class CoordCommandUtils {
                 .createPullInputDependencies(isInputLogicSpecified);
         CoordInputDependency coordPushInputDependency = CoordInputDependencyFactory
                 .createPushInputDependencies(isInputLogicSpecified);
-        Map<String, String> unresolvedList = new HashMap<String, String>();
+        List<Pair<String, String>> unresolvedList = new ArrayList<Pair<String, String>>();
 
         URIHandlerService uriService = Services.get().get(URIHandlerService.class);
 
@@ -776,11 +775,11 @@ public class CoordCommandUtils {
 
             String tmpUnresolved = event.getChildTextTrim(UNRESOLVED_INSTANCES_TAG, event.getNamespace());
             if (tmpUnresolved != null) {
-                unresolvedList.put(name, tmpUnresolved);
+                unresolvedList.add(new Pair<String,String>(name, tmpUnresolved));
             }
         }
-        for(String unresolvedDatasetName:unresolvedList.keySet()){
-            coordPullInputDependency.addUnResolvedList(unresolvedDatasetName, unresolvedList.get(unresolvedDatasetName));
+        for (Pair<String, String> unresolvedDataset : unresolvedList) {
+            coordPullInputDependency.addUnResolvedList(unresolvedDataset.getFirst(), unresolvedDataset.getSecond());
         }
         actionBean.setPullInputDependencies(coordPullInputDependency);
         actionBean.setPushInputDependencies(coordPushInputDependency);
@@ -946,4 +945,13 @@ public class CoordCommandUtils {
         return pathExists(sPath, actionConf, user);
     }
 
+    public static String getFirstMissingDependency(CoordinatorActionBean coordAction) {
+        CoordInputDependency coordPullInputDependency = coordAction.getPullInputDependencies();
+        CoordInputDependency coordPushInputDependency = coordAction.getPushInputDependencies();
+        String firstMissingDependencies = coordPullInputDependency.getFirstMissingDependency();
+        if (StringUtils.isEmpty(firstMissingDependencies)) {
+            firstMissingDependencies = coordPushInputDependency.getFirstMissingDependency();
+        }
+        return firstMissingDependencies;
+    }
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/command/coord/CoordSLAAlertsXCommand.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/command/coord/CoordSLAAlertsXCommand.java b/core/src/main/java/org/apache/oozie/command/coord/CoordSLAAlertsXCommand.java
index b8affd6..96be7ad 100644
--- a/core/src/main/java/org/apache/oozie/command/coord/CoordSLAAlertsXCommand.java
+++ b/core/src/main/java/org/apache/oozie/command/coord/CoordSLAAlertsXCommand.java
@@ -170,23 +170,10 @@ public abstract class CoordSLAAlertsXCommand extends SLAAlertsXCommand {
      * @throws CommandException the command exception
      */
     private List<String> getActionListForScopeAndDate(String id, String scope, String dates) throws CommandException {
-        List<String> actionIds = new ArrayList<String>();
-
         if (scope == null && dates == null) {
             return null;
         }
-        List<String> parsed = new ArrayList<String>();
-        if (dates != null) {
-            List<CoordinatorActionBean> actionSet = CoordUtils.getCoordActionsFromDates(id, dates, true);
-            for (CoordinatorActionBean action : actionSet) {
-                actionIds.add(action.getId());
-            }
-            parsed.addAll(actionIds);
-        }
-        if (scope != null) {
-            parsed.addAll(CoordUtils.getActionsIds(id, scope));
-        }
-        return parsed;
+        return CoordUtils.getActionListForScopeAndDate(id, scope, dates);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/coord/CoordUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/coord/CoordUtils.java b/core/src/main/java/org/apache/oozie/coord/CoordUtils.java
index 82f9bed..5425d86 100644
--- a/core/src/main/java/org/apache/oozie/coord/CoordUtils.java
+++ b/core/src/main/java/org/apache/oozie/coord/CoordUtils.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.Map;
@@ -100,6 +101,29 @@ public class CoordUtils {
         return coordActions;
     }
 
+    public static List<String> getActionListForScopeAndDate(String id, String scope, String dates) throws CommandException {
+        List<String> actionIds = new ArrayList<String>();
+
+        List<String> parsed = new ArrayList<String>();
+        if (scope == null && dates == null) {
+            parsed.add(id);
+            return parsed;
+        }
+
+        if (dates != null) {
+            List<CoordinatorActionBean> actionSet = CoordUtils.getCoordActionsFromDates(id, dates, true);
+            for (CoordinatorActionBean action : actionSet) {
+                actionIds.add(action.getId());
+            }
+            parsed.addAll(actionIds);
+        }
+        if (scope != null) {
+            parsed.addAll(CoordUtils.getActionsIds(id, scope));
+        }
+        return parsed;
+    }
+
+
     /**
      * Get the list of actions for given date ranges
      *
@@ -115,7 +139,7 @@ public class CoordUtils {
         ParamChecker.notEmpty(jobId, "jobId");
         ParamChecker.notEmpty(scope, "scope");
 
-        Set<CoordinatorActionBean> actionSet = new HashSet<CoordinatorActionBean>();
+        Set<CoordinatorActionBean> actionSet = new LinkedHashSet<CoordinatorActionBean>();
         String[] list = scope.split(",");
         for (String s : list) {
             s = s.trim();
@@ -169,7 +193,7 @@ public class CoordUtils {
         ParamChecker.notEmpty(jobId, "jobId");
         ParamChecker.notEmpty(scope, "scope");
 
-        Set<String> actions = new HashSet<String>();
+        Set<String> actions = new LinkedHashSet<String>();
         String[] list = scope.split(",");
         for (String s : list) {
             s = s.trim();
@@ -360,7 +384,7 @@ public class CoordUtils {
         Map<String, Object> params = new HashMap<String, Object>();
         int pcnt= 1;
         for (Map.Entry<Pair<String, CoordinatorEngine.FILTER_COMPARATORS>, List<Object>> filter : filterMap.entrySet()) {
-            String field = filter.getKey().getFist();
+            String field = filter.getKey().getFirst();
             CoordinatorEngine.FILTER_COMPARATORS comp = filter.getKey().getSecond();
             String sqlField;
             if (field.equals(OozieClient.FILTER_STATUS)) {

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/coord/input/dependency/AbstractCoordInputDependency.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/coord/input/dependency/AbstractCoordInputDependency.java b/core/src/main/java/org/apache/oozie/coord/input/dependency/AbstractCoordInputDependency.java
index 0da60ec..ace120d 100644
--- a/core/src/main/java/org/apache/oozie/coord/input/dependency/AbstractCoordInputDependency.java
+++ b/core/src/main/java/org/apache/oozie/coord/input/dependency/AbstractCoordInputDependency.java
@@ -294,7 +294,6 @@ public abstract class AbstractCoordInputDependency implements Writable, CoordInp
         WritableUtils.writeStringAsBytes(out,INTERNAL_VERSION_ID);
         out.writeBoolean(isDependencyMet);
         WritableUtils.writeMapWithList(out, dependencyMap);
-
     }
 
     @Override
@@ -312,4 +311,18 @@ public abstract class AbstractCoordInputDependency implements Writable, CoordInp
         return getAvailableDependencies(dataSet).size() == getDependencyMap().get(dataSet).size();
     }
 
+    @Override
+    public Map<String, ActionDependency> getMissingDependencies(CoordinatorActionBean coordAction)
+            throws CommandException, IOException, JDOMException {
+        Map<String, ActionDependency> missingDependenciesMap = new HashMap<String, ActionDependency>();
+        for (String key : missingDependenciesSet.keySet()) {
+            missingDependenciesMap.put(key, new ActionDependency(missingDependenciesSet.get(key), new ArrayList<String>()));
+        }
+        return missingDependenciesMap;
+    }
+
+    public String getFirstMissingDependency() {
+        return null;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordInputDependency.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordInputDependency.java b/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordInputDependency.java
index 504bc3d..4a2a0b0 100644
--- a/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordInputDependency.java
+++ b/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordInputDependency.java
@@ -21,6 +21,7 @@ package org.apache.oozie.coord.input.dependency;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.oozie.CoordinatorActionBean;
 import org.apache.oozie.command.CommandException;
@@ -134,6 +135,25 @@ public interface CoordInputDependency {
             boolean registerForNotification) throws CommandException, IOException, JDOMException;
 
     /**
+     * Gets the missing dependencies.
+     *
+     * @param coordAction the coord action
+     * @return the missing dependencies
+     * @throws CommandException the command exception
+     * @throws IOException Signals that an I/O exception has occurred.
+     * @throws JDOMException the JDOM exception
+     */
+    public Map<String, ActionDependency> getMissingDependencies(CoordinatorActionBean coordAction)
+            throws CommandException, IOException, JDOMException;
+
+    /**
+     * Gets the first missing dependency.
+     *
+     * @return the first missing dependency
+     */
+    public String getFirstMissingDependency();
+
+    /**
      * Check pull missing dependencies.
      *
      * @param coordAction the coord action

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordOldInputDependency.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordOldInputDependency.java b/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordOldInputDependency.java
index aabd2bf..b0b6475 100644
--- a/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordOldInputDependency.java
+++ b/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordOldInputDependency.java
@@ -25,7 +25,12 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.conf.Configuration;
@@ -38,9 +43,13 @@ import org.apache.oozie.command.coord.CoordCommandUtils;
 import org.apache.oozie.coord.CoordELConstants;
 import org.apache.oozie.coord.CoordELEvaluator;
 import org.apache.oozie.coord.CoordELFunctions;
+import org.apache.oozie.coord.CoordUtils;
 import org.apache.oozie.dependency.ActionDependency;
 import org.apache.oozie.dependency.DependencyChecker;
+import org.apache.oozie.dependency.URIHandler;
 import org.apache.oozie.dependency.URIHandlerException;
+import org.apache.oozie.service.Services;
+import org.apache.oozie.service.URIHandlerService;
 import org.apache.oozie.util.DateUtils;
 import org.apache.oozie.util.ELEvaluator;
 import org.apache.oozie.util.ParamChecker;
@@ -52,7 +61,6 @@ import org.jdom.JDOMException;
 
 /**
  * Old approach where dependencies are stored as String.
- *
  */
 public class CoordOldInputDependency implements CoordInputDependency {
 
@@ -153,8 +161,8 @@ public class CoordOldInputDependency implements CoordInputDependency {
         if (StringUtils.isEmpty(missingDependencies)) {
             return;
         }
-        List<String> missingDependenciesList = new ArrayList<String>(Arrays.asList((DependencyChecker
-                .dependenciesAsArray(missingDependencies))));
+        List<String> missingDependenciesList = new ArrayList<String>(
+                Arrays.asList((DependencyChecker.dependenciesAsArray(missingDependencies))));
         missingDependenciesList.removeAll(availableList);
         missingDependencies = DependencyChecker.dependenciesAsString(missingDependenciesList);
 
@@ -178,8 +186,8 @@ public class CoordOldInputDependency implements CoordInputDependency {
 
     public ActionDependency checkPushMissingDependencies(CoordinatorActionBean coordAction,
             boolean registerForNotification) throws CommandException, IOException {
-        return DependencyChecker.checkForAvailability(getMissingDependenciesAsList(), new XConfiguration(
-                new StringReader(coordAction.getRunConf())), !registerForNotification);
+        return DependencyChecker.checkForAvailability(getMissingDependenciesAsList(),
+                new XConfiguration(new StringReader(coordAction.getRunConf())), !registerForNotification);
     }
 
     private boolean checkListOfPaths(CoordinatorActionBean coordAction, StringBuilder existList,
@@ -252,13 +260,12 @@ public class CoordOldInputDependency implements CoordInputDependency {
     }
 
     @SuppressWarnings("unchecked")
-    public boolean checkUnresolved(CoordinatorActionBean coordAction, Element eAction)
-            throws Exception {
+    public boolean checkUnresolved(CoordinatorActionBean coordAction, Element eAction) throws Exception {
         Date nominalTime = DateUtils.parseDateOozieTZ(eAction.getAttributeValue("action-nominal-time"));
         String actualTimeStr = eAction.getAttributeValue("action-actual-time");
         Element inputList = eAction.getChild("input-events", eAction.getNamespace());
 
-        if(inputList==null){
+        if (inputList == null) {
             return true;
         }
 
@@ -279,8 +286,8 @@ public class CoordOldInputDependency implements CoordInputDependency {
                     continue;
                 }
                 ELEvaluator eval = CoordELEvaluator.createLazyEvaluator(actualTime, nominalTime, dEvent, actionConf);
-                String unResolvedInstance = dEvent.getChild(CoordCommandUtils.UNRESOLVED_INSTANCES_TAG,
-                        dEvent.getNamespace()).getTextTrim();
+                String unResolvedInstance = dEvent
+                        .getChild(CoordCommandUtils.UNRESOLVED_INSTANCES_TAG, dEvent.getNamespace()).getTextTrim();
                 String unresolvedList[] = unResolvedInstance.split(CoordELFunctions.INSTANCE_SEPARATOR);
                 StringBuffer resolvedTmp = new StringBuffer();
                 for (int i = 0; i < unresolvedList.length; i++) {
@@ -297,8 +304,8 @@ public class CoordOldInputDependency implements CoordInputDependency {
                 }
                 if (resolvedTmp.length() > 0) {
                     if (dEvent.getChild("uris", dEvent.getNamespace()) != null) {
-                        resolvedTmp.append(CoordELFunctions.INSTANCE_SEPARATOR).append(
-                                dEvent.getChild("uris", dEvent.getNamespace()).getTextTrim());
+                        resolvedTmp.append(CoordELFunctions.INSTANCE_SEPARATOR)
+                                .append(dEvent.getChild("uris", dEvent.getNamespace()).getTextTrim());
                         dEvent.removeChild("uris", dEvent.getNamespace());
                     }
                     Element uriInstance = new Element("uris", dEvent.getNamespace());
@@ -312,4 +319,98 @@ public class CoordOldInputDependency implements CoordInputDependency {
         return true;
     }
 
+    public Map<String, ActionDependency> getMissingDependencies(CoordinatorActionBean coordAction)
+            throws CommandException, IOException, JDOMException {
+
+        Map<String, ActionDependency> dependenciesMap = null;
+        try {
+            dependenciesMap = getDependency(coordAction);
+        }
+        catch (URIHandlerException e) {
+            throw new IOException(e);
+        }
+
+        StringBuilder nonExistList = new StringBuilder();
+        StringBuilder nonResolvedList = new StringBuilder();
+        CoordCommandUtils.getResolvedList(getMissingDependencies(), nonExistList, nonResolvedList);
+
+        Set<String> missingSets = new HashSet<String>(
+                Arrays.asList(nonExistList.toString().split(CoordELFunctions.INSTANCE_SEPARATOR)));
+
+        missingSets.addAll(
+                Arrays.asList(nonResolvedList.toString().split(CoordCommandUtils.RESOLVED_UNRESOLVED_SEPARATOR)));
+
+        for (Iterator<Map.Entry<String, ActionDependency>> it = dependenciesMap.entrySet().iterator(); it.hasNext();) {
+            Map.Entry<String, ActionDependency> entry = it.next();
+            ActionDependency dependency = entry.getValue();
+            dependency.getMissingDependencies().retainAll(missingSets);
+            if (dependenciesMap.get(entry.getKey()).getMissingDependencies().isEmpty()) {
+                it.remove();
+            }
+        }
+        return dependenciesMap;
+    }
+
+    @SuppressWarnings("unchecked")
+    private Map<String, ActionDependency> getDependency(CoordinatorActionBean coordAction)
+            throws JDOMException, URIHandlerException {
+        Map<String, ActionDependency> dependenciesMap = new HashMap<String, ActionDependency>();
+        URIHandlerService uriService = Services.get().get(URIHandlerService.class);
+
+        Element eAction = XmlUtils.parseXml(coordAction.getActionXml());
+        Element inputList = eAction.getChild("input-events", eAction.getNamespace());
+        List<Element> eDataEvents = inputList.getChildren("data-in", eAction.getNamespace());
+        for (Element event : eDataEvents) {
+            Element uri = event.getChild("uris", event.getNamespace());
+            ActionDependency dependency = new ActionDependency();
+            if (uri != null) {
+                Element doneFlagElement = event.getChild("dataset", event.getNamespace()).getChild("done-flag",
+                        event.getNamespace());
+                String[] dataSets = uri.getText().split(CoordELFunctions.INSTANCE_SEPARATOR);
+                String doneFlag = CoordUtils.getDoneFlag(doneFlagElement);
+
+                for (String dataSet : dataSets) {
+                    URIHandler uriHandler;
+                    uriHandler = uriService.getURIHandler(dataSet);
+                    dependency.getMissingDependencies().add(uriHandler.getURIWithDoneFlag(dataSet, doneFlag));
+                }
+            }
+            if (event.getChildTextTrim(CoordCommandUtils.UNRESOLVED_INSTANCES_TAG, event.getNamespace()) != null) {
+                dependency.getMissingDependencies()
+                        .addAll(getUnResolvedDependency(coordAction, event).getMissingDependencies());
+            }
+            dependenciesMap.put(event.getAttributeValue("name"), dependency);
+        }
+        return dependenciesMap;
+    }
+
+    private ActionDependency getUnResolvedDependency(CoordinatorActionBean coordAction, Element event)
+            throws JDOMException, URIHandlerException {
+        String tmpUnresolved = event.getChildTextTrim(CoordCommandUtils.UNRESOLVED_INSTANCES_TAG, event.getNamespace());
+        ActionDependency dependency = new ActionDependency();
+        StringBuilder nonResolvedList = new StringBuilder();
+        CoordCommandUtils.getResolvedList(getMissingDependencies(), new StringBuilder(), nonResolvedList);
+        if (nonResolvedList.length() > 0) {
+            dependency.getMissingDependencies().add(tmpUnresolved);
+        }
+        return dependency;
+    }
+
+    @Override
+    public String getFirstMissingDependency() {
+        StringBuilder nonExistList = new StringBuilder();
+        String missingDependencies = getMissingDependencies();
+        StringBuilder nonResolvedList = new StringBuilder();
+        CoordCommandUtils.getResolvedList(missingDependencies, nonExistList, nonResolvedList);
+        String firstMissingDependency = "";
+        if (nonExistList.length() > 0) {
+            firstMissingDependency = nonExistList.toString().split(CoordELFunctions.INSTANCE_SEPARATOR)[0];
+        }
+        else {
+            if (nonResolvedList.length() > 0) {
+                firstMissingDependency = nonResolvedList.toString().split(CoordCommandUtils.RESOLVED_UNRESOLVED_SEPARATOR)[0];
+            }
+        }
+        return firstMissingDependency;
+    }
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordPullInputDependency.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordPullInputDependency.java b/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordPullInputDependency.java
index f20dcae..358f6f9 100644
--- a/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordPullInputDependency.java
+++ b/core/src/main/java/org/apache/oozie/coord/input/dependency/CoordPullInputDependency.java
@@ -30,9 +30,13 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.oozie.CoordinatorActionBean;
+import org.apache.oozie.command.CommandException;
 import org.apache.oozie.command.coord.CoordCommandUtils;
 import org.apache.oozie.coord.CoordELFunctions;
+import org.apache.oozie.dependency.ActionDependency;
 import org.apache.oozie.util.WritableUtils;
+import org.jdom.JDOMException;
 
 public class CoordPullInputDependency extends AbstractCoordInputDependency {
     private Map<String, CoordUnResolvedInputDependency> unResolvedList = new HashMap<String, CoordUnResolvedInputDependency>();
@@ -148,4 +152,19 @@ public class CoordPullInputDependency extends AbstractCoordInputDependency {
             return super.isDataSetResolved(dataSet);
         }
     }
+
+    @Override
+    public Map<String, ActionDependency> getMissingDependencies(CoordinatorActionBean coordAction)
+            throws CommandException, IOException, JDOMException {
+        Map<String, ActionDependency> missingDependenciesMap = new HashMap<String, ActionDependency>();
+        missingDependenciesMap.putAll(super.getMissingDependencies(coordAction));
+
+        for (String key : unResolvedList.keySet()) {
+            if (!unResolvedList.get(key).isResolved()) {
+                missingDependenciesMap.put(key,
+                        new ActionDependency(unResolvedList.get(key).getDependencies(), new ArrayList<String>()));
+            }
+        }
+        return missingDependenciesMap;
+    }
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/dependency/ActionDependency.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/dependency/ActionDependency.java b/core/src/main/java/org/apache/oozie/dependency/ActionDependency.java
index fe7a327..cc99038 100644
--- a/core/src/main/java/org/apache/oozie/dependency/ActionDependency.java
+++ b/core/src/main/java/org/apache/oozie/dependency/ActionDependency.java
@@ -18,6 +18,7 @@
 
 package org.apache.oozie.dependency;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class ActionDependency {
@@ -25,6 +26,10 @@ public class ActionDependency {
     private List<String> missingDependencies;
     private List<String> availableDependencies;
 
+    public ActionDependency() {
+        this(new ArrayList<String>(), new ArrayList<String>());
+    }
+
     public ActionDependency(List<String> missingDependencies, List<String> availableDependencies) {
         this.missingDependencies = missingDependencies;
         this.availableDependencies = availableDependencies;

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/executor/jpa/CoordActionQueryExecutor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/executor/jpa/CoordActionQueryExecutor.java b/core/src/main/java/org/apache/oozie/executor/jpa/CoordActionQueryExecutor.java
index c0e6c19..2c02998 100644
--- a/core/src/main/java/org/apache/oozie/executor/jpa/CoordActionQueryExecutor.java
+++ b/core/src/main/java/org/apache/oozie/executor/jpa/CoordActionQueryExecutor.java
@@ -29,8 +29,10 @@ import javax.persistence.Query;
 import org.apache.oozie.CoordinatorActionBean;
 import org.apache.oozie.ErrorCode;
 import org.apache.oozie.StringBlob;
+import org.apache.oozie.client.CoordinatorAction;
 import org.apache.oozie.service.JPAService;
 import org.apache.oozie.service.Services;
+import org.apache.oozie.util.DateUtils;
 
 /**
  * Query Executor that provides API to run query for Coordinator Action
@@ -60,7 +62,8 @@ public class CoordActionQueryExecutor extends
         GET_ACTIVE_ACTIONS_FOR_DATES,
         GET_COORD_ACTIONS_WAITING_READY_SUBMITTED_OLDER_THAN,
         GET_COORD_ACTIONS_FOR_RECOVERY_OLDER_THAN,
-        GET_COORD_ACTION_FOR_SLA
+        GET_COORD_ACTION_FOR_SLA,
+        GET_COORD_ACTION_FOR_INPUTCHECK
     };
 
     private static CoordActionQueryExecutor instance = new CoordActionQueryExecutor();
@@ -179,6 +182,7 @@ public class CoordActionQueryExecutor extends
             case GET_COORD_ACTION:
             case GET_COORD_ACTION_STATUS:
             case GET_COORD_ACTION_FOR_SLA:
+            case GET_COORD_ACTION_FOR_INPUTCHECK:
                 query.setParameter("id", parameters[0]);
                 break;
             case GET_COORD_ACTIONS_BY_LAST_MODIFIED_TIME:
@@ -341,6 +345,22 @@ public class CoordActionQueryExecutor extends
                 bean.setExternalId((String) arr[3]);
                 bean.setLastModifiedTime((Timestamp) arr[4]);
                 break;
+            case GET_COORD_ACTION_FOR_INPUTCHECK:
+                arr = (Object[]) ret;
+                bean = new CoordinatorActionBean();
+                bean.setId((String) arr[0]);
+                bean.setActionNumber((Integer) arr[1]);
+                bean.setJobId((String) arr[2]);
+                bean.setStatus(CoordinatorAction.Status.valueOf((String) arr[3]));
+                bean.setRunConfBlob((StringBlob) arr[4]);
+                bean.setNominalTime(DateUtils.toDate((Timestamp) arr[5]));
+                bean.setCreatedTime(DateUtils.toDate((Timestamp) arr[6]));
+                bean.setActionXmlBlob((StringBlob) arr[7]);
+                bean.setMissingDependenciesBlob((StringBlob) arr[8]);
+                bean.setPushMissingDependenciesBlob((StringBlob) arr[9]);
+                bean.setTimeOut((Integer) arr[10]);
+                bean.setExternalId((String) arr[11]);
+                break;
 
             default:
                 throw new JPAExecutorException(ErrorCode.E0603, "QueryExecutor cannot construct action bean for "

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/servlet/BaseJobServlet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/servlet/BaseJobServlet.java b/core/src/main/java/org/apache/oozie/servlet/BaseJobServlet.java
index 87a2b42..03acbc1 100644
--- a/core/src/main/java/org/apache/oozie/servlet/BaseJobServlet.java
+++ b/core/src/main/java/org/apache/oozie/servlet/BaseJobServlet.java
@@ -361,7 +361,14 @@ public abstract class BaseJobServlet extends JsonRestServlet {
             json.put(JsonTags.WORKFLOW_ACTION_RETRIES, retries);
             startCron();
             sendJsonResponse(response, HttpServletResponse.SC_OK, json);
-        }        else {
+        }
+        else if (show.equals(RestConstants.COORD_ACTION_MISSING_DEPENDENCIES)) {
+            stopCron();
+            JSONObject json = getCoordActionMissingDependencies(request, response);
+            startCron();
+            sendJsonResponse(response, HttpServletResponse.SC_OK, json);
+        }
+        else {
             throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0303,
                     RestConstants.JOB_SHOW_PARAM, show);
         }
@@ -588,4 +595,16 @@ public abstract class BaseJobServlet extends JsonRestServlet {
      */
     abstract JSONArray getActionRetries(HttpServletRequest request, HttpServletResponse response)
             throws XServletException, IOException;
+
+    /**
+     * Abstract method to get the coord action missing dependencies.
+     *
+     * @param request the request
+     * @param response the response
+     * @return the coord input dependencies
+     * @throws XServletException the x servlet exception
+     * @throws IOException Signals that an I/O exception has occurred.
+     */
+    abstract JSONObject getCoordActionMissingDependencies(HttpServletRequest request, HttpServletResponse response)
+            throws XServletException, IOException;
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/servlet/V0JobServlet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/servlet/V0JobServlet.java b/core/src/main/java/org/apache/oozie/servlet/V0JobServlet.java
index 0c42128..d3b4689 100644
--- a/core/src/main/java/org/apache/oozie/servlet/V0JobServlet.java
+++ b/core/src/main/java/org/apache/oozie/servlet/V0JobServlet.java
@@ -38,6 +38,8 @@ public class V0JobServlet extends BaseJobServlet {
 
     private static final String INSTRUMENTATION_NAME = "v0job";
 
+    final static String NOT_SUPPORTED_MESSAGE = "Not supported in v0";
+
     public V0JobServlet() {
         super(INSTRUMENTATION_NAME);
     }
@@ -226,45 +228,53 @@ public class V0JobServlet extends BaseJobServlet {
     @Override
     protected JSONObject getJobsByParentId(HttpServletRequest request, HttpServletResponse response) throws XServletException,
             IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     protected JSONObject updateJob(HttpServletRequest request, HttpServletResponse response, Configuration conf)
             throws XServletException, IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     protected JSONObject ignoreJob(HttpServletRequest request, HttpServletResponse response) throws XServletException, IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     protected String getJobStatus(HttpServletRequest request, HttpServletResponse response) throws XServletException,
             IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     void slaEnableAlert(HttpServletRequest request, HttpServletResponse response) throws XServletException, IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     void slaDisableAlert(HttpServletRequest request, HttpServletResponse response) throws XServletException,
             IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     void slaChange(HttpServletRequest request, HttpServletResponse response) throws XServletException, IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     JSONArray getActionRetries(HttpServletRequest request, HttpServletResponse response) throws XServletException,
             IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v0");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
+
+    @Override
+    protected JSONObject getCoordActionMissingDependencies(HttpServletRequest request, HttpServletResponse response)
+            throws XServletException, IOException {
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/servlet/V1JobServlet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/servlet/V1JobServlet.java b/core/src/main/java/org/apache/oozie/servlet/V1JobServlet.java
index 95dcca6..9356768 100644
--- a/core/src/main/java/org/apache/oozie/servlet/V1JobServlet.java
+++ b/core/src/main/java/org/apache/oozie/servlet/V1JobServlet.java
@@ -50,6 +50,9 @@ public class V1JobServlet extends BaseJobServlet {
     private static final String INSTRUMENTATION_NAME = "v1job";
     public static final String COORD_ACTIONS_DEFAULT_LENGTH = "oozie.coord.actions.default.length";
 
+    final static String NOT_SUPPORTED_MESSAGE = "Not supported in v1";
+
+
     public V1JobServlet() {
         super(INSTRUMENTATION_NAME);
     }
@@ -181,7 +184,7 @@ public class V1JobServlet extends BaseJobServlet {
     }
     @Override
     protected JSONObject ignoreJob(HttpServletRequest request, HttpServletResponse response) throws XServletException, IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v1");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     /*
@@ -1041,7 +1044,7 @@ public class V1JobServlet extends BaseJobServlet {
     @Override
     protected String getJMSTopicName(HttpServletRequest request, HttpServletResponse response) throws XServletException,
             IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v1");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
@@ -1089,44 +1092,50 @@ public class V1JobServlet extends BaseJobServlet {
     @Override
     protected JSONObject updateJob(HttpServletRequest request, HttpServletResponse response, Configuration conf)
             throws XServletException, IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v1");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     protected String getJobStatus(HttpServletRequest request, HttpServletResponse response) throws XServletException,
             IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v1");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     protected void streamJobErrorLog(HttpServletRequest request, HttpServletResponse response) throws XServletException,
             IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v1");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
     @Override
     protected void streamJobAuditLog(HttpServletRequest request, HttpServletResponse response) throws XServletException,
             IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v1");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
     @Override
     void slaEnableAlert(HttpServletRequest request, HttpServletResponse response) throws XServletException, IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v1");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     void slaDisableAlert(HttpServletRequest request, HttpServletResponse response) throws XServletException,
             IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v1");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     void slaChange(HttpServletRequest request, HttpServletResponse response) throws XServletException, IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v1");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
+    }
+
+    @Override
+    JSONObject getCoordActionMissingDependencies(HttpServletRequest request, HttpServletResponse response)
+            throws XServletException, IOException {
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 
     @Override
     JSONArray getActionRetries(HttpServletRequest request, HttpServletResponse response) throws XServletException,
             IOException {
-        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Not supported in v1");
+        throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, NOT_SUPPORTED_MESSAGE);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/servlet/V2JobServlet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/servlet/V2JobServlet.java b/core/src/main/java/org/apache/oozie/servlet/V2JobServlet.java
index 3a0ffb0..6c30f5d 100644
--- a/core/src/main/java/org/apache/oozie/servlet/V2JobServlet.java
+++ b/core/src/main/java/org/apache/oozie/servlet/V2JobServlet.java
@@ -30,6 +30,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.oozie.BaseEngine;
 import org.apache.oozie.BaseEngineException;
+import org.apache.oozie.BundleEngine;
 import org.apache.oozie.CoordinatorActionBean;
 import org.apache.oozie.CoordinatorActionInfo;
 import org.apache.oozie.CoordinatorEngine;
@@ -42,11 +43,14 @@ import org.apache.oozie.client.rest.JsonBean;
 import org.apache.oozie.client.rest.JsonTags;
 import org.apache.oozie.client.rest.RestConstants;
 import org.apache.oozie.command.CommandException;
+import org.apache.oozie.command.coord.CoordCommandUtils;
 import org.apache.oozie.command.wf.ActionXCommand;
+import org.apache.oozie.dependency.ActionDependency;
 import org.apache.oozie.service.BundleEngineService;
 import org.apache.oozie.service.CoordinatorEngineService;
 import org.apache.oozie.service.DagEngineService;
 import org.apache.oozie.service.Services;
+import org.apache.oozie.util.Pair;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 
@@ -315,6 +319,46 @@ public class V2JobServlet extends V1JobServlet {
         }
     }
 
+    @SuppressWarnings("unchecked")
+    @Override
+    protected JSONObject getCoordActionMissingDependencies(HttpServletRequest request, HttpServletResponse response)
+            throws XServletException, IOException {
+        String jobId = getResourceName(request);
+        String actions = request.getParameter(RestConstants.JOB_COORD_SCOPE_ACTION_LIST);
+        String dates = request.getParameter(RestConstants.JOB_COORD_SCOPE_DATE);
+
+        try {
+            List<Pair<CoordinatorActionBean, Map<String, ActionDependency>>> dependenciesList = Services.get()
+                    .get(CoordinatorEngineService.class).getCoordinatorEngine(getUser(request))
+                    .getCoordActionMissingDependencies(jobId, actions, dates);
+            JSONArray dependenciesArray = new JSONArray();
+            for (Pair<CoordinatorActionBean, Map<String, ActionDependency>> dependencies : dependenciesList) {
+                JSONObject json = new JSONObject();
+                JSONArray parentJsonArray = new JSONArray();
+
+                for (String key : dependencies.getSecond().keySet()) {
+                    JSONObject dependencyList = new JSONObject();
+                    JSONArray jsonArray = new JSONArray();
+                    jsonArray.addAll(dependencies.getSecond().get(key).getMissingDependencies());
+                    dependencyList.put(JsonTags.COORDINATOR_ACTION_MISSING_DEPS, jsonArray);
+                    dependencyList.put(JsonTags.COORDINATOR_ACTION_DATASET, key);
+                    parentJsonArray.add(dependencyList);
+                }
+                json.put(JsonTags.COORD_ACTION_FIRST_MISSING_DEPENDENCIES,
+                        CoordCommandUtils.getFirstMissingDependency(dependencies.getFirst()));
+                json.put(JsonTags.COORDINATOR_ACTION_ID, dependencies.getFirst().getActionNumber());
+                json.put(JsonTags.COORDINATOR_ACTION_DATASETS, parentJsonArray);
+                dependenciesArray.add(json);
+            }
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put(JsonTags.COORD_ACTION_MISSING_DEPENDENCIES, dependenciesArray);
+            return jsonObject;
+        }
+        catch (CommandException e) {
+            throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, e);
+        }
+    }
+
     /**
      * Gets the base engine based on jobId.
      *

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java b/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java
index 3522ffe..347f853 100644
--- a/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java
+++ b/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java
@@ -617,7 +617,7 @@ public class SLACalculatorMemory implements SLACalculator {
         @SuppressWarnings("rawtypes")
         List<UpdateEntry> updateList = new ArrayList<BatchQueryExecutor.UpdateEntry>();
         for (Pair<String, Map<String, String>> jobIdSLAPair : jobIdsSLAPair) {
-            SLACalcStatus slaCalc = getSLACalcStatus(jobIdSLAPair.getFist());
+            SLACalcStatus slaCalc = getSLACalcStatus(jobIdSLAPair.getFirst());
             if (slaCalc != null) {
                 updateParams(slaCalc, jobIdSLAPair.getSecond());
                 updateDBSlaExpectedValues(slaCalc, updateList);

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/main/java/org/apache/oozie/util/Pair.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/util/Pair.java b/core/src/main/java/org/apache/oozie/util/Pair.java
index 1bf45b4..4ece0d3 100644
--- a/core/src/main/java/org/apache/oozie/util/Pair.java
+++ b/core/src/main/java/org/apache/oozie/util/Pair.java
@@ -36,10 +36,10 @@ public class Pair<T, S> {
 
 
     public static <T, S> Pair<T, S> of(T first, S second) {
-        return new Pair(first, second);
+        return new Pair<T,S>(first, second);
     }
 
-    public T getFist() {
+    public T getFirst() {
         return first;
     }
 
@@ -62,7 +62,7 @@ public class Pair<T, S> {
             return false;
         }
 
-        Pair otherPair = (Pair)other;
+        Pair<T, S> otherPair = (Pair<T,S>)other;
         return (ObjectUtils.equals(first, otherPair.first) && ObjectUtils.equals(second, otherPair.second));
     }
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/test/java/org/apache/oozie/TestCoordinatorEngineSimple.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/oozie/TestCoordinatorEngineSimple.java b/core/src/test/java/org/apache/oozie/TestCoordinatorEngineSimple.java
index 4a12e42..c408d47 100644
--- a/core/src/test/java/org/apache/oozie/TestCoordinatorEngineSimple.java
+++ b/core/src/test/java/org/apache/oozie/TestCoordinatorEngineSimple.java
@@ -57,7 +57,7 @@ public class TestCoordinatorEngineSimple extends XTestCase {
         assertEquals(1, map.size());
         Pair<String, FILTER_COMPARATORS> key = map.keySet().iterator().next();
         assertNotNull(key);
-        assertEquals(OozieClient.FILTER_STATUS, key.getFist());
+        assertEquals(OozieClient.FILTER_STATUS, key.getFirst());
         assertEquals(FILTER_COMPARATORS.EQUALS, key.getSecond());
         List<Object> list = map.get(key);
         assertNotNull(list);
@@ -71,7 +71,7 @@ public class TestCoordinatorEngineSimple extends XTestCase {
         assertEquals(1, map.size());
         key = map.keySet().iterator().next();
         assertNotNull(key);
-        assertEquals(OozieClient.FILTER_NOMINAL_TIME, key.getFist());
+        assertEquals(OozieClient.FILTER_NOMINAL_TIME, key.getFirst());
         assertEquals(FILTER_COMPARATORS.GREATER_EQUAL, key.getSecond());
         list = map.get(key);
         assertNotNull(list);

http://git-wip-us.apache.org/repos/asf/oozie/blob/9035d91c/core/src/test/java/org/apache/oozie/client/TestOozieCLI.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/oozie/client/TestOozieCLI.java b/core/src/test/java/org/apache/oozie/client/TestOozieCLI.java
index 8ec38e4..d873b96 100644
--- a/core/src/test/java/org/apache/oozie/client/TestOozieCLI.java
+++ b/core/src/test/java/org/apache/oozie/client/TestOozieCLI.java
@@ -31,6 +31,7 @@ import java.util.concurrent.Callable;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
+import org.apache.oozie.BaseEngine;
 import org.apache.oozie.BuildInfo;
 import org.apache.oozie.cli.CLIParser;
 import org.apache.oozie.cli.OozieCLI;
@@ -1626,6 +1627,21 @@ public class TestOozieCLI extends DagServletTestCase {
 
     }
 
+    public void testCoordActionMissingdependencies() throws Exception {
+        runTest(END_POINTS, SERVLET_CLASSES, false, new Callable<Void>() {
+            @Override
+            public Void call() throws Exception {
+                HeaderTestingVersionServlet.OOZIE_HEADERS.clear();
+                String oozieUrl = getContextURL();
+                String[] args = new String[] { "job", "-missingdeps", "aaa-C", "-oozie", oozieUrl };
+                assertEquals(0, new OozieCLI().run(args));
+                assertEquals(MockCoordinatorEngineService.did, RestConstants.COORD_ACTION_MISSING_DEPENDENCIES);
+                assertFalse(MockCoordinatorEngineService.started.get(1));
+                return null;
+            }
+        });
+    }
+
     private String runOozieCLIAndGetStdout(String[] args) {
         PrintStream original = System.out;
         ByteArrayOutputStream baos = new ByteArrayOutputStream();