Added: incubator/bigtop/trunk/bigtop-packages/src/common/oozie/patch
URL: http://svn.apache.org/viewvc/incubator/bigtop/trunk/bigtop-packages/src/common/oozie/patch?rev=1326670&view=auto
==============================================================================
--- incubator/bigtop/trunk/bigtop-packages/src/common/oozie/patch (added)
+++ incubator/bigtop/trunk/bigtop-packages/src/common/oozie/patch Mon Apr 16 16:10:22 2012
@@ -0,0 +1,20476 @@
+diff --git .gitignore .gitignore
+index 1e2a1f6..84f6d75 100644
+--- .gitignore
++++ .gitignore
+@@ -16,12 +16,11 @@ target
+
+ # Oozie build
+ core/pig*
+-build
+-mem
++core/hive-*
+ core/build
+ core/mem
+ examples/oozietests
+ mkdistro-*.out
+ distro/downloads
+ SecurityAuth.audit
+-
++build
+diff --git client/pom.xml client/pom.xml
+index 9e2d26d..f5bc042 100644
+--- client/pom.xml
++++ client/pom.xml
+@@ -7,25 +7,28 @@
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+-
++
+ http://www.apache.org/licenses/LICENSE-2.0
+-
++
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
++ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.oozie</groupId>
+ <artifactId>oozie-main</artifactId>
+ <version>3.1.3-incubating</version>
+ </parent>
++ <groupId>org.apache.oozie</groupId>
+ <artifactId>oozie-client</artifactId>
+- <description>Oozie Client</description>
+- <name>Oozie Client</name>
++ <version>3.1.3-incubating</version>
++ <description>Apache Oozie Client</description>
++ <name>Apache Oozie Client</name>
+ <packaging>jar</packaging>
+
+ <dependencies>
+@@ -44,6 +47,18 @@
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
++
++ <dependency>
++ <groupId>org.apache.hadoop</groupId>
++ <artifactId>hadoop-auth</artifactId>
++ <scope>compile</scope>
++ <exclusions>
++ <exclusion>
++ <groupId>org.slf4j</groupId>
++ <artifactId>slf4j-api</artifactId>
++ </exclusion>
++ </exclusions>
++ </dependency>
+ </dependencies>
+
+ <build>
+@@ -67,47 +82,47 @@
+ </build>
+
+ <profiles>
+- <profile>
+- <id>generateDocs</id>
+- <activation>
+- <activeByDefault>false</activeByDefault>
+- <property>
+- <name>generateDocs</name>
+- </property>
+- </activation>
+- <build>
+- <plugins>
+- <plugin>
+- <groupId>org.apache.maven.plugins</groupId>
+- <artifactId>maven-javadoc-plugin</artifactId>
+- <configuration>
+- <linksource>true</linksource>
+- <quiet>true</quiet>
+- <verbose>false</verbose>
+- <source>${maven.compile.source}</source>
+- <charset>${maven.compile.encoding}</charset>
+- <groups>
+- <group>
+- <title>Client API</title>
+- <packages>
+- org.apache.oozie.client
+- </packages>
+- </group>
+- </groups>
+- </configuration>
+- <executions>
+- <execution>
+- <goals>
+- <goal>javadoc</goal>
+- </goals>
+- <phase>package</phase>
+- </execution>
+- </executions>
+- </plugin>
+- </plugins>
+- </build>
+- </profile>
++ <profile>
++ <id>generateDocs</id>
++ <activation>
++ <activeByDefault>false</activeByDefault>
++ <property>
++ <name>generateDocs</name>
++ </property>
++ </activation>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-javadoc-plugin</artifactId>
++ <configuration>
++ <linksource>true</linksource>
++ <quiet>true</quiet>
++ <verbose>false</verbose>
++ <source>${maven.compile.source}</source>
++ <charset>${maven.compile.encoding}</charset>
++ <groups>
++ <group>
++ <title>Client API</title>
++ <packages>
++ org.apache.oozie.client
++ </packages>
++ </group>
++ </groups>
++ </configuration>
++ <executions>
++ <execution>
++ <goals>
++ <goal>javadoc</goal>
++ </goals>
++ <phase>package</phase>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++ </profile>
+ </profiles>
+-
++
+ </project>
+
+diff --git client/src/main/bin/oozie client/src/main/bin/oozie
+index 9393f9f..21802a6 100644
+--- client/src/main/bin/oozie
++++ client/src/main/bin/oozie
+@@ -7,9 +7,9 @@
+ # 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.
+@@ -46,7 +46,6 @@ else
+ JAVA_BIN=${JAVA_HOME}/bin/java
+ fi
+
+-JAVA_PROPERTIES=""
+ while [[ ${1} =~ ^\-D ]]; do
+ JAVA_PROPERTIES="${JAVA_PROPERTIES} ${1}"
+ shift
+diff --git client/src/main/java/org/apache/oozie/cli/OozieCLI.java client/src/main/java/org/apache/oozie/cli/OozieCLI.java
+index bd35fdc..77fcdc1 100644
+--- client/src/main/java/org/apache/oozie/cli/OozieCLI.java
++++ client/src/main/java/org/apache/oozie/cli/OozieCLI.java
+@@ -6,9 +6,9 @@
+ * 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.
+@@ -31,6 +31,7 @@ import java.util.Locale;
+ import java.util.Map;
+ import java.util.Properties;
+ import java.util.TimeZone;
++import java.util.concurrent.Callable;
+
+ import javax.xml.XMLConstants;
+ import javax.xml.parsers.DocumentBuilder;
+@@ -48,6 +49,7 @@ import org.apache.commons.cli.OptionGroup;
+ import org.apache.commons.cli.Options;
+ import org.apache.commons.cli.ParseException;
+ import org.apache.oozie.BuildInfo;
++import org.apache.oozie.client.AuthOozieClient;
+ import org.apache.oozie.client.BundleJob;
+ import org.apache.oozie.client.CoordinatorAction;
+ import org.apache.oozie.client.CoordinatorJob;
+@@ -102,6 +104,8 @@ public class OozieCLI {
+ public static final String DEFINITION_OPTION = "definition";
+ public static final String CONFIG_CONTENT_OPTION = "configcontent";
+
++ public static final String DO_AS_OPTION = "doas";
++
+ public static final String LEN_OPTION = "len";
+ public static final String FILTER_OPTION = "filter";
+ public static final String JOBTYPE_OPTION = "jobtype";
+@@ -145,6 +149,9 @@ public class OozieCLI {
+ * @param args options and arguments for the Oozie CLI.
+ */
+ public static void main(String[] args) {
++ if (!System.getProperties().contains(AuthOozieClient.USE_AUTH_TOKEN_CACHE_SYS_PROP)) {
++ System.setProperty(AuthOozieClient.USE_AUTH_TOKEN_CACHE_SYS_PROP, "true");
++ }
+ System.exit(new OozieCLI().run(args));
+ }
+
+@@ -171,8 +178,10 @@ public class OozieCLI {
+ Option status = new Option(STATUS_OPTION, false, "show the current system status");
+ Option version = new Option(VERSION_OPTION, false, "show Oozie server build version");
+ Option queuedump = new Option(QUEUE_DUMP_OPTION, false, "show Oozie server queue elements");
++ Option doAs = new Option(DO_AS_OPTION, true, "doAs user, impersonates as the specified user");
+ Options adminOptions = new Options();
+ adminOptions.addOption(oozie);
++ adminOptions.addOption(doAs);
+ OptionGroup group = new OptionGroup();
+ group.addOption(system_mode);
+ group.addOption(status);
+@@ -218,6 +227,8 @@ public class OozieCLI {
+ Option property = OptionBuilder.withArgName("property=value").hasArgs(2).withValueSeparator().withDescription(
+ "set/override value for given property").create("D");
+
++ Option doAs = new Option(DO_AS_OPTION, true, "doAs user, impersonates as the specified user");
++
+ OptionGroup actions = new OptionGroup();
+ actions.addOption(submit);
+ actions.addOption(start);
+@@ -235,6 +246,7 @@ public class OozieCLI {
+ actions.setRequired(true);
+ Options jobOptions = new Options();
+ jobOptions.addOption(oozie);
++ jobOptions.addOption(doAs);
+ jobOptions.addOption(config);
+ jobOptions.addOption(property);
+ jobOptions.addOption(changeValue);
+@@ -257,13 +269,16 @@ public class OozieCLI {
+ Option jobtype = new Option(JOBTYPE_OPTION, true,
+ "job type ('Supported in Oozie-2.0 or later versions ONLY - 'coordinator' or 'bundle' or 'wf'(default))");
+ Option len = new Option(LEN_OPTION, true, "number of jobs (default '100')");
+- Option filter = new Option(FILTER_OPTION, true, "user=<U>;name=<N>;group=<G>;status=<S>;...");
++ Option filter = new Option(FILTER_OPTION, true, "user=<U>;name=<N>;group=<G>;status=<S>;frequency=<F>;unit=<M> " +
++ "(Valid unit values are 'months', 'days', 'hours' or 'minutes'.)");
+ Option localtime = new Option(LOCAL_TIME_OPTION, false, "use local time (default GMT)");
+ Option verbose = new Option(VERBOSE_OPTION, false, "verbose mode");
++ Option doAs = new Option(DO_AS_OPTION, true, "doAs user, impersonates as the specified user");
+ start.setType(Integer.class);
+ len.setType(Integer.class);
+ Options jobsOptions = new Options();
+ jobsOptions.addOption(oozie);
++ jobsOptions.addOption(doAs);
+ jobsOptions.addOption(localtime);
+ jobsOptions.addOption(start);
+ jobsOptions.addOption(len);
+@@ -293,8 +308,10 @@ public class OozieCLI {
+ Option pigFile = new Option(PIGFILE_OPTION, true, "Pig script");
+ Option property = OptionBuilder.withArgName("property=value").hasArgs(2).withValueSeparator().withDescription(
+ "set/override value for given property").create("D");
++ Option doAs = new Option(DO_AS_OPTION, true, "doAs user, impersonates as the specified user");
+ Options pigOptions = new Options();
+ pigOptions.addOption(oozie);
++ pigOptions.addOption(doAs);
+ pigOptions.addOption(config);
+ pigOptions.addOption(property);
+ pigOptions.addOption(pigFile);
+@@ -317,7 +334,7 @@ public class OozieCLI {
+ }
+ used = true;
+
+- CLIParser parser = new CLIParser(OOZIE_OPTION, getCLIHelp());
++ final CLIParser parser = new CLIParser(OOZIE_OPTION, getCLIHelp());
+ parser.addCommand(HELP_CMD, "", "display usage", new Options(), false);
+ parser.addCommand(VERSION_CMD, "", "show client version", new Options(), false);
+ parser.addCommand(JOB_CMD, "", "job operations", createJobOptions(), false);
+@@ -329,30 +346,21 @@ public class OozieCLI {
+ createPigOptions(), true);
+
+ try {
+- CLIParser.Command command = parser.parse(args);
+- if (command.getName().equals(HELP_CMD)) {
+- parser.showHelp();
+- }
+- else if (command.getName().equals(JOB_CMD)) {
+- jobCommand(command.getCommandLine());
+- }
+- else if (command.getName().equals(JOBS_CMD)) {
+- jobsCommand(command.getCommandLine());
+- }
+- else if (command.getName().equals(ADMIN_CMD)) {
+- adminCommand(command.getCommandLine());
+- }
+- else if (command.getName().equals(VERSION_CMD)) {
+- versionCommand();
+- }
+- else if (command.getName().equals(VALIDATE_CMD)) {
+- validateCommand(command.getCommandLine());
+- }
+- else if (command.getName().equals(SLA_CMD)) {
+- slaCommand(command.getCommandLine());
++ final CLIParser.Command command = parser.parse(args);
++
++ String doAsUser = command.getCommandLine().getOptionValue(DO_AS_OPTION);
++
++ if (doAsUser != null) {
++ OozieClient.doAs(doAsUser, new Callable<Void>() {
++ @Override
++ public Void call() throws Exception {
++ processCommand(parser, command);
++ return null;
++ }
++ });
+ }
+- else if (command.getName().equals(PIG_CMD)) {
+- pigCommand(command.getCommandLine());
++ else {
++ processCommand(parser, command);
+ }
+
+ return 0;
+@@ -374,6 +382,32 @@ public class OozieCLI {
+ }
+ }
+
++ private void processCommand(CLIParser parser, CLIParser.Command command) throws Exception {
++ if (command.getName().equals(HELP_CMD)) {
++ parser.showHelp();
++ }
++ else if (command.getName().equals(JOB_CMD)) {
++ jobCommand(command.getCommandLine());
++ }
++ else if (command.getName().equals(JOBS_CMD)) {
++ jobsCommand(command.getCommandLine());
++ }
++ else if (command.getName().equals(ADMIN_CMD)) {
++ adminCommand(command.getCommandLine());
++ }
++ else if (command.getName().equals(VERSION_CMD)) {
++ versionCommand();
++ }
++ else if (command.getName().equals(VALIDATE_CMD)) {
++ validateCommand(command.getCommandLine());
++ }
++ else if (command.getName().equals(SLA_CMD)) {
++ slaCommand(command.getCommandLine());
++ }
++ else if (command.getName().equals(PIG_CMD)) {
++ pigCommand(command.getCommandLine());
++ }
++ }
+ protected String getOozieUrl(CommandLine commandLine) {
+ String url = commandLine.getOptionValue(OOZIE_OPTION);
+ if (url == null) {
+@@ -449,9 +483,8 @@ public class OozieCLI {
+ }
+ }
+
+- private Properties getConfiguration(CommandLine commandLine) throws IOException {
+- Properties conf = new Properties();
+- conf.setProperty("user.name", System.getProperty("user.name"));
++ private Properties getConfiguration(OozieClient wc, CommandLine commandLine) throws IOException {
++ Properties conf = wc.createConfiguration();
+ String configFile = commandLine.getOptionValue(CONFIG_OPTION);
+ if (configFile == null) {
+ throw new IOException("configuration file not specified");
+@@ -493,7 +526,7 @@ public class OozieCLI {
+ return changeValue;
+ }
+
+- private void addHeader(OozieClient wc) {
++ protected void addHeader(OozieClient wc) {
+ for (Map.Entry entry : System.getProperties().entrySet()) {
+ String key = (String) entry.getKey();
+ if (key.startsWith(WS_HEADER_PREFIX)) {
+@@ -513,10 +546,7 @@ public class OozieCLI {
+ * @throws OozieCLIException thrown if the OozieClient could not be configured.
+ */
+ protected OozieClient createOozieClient(CommandLine commandLine) throws OozieCLIException {
+- OozieClient wc = new OozieClient(getOozieUrl(commandLine));
+- addHeader(wc);
+- setDebugMode(wc);
+- return wc;
++ return createXOozieClient(commandLine);
+ }
+
+ /**
+@@ -529,7 +559,7 @@ public class OozieCLI {
+ * @throws OozieCLIException thrown if the XOozieClient could not be configured.
+ */
+ protected XOozieClient createXOozieClient(CommandLine commandLine) throws OozieCLIException {
+- XOozieClient wc = new XOozieClient(getOozieUrl(commandLine));
++ XOozieClient wc = new AuthOozieClient(getOozieUrl(commandLine));
+ addHeader(wc);
+ setDebugMode(wc);
+ return wc;
+@@ -562,13 +592,13 @@ public class OozieCLI {
+
+ try {
+ if (options.contains(SUBMIT_OPTION)) {
+- System.out.println(JOB_ID_PREFIX + wc.submit(getConfiguration(commandLine)));
++ System.out.println(JOB_ID_PREFIX + wc.submit(getConfiguration(wc, commandLine)));
+ }
+ else if (options.contains(START_OPTION)) {
+ wc.start(commandLine.getOptionValue(START_OPTION));
+ }
+ else if (options.contains(DRYRUN_OPTION)) {
+- String[] dryrunStr = wc.dryrun(getConfiguration(commandLine)).split("action for new instance");
++ String[] dryrunStr = wc.dryrun(getConfiguration(wc, commandLine)).split("action for new instance");
+ int arraysize = dryrunStr.length;
+ System.out.println("***coordJob after parsing: ***");
+ System.out.println(dryrunStr[0]);
+@@ -596,11 +626,11 @@ public class OozieCLI {
+ wc.change(commandLine.getOptionValue(CHANGE_OPTION), getChangeValue(commandLine));
+ }
+ else if (options.contains(RUN_OPTION)) {
+- System.out.println(JOB_ID_PREFIX + wc.run(getConfiguration(commandLine)));
++ System.out.println(JOB_ID_PREFIX + wc.run(getConfiguration(wc, commandLine)));
+ }
+ else if (options.contains(RERUN_OPTION)) {
+ if (commandLine.getOptionValue(RERUN_OPTION).contains("-W")) {
+- wc.reRun(commandLine.getOptionValue(RERUN_OPTION), getConfiguration(commandLine));
++ wc.reRun(commandLine.getOptionValue(RERUN_OPTION), getConfiguration(wc, commandLine));
+ }
+ else if (commandLine.getOptionValue(RERUN_OPTION).contains("-B")) {
+ String bundleJobId = commandLine.getOptionValue(RERUN_OPTION);
+@@ -685,8 +715,8 @@ public class OozieCLI {
+ .contains(LOCAL_TIME_OPTION));
+ }
+ else if (commandLine.getOptionValue(INFO_OPTION).contains("-W@")) {
+- printWorkflowAction(wc.getWorkflowActionInfo(commandLine.getOptionValue(INFO_OPTION)), options
+- .contains(LOCAL_TIME_OPTION));
++ printWorkflowAction(wc.getWorkflowActionInfo(commandLine.getOptionValue(INFO_OPTION)),
++ options.contains(LOCAL_TIME_OPTION), options.contains(VERBOSE_OPTION));
+ }
+ else {
+ String s = commandLine.getOptionValue(OFFSET_OPTION);
+@@ -865,23 +895,28 @@ public class OozieCLI {
+ }
+ }
+
+- private void printWorkflowAction(WorkflowAction action, boolean contains) {
++ private void printWorkflowAction(WorkflowAction action, boolean contains, boolean verbose) {
+ System.out.println("ID : " + maskIfNull(action.getId()));
+
+ System.out.println(RULER);
+
+- System.out.println("Console URL : " + maskIfNull(action.getConsoleUrl()));
+- System.out.println("Error Code : " + maskIfNull(action.getErrorCode()));
+- System.out.println("Error Message : " + maskIfNull(action.getErrorMessage()));
+- System.out.println("External ID : " + maskIfNull(action.getExternalId()));
+- System.out.println("External Status : " + maskIfNull(action.getExternalStatus()));
+- System.out.println("Name : " + maskIfNull(action.getName()));
+- System.out.println("Retries : " + action.getRetries());
+- System.out.println("Tracker URI : " + maskIfNull(action.getTrackerUri()));
+- System.out.println("Type : " + maskIfNull(action.getType()));
+- System.out.println("Started : " + maskDate(action.getStartTime(), contains));
+- System.out.println("Status : " + action.getStatus());
+- System.out.println("Ended : " + maskDate(action.getEndTime(), contains));
++ System.out.println("Console URL : " + maskIfNull(action.getConsoleUrl()));
++ System.out.println("Error Code : " + maskIfNull(action.getErrorCode()));
++ System.out.println("Error Message : " + maskIfNull(action.getErrorMessage()));
++ System.out.println("External ID : " + maskIfNull(action.getExternalId()));
++ System.out.println("External Status : " + maskIfNull(action.getExternalStatus()));
++ System.out.println("Name : " + maskIfNull(action.getName()));
++ System.out.println("Retries : " + action.getRetries());
++ System.out.println("Tracker URI : " + maskIfNull(action.getTrackerUri()));
++ System.out.println("Type : " + maskIfNull(action.getType()));
++ System.out.println("Started : " + maskDate(action.getStartTime(), contains));
++ System.out.println("Status : " + action.getStatus());
++ System.out.println("Ended : " + maskDate(action.getEndTime(), contains));
++
++ if (verbose) {
++ System.out.println("External Stats : " + action.getStats());
++ System.out.println("External ChildIDs : " + action.getExternalChildIDs());
++ }
+
+ System.out.println(RULER);
+ }
+@@ -1220,6 +1255,8 @@ public class OozieCLI {
+ sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
+ "oozie-workflow-0.1.xsd")));
+ sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
++ "shell-action-0.1.xsd")));
++ sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
+ "email-action-0.1.xsd")));
+ sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
+ "distcp-action-0.1.xsd")));
+@@ -1239,6 +1276,12 @@ public class OozieCLI {
+ "oozie-bundle-0.1.xsd")));
+ sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
+ "oozie-sla-0.1.xsd")));
++ sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
++ "hive-action-0.2.xsd")));
++ sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
++ "sqoop-action-0.2.xsd")));
++ sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
++ "ssh-action-0.1.xsd")));
+ SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ Schema schema = factory.newSchema(sources.toArray(new StreamSource[sources.size()]));
+ Validator validator = schema.newValidator();
+@@ -1277,11 +1320,11 @@ public class OozieCLI {
+ throw new OozieCLIException("Need to specify -config <configfile>");
+ }
+
+- Properties conf = getConfiguration(commandLine);
+- String script = commandLine.getOptionValue(PIGFILE_OPTION);
+
+ try {
+ XOozieClient wc = createXOozieClient(commandLine);
++ Properties conf = getConfiguration(wc, commandLine);
++ String script = commandLine.getOptionValue(PIGFILE_OPTION);
+ System.out.println(JOB_ID_PREFIX + wc.submitPig(conf, script, pigArgs.toArray(new String[pigArgs.size()])));
+ }
+ catch (OozieClientException ex) {
+diff --git client/src/main/java/org/apache/oozie/client/AuthOozieClient.java client/src/main/java/org/apache/oozie/client/AuthOozieClient.java
+new file mode 100644
+index 0000000..0853c88
+--- /dev/null
++++ client/src/main/java/org/apache/oozie/client/AuthOozieClient.java
+@@ -0,0 +1,208 @@
++/**
++ * 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.client;
++
++import org.apache.hadoop.security.authentication.client.AuthenticatedURL;
++import org.apache.hadoop.security.authentication.client.AuthenticationException;
++import org.apache.hadoop.security.authentication.client.Authenticator;
++import org.apache.hadoop.security.authentication.client.KerberosAuthenticator;
++
++import java.io.BufferedReader;
++import java.io.File;
++import java.io.FileReader;
++import java.io.FileWriter;
++import java.io.IOException;
++import java.io.Writer;
++import java.net.HttpURLConnection;
++import java.net.URL;
++
++/**
++ * This subclass of {@link XOozieClient} supports Kerberos HTTP SPNEGO and simple authentication.
++ */
++public class AuthOozieClient extends XOozieClient {
++
++ /**
++ * Java system property to specify a custom Authenticator implementation.
++ */
++ public static final String AUTHENTICATOR_CLASS_SYS_PROP = "authenticator.class";
++
++ /**
++ * Java system property that, if set the authentication token will be cached in the user home directory in a hidden
++ * file <code>.oozie-auth-token</code> with user read/write permissions only.
++ */
++ public static final String USE_AUTH_TOKEN_CACHE_SYS_PROP = "oozie.auth.token.cache";
++
++ /**
++ * File constant that defines the location of the authentication token cache file.
++ * <p/>
++ * It resolves to <code>${user.home}/.oozie-auth-token</code>.
++ */
++ public static final File AUTH_TOKEN_CACHE_FILE = new File(System.getProperty("user.home"), ".oozie-auth-token");
++
++ /**
++ * Create an instance of the AuthOozieClient.
++ *
++ * @param oozieUrl the Oozie URL
++ */
++ public AuthOozieClient(String oozieUrl) {
++ super(oozieUrl);
++ }
++
++ /**
++ * Create an authenticated connection to the Oozie server.
++ * <p/>
++ * It uses Hadoop-auth client authentication which by default supports
++ * Kerberos HTTP SPNEGO, Pseudo/Simple and anonymous.
++ * <p/>
++ * if the Java system property {@link #USE_AUTH_TOKEN_CACHE_SYS_PROP} is set to true Hadoop-auth
++ * authentication token will be cached/used in/from the '.oozie-auth-token' file in the user
++ * home directory.
++ *
++ * @param url the URL to open a HTTP connection to.
++ * @param method the HTTP method for the HTTP connection.
++ * @return an authenticated connection to the Oozie server.
++ * @throws IOException if an IO error occurred.
++ * @throws OozieClientException if an oozie client error occurred.
++ */
++ @Override
++ protected HttpURLConnection createConnection(URL url, String method) throws IOException, OozieClientException {
++ boolean useAuthFile = System.getProperty(USE_AUTH_TOKEN_CACHE_SYS_PROP, "false").equalsIgnoreCase("true");
++ AuthenticatedURL.Token readToken = new AuthenticatedURL.Token();
++ AuthenticatedURL.Token currentToken = new AuthenticatedURL.Token();
++
++ if (useAuthFile) {
++ readToken = readAuthToken();
++ if (readToken != null) {
++ currentToken = new AuthenticatedURL.Token(readToken.toString());
++ }
++ }
++
++ if (currentToken.isSet()) {
++ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
++ conn.setRequestMethod("OPTIONS");
++ AuthenticatedURL.injectToken(conn, currentToken);
++ if (conn.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED) {
++ AUTH_TOKEN_CACHE_FILE.delete();
++ currentToken = new AuthenticatedURL.Token();
++ }
++ }
++
++ if (!currentToken.isSet()) {
++ Authenticator authenticator = getAuthenticator();
++ try {
++ new AuthenticatedURL(authenticator).openConnection(url, currentToken);
++ }
++ catch (AuthenticationException ex) {
++ AUTH_TOKEN_CACHE_FILE.delete();
++ throw new OozieClientException(OozieClientException.AUTHENTICATION,
++ "Could not authenticate, " + ex.getMessage(), ex);
++ }
++ }
++ if (useAuthFile && !currentToken.equals(readToken)) {
++ writeAuthToken(currentToken);
++ }
++ HttpURLConnection conn = super.createConnection(url, method);
++
++ AuthenticatedURL.injectToken(conn, currentToken);
++ return conn;
++ }
++
++
++ /**
++ * Read a authentication token cached in the user home directory.
++ * <p/>
++ *
++ * @return the authentication token cached in the user home directory, NULL if none.
++ */
++ protected AuthenticatedURL.Token readAuthToken() {
++ AuthenticatedURL.Token authToken = null;
++ if (AUTH_TOKEN_CACHE_FILE.exists()) {
++ try {
++ BufferedReader reader = new BufferedReader(new FileReader(AUTH_TOKEN_CACHE_FILE));
++ String line = reader.readLine();
++ reader.close();
++ if (line != null) {
++ authToken = new AuthenticatedURL.Token(line);
++ }
++ }
++ catch (IOException ex) {
++ //NOP
++ }
++ }
++ return authToken;
++ }
++
++ /**
++ * Write the current authenthication token to the user home directory.
++ * <p/>
++ * The file is written with user only read/write permissions.
++ * <p/>
++ * If the file cannot be updated or the user only ready/write permissions cannot be set the file is deleted.
++ *
++ * @param authToken the authentication token to cache.
++ */
++ protected void writeAuthToken(AuthenticatedURL.Token authToken) {
++ try {
++ Writer writer = new FileWriter(AUTH_TOKEN_CACHE_FILE);
++ writer.write(authToken.toString());
++ writer.close();
++ // sets read-write permissions to owner only
++ AUTH_TOKEN_CACHE_FILE.setReadable(false, false);
++ AUTH_TOKEN_CACHE_FILE.setReadable(true, true);
++ AUTH_TOKEN_CACHE_FILE.setWritable(true, true);
++ }
++ catch (Exception ex) {
++ // if case of any error we just delete the cache, if user-only
++ // write permissions are not properly set a security exception
++ // is thrown and the file will be deleted.
++ AUTH_TOKEN_CACHE_FILE.delete();
++ }
++ }
++
++ /**
++ * Return the Hadoop-auth Authenticator to use.
++ * <p/>
++ * It looks for value of the {@link #AUTHENTICATOR_CLASS_SYS_PROP} Java system property, if not set it uses
++ * Hadoop-auth <code>KerberosAuthenticator</code> which supports both Kerberos HTTP SPNEGO and Pseudo/simple
++ * authentication.
++ *
++ * @return the Authenticator to use, <code>NULL</code> if none.
++ *
++ * @throws OozieClientException thrown if the authenticator could not be instatiated.
++ */
++ protected Authenticator getAuthenticator() throws OozieClientException {
++ String className = System.getProperty(AUTHENTICATOR_CLASS_SYS_PROP, KerberosAuthenticator.class.getName());
++ if (className != null) {
++ try {
++ ClassLoader cl = Thread.currentThread().getContextClassLoader();
++ Class klass = (cl != null) ? cl.loadClass(className) : getClass().getClassLoader().loadClass(className);
++ return (Authenticator) klass.newInstance();
++ }
++ catch (Exception ex) {
++ throw new OozieClientException(OozieClientException.AUTHENTICATION,
++ "Could not instantiate Authenticator [" + className + "], " +
++ ex.getMessage(), ex);
++ }
++ }
++ else {
++ throw new OozieClientException(OozieClientException.AUTHENTICATION,
++ "Authenticator class not found [" + className + "]");
++ }
++ }
++
++}
+diff --git client/src/main/java/org/apache/oozie/client/OozieClient.java client/src/main/java/org/apache/oozie/client/OozieClient.java
+index dd3b962..1272f75 100644
+--- client/src/main/java/org/apache/oozie/client/OozieClient.java
++++ client/src/main/java/org/apache/oozie/client/OozieClient.java
+@@ -32,6 +32,7 @@ import java.util.Collections;
+ import java.util.Enumeration;
+ import java.util.HashMap;
+ import java.util.Iterator;
++import java.util.LinkedHashMap;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Properties;
+@@ -120,6 +121,8 @@ public class OozieClient {
+ public static final String FILTER_FREQUENCY = "frequency";
+
+ public static final String FILTER_ID = "id";
++
++ public static final String FILTER_UNIT = "unit";
+
+ public static final String CHANGE_VALUE_ENDTIME = "endtime";
+
+@@ -145,6 +148,32 @@ public class OozieClient {
+ private boolean validatedVersion = false;
+ private final Map<String, String> headers = new HashMap<String, String>();
+
++ private static ThreadLocal<String> USER_NAME_TL = new ThreadLocal<String>();
++
++ /**
++ * Allows to impersonate other users in the Oozie server. The current user
++ * must be configured as a proxyuser in Oozie.
++ * <p/>
++ * IMPORTANT: impersonation happens only with Oozie client requests done within
++ * doAs() calls.
++ *
++ * @param userName user to impersonate.
++ * @param callable callable with {@link OozieClient} calls impersonating the specified user.
++ * @return any response returned by the {@link Callable#call()} method.
++ * @throws Exception thrown by the {@link Callable#call()} method.
++ */
++ public static <T> T doAs(String userName, Callable<T> callable) throws Exception {
++ notEmpty(userName, "userName");
++ notNull(callable, "callable");
++ try {
++ USER_NAME_TL.set(userName);
++ return callable.call();
++ }
++ finally {
++ USER_NAME_TL.remove();
++ }
++ }
++
+ protected OozieClient() {
+ }
+
+@@ -253,7 +282,11 @@ public class OozieClient {
+ */
+ public Properties createConfiguration() {
+ Properties conf = new Properties();
+- conf.setProperty(USER_NAME, System.getProperty("user.name"));
++ String userName = USER_NAME_TL.get();
++ if (userName == null) {
++ userName = System.getProperty("user.name");
++ }
++ conf.setProperty(USER_NAME, userName);
+ return conf;
+ }
+
+@@ -411,10 +444,14 @@ public class OozieClient {
+ }
+
+ static Map<String, String> prepareParams(String... params) {
+- Map<String, String> map = new HashMap<String, String>();
++ Map<String, String> map = new LinkedHashMap<String, String>();
+ for (int i = 0; i < params.length; i = i + 2) {
+ map.put(params[i], params[i + 1]);
+ }
++ String doAsUserName = USER_NAME_TL.get();
++ if (doAsUserName != null) {
++ map.put(RestConstants.DO_AS_PARAM, doAsUserName);
++ }
+ return map;
+ }
+
+diff --git client/src/main/java/org/apache/oozie/client/WorkflowAction.java client/src/main/java/org/apache/oozie/client/WorkflowAction.java
+index 4fab81f..ed84063 100644
+--- client/src/main/java/org/apache/oozie/client/WorkflowAction.java
++++ client/src/main/java/org/apache/oozie/client/WorkflowAction.java
+@@ -141,6 +141,20 @@ public interface WorkflowAction {
+ String getData();
+
+ /**
++ * Return the action statistics.
++ *
++ * @return the action statistics.
++ */
++ String getStats();
++
++ /**
++ * Return the external child IDs of the action.
++ *
++ * @return the external child IDs of the action.
++ */
++ String getExternalChildIDs();
++
++ /**
+ * Return the external ID of the action.
+ *
+ * @return the external ID of the action.
+diff --git client/src/main/java/org/apache/oozie/client/rest/JsonTags.java client/src/main/java/org/apache/oozie/client/rest/JsonTags.java
+index 249d1f1..b8ae77f 100644
+--- client/src/main/java/org/apache/oozie/client/rest/JsonTags.java
++++ client/src/main/java/org/apache/oozie/client/rest/JsonTags.java
+@@ -65,6 +65,8 @@ public interface JsonTags {
+ public static final String WORKFLOW_ACTION_STATUS = "status";
+ public static final String WORKFLOW_ACTION_TRANSITION = "transition";
+ public static final String WORKFLOW_ACTION_DATA = "data";
++ public static final String WORKFLOW_ACTION_STATS = "stats";
++ public static final String WORKFLOW_ACTION_EXTERNAL_CHILD_IDS = "externalChildIDs";
+ public static final String WORKFLOW_ACTION_EXTERNAL_ID = "externalId";
+ public static final String WORKFLOW_ACTION_EXTERNAL_STATUS = "externalStatus";
+ public static final String WORKFLOW_ACTION_TRACKER_URI = "trackerUri";
+diff --git client/src/main/java/org/apache/oozie/client/rest/JsonToBean.java client/src/main/java/org/apache/oozie/client/rest/JsonToBean.java
+index 5c688a7..1454a72 100644
+--- client/src/main/java/org/apache/oozie/client/rest/JsonToBean.java
++++ client/src/main/java/org/apache/oozie/client/rest/JsonToBean.java
+@@ -75,6 +75,8 @@ public class JsonToBean {
+ WF_ACTION.put("getEndTime", new Property(JsonTags.WORKFLOW_ACTION_END_TIME, Date.class));
+ WF_ACTION.put("getTransition", new Property(JsonTags.WORKFLOW_ACTION_TRANSITION, String.class));
+ WF_ACTION.put("getData", new Property(JsonTags.WORKFLOW_ACTION_DATA, String.class));
++ WF_ACTION.put("getStats", new Property(JsonTags.WORKFLOW_ACTION_STATS, String.class));
++ WF_ACTION.put("getExternalChildIDs", new Property(JsonTags.WORKFLOW_ACTION_EXTERNAL_CHILD_IDS, String.class));
+ WF_ACTION.put("getExternalId", new Property(JsonTags.WORKFLOW_ACTION_EXTERNAL_ID, String.class));
+ WF_ACTION.put("getExternalStatus", new Property(JsonTags.WORKFLOW_ACTION_EXTERNAL_STATUS, String.class));
+ WF_ACTION.put("getTrackerUri", new Property(JsonTags.WORKFLOW_ACTION_TRACKER_URI, String.class));
+diff --git client/src/main/java/org/apache/oozie/client/rest/RestConstants.java client/src/main/java/org/apache/oozie/client/rest/RestConstants.java
+index c899258..305eb6f 100644
+--- client/src/main/java/org/apache/oozie/client/rest/RestConstants.java
++++ client/src/main/java/org/apache/oozie/client/rest/RestConstants.java
+@@ -134,4 +134,6 @@ public interface RestConstants {
+ public static final String MAX_EVENTS = "max-events";
+
+ public static final String SLA = "sla";
++
++ public static final String DO_AS_PARAM = "doAs";
+ }
+diff --git client/src/main/resources/hive-action-0.2.xsd client/src/main/resources/hive-action-0.2.xsd
+new file mode 100644
+index 0000000..884bd5f
+--- /dev/null
++++ client/src/main/resources/hive-action-0.2.xsd
+@@ -0,0 +1,68 @@
++<?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.
++-->
++<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
++ xmlns:hive="uri:oozie:hive-action:0.2" elementFormDefault="qualified"
++ targetNamespace="uri:oozie:hive-action:0.2">
++
++ <xs:element name="hive" type="hive:ACTION"/>
++
++ <xs:complexType name="ACTION">
++ <xs:sequence>
++ <xs:element name="job-tracker" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="name-node" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="prepare" type="hive:PREPARE" minOccurs="0" maxOccurs="1"/>
++ <xs:element name="job-xml" type="xs:string" minOccurs="0" maxOccurs="1"/>
++ <xs:element name="configuration" type="hive:CONFIGURATION" minOccurs="0" maxOccurs="1"/>
++ <xs:element name="script" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="param" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="file" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="archive" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++ </xs:sequence>
++ </xs:complexType>
++
++ <xs:complexType name="CONFIGURATION">
++ <xs:sequence>
++ <xs:element name="property" minOccurs="1" maxOccurs="unbounded">
++ <xs:complexType>
++ <xs:sequence>
++ <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string"/>
++ <xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:string"/>
++ <xs:element name="description" minOccurs="0" maxOccurs="1" type="xs:string"/>
++ </xs:sequence>
++ </xs:complexType>
++ </xs:element>
++ </xs:sequence>
++ </xs:complexType>
++
++ <xs:complexType name="PREPARE">
++ <xs:sequence>
++ <xs:element name="delete" type="hive:DELETE" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="mkdir" type="hive:MKDIR" minOccurs="0" maxOccurs="unbounded"/>
++ </xs:sequence>
++ </xs:complexType>
++
++ <xs:complexType name="DELETE">
++ <xs:attribute name="path" type="xs:string" use="required"/>
++ </xs:complexType>
++
++ <xs:complexType name="MKDIR">
++ <xs:attribute name="path" type="xs:string" use="required"/>
++ </xs:complexType>
++
++</xs:schema>
+diff --git client/src/main/resources/shell-action-0.1.xsd client/src/main/resources/shell-action-0.1.xsd
+new file mode 100644
+index 0000000..4794c0d
+--- /dev/null
++++ client/src/main/resources/shell-action-0.1.xsd
+@@ -0,0 +1,73 @@
++<?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.
++-->
++
++<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
++ xmlns:shell="uri:oozie:shell-action:0.1" elementFormDefault="qualified"
++ targetNamespace="uri:oozie:shell-action:0.1">
++
++ <xs:element name="shell" type="shell:ACTION"/>
++
++ <xs:complexType name="ACTION">
++ <xs:sequence>
++ <xs:element name="job-tracker" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="name-node" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="prepare" type="shell:PREPARE" minOccurs="0" maxOccurs="1"/>
++ <xs:element name="job-xml" type="xs:string" minOccurs="0" maxOccurs="1"/>
++ <xs:element name="configuration" type="shell:CONFIGURATION" minOccurs="0" maxOccurs="1"/>
++ <xs:element name="exec" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="argument" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="env-var" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="file" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="archive" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="capture-output" type="shell:FLAG" minOccurs="0" maxOccurs="1"/>
++ </xs:sequence>
++ </xs:complexType>
++
++ <xs:complexType name="FLAG"/>
++
++ <xs:complexType name="CONFIGURATION">
++ <xs:sequence>
++ <xs:element name="property" minOccurs="1" maxOccurs="unbounded">
++ <xs:complexType>
++ <xs:sequence>
++ <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string"/>
++ <xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:string"/>
++ <xs:element name="description" minOccurs="0" maxOccurs="1" type="xs:string"/>
++ </xs:sequence>
++ </xs:complexType>
++ </xs:element>
++ </xs:sequence>
++ </xs:complexType>
++
++ <xs:complexType name="PREPARE">
++ <xs:sequence>
++ <xs:element name="delete" type="shell:DELETE" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="mkdir" type="shell:MKDIR" minOccurs="0" maxOccurs="unbounded"/>
++ </xs:sequence>
++ </xs:complexType>
++
++ <xs:complexType name="DELETE">
++ <xs:attribute name="path" type="xs:string" use="required"/>
++ </xs:complexType>
++
++ <xs:complexType name="MKDIR">
++ <xs:attribute name="path" type="xs:string" use="required"/>
++ </xs:complexType>
++
++</xs:schema>
+diff --git client/src/main/resources/sqoop-action-0.2.xsd client/src/main/resources/sqoop-action-0.2.xsd
+new file mode 100644
+index 0000000..8e2ebd3
+--- /dev/null
++++ client/src/main/resources/sqoop-action-0.2.xsd
+@@ -0,0 +1,70 @@
++<?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.
++-->
++<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
++ xmlns:sqoop="uri:oozie:sqoop-action:0.2" elementFormDefault="qualified"
++ targetNamespace="uri:oozie:sqoop-action:0.2">
++
++ <xs:element name="sqoop" type="sqoop:ACTION"/>
++
++ <xs:complexType name="ACTION">
++ <xs:sequence>
++ <xs:element name="job-tracker" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="name-node" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="prepare" type="sqoop:PREPARE" minOccurs="0" maxOccurs="1"/>
++ <xs:element name="job-xml" type="xs:string" minOccurs="0" maxOccurs="1"/>
++ <xs:element name="configuration" type="sqoop:CONFIGURATION" minOccurs="0" maxOccurs="1"/>
++ <xs:choice>
++ <xs:element name="command" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="arg" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
++ </xs:choice>
++ <xs:element name="file" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="archive" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++ </xs:sequence>
++ </xs:complexType>
++
++ <xs:complexType name="CONFIGURATION">
++ <xs:sequence>
++ <xs:element name="property" minOccurs="1" maxOccurs="unbounded">
++ <xs:complexType>
++ <xs:sequence>
++ <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string"/>
++ <xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:string"/>
++ <xs:element name="description" minOccurs="0" maxOccurs="1" type="xs:string"/>
++ </xs:sequence>
++ </xs:complexType>
++ </xs:element>
++ </xs:sequence>
++ </xs:complexType>
++
++ <xs:complexType name="PREPARE">
++ <xs:sequence>
++ <xs:element name="delete" type="sqoop:DELETE" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="mkdir" type="sqoop:MKDIR" minOccurs="0" maxOccurs="unbounded"/>
++ </xs:sequence>
++ </xs:complexType>
++
++ <xs:complexType name="DELETE">
++ <xs:attribute name="path" type="xs:string" use="required"/>
++ </xs:complexType>
++
++ <xs:complexType name="MKDIR">
++ <xs:attribute name="path" type="xs:string" use="required"/>
++ </xs:complexType>
++
++</xs:schema>
+diff --git client/src/main/resources/ssh-action-0.1.xsd client/src/main/resources/ssh-action-0.1.xsd
+new file mode 100644
+index 0000000..e8a6f9e
+--- /dev/null
++++ client/src/main/resources/ssh-action-0.1.xsd
+@@ -0,0 +1,36 @@
++<?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.
++-->
++<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
++ xmlns:ssh="uri:oozie:ssh-action:0.1" elementFormDefault="qualified"
++ targetNamespace="uri:oozie:ssh-action:0.1">
++
++ <xs:element name="ssh" type="ssh:ACTION"/>
++
++ <xs:complexType name="ACTION">
++ <xs:sequence>
++ <xs:element name="host" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="command" type="xs:string" minOccurs="1" maxOccurs="1"/>
++ <xs:element name="args" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++ <xs:element name="capture-output" type="ssh:FLAG" minOccurs="0" maxOccurs="1"/>
++ </xs:sequence>
++ </xs:complexType>
++
++ <xs:complexType name="FLAG"/>
++
++</xs:schema>
+diff --git core/pom.xml core/pom.xml
+index 106893d..a56227d 100644
+--- core/pom.xml
++++ core/pom.xml
+@@ -16,22 +16,37 @@
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
++ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.oozie</groupId>
+ <artifactId>oozie-main</artifactId>
+ <version>3.1.3-incubating</version>
+ </parent>
++ <groupId>org.apache.oozie</groupId>
+ <artifactId>oozie-core</artifactId>
+- <description>Oozie Core</description>
+- <name>Oozie Core</name>
++ <version>3.1.3-incubating</version>
++ <description>Apache Oozie Core</description>
++ <name>Apache Oozie Core</name>
+ <packaging>jar</packaging>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.oozie</groupId>
++ <artifactId>oozie-hadoop-test</artifactId>
++ <scope>test</scope>
++ </dependency>
++
++ <dependency>
++ <groupId>org.apache.oozie</groupId>
++ <artifactId>oozie-hadoop</artifactId>
++ <scope>provided</scope>
++ </dependency>
++
++ <dependency>
++ <groupId>org.apache.oozie</groupId>
+ <artifactId>oozie-client</artifactId>
+ <scope>compile</scope>
+ </dependency>
+@@ -57,7 +72,18 @@
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+- <scope>compile</scope>
++ <scope>provided</scope>
++ <exclusions>
++ <exclusion>
++ <groupId>commons-lang</groupId>
++ <artifactId>commons-lang</artifactId>
++ </exclusion>
++ </exclusions>
++ </dependency>
++
++ <dependency>
++ <groupId>commons-lang</groupId>
++ <artifactId>commons-lang</artifactId>
+ </dependency>
+
+ <dependency>
+@@ -73,34 +99,6 @@
+ </dependency>
+
+ <dependency>
+- <groupId>org.apache.hadoop</groupId>
+- <artifactId>hadoop-core</artifactId>
+- <scope>provided</scope>
+- </dependency>
+- <dependency>
+- <groupId>org.apache.hadoop</groupId>
+- <artifactId>hadoop-test</artifactId>
+- <scope>test</scope>
+- </dependency>
+- <dependency>
+- <groupId>com.sun.jersey</groupId>
+- <artifactId>jersey-server</artifactId>
+- <scope>test</scope>
+- </dependency>
+-
+- <dependency>
+- <groupId>org.apache.oozie</groupId>
+- <artifactId>oozie-sharelib</artifactId>
+- <scope>provided</scope>
+- </dependency>
+-
+- <dependency>
+- <groupId>org.slf4j</groupId>
+- <artifactId>slf4j-log4j12</artifactId>
+- <scope>test</scope>
+- </dependency>
+-
+- <dependency>
+ <groupId>com.googlecode.json-simple</groupId>
+ <artifactId>json-simple</artifactId>
+ <scope>compile</scope>
+@@ -143,24 +141,6 @@
+ <scope>compile</scope>
+ </dependency>
+
+- <dependency>
+- <groupId>org.python</groupId>
+- <artifactId>jython</artifactId>
+- <scope>test</scope>
+- </dependency>
+-
+- <dependency>
+- <groupId>org.antlr</groupId>
+- <artifactId>antlr-runtime</artifactId>
+- <scope>test</scope>
+- </dependency>
+-
+- <dependency>
+- <groupId>com.google.guava</groupId>
+- <artifactId>guava</artifactId>
+- <scope>test</scope>
+- </dependency>
+-
+ <!--
+ Oozie web-app module must exclude it.
+ -->
+@@ -190,6 +170,11 @@
+ <dependency>
+ <groupId>javax.mail</groupId>
+ <artifactId>mail</artifactId>
++ </dependency>
++
++ <dependency>
++ <groupId>org.apache.hadoop</groupId>
++ <artifactId>hadoop-auth</artifactId>
+ <scope>compile</scope>
+ </dependency>
+
+@@ -205,6 +190,54 @@
+ <scope>compile</scope>
+ </dependency>
+
++ <dependency>
++ <groupId>org.slf4j</groupId>
++ <artifactId>slf4j-api</artifactId>
++ <scope>compile</scope>
++ </dependency>
++
++ <dependency>
++ <groupId>org.slf4j</groupId>
++ <artifactId>slf4j-log4j12</artifactId>
++ <scope>compile</scope>
++ </dependency>
++
++ <dependency>
++ <groupId>org.apache.oozie</groupId>
++ <artifactId>oozie-sharelib-pig</artifactId>
++ <scope>provided</scope>
++ </dependency>
++
++ <dependency>
++ <groupId>org.apache.oozie</groupId>
++ <artifactId>oozie-sharelib-streaming</artifactId>
++ <scope>provided</scope>
++ </dependency>
++
++ <dependency>
++ <groupId>org.apache.oozie</groupId>
++ <artifactId>oozie-sharelib-hive</artifactId>
++ <scope>provided</scope>
++ </dependency>
++
++ <dependency>
++ <groupId>org.apache.oozie</groupId>
++ <artifactId>oozie-sharelib-sqoop</artifactId>
++ <scope>provided</scope>
++ </dependency>
++
++ <dependency>
++ <groupId>org.apache.oozie</groupId>
++ <artifactId>oozie-sharelib-oozie</artifactId>
++ <scope>provided</scope>
++ </dependency>
++
++ <dependency>
++ <groupId>org.mockito</groupId>
++ <artifactId>mockito-all</artifactId>
++ <scope>test</scope>
++ </dependency>
++
+ </dependencies>
+
+ <build>
+@@ -234,6 +267,23 @@
+ </configuration>
+ </plugin>
+ <plugin>
++ <artifactId>maven-dependency-plugin</artifactId>
++ <executions>
++ <execution>
++ <id>create-mrapp-generated-classpath</id>
++ <phase>generate-test-resources</phase>
++ <goals>
++ <goal>build-classpath</goal>
++ </goals>
++ <configuration>
++ <!-- needed to run the unit test for DS to generate the required classpath
++ that is required in the env of the launch container in the mini mr/yarn cluster -->
++ <outputFile>${project.build.directory}/test-classes/mrapp-generated-classpath</outputFile>
++ </configuration>
++ </execution>
++ </executions>
++ </plugin>
++ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+@@ -242,32 +292,32 @@
+ <configuration>
+ <target>
+ <path id="cp">
+- <path refid="maven.test.classpath" />
+- <path refid="maven.compile.classpath" />
+- <path refid="maven.dependency.classpath" />
++ <path refid="maven.test.classpath"/>
++ <path refid="maven.compile.classpath"/>
++ <path refid="maven.dependency.classpath"/>
+ </path>
+ <taskdef name="openjpac" classname="org.apache.openjpa.ant.PCEnhancerTask">
+- <classpath refid="cp" />
++ <classpath refid="cp"/>
+ </taskdef>
+ <fileset id="enhance.path.ref" dir="../core/target/classes">
+- <include name="**/JsonWorkflowJob.class" />
+- <include name="**/JsonWorkflowAction.class" />
+- <include name="**/JsonCoordinatorJob.class" />
+- <include name="**/JsonCoordinatorAction.class" />
+- <include name="**/JsonSLAEvent.class" />
++ <include name="**/JsonWorkflowJob.class"/>
++ <include name="**/JsonWorkflowAction.class"/>
++ <include name="**/JsonCoordinatorJob.class"/>
++ <include name="**/JsonCoordinatorAction.class"/>
++ <include name="**/JsonSLAEvent.class"/>
+ <include name="**/JsonBundleJob.class"/>
+
+- <include name="**/WorkflowJobBean.class" />
+- <include name="**/WorkflowActionBean.class" />
+- <include name="**/CoordinatorJobBean.class" />
+- <include name="**/CoordinatorActionBean.class" />
+- <include name="**/SLAEventBean.class" />
++ <include name="**/WorkflowJobBean.class"/>
++ <include name="**/WorkflowActionBean.class"/>
++ <include name="**/CoordinatorJobBean.class"/>
++ <include name="**/CoordinatorActionBean.class"/>
++ <include name="**/SLAEventBean.class"/>
+ <include name="**/BundleJobBean.class"/>
+ <include name="**/BundleActionBean.class"/>
+ </fileset>
+ <openjpac>
+- <classpath refid="cp" />
+- <fileset refid="enhance.path.ref" />
++ <classpath refid="cp"/>
++ <fileset refid="enhance.path.ref"/>
+ </openjpac>
+ </target>
+ </configuration>
+@@ -278,17 +328,17 @@
+ </executions>
+ </plugin>
+ <plugin>
+- <groupId>org.apache.rat</groupId>
+- <artifactId>apache-rat-plugin</artifactId>
+- <configuration>
+- <excludes>
+- <exclude>src/test/resources/PigMain.txt</exclude>
+- <exclude>src/test/resources/test-ioutils.txt</exclude>
+- <exclude>.gitignore</exclude>
+- <exclude>./SecurityAuth.audit</exclude>
+- </excludes>
+- </configuration>
+- </plugin>
++ <groupId>org.apache.rat</groupId>
++ <artifactId>apache-rat-plugin</artifactId>
++ <configuration>
++ <excludes>
++ <exclude>src/test/resources/PigMain.txt</exclude>
++ <exclude>src/test/resources/test-ioutils.txt</exclude>
++ <exclude>.gitignore</exclude>
++ <exclude>./SecurityAuth.audit</exclude>
++ </excludes>
++ </configuration>
++ </plugin>
+ </plugins>
+ </build>
+
+@@ -307,26 +357,26 @@
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+- <linksource>true</linksource>
+- <quiet>true</quiet>
+- <verbose>false</verbose>
+- <source>${maven.compile.source}</source>
+- <charset>${maven.compile.encoding}</charset>
+- <groups>
+- <group>
+- <title>Action Executor API</title>
+- <packages>
+- org.apache.oozie.action
+- </packages>
+- </group>
+- <group>
+- <title>Local Oozie (for application development/testing)</title>
+- <packages>
+- org.apache.oozie.local
+- </packages>
+- </group>
+- </groups>
+- </configuration>
++ <linksource>true</linksource>
++ <quiet>true</quiet>
++ <verbose>false</verbose>
++ <source>${maven.compile.source}</source>
++ <charset>${maven.compile.encoding}</charset>
++ <groups>
++ <group>
++ <title>Action Executor API</title>
++ <packages>
++ org.apache.oozie.action
++ </packages>
++ </group>
++ <group>
++ <title>Local Oozie (for application development/testing)</title>
++ <packages>
++ org.apache.oozie.local
++ </packages>
++ </group>
++ </groups>
++ </configuration>
+ <executions>
+ <execution>
+ <goals>
+@@ -341,22 +391,25 @@
+ </profile>
+
+ <profile>
+- <id>hadoop20</id>
++ <id>oozieci</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ <property>
+- <name>hadoop20</name>
+- <value>true</value>
++ <name>oozieci</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+- <artifactId>maven-compiler-plugin</artifactId>
++ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludes>
+- <exclude>**/Kerberos*.java</exclude>
++ <exclude>**/TestRerun.java</exclude>
++ <exclude>**/TestCallableQueueService.java</exclude>
++ <exclude>**/TestPigActionExecutor.java</exclude>
++ <exclude>**/TestCallableQueueService.java</exclude>
++ <exclude>**/TestSshActionExecutor.java</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+@@ -364,91 +417,64 @@
+ </build>
+ </profile>
+
+- <profile>
+- <id>oozieci</id>
+- <activation>
+- <activeByDefault>false</activeByDefault>
+- <property>
+- <name>oozieci</name>
+- </property>
+- </activation>
+- <build>
+- <plugins>
+- <plugin>
+- <groupId>org.apache.maven.plugins</groupId>
+- <artifactId>maven-surefire-plugin</artifactId>
+- <configuration>
+- <excludes>
+- <exclude>**/TestRerun.java</exclude>
+- <exclude>**/TestCallableQueueService.java</exclude>
+- <exclude>**/TestPigActionExecutor.java</exclude>
+- <exclude>**/TestCallableQueueService.java</exclude>
+- <exclude>**/TestSshActionExecutor.java</exclude>
+- </excludes>
+- </configuration>
+- </plugin>
+- </plugins>
+- </build>
+- </profile>
+-
+- <profile>
+- <id>test-jar-all</id>
+- <activation>
+- <activeByDefault>true</activeByDefault>
+- <property>
+- <name>testJarAll</name>
+- </property>
+- </activation>
+- <build>
+- <plugins>
+- <plugin>
+- <groupId>org.apache.maven.plugins</groupId>
+- <artifactId>maven-jar-plugin</artifactId>
+- <executions>
+- <execution>
+- <goals>
+- <goal>test-jar</goal>
+- </goals>
+- </execution>
+- </executions>
+- </plugin>
+- </plugins>
+- </build>
+- </profile>
+-
+- <profile>
+- <id>test-jar-simple</id>
+- <activation>
+- <activeByDefault>false</activeByDefault>
+- <property>
+- <name>testJarSimple</name>
+- </property>
+- </activation>
+- <build>
+- <plugins>
+- <plugin>
+- <groupId>org.apache.maven.plugins</groupId>
+- <artifactId>maven-jar-plugin</artifactId>
+- <executions>
+- <execution>
+- <goals>
+- <goal>test-jar</goal>
+- </goals>
+- <configuration>
+- <includes>
+- <include>**/XTestCase.class</include>
+- <include>**/XTestCase$1.class</include>
+- <include>**/XFsTestCase.class</include>
+- <include>**/MiniOozieTestCase.class</include>
+- <include>**/XTestCase$Predicate.class</include>
+- </includes>
+- </configuration>
+- </execution>
+- </executions>
+- </plugin>
+- </plugins>
+- </build>
+- </profile>
++ <profile>
++ <id>test-jar-all</id>
++ <activation>
++ <activeByDefault>true</activeByDefault>
++ <property>
++ <name>testJarAll</name>
++ </property>
++ </activation>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-jar-plugin</artifactId>
++ <executions>
++ <execution>
++ <goals>
++ <goal>test-jar</goal>
++ </goals>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++ </profile>
++
++ <profile>
++ <id>test-jar-simple</id>
++ <activation>
++ <activeByDefault>false</activeByDefault>
++ <property>
++ <name>testJarSimple</name>
++ </property>
++ </activation>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-jar-plugin</artifactId>
++ <executions>
++ <execution>
++ <goals>
++ <goal>test-jar</goal>
++ </goals>
++ <configuration>
++ <includes>
++ <include>**/XTestCase.class</include>
++ <include>**/XTestCase$1.class</include>
++ <include>**/XFsTestCase.class</include>
++ <include>**/MiniOozieTestCase.class</include>
++ <include>**/XTestCase$Predicate.class</include>
++ </includes>
++ </configuration>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++ </profile>
+
+ <!-- Include MySQL JDBC driver -->
+ <profile>
+@@ -456,7 +482,8 @@
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ <property>
+- <name>mysql</name>
++ <name>oozie.test.db</name>
++ <value>mysql</value>
+ </property>
+ </activation>
+ <dependencies>
+@@ -476,7 +503,8 @@
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ <property>
+- <name>oracle</name>
++ <name>oozie.test.db</name>
++ <value>oracle</value>
+ </property>
+ </activation>
+ <dependencies>
+@@ -487,6 +515,54 @@
+ </dependencies>
+ </profile>
+
++ <!-- Forcing antlr-runtime 3.0.1 for Hive action testcases -->
++ <!-- This is required because Pig 0.9.0 requires 3.4 and -->
++ <!-- Hive 0.9.0-SNAPSHOT requires 3.0.1 -->
++ <profile>
++ <id>testHive</id>
++ <activation>
++ <activeByDefault>false</activeByDefault>
++ <property>
++ <name>testHive</name>
++ </property>
++ </activation>
++ <dependencies>
++ <dependency>
++ <groupId>org.antlr</groupId>
++ <artifactId>antlr-runtime</artifactId>
++ <version>3.0.1</version>
++ <scope>test</scope>
++ </dependency>
++ </dependencies>
++ </profile>
++
++ <!-- Forcing Hadoop 0.20.2-cdh3u2 version because Sqoop -->
++ <!-- uses Hadoop API that is avail 0.21 onwards and the -->
++ <!-- Hadoop CDH version is the only stable version that -->
++ <!-- currently has such API (SQOOP-384) and published -->
++ <!-- in public Maven repos. This is a temporary fix -->
++ <profile>
++ <id>testSqoop</id>
++ <activation>
++ <activeByDefault>false</activeByDefault>
++ <property>
++ <name>testSqoop</name>
++ </property>
++ </activation>
++ <properties>
++ <hadoop.version>0.20.2-cdh3u2</hadoop.version>
++ </properties>
++ <repositories>
++ <repository>
++ <id>cdh.releases.repo</id>
++ <url>https://repository.cloudera.com/content/groups/cdh-releases-rcs</url>
++ <name>CDH Releases Repository</name>
++ <snapshots>
++ <enabled>false</enabled>
++ </snapshots>
++ </repository>
++ </repositories>
++ </profile>
+ </profiles>
+
+ </project>
+diff --git core/src/main/conf/oozie-log4j.properties core/src/main/conf/oozie-log4j.properties
+index 3db1419..a14ae89 100644
+--- core/src/main/conf/oozie-log4j.properties
++++ core/src/main/conf/oozie-log4j.properties
+@@ -6,9 +6,9 @@
+ # 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.
+@@ -71,3 +71,4 @@ log4j.logger.org.apache.oozie=DEBUG, oozie
+ log4j.logger.org.apache.hadoop=WARN, oozie
+ log4j.logger.org.mortbay=WARN, oozie
+ log4j.logger.org.hsqldb=WARN, oozie
++log4j.logger.org.apache.hadoop.security.authentication.server=DEBUG, oozie
+diff --git core/src/main/conf/oozie-site.xml core/src/main/conf/oozie-site.xml
+index e17ba7b..fd58686 100644
+--- core/src/main/conf/oozie-site.xml
++++ core/src/main/conf/oozie-site.xml
+@@ -18,24 +18,29 @@
+ -->
+ <configuration>
+
+-<!--
+- Refer to the oozie-default.xml file for the complete list of
+- Oozie configuration properties and their default values.
+--->
++ <!--
++ Refer to the oozie-default.xml file for the complete list of
++ Oozie configuration properties and their default values.
++ -->
++
++ <!-- Uncomment the following properties to enable Email & Hive actions
+
+-<!-- Uncomment to enable additional actions (email).
+ <property>
+ <name>oozie.service.ActionService.executor.ext.classes</name>
+ <value>
+- org.apache.oozie.action.email.EmailActionExecutor
++ org.apache.oozie.action.email.EmailActionExecutor,
++ org.apache.oozie.action.hadoop.HiveActionExecutor,
++ org.apache.oozie.action.hadoop.ShellActionExecutor,
++ org.apache.oozie.action.hadoop.SqoopActionExecutor
+ </value>
+ </property>
+
+ <property>
+ <name>oozie.service.SchemaService.wf.ext.schemas</name>
+- <value>email-action-0.1.xsd</value>
++ <value>shell-action-0.1.xsd,email-action-0.1.xsd,hive-action-0.2.xsd,sqoop-action-0.2.xsd,ssh-action-0.1.xsd</value>
+ </property>
+--->
++
++ -->
+
+ <property>
+ <name>oozie.system.id</name>
+@@ -80,7 +85,7 @@
+
+ <property>
+ <name>oozie.service.CallableQueueService.queue.size</name>
+- <value>1000</value>
++ <value>10000</value>
+ <description>Max callable queue size</description>
+ </property>
+
+@@ -120,7 +125,7 @@
+
+ <property>
+ <name>oozie.service.StoreService.create.db.schema</name>
+- <value>true</value>
++ <value>false</value>
+ <description>
+ Creates Oozie DB.
+
+@@ -244,5 +249,110 @@
+ </description>
+ </property>
+
+-</configuration>
++ <property>
++ <name>oozie.authentication.type</name>
++ <value>simple</value>
++ <description>
++ Defines authentication used for Oozie HTTP endpoint.
++ Supported values are: simple | kerberos | #AUTHENTICATION_HANDLER_CLASSNAME#
++ </description>
++ </property>
++
++ <property>
++ <name>oozie.authentication.token.validity</name>
++ <value>36000</value>
++ <description>
++ Indicates how long (in seconds) an authentication token is valid before it has
++ to be renewed.
++ </description>
++ </property>
++
++ <property>
++ <name>oozie.authentication.signature.secret</name>
++ <value>oozie</value>
++ <description>
++ The signature secret for signing the authentication tokens.
++ If not set a random secret is generated at startup time.
++ In order to authentiation to work correctly across multiple hosts
++ the secret must be the same across al the hosts.
++ </description>
++ </property>
++
++ <property>
++ <name>oozie.authentication.cookie.domain</name>
++ <value></value>
++ <description>
++ The domain to use for the HTTP cookie that stores the authentication token.
++ In order to authentiation to work correctly across multiple hosts
++ the domain must be correctly set.
++ </description>
++ </property>
++
++ <property>
++ <name>oozie.authentication.simple.anonymous.allowed</name>
++ <value>true</value>
++ <description>
++ Indicates if anonymous requests are allowed.
++ This setting is meaningful only when using 'simple' authentication.
++ </description>
++ </property>
++
++ <property>
++ <name>oozie.authentication.kerberos.principal</name>
++ <value>HTTP/localhost@${local.realm}</value>
++ <description>
++ Indicates the Kerberos principal to be used for HTTP endpoint.
++ The principal MUST start with 'HTTP/' as per Kerberos HTTP SPNEGO specification.
++ </description>
++ </property>
++
++ <property>
++ <name>oozie.authentication.kerberos.keytab</name>
++ <value>${oozie.service.HadoopAccessorService.keytab.file}</value>
++ <description>
++ Location of the keytab file with the credentials for the principal.
++ Referring to the same keytab file Oozie uses for its Kerberos credentials for Hadoop.
++ </description>
++ </property>
++
++ <!-- Proxyuser Configuration -->
++
++ <!--
++
++ <property>
++ <name>oozie.service.ProxyUserService.proxyuser.#USER#.hosts</name>
++ <value>*</value>
++ <description>
++ List of hosts the '#USER#' user is allowed to perform 'doAs'
++ operations.
+
++ The '#USER#' must be replaced with the username o the user who is
++ allowed to perform 'doAs' operations.
++
++ The value can be the '*' wildcard or a list of hostnames.
++
++ For multiple users copy this property and replace the user name
++ in the property name.
++ </description>
++ </property>
++
++ <property>
++ <name>oozie.service.ProxyUserService.proxyuser.#USER#.groups</name>
++ <value>*</value>
++ <description>
++ List of groups the '#USER#' user is allowed to impersonate users
++ from to perform 'doAs' operations.
++
++ The '#USER#' must be replaced with the username o the user who is
++ allowed to perform 'doAs' operations.
++
++ The value can be the '*' wildcard or a list of groups.
++
++ For multiple users copy this property and replace the user name
++ in the property name.
++ </description>
++ </property>
++
++ -->
++
++</configuration>
+diff --git core/src/main/java/org/apache/oozie/CoordinatorActionBean.java core/src/main/java/org/apache/oozie/CoordinatorActionBean.java
+index 54f36cd..b058097 100644
+--- core/src/main/java/org/apache/oozie/CoordinatorActionBean.java
++++ core/src/main/java/org/apache/oozie/CoordinatorActionBean.java
+@@ -78,8 +78,10 @@ import org.apache.openjpa.persistence.jdbc.Index;
+ @NamedQuery(name = "GET_COORD_ACTIONS_PENDING_FALSE_STATUS_COUNT", query = "select count(a) from CoordinatorActionBean a where a.jobId = :jobId AND a.pending = 0 AND a.status = :status"),
+
+ @NamedQuery(name = "GET_ACTIONS_FOR_COORD_JOB", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId"),
+-
+- @NamedQuery(name = "GET_COORD_ACTION_FOR_COORD_JOB_BY_ACTION_NUMBER", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId AND a.actionNumber = :actionNumber"),
++ // Query to retrieve Coordinator actions sorted by nominal time
++ @NamedQuery(name = "GET_ACTIONS_FOR_COORD_JOB_ORDER_BY_NOMINAL_TIME", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId order by a.nominalTimestamp"),
++ // Query to retrieve action id, action status, pending status and external Id of not completed Coordinator actions
++ @NamedQuery(name = "GET_COORD_ACTIONS_NOT_COMPLETED", query = "select a.id, a.status, a.pending, a.externalId from CoordinatorActionBean a where a.jobId = :jobId AND a.status <> 'FAILED' AND a.status <> 'TIMEDOUT' AND a.status <> 'SUCCEEDED' AND a.status <> 'KILLED'"),
+
+ @NamedQuery(name = "GET_COORD_ACTIONS_BY_LAST_MODIFIED_TIME", query = "select OBJECT(w) from CoordinatorActionBean w where w.lastModifiedTimestamp >= :lastModifiedTime"),
+
+@@ -114,6 +116,7 @@ public class CoordinatorActionBean extends JsonCoordinatorAction implements
+ private String status = null;
+
+ @Basic
++ @Index
+ @Column(name = "nominal_time")
+ private java.sql.Timestamp nominalTimestamp = null;
+
+diff --git core/src/main/java/org/apache/oozie/CoordinatorEngine.java core/src/main/java/org/apache/oozie/CoordinatorEngine.java
+index 26b2f97..adbf893 100644
+--- core/src/main/java/org/apache/oozie/CoordinatorEngine.java
++++ core/src/main/java/org/apache/oozie/CoordinatorEngine.java
+@@ -505,6 +505,7 @@ public class CoordinatorEngine extends BaseEngine {
+ FILTER_NAMES.add(OozieClient.FILTER_STATUS);
+ FILTER_NAMES.add(OozieClient.FILTER_ID);
+ FILTER_NAMES.add(OozieClient.FILTER_FREQUENCY);
++ FILTER_NAMES.add(OozieClient.FILTER_UNIT);
+ }
+
+ /**
+@@ -537,6 +538,10 @@ public class CoordinatorEngine extends BaseEngine {
+ */
+ private Map<String, List<String>> parseFilter(String filter) throws CoordinatorEngineException {
+ Map<String, List<String>> map = new HashMap<String, List<String>>();
++ boolean isTimeUnitSpecified = false;
++ String timeUnit = "MINUTE";
++ boolean isFrequencySpecified = false;
++ String frequency = "";
+ if (filter != null) {
+ StringTokenizer st = new StringTokenizer(filter, ";");
+ while (st.hasMoreTokens()) {
+@@ -547,10 +552,32 @@ public class CoordinatorEngine extends BaseEngine {
+ throw new CoordinatorEngineException(ErrorCode.E0420, filter,
+ "elements must be name=value pairs");
+ }
+- if (!FILTER_NAMES.contains(pair[0])) {
++ if (!FILTER_NAMES.contains(pair[0].toLowerCase())) {
+ throw new CoordinatorEngineException(ErrorCode.E0420, filter, XLog.format("invalid name [{0}]",
+ pair[0]));
+ }
++ if (pair[0].equalsIgnoreCase("frequency")) {
++ isFrequencySpecified = true;
++ try {
++ frequency = (int) Float.parseFloat(pair[1]) + "";
++ continue;
++ }
++ catch (NumberFormatException NANException) {
++ throw new CoordinatorEngineException(ErrorCode.E0420, filter, XLog.format(
++ "invalid value [{0}] for frequency. A numerical value is expected", pair[1]));
[... 18446 lines stripped ...]
|