Repository: oozie Updated Branches: refs/heads/master 5b55169c6 -> 2f6bced4f
OOZIE-2956 Fix Findbugs warnings related to reliance on default encoding in oozie-core (Jan Hentschel, kmarton via andras.piros) Project: http://git-wip-us.apache.org/repos/asf/oozie/repo Commit: http://git-wip-us.apache.org/repos/asf/oozie/commit/2f6bced4 Tree: http://git-wip-us.apache.org/repos/asf/oozie/tree/2f6bced4 Diff: http://git-wip-us.apache.org/repos/asf/oozie/diff/2f6bced4 Branch: refs/heads/master Commit: 2f6bced4fdfe6a438183b3e3fb0f4e2cadc89770 Parents: 5b55169 Author: Andras Piros <[email protected]> Authored: Mon Jul 2 09:58:05 2018 +0200 Committer: Andras Piros <[email protected]> Committed: Mon Jul 2 09:59:41 2018 +0200 ---------------------------------------------------------------------- core/pom.xml | 5 + .../main/java/org/apache/oozie/StringBlob.java | 4 +- .../org/apache/oozie/action/ActionExecutor.java | 16 ++- .../oozie/action/hadoop/LauncherHelper.java | 52 ++++---- .../action/hadoop/MapReduceActionExecutor.java | 13 +- .../action/hadoop/SqoopActionExecutor.java | 5 +- .../oozie/action/ssh/SshActionExecutor.java | 47 +++---- .../command/bundle/BundleSubmitXCommand.java | 21 +-- .../command/coord/CoordSubmitXCommand.java | 47 +++---- .../command/coord/CoordUpdateXCommand.java | 15 +-- .../oozie/service/AuthorizationService.java | 133 +++++++++---------- .../oozie/service/WorkflowAppService.java | 20 +-- .../org/apache/oozie/servlet/V1JobServlet.java | 39 ++---- .../apache/oozie/servlet/V2ValidateServlet.java | 8 +- .../org/apache/oozie/util/AuthUrlClient.java | 35 +++-- .../java/org/apache/oozie/util/IOUtils.java | 6 +- .../org/apache/oozie/util/MultiFileReader.java | 6 +- .../org/apache/oozie/util/XConfiguration.java | 14 +- .../java/org/apache/oozie/util/XmlUtils.java | 12 +- release-log.txt | 1 + 20 files changed, 233 insertions(+), 266 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/pom.xml ---------------------------------------------------------------------- diff --git a/core/pom.xml b/core/pom.xml index a5a776c..92236bc 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -507,6 +507,11 @@ <artifactId>hive-jdbc</artifactId> <scope>compile</scope> </dependency> + <dependency> + <groupId>com.google.code.findbugs</groupId> + <artifactId>annotations</artifactId> + <scope>provided</scope> + </dependency> </dependencies> <build> http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/StringBlob.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/StringBlob.java b/core/src/main/java/org/apache/oozie/StringBlob.java index 6c77601..eba1313 100644 --- a/core/src/main/java/org/apache/oozie/StringBlob.java +++ b/core/src/main/java/org/apache/oozie/StringBlob.java @@ -21,7 +21,9 @@ package org.apache.oozie; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import com.google.common.base.Charsets; import org.apache.oozie.compression.CodecFactory; import org.apache.oozie.compression.CompressionCodec; import org.apache.oozie.util.ByteArrayUtils; @@ -117,7 +119,7 @@ public class StringBlob { } } else { - rawBlob = ByteArrayUtils.weakIntern(string.getBytes()); + rawBlob = ByteArrayUtils.weakIntern(string.getBytes(Charsets.UTF_8)); } return rawBlob; } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/action/ActionExecutor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/action/ActionExecutor.java b/core/src/main/java/org/apache/oozie/action/ActionExecutor.java index 919509d..71bd36a 100644 --- a/core/src/main/java/org/apache/oozie/action/ActionExecutor.java +++ b/core/src/main/java/org/apache/oozie/action/ActionExecutor.java @@ -18,6 +18,7 @@ package org.apache.oozie.action; +import com.google.common.base.Charsets; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; @@ -34,6 +35,7 @@ import org.apache.oozie.service.Services; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; +import java.io.UnsupportedEncodingException; import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; @@ -58,13 +60,12 @@ public abstract class ActionExecutor { public static final String OOZIE_ACTION_YARN_TAG = "oozie.action.yarn.tag"; - /** * Error code used by {@link #convertException} when there is not register error information for an exception. */ public static final String ERROR_OTHER = "OTHER"; - public static enum RETRYPOLICY { + public enum RETRYPOLICY { EXPONENTIAL, PERIODIC } @@ -81,7 +82,7 @@ public abstract class ActionExecutor { } private static boolean initMode = false; - private static Map<String, Map<String, ErrorInfo>> ERROR_INFOS = new HashMap<String, Map<String, ErrorInfo>>(); + private static Map<String, Map<String, ErrorInfo>> ERROR_INFOS = new HashMap<>(); /** * Context information passed to the ActionExecutor methods. @@ -350,8 +351,13 @@ public abstract class ActionExecutor { } catch (java.lang.NoClassDefFoundError err) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - err.printStackTrace(new PrintStream(baos)); - XLog.getLog(getClass()).warn(baos.toString()); + + try { + err.printStackTrace(new PrintStream(baos, false, Charsets.UTF_8.name())); + XLog.getLog(getClass()).warn(baos.toString(Charsets.UTF_8.name())); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } } } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/action/hadoop/LauncherHelper.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/action/hadoop/LauncherHelper.java b/core/src/main/java/org/apache/oozie/action/hadoop/LauncherHelper.java index 21c9b7e..a71d930 100644 --- a/core/src/main/java/org/apache/oozie/action/hadoop/LauncherHelper.java +++ b/core/src/main/java/org/apache/oozie/action/hadoop/LauncherHelper.java @@ -22,6 +22,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -33,7 +34,9 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import com.google.common.base.Charsets; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.SequenceFile; @@ -64,12 +67,11 @@ public class LauncherHelper { if (fs.exists(recoveryFile)) { InputStream is = fs.open(recoveryFile); - BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charsets.UTF_8)); jobId = reader.readLine(); reader.close(); } return jobId; - } public static void setupMainClass(Configuration launcherConf, String javaMainClass) { @@ -130,7 +132,7 @@ public class LauncherHelper { actionConf.set(LauncherAMUtils.OOZIE_ACTION_ID, actionId); if (Services.get().getConf().getBoolean("oozie.hadoop-2.0.2-alpha.workaround.for.distributed.cache", false)) { - List<String> purgedEntries = new ArrayList<String>(); + List<String> purgedEntries = new ArrayList<>(); Collection<String> entries = actionConf.getStringCollection("mapreduce.job.cache.files"); for (String entry : entries) { if (entry.contains("#")) { @@ -155,9 +157,8 @@ public class LauncherHelper { public static String getTag(String launcherTag) throws NoSuchAlgorithmException { MessageDigest digest = MessageDigest.getInstance("MD5"); - digest.update(launcherTag.getBytes(), 0, launcherTag.length()); - String md5 = "oozie-" + new BigInteger(1, digest.digest()).toString(16); - return md5; + digest.update(launcherTag.getBytes(Charsets.UTF_8), 0, launcherTag.length()); + return "oozie-" + new BigInteger(1, digest.digest()).toString(16); } public static boolean isMainDone(RunningJob runningJob) throws IOException { @@ -246,7 +247,7 @@ public class LauncherHelper { return ugi.doAs(new PrivilegedExceptionAction<Map<String, String>>() { @Override public Map<String, String> run() throws IOException { - Map<String, String> ret = new HashMap<String, String>(); + Map<String, String> ret = new HashMap<>(); Path seqFilePath = getActionDataSequenceFilePath(actionDir); if (fs.exists(seqFilePath)) { SequenceFile.Reader seqFile = new SequenceFile.Reader(fs, seqFilePath, conf); @@ -259,42 +260,41 @@ public class LauncherHelper { else { // maintain backward-compatibility. to be deprecated org.apache.hadoop.fs.FileStatus[] files = fs.listStatus(actionDir); InputStream is; - BufferedReader reader = null; + BufferedReader reader; Properties props; if (files != null && files.length > 0) { - for (int x = 0; x < files.length; x++) { - Path file = files[x].getPath(); - if (file.equals(new Path(actionDir, "externalChildIds.properties"))) { - is = fs.open(file); - reader = new BufferedReader(new InputStreamReader(is)); + for (FileStatus fileStatus : files) { + Path path = fileStatus.getPath(); + if (path.equals(new Path(actionDir, "externalChildIds.properties"))) { + is = fs.open(path); + reader = new BufferedReader(new InputStreamReader(is, Charsets.UTF_8)); ret.put(LauncherAMUtils.ACTION_DATA_EXTERNAL_CHILD_IDS, IOUtils.getReaderAsString(reader, -1)); - } - else if (file.equals(new Path(actionDir, "newId.properties"))) { - is = fs.open(file); - reader = new BufferedReader(new InputStreamReader(is)); + } else if (path.equals(new Path(actionDir, "newId.properties"))) { + is = fs.open(path); + reader = new BufferedReader(new InputStreamReader(is, Charsets.UTF_8)); props = PropertiesUtils.readProperties(reader, -1); ret.put(LauncherAMUtils.ACTION_DATA_NEW_ID, props.getProperty("id")); } - else if (file.equals(new Path(actionDir, LauncherAMUtils.ACTION_DATA_OUTPUT_PROPS))) { + else if (path.equals(new Path(actionDir, LauncherAMUtils.ACTION_DATA_OUTPUT_PROPS))) { int maxOutputData = conf.getInt(LauncherAMUtils.CONF_OOZIE_ACTION_MAX_OUTPUT_DATA, 2 * 1024); - is = fs.open(file); - reader = new BufferedReader(new InputStreamReader(is)); + is = fs.open(path); + reader = new BufferedReader(new InputStreamReader(is, Charsets.UTF_8)); ret.put(LauncherAMUtils.ACTION_DATA_OUTPUT_PROPS, PropertiesUtils .propertiesToString(PropertiesUtils.readProperties(reader, maxOutputData))); } - else if (file.equals(new Path(actionDir, LauncherAMUtils.ACTION_DATA_STATS))) { + else if (path.equals(new Path(actionDir, LauncherAMUtils.ACTION_DATA_STATS))) { int statsMaxOutputData = conf.getInt(LauncherAMUtils.CONF_OOZIE_EXTERNAL_STATS_MAX_SIZE, Integer.MAX_VALUE); - is = fs.open(file); - reader = new BufferedReader(new InputStreamReader(is)); + is = fs.open(path); + reader = new BufferedReader(new InputStreamReader(is, Charsets.UTF_8)); ret.put(LauncherAMUtils.ACTION_DATA_STATS, PropertiesUtils .propertiesToString(PropertiesUtils.readProperties(reader, statsMaxOutputData))); } - else if (file.equals(new Path(actionDir, LauncherAMUtils.ACTION_DATA_ERROR_PROPS))) { - is = fs.open(file); - reader = new BufferedReader(new InputStreamReader(is)); + else if (path.equals(new Path(actionDir, LauncherAMUtils.ACTION_DATA_ERROR_PROPS))) { + is = fs.open(path); + reader = new BufferedReader(new InputStreamReader(is, Charsets.UTF_8)); ret.put(LauncherAMUtils.ACTION_DATA_ERROR_PROPS, IOUtils.getReaderAsString(reader, -1)); } } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/action/hadoop/MapReduceActionExecutor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/action/hadoop/MapReduceActionExecutor.java b/core/src/main/java/org/apache/oozie/action/hadoop/MapReduceActionExecutor.java index d0b8074..83a23f5 100644 --- a/core/src/main/java/org/apache/oozie/action/hadoop/MapReduceActionExecutor.java +++ b/core/src/main/java/org/apache/oozie/action/hadoop/MapReduceActionExecutor.java @@ -21,10 +21,10 @@ package org.apache.oozie.action.hadoop; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; +import com.google.common.base.Charsets; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; @@ -59,7 +59,7 @@ public class MapReduceActionExecutor extends JavaActionExecutor { @Override public List<Class<?>> getLauncherClasses() { - List<Class<?>> classes = new ArrayList<Class<?>>(); + List<Class<?>> classes = new ArrayList<>(); try { classes.add(Class.forName(STREAMING_MAIN_CLASS_NAME)); } @@ -118,8 +118,7 @@ public class MapReduceActionExecutor extends JavaActionExecutor { @Override protected Configuration createBaseHadoopConf(Context context, Element actionXml, boolean loadResources) { - Configuration conf = super.createBaseHadoopConf(context, actionXml, loadResources); - return conf; + return super.createBaseHadoopConf(context, actionXml, loadResources); } @Override @@ -242,7 +241,7 @@ public class MapReduceActionExecutor extends JavaActionExecutor { // do not store the action stats if (Boolean.parseBoolean(evaluateConfigurationProperty(actionXml, OOZIE_ACTION_EXTERNAL_STATS_WRITE, "false")) - && (statsJsonString.getBytes().length <= getMaxExternalStatsSize())) { + && (statsJsonString.getBytes(Charsets.UTF_8).length <= getMaxExternalStatsSize())) { context.setExecutionStats(statsJsonString); log.debug( "Printing stats for Map-Reduce action as a JSON string : [{0}]", statsJsonString); @@ -339,8 +338,8 @@ public class MapReduceActionExecutor extends JavaActionExecutor { @Override public void check(Context context, WorkflowAction action) throws ActionExecutorException { - Map<String, String> actionData = Collections.emptyMap(); - Configuration jobConf = null; + Map<String, String> actionData; + Configuration jobConf; try { FileSystem actionFs = context.getAppFileSystem(); http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/action/hadoop/SqoopActionExecutor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/action/hadoop/SqoopActionExecutor.java b/core/src/main/java/org/apache/oozie/action/hadoop/SqoopActionExecutor.java index 69d5e7e..556f2cf 100644 --- a/core/src/main/java/org/apache/oozie/action/hadoop/SqoopActionExecutor.java +++ b/core/src/main/java/org/apache/oozie/action/hadoop/SqoopActionExecutor.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; +import com.google.common.base.Charsets; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.mapred.Counters; @@ -51,7 +52,7 @@ public class SqoopActionExecutor extends JavaActionExecutor { @Override public List<Class<?>> getLauncherClasses() { - List<Class<?>> classes = new ArrayList<Class<?>>(); + List<Class<?>> classes = new ArrayList<>(); try { classes.add(Class.forName(SQOOP_MAIN_CLASS_NAME)); } @@ -182,7 +183,7 @@ public class SqoopActionExecutor extends JavaActionExecutor { // do not store the action stats if (Boolean.parseBoolean(evaluateConfigurationProperty(actionXml, OOZIE_ACTION_EXTERNAL_STATS_WRITE, "true")) - && (statsJsonString.getBytes().length <= getMaxExternalStatsSize())) { + && (statsJsonString.getBytes(Charsets.UTF_8).length <= getMaxExternalStatsSize())) { context.setExecutionStats(statsJsonString); LOG.debug( "Printing stats for sqoop action as a JSON string : [{0}]", statsJsonString); http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/action/ssh/SshActionExecutor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/action/ssh/SshActionExecutor.java b/core/src/main/java/org/apache/oozie/action/ssh/SshActionExecutor.java index 128feee..1c76a87 100644 --- a/core/src/main/java/org/apache/oozie/action/ssh/SshActionExecutor.java +++ b/core/src/main/java/org/apache/oozie/action/ssh/SshActionExecutor.java @@ -20,12 +20,16 @@ package org.apache.oozie.action.ssh; import java.io.BufferedReader; import java.io.File; -import java.io.FileWriter; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; + +import com.google.common.base.Charsets; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.hadoop.util.StringUtils; import org.apache.oozie.client.WorkflowAction; @@ -118,11 +122,13 @@ public class SshActionExecutor extends ActionExecutor { * @param action action object. * @throws org.apache.oozie.action.ActionExecutorException */ + @SuppressFBWarnings(value = {"COMMAND_INJECTION", "PATH_TRAVERSAL_OUT"}, + justification = "Tracker URI is specified in the WF action, and action dir path is from context") @Override public void check(Context context, WorkflowAction action) throws ActionExecutorException { LOG.trace("check() start for action={0}", action.getId()); Status status = getActionStatus(context, action); - boolean captureOutput = false; + boolean captureOutput; try { Element eConf = XmlUtils.parseXml(action.getConf()); Namespace ns = eConf.getNamespace(); @@ -228,7 +234,6 @@ public class SshActionExecutor extends ActionExecutor { public String call() throws Exception { return setupRemote(host, context, action); } - }); String runningPid = execute(new Callable<String>() { @@ -286,7 +291,6 @@ public class SshActionExecutor extends ActionExecutor { return doExecute(host, dirLocation, commandElement.getValue(), argsF, ignoreOutput, action, recoveryId, preserveF); } - }); } context.setStartData(pid, host, host); @@ -299,14 +303,13 @@ public class SshActionExecutor extends ActionExecutor { } private String checkIfRunning(String host, final Context context, final WorkflowAction action) { - String pid = null; String outFile = getRemoteFileName(context, action, "pid", false, false); String getOutputCmd = SSH_COMMAND_BASE + host + " cat " + outFile; try { Process process = Runtime.getRuntime().exec(getOutputCmd.split("\\s")); StringBuffer buffer = new StringBuffer(); drainBuffers(process, buffer, null, maxLen); - pid = getFirstLine(buffer); + String pid = getFirstLine(buffer); if (Long.valueOf(pid) > 0) { return pid; @@ -358,9 +361,8 @@ public class SshActionExecutor extends ActionExecutor { StringBuffer errorBuffer = new StringBuffer(); int exitValue = drainBuffers(p, null, errorBuffer, maxLen); - String error = null; if (exitValue != 0) { - error = getTruncatedString(errorBuffer); + String error = getTruncatedString(errorBuffer); throw new IOException(XLog.format("Not able to perform operation [{0}]", command) + " | " + "ErrorStream: " + error); } @@ -444,17 +446,15 @@ public class SshActionExecutor extends ActionExecutor { LOG.trace("Executing SSH command [finalCommand={0}]", Arrays.toString(finalCommand)); final Process p = runtime.exec(finalCommand); - final String pid; final StringBuffer inputBuffer = new StringBuffer(); final StringBuffer errorBuffer = new StringBuffer(); final int exitValue = drainBuffers(p, inputBuffer, errorBuffer, maxLen); - pid = getFirstLine(inputBuffer); + final String pid = getFirstLine(inputBuffer); - String error = null; if (exitValue != 0) { - error = getTruncatedString(errorBuffer); + String error = getTruncatedString(errorBuffer); throw new IOException(XLog.format("Not able to execute ssh-base.sh on {0}", host) + " | " + "ErrorStream: " + error); } @@ -522,6 +522,7 @@ public class SshActionExecutor extends ActionExecutor { /** * Copy the ssh base and wrapper scripts to the local directory. */ + @SuppressFBWarnings(value ="PATH_TRAVERSAL_OUT", justification = "Path is created runtime") private void initSshScripts() { String dirLocation = Services.get().getRuntimeDir() + "/ssh"; File path = new File(dirLocation); @@ -530,10 +531,10 @@ public class SshActionExecutor extends ActionExecutor { throw new RuntimeException(XLog.format("Not able to create required directory {0}", dirLocation)); } try { - IOUtils.copyCharStream(IOUtils.getResourceAsReader("ssh-base.sh", -1), new FileWriter(dirLocation - + "/ssh-base.sh")); - IOUtils.copyCharStream(IOUtils.getResourceAsReader("ssh-wrapper.sh", -1), new FileWriter(dirLocation - + "/ssh-wrapper.sh")); + IOUtils.copyCharStream(IOUtils.getResourceAsReader("ssh-base.sh", -1), new OutputStreamWriter( + new FileOutputStream(dirLocation + "/ssh-base.sh"), Charsets.UTF_8)); + IOUtils.copyCharStream(IOUtils.getResourceAsReader("ssh-wrapper.sh", -1), new OutputStreamWriter( + new FileOutputStream(dirLocation + "/ssh-wrapper.sh"), Charsets.UTF_8)); } catch (IOException ie) { throw new RuntimeException(XLog.format("Not able to copy required scripts file to {0} " @@ -719,7 +720,6 @@ public class SshActionExecutor extends ActionExecutor { * @return truncated string string */ private String getTruncatedString(StringBuffer strBuffer) { - if (strBuffer.length() <= maxLen) { return strBuffer.toString(); } @@ -743,15 +743,14 @@ public class SshActionExecutor extends ActionExecutor { private int drainBuffers(Process p, StringBuffer inputBuffer, StringBuffer errorBuffer, int maxLength) throws IOException { int exitValue = -1; - BufferedReader ir = new BufferedReader(new InputStreamReader(p.getInputStream())); - BufferedReader er = new BufferedReader(new InputStreamReader(p.getErrorStream())); int inBytesRead = 0; int errBytesRead = 0; boolean processEnded = false; - try { + try (BufferedReader ir = new BufferedReader(new InputStreamReader(p.getInputStream(), Charsets.UTF_8)); + BufferedReader er = new BufferedReader(new InputStreamReader(p.getErrorStream(), Charsets.UTF_8))) { while (!processEnded) { try { exitValue = p.waitFor(); @@ -766,11 +765,6 @@ public class SshActionExecutor extends ActionExecutor { errBytesRead += drainBuffer(er, errorBuffer, maxLength, errBytesRead, processEnded); } } - finally { - ir.close(); - er.close(); - } - return exitValue; } @@ -810,8 +804,7 @@ public class SshActionExecutor extends ActionExecutor { * @return The first line of the buffer. */ private String getFirstLine(StringBuffer buffer) { - int newLineIndex = 0; - newLineIndex = buffer.indexOf("\n"); + int newLineIndex = buffer.indexOf("\n"); if (newLineIndex == -1) { return buffer.toString(); } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/command/bundle/BundleSubmitXCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/command/bundle/BundleSubmitXCommand.java b/core/src/main/java/org/apache/oozie/command/bundle/BundleSubmitXCommand.java index 80e7d5d..f94e871 100644 --- a/core/src/main/java/org/apache/oozie/command/bundle/BundleSubmitXCommand.java +++ b/core/src/main/java/org/apache/oozie/command/bundle/BundleSubmitXCommand.java @@ -34,6 +34,7 @@ import java.util.Set; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Validator; +import com.google.common.base.Charsets; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; @@ -80,8 +81,8 @@ public class BundleSubmitXCommand extends SubmitTransitionXCommand { public static final String BUNDLE_XML_FILE = "bundle.xml"; private final BundleJobBean bundleBean = new BundleJobBean(); private String jobId; - private static final Set<String> DISALLOWED_USER_PROPERTIES = new HashSet<String>(); - private static final Set<String> DISALLOWED_DEFAULT_PROPERTIES = new HashSet<String>(); + private static final Set<String> DISALLOWED_USER_PROPERTIES = new HashSet<>(); + private static final Set<String> DISALLOWED_DEFAULT_PROPERTIES = new HashSet<>(); static { String[] badUserProps = { PropertiesUtils.YEAR, PropertiesUtils.MONTH, PropertiesUtils.DAY, @@ -159,8 +160,8 @@ public class BundleSubmitXCommand extends SubmitTransitionXCommand { catch (IOException e1) { LOG.warn("Configuration parse error. read from DB :" + bundleBean.getConf(), e1); } - String output = bundleBean.getJobXml() + System.getProperty("line.separator"); - return output; + + return bundleBean.getJobXml() + System.getProperty("line.separator"); } else { if (bundleBean.getKickoffTime() == null) { @@ -297,7 +298,7 @@ public class BundleSubmitXCommand extends SubmitTransitionXCommand { HadoopAccessorService has = Services.get().get(HadoopAccessorService.class); Configuration fsConf = has.createConfiguration(uri.getAuthority()); FileSystem fs = has.createFileSystem(user, uri, fsConf); - Path appDefPath = null; + Path appDefPath; // app path could be a directory Path path = new Path(uri.getPath()); @@ -307,7 +308,7 @@ public class BundleSubmitXCommand extends SubmitTransitionXCommand { appDefPath = path; } - Reader reader = new InputStreamReader(fs.open(appDefPath)); + Reader reader = new InputStreamReader(fs.open(appDefPath), Charsets.UTF_8); StringWriter writer = new StringWriter(); IOUtils.copyCharStream(reader, writer); return writer.toString(); @@ -353,7 +354,7 @@ public class BundleSubmitXCommand extends SubmitTransitionXCommand { /** * Write a Bundle Job into database * - * @param Bundle job bean + * @param bundleJob job bean * @return job id * @throws CommandException thrown if failed to store bundle job bean to db */ @@ -456,19 +457,19 @@ public class BundleSubmitXCommand extends SubmitTransitionXCommand { /** * Verify the uniqueness of coordinator names * - * @param resolved job xml + * @param resolvedJobXml job xml * @throws CommandException thrown if failed to verify the uniqueness of coordinator names */ @SuppressWarnings("unchecked") private Void verifyCoordNameUnique(String resolvedJobXml) throws CommandException { - Set<String> set = new HashSet<String>(); + Set<String> set = new HashSet<>(); try { Element bAppXml = XmlUtils.parseXml(resolvedJobXml); List<Element> coordElems = bAppXml.getChildren("coordinator", bAppXml.getNamespace()); for (Element elem : coordElems) { Attribute name = elem.getAttribute("name"); if (name != null) { - String coordName = name.getValue(); + String coordName; try { coordName = ELUtils.resolveAppName(name.getValue(), conf); } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/command/coord/CoordSubmitXCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/command/coord/CoordSubmitXCommand.java b/core/src/main/java/org/apache/oozie/command/coord/CoordSubmitXCommand.java index 8bfa634..2e25e03 100644 --- a/core/src/main/java/org/apache/oozie/command/coord/CoordSubmitXCommand.java +++ b/core/src/main/java/org/apache/oozie/command/coord/CoordSubmitXCommand.java @@ -39,6 +39,7 @@ import java.util.TreeSet; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Validator; +import com.google.common.base.Charsets; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; @@ -113,8 +114,8 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { public final String COORD_INPUT_EVENTS_DATA_IN ="data-in"; public final String COORD_OUTPUT_EVENTS_DATA_OUT = "data-out"; - private static final Set<String> DISALLOWED_USER_PROPERTIES = new HashSet<String>(); - private static final Set<String> DISALLOWED_DEFAULT_PROPERTIES = new HashSet<String>(); + private static final Set<String> DISALLOWED_USER_PROPERTIES = new HashSet<>(); + private static final Set<String> DISALLOWED_DEFAULT_PROPERTIES = new HashSet<>(); protected CoordinatorJobBean coordJob = null; /** @@ -206,7 +207,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { } protected String submitJob() throws CommandException { - String jobId = null; + String jobId; InstrumentUtils.incrJobCounter(getName(), 1, getInstrumentation()); boolean exceptionOccured = false; @@ -315,9 +316,8 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { } String action = new CoordMaterializeTransitionXCommand(coordJob, materializationWindow, startTime, endTime).materializeActions(true); - String output = coordJob.getJobXml() + System.getProperty("line.separator") - + "***actions for instance***" + action; - return output; + + return coordJob.getJobXml() + System.getProperty("line.separator") + "***actions for instance***" + action; } /** @@ -488,6 +488,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { throw new CoordinatorJobException(ErrorCode.E1021, eventType + " end-instance '" + instanceValue + "' contains more than one date end-instance. Coordinator job NOT SUBMITTED. " + correctAction); } + /** * Read the application XML and validate against coordinator Schema * @@ -606,7 +607,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { * @throws Exception thrown if failed to resolve basic entities or include referred datasets */ public Element basicResolveAndIncludeDS(String appXml, Configuration conf, CoordinatorJobBean coordJob) - throws CoordinatorJobException, Exception { + throws Exception { Element basicResolvedApp = resolveInitial(conf, appXml, coordJob); includeDataSets(basicResolvedApp, conf); return basicResolvedApp; @@ -666,7 +667,6 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { evalAction = CoordELEvaluator.createELEvaluatorForGroup(conf, "coord-action-start"); evalTimeout = CoordELEvaluator.createELEvaluatorForGroup(conf, "coord-job-wait-timeout"); evalInitialInstance = CoordELEvaluator.createELEvaluatorForGroup(conf, "coord-job-submit-initial-instance"); - } /** @@ -681,12 +681,11 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { */ @SuppressWarnings("unchecked") protected Element resolveInitial(Configuration conf, String appXml, CoordinatorJobBean coordJob) - throws CoordinatorJobException, Exception { + throws Exception { Element eAppXml = XmlUtils.parseXml(appXml); // job's main attributes // frequency String val = resolveAttribute("frequency", eAppXml, evalFreq); - int ival = 0; val = ParamChecker.checkFrequency(val); coordJob.setFrequency(val); @@ -755,7 +754,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { val = ConfigurationService.get(CONF_DEFAULT_TIMEOUT_NORMAL); } - ival = ParamChecker.checkInteger(val, "timeout"); + int ival = ParamChecker.checkInteger(val, "timeout"); if (ival < 0 || ival > ConfigurationService.getInt(CONF_DEFAULT_MAX_TIMEOUT)) { ival = ConfigurationService.getInt(CONF_DEFAULT_MAX_TIMEOUT); } @@ -770,8 +769,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { val = resolveTagContents("throttle", eAppXml.getChild("controls", eAppXml.getNamespace()), evalNofuncs); if (val == null || val.isEmpty()) { - int defaultThrottle = ConfigurationService.getInt(CONF_DEFAULT_THROTTLE); - ival = defaultThrottle; + ival = ConfigurationService.getInt(CONF_DEFAULT_THROTTLE); } else { ival = ParamChecker.checkInteger(val, "throttle"); @@ -887,7 +885,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { Element eJob = (Element) eJobOrg.clone(); Element inputList = eJob.getChild("input-events", eJob.getNamespace()); if (inputList != null) { - TreeSet<String> eventNameSet = new TreeSet<String>(); + TreeSet<String> eventNameSet = new TreeSet<>(); for (Element dataIn : (List<Element>) inputList.getChildren("data-in", eJob.getNamespace())) { String dataInName = dataIn.getAttributeValue("name"); dataNameList.put(dataInName, "data-in"); @@ -907,7 +905,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { // Resolving output-events/data-out Element outputList = eJob.getChild("output-events", eJob.getNamespace()); if (outputList != null) { - TreeSet<String> eventNameSet = new TreeSet<String>(); + TreeSet<String> eventNameSet = new TreeSet<>(); for (Element dataOut : (List<Element>) outputList.getChildren("data-out", eJob.getNamespace())) { String dataOutName = dataOut.getAttributeValue("name"); dataNameList.put(dataOutName, "data-out"); @@ -948,7 +946,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { /** * Resolve input-events/dataset and output-events/dataset tags. * - * @param eJob : Job element + * @param eAppXml : Job element * @throws CoordinatorJobException thrown if failed to resolve input and output events */ @SuppressWarnings("unchecked") @@ -966,10 +964,8 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { if (outputList != null) { for (Element dataOut : (List<Element>) outputList.getChildren("data-out", eAppXml.getNamespace())) { resolveAttribute("dataset", dataOut, evalInst); - } } - } @@ -994,7 +990,6 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { private void resolveDataSets(Element eAppXml) throws Exception { Element datasetList = eAppXml.getChild("datasets", eAppXml.getNamespace()); if (datasetList != null) { - List<Element> dsElems = datasetList.getChildren("dataset", eAppXml.getNamespace()); resolveDataSets(dsElems); resolveTagContents("app-path", eAppXml.getChild("action", eAppXml.getNamespace()).getChild("workflow", @@ -1018,9 +1013,9 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { int ival = ParamChecker.checkInteger(val, "frequency"); ParamChecker.checkGTZero(ival, "frequency"); addAnAttribute("freq_timeunit", dsElem, evalFreq.getVariable("timeunit") == null ? TimeUnit.MINUTE - .toString() : ((TimeUnit) evalFreq.getVariable("timeunit")).toString()); + .toString() : evalFreq.getVariable("timeunit").toString()); addAnAttribute("end_of_duration", dsElem, evalFreq.getVariable("endOfDuration") == null ? TimeUnit.NONE - .toString() : ((TimeUnit) evalFreq.getVariable("endOfDuration")).toString()); + .toString() : evalFreq.getVariable("endOfDuration").toString()); val = resolveAttribute("initial-instance", dsElem, evalInitialInstance); ParamChecker.checkDateOozieTZ(val, "initial-instance"); checkInitialInstance(val); @@ -1098,7 +1093,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { protected void includeDataSets(Element resolvedXml, Configuration conf) throws CoordinatorJobException { Element datasets = resolvedXml.getChild("datasets", resolvedXml.getNamespace()); Element allDataSets = new Element("all_datasets", resolvedXml.getNamespace()); - List<String> dsList = new ArrayList<String>(); + List<String> dsList = new ArrayList<>(); if (datasets != null) { for (Element includeElem : (List<Element>) datasets.getChildren("include", datasets.getNamespace())) { String incDSFile = includeElem.getTextTrim(); @@ -1132,7 +1127,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { @SuppressWarnings("unchecked") private void includeOneDSFile(String incDSFile, List<String> dsList, Element allDataSets, Namespace dsNameSpace) throws CoordinatorJobException { - Element tmpDataSets = null; + Element tmpDataSets; try { String dsXml = readDefinition(incDSFile); LOG.debug("DSFILE :" + incDSFile + "\n" + dsXml); @@ -1198,7 +1193,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { HadoopAccessorService has = Services.get().get(HadoopAccessorService.class); Configuration fsConf = has.createConfiguration(uri.getAuthority()); FileSystem fs = has.createFileSystem(user, uri, fsConf); - Path appDefPath = null; + Path appDefPath; // app path could be a directory Path path = new Path(uri.getPath()); @@ -1212,7 +1207,7 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { appDefPath = path; } - Reader reader = new InputStreamReader(fs.open(appDefPath)); + Reader reader = new InputStreamReader(fs.open(appDefPath), Charsets.UTF_8); StringWriter writer = new StringWriter(); IOUtils.copyCharStream(reader, writer); return writer.toString(); @@ -1319,12 +1314,10 @@ public class CoordSubmitXCommand extends SubmitTransitionXCommand { coordJob.setAppName(this.coordName); } setJob(coordJob); - } @Override protected void verifyPrecondition() throws CommandException { - } @Override http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/command/coord/CoordUpdateXCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/command/coord/CoordUpdateXCommand.java b/core/src/main/java/org/apache/oozie/command/coord/CoordUpdateXCommand.java index 502a800..9efff12 100644 --- a/core/src/main/java/org/apache/oozie/command/coord/CoordUpdateXCommand.java +++ b/core/src/main/java/org/apache/oozie/command/coord/CoordUpdateXCommand.java @@ -16,7 +16,6 @@ * limitations under the License. */ - package org.apache.oozie.command.coord; import java.io.ByteArrayOutputStream; @@ -24,6 +23,7 @@ import java.io.IOException; import java.io.StringReader; import java.util.Date; +import com.google.common.base.Charsets; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.oozie.CoordinatorJobBean; @@ -65,14 +65,14 @@ public class CoordUpdateXCommand extends CoordSubmitXCommand { public CoordUpdateXCommand(boolean dryrun, Configuration conf, String jobId) { super(dryrun, conf); this.jobId = jobId; - isConfChange = conf.size() == 0 ? false : true; + isConfChange = conf.size() != 0; } public CoordUpdateXCommand(boolean dryrun, Configuration conf, String jobId, boolean showDiff) { super(dryrun, conf); this.jobId = jobId; this.showDiff = showDiff; - isConfChange = conf.size() == 0 ? false : true; + isConfChange = conf.size() != 0; } @Override @@ -90,7 +90,6 @@ public class CoordUpdateXCommand extends CoordSubmitXCommand { oldCoordJob.setTimeout(coordJob.getTimeout()); oldCoordJob.setJobXml(XmlUtils.prettyPrint(eJob).toString()); - if (!dryrun) { oldCoordJob.setLastModifiedTime(new Date()); // Should log the changes, this should be useful for debugging. @@ -146,7 +145,6 @@ public class CoordUpdateXCommand extends CoordSubmitXCommand { coordJob.setConf(XmlUtils.prettyPrint(conf).toString()); setJob(coordJob); LogUtils.setLogInfo(coordJob); - } @Override @@ -164,7 +162,6 @@ public class CoordUpdateXCommand extends CoordSubmitXCommand { * @param eJob the e job * @return the diff */ - private void computeDiff(Element eJob) { try { diff.append("**********Job definition changes**********").append(System.getProperty("line.separator")); @@ -195,12 +192,12 @@ public class CoordUpdateXCommand extends CoordSubmitXCommand { */ private String getDiffinGitFormat(String string1, String string2) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); - RawText rt1 = new RawText(string1.getBytes()); - RawText rt2 = new RawText(string2.getBytes()); + RawText rt1 = new RawText(string1.getBytes(Charsets.UTF_8)); + RawText rt2 = new RawText(string2.getBytes(Charsets.UTF_8)); EditList diffList = new EditList(); diffList.addAll(new HistogramDiff().diff(RawTextComparator.DEFAULT, rt1, rt2)); new DiffFormatter(out).format(diffList, rt1, rt2); - return out.toString(); + return out.toString(Charsets.UTF_8.name()); } @Override http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/service/AuthorizationService.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/service/AuthorizationService.java b/core/src/main/java/org/apache/oozie/service/AuthorizationService.java index 251838c..6f72c41 100644 --- a/core/src/main/java/org/apache/oozie/service/AuthorizationService.java +++ b/core/src/main/java/org/apache/oozie/service/AuthorizationService.java @@ -21,17 +21,16 @@ package org.apache.oozie.service; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; -import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.ArrayList; import java.util.Set; import java.util.LinkedHashSet; + +import com.google.common.base.Charsets; import com.google.common.collect.Sets; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; @@ -140,14 +139,14 @@ public class AuthorizationService implements Service { String[] str = getTrimmedStrings(Services.get().getConf().get(CONF_ADMIN_GROUPS)); if (str.length > 0) { log.info("Admin users will be checked against the defined admin groups"); - adminGroups = new HashSet<String>(); + adminGroups = new HashSet<>(); for (String s : str) { adminGroups.add(s.trim()); } } else { log.info("Admin users will be checked against the 'adminusers.txt' file contents"); - adminUsers = new HashSet<String>(); + adminUsers = new HashSet<>(); loadAdminUsersFromFile(); loadAdminUsersFromConfiguration(); } @@ -194,7 +193,7 @@ public class AuthorizationService implements Service { if (file.exists()) { try { BufferedReader br = new BufferedReader( - new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)); + new InputStreamReader(new FileInputStream(file), Charsets.UTF_8)); try { String line = br.readLine(); while (line != null) { @@ -486,7 +485,7 @@ public class AuthorizationService implements Service { try { // handle workflow jobs if (jobId.endsWith("-W")) { - WorkflowJobBean jobBean = null; + WorkflowJobBean jobBean; JPAService jpaService = Services.get().get(JPAService.class); if (jpaService != null) { try { @@ -530,7 +529,7 @@ public class AuthorizationService implements Service { } // handle coordinator jobs else { - CoordinatorJobBean jobBean = null; + CoordinatorJobBean jobBean; JPAService jpaService = Services.get().get(JPAService.class); if (jpaService != null) { try { @@ -573,76 +572,74 @@ public class AuthorizationService implements Service { if (authorizationEnabled && write && !isAdmin(user)) { try { // handle workflow jobs - if (jobType.equals("wf")) { - List<WorkflowJobBean> jobBeans = new ArrayList<WorkflowJobBean>(); - JPAService jpaService = Services.get().get(JPAService.class); - if (jpaService != null) { - try { - jobBeans = jpaService.execute(new WorkflowsJobGetJPAExecutor( - filter, start, len)).getWorkflows(); - } - catch (JPAExecutorException je) { - throw new AuthorizationException(je); + switch (jobType) { + case "wf": { + List<WorkflowJobBean> jobBeans; + JPAService jpaService = Services.get().get(JPAService.class); + if (jpaService != null) { + try { + jobBeans = jpaService.execute(new WorkflowsJobGetJPAExecutor( + filter, start, len)).getWorkflows(); + } catch (JPAExecutorException je) { + throw new AuthorizationException(je); + } + } else { + throw new AuthorizationException(ErrorCode.E0610); } - } - else { - throw new AuthorizationException(ErrorCode.E0610); - } - for (WorkflowJobBean jobBean : jobBeans) { - if (jobBean != null && !jobBean.getUser().equals(user)) { - if (!isUserInAcl(user, jobBean.getGroup())) { + for (WorkflowJobBean jobBean : jobBeans) { + if (jobBean != null && !jobBean.getUser().equals(user)) { + if (!isUserInAcl(user, jobBean.getGroup())) { incrCounter(INSTR_FAILED_AUTH_COUNTER, 1); - throw new AuthorizationException(ErrorCode.E0508, user, jobBean.getId()); + throw new AuthorizationException(ErrorCode.E0508, user, jobBean.getId()); + } } } + break; } - } - // handle bundle jobs - else if (jobType.equals("bundle")) { - List<BundleJobBean> jobBeans = new ArrayList<BundleJobBean>(); - JPAService jpaService = Services.get().get(JPAService.class); - if (jpaService != null) { - try { - jobBeans = jpaService.execute(new BundleJobInfoGetJPAExecutor( - filter, start, len)).getBundleJobs(); - } - catch (JPAExecutorException je) { - throw new AuthorizationException(je); + // handle bundle jobs + case "bundle": { + List<BundleJobBean> jobBeans; + JPAService jpaService = Services.get().get(JPAService.class); + if (jpaService != null) { + try { + jobBeans = jpaService.execute(new BundleJobInfoGetJPAExecutor( + filter, start, len)).getBundleJobs(); + } catch (JPAExecutorException je) { + throw new AuthorizationException(je); + } + } else { + throw new AuthorizationException(ErrorCode.E0610); } - } - else { - throw new AuthorizationException(ErrorCode.E0610); - } - for (BundleJobBean jobBean : jobBeans){ - if (jobBean != null && !jobBean.getUser().equals(user)) { - if (!isUserInAcl(user, jobBean.getGroup())) { - incrCounter(INSTR_FAILED_AUTH_COUNTER, 1); - throw new AuthorizationException(ErrorCode.E0509, user, jobBean.getId()); + for (BundleJobBean jobBean : jobBeans) { + if (jobBean != null && !jobBean.getUser().equals(user)) { + if (!isUserInAcl(user, jobBean.getGroup())) { + incrCounter(INSTR_FAILED_AUTH_COUNTER, 1); + throw new AuthorizationException(ErrorCode.E0509, user, jobBean.getId()); + } } } + break; } - } - // handle coordinator jobs - else { - List<CoordinatorJobBean> jobBeans = new ArrayList<CoordinatorJobBean>(); - JPAService jpaService = Services.get().get(JPAService.class); - if (jpaService != null) { - try { - jobBeans = jpaService.execute(new CoordJobInfoGetJPAExecutor( - filter, start, len)).getCoordJobs(); - } - catch (JPAExecutorException je) { - throw new AuthorizationException(je); + // handle coordinator jobs + default: { + List<CoordinatorJobBean> jobBeans; + JPAService jpaService = Services.get().get(JPAService.class); + if (jpaService != null) { + try { + jobBeans = jpaService.execute(new CoordJobInfoGetJPAExecutor( + filter, start, len)).getCoordJobs(); + } catch (JPAExecutorException je) { + throw new AuthorizationException(je); + } + } else { + throw new AuthorizationException(ErrorCode.E0610); } - } - else { - throw new AuthorizationException(ErrorCode.E0610); - } - for (CoordinatorJobBean jobBean : jobBeans) { - if (jobBean != null && !jobBean.getUser().equals(user)) { - if (!isUserInAcl(user, jobBean.getGroup())) { - incrCounter(INSTR_FAILED_AUTH_COUNTER, 1); - throw new AuthorizationException(ErrorCode.E0509, user, jobBean.getId()); + for (CoordinatorJobBean jobBean : jobBeans) { + if (jobBean != null && !jobBean.getUser().equals(user)) { + if (!isUserInAcl(user, jobBean.getGroup())) { + incrCounter(INSTR_FAILED_AUTH_COUNTER, 1); + throw new AuthorizationException(ErrorCode.E0509, user, jobBean.getId()); + } } } } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/service/WorkflowAppService.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/service/WorkflowAppService.java b/core/src/main/java/org/apache/oozie/service/WorkflowAppService.java index c725f49..17d1d2e 100644 --- a/core/src/main/java/org/apache/oozie/service/WorkflowAppService.java +++ b/core/src/main/java/org/apache/oozie/service/WorkflowAppService.java @@ -18,6 +18,7 @@ package org.apache.oozie.service; +import com.google.common.base.Charsets; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; @@ -104,7 +105,6 @@ public abstract class WorkflowAppService implements Service { /** * Read workflow definition. * - * * @param appPath application path. * @param user user name. * @return workflow definition. @@ -129,7 +129,7 @@ public abstract class WorkflowAppService implements Service { throw new WorkflowException(ErrorCode.E0736, fsStatus.getLen(), this.maxWFLength); } - Reader reader = new InputStreamReader(fs.open(path)); + Reader reader = new InputStreamReader(fs.open(path), Charsets.UTF_8); StringWriter writer = new StringWriter(); IOUtils.copyCharStream(reader, writer); return writer.toString(); @@ -151,6 +151,7 @@ public abstract class WorkflowAppService implements Service { throw new WorkflowException(ErrorCode.E0710, ex.getMessage(), ex); } } + /** * Create proto configuration. <p> The proto configuration includes the user,group and the paths which need to be * added to distributed cache. These paths include .jar,.so and the resource file paths. @@ -169,7 +170,6 @@ public abstract class WorkflowAppService implements Service { Configuration conf = has.createConfiguration(uri.getAuthority()); XConfiguration protoConf = new XConfiguration(); - String user = jobConf.get(OozieClient.USER_NAME); conf.set(OozieClient.USER_NAME, user); protoConf.set(OozieClient.USER_NAME, user); @@ -191,15 +191,15 @@ public abstract class WorkflowAppService implements Service { } } else { - filePaths = new LinkedHashSet<String>(); + filePaths = new LinkedHashSet<>(); } String[] libPaths = jobConf.getStrings(OozieClient.LIBPATH); if (libPaths != null && libPaths.length > 0) { - for (int i = 0; i < libPaths.length; i++) { - if (libPaths[i].trim().length() > 0) { - Path libPath = new Path(libPaths[i].trim()); - Collection<String> libFilePaths = getLibFiles(fs, libPath); + for (String libPath : libPaths) { + if (libPath.trim().length() > 0) { + Path path = new Path(libPath.trim()); + Collection<String> libFilePaths = getLibFiles(fs, path); filePaths.addAll(libFilePaths); } } @@ -218,7 +218,7 @@ public abstract class WorkflowAppService implements Service { filePathsNames[i] = p.getName(); } Arrays.sort(filePathsNames); - List<String> nonDuplicateParentFilePaths = new ArrayList<String>(); + List<String> nonDuplicateParentFilePaths = new ArrayList<>(); for (String parentFilePath : parentFilePaths) { Path p = new Path(parentFilePath); if (Arrays.binarySearch(filePathsNames, p.getName()) < 0) { @@ -297,7 +297,7 @@ public abstract class WorkflowAppService implements Service { * @throws IOException thrown if the lib paths could not be obtained. */ private Collection<String> getLibFiles(FileSystem fs, Path libPath) throws IOException { - Set<String> libPaths = new LinkedHashSet<String>(); + Set<String> libPaths = new LinkedHashSet<>(); if (fs.exists(libPath)) { FileStatus[] files = fs.listStatus(libPath, new NoPathFilter()); http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/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 361141b..9acd571 100644 --- a/core/src/main/java/org/apache/oozie/servlet/V1JobServlet.java +++ b/core/src/main/java/org/apache/oozie/servlet/V1JobServlet.java @@ -26,6 +26,7 @@ import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import com.google.common.base.Charsets; import com.google.common.base.Strings; import org.apache.hadoop.conf.Configuration; import org.apache.oozie.*; @@ -49,7 +50,6 @@ import org.apache.oozie.util.graph.OutputFormat; import org.json.simple.JSONArray; import org.json.simple.JSONObject; - @SuppressWarnings("serial") public class V1JobServlet extends BaseJobServlet { @@ -58,7 +58,6 @@ public class V1JobServlet extends BaseJobServlet { final static String NOT_SUPPORTED_MESSAGE = "Not supported in v1"; - public V1JobServlet() { super(INSTRUMENTATION_NAME); } @@ -91,7 +90,6 @@ public class V1JobServlet extends BaseJobServlet { throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0303, RestConstants.ACTION_PARAM, RestConstants.JOB_ACTION_START); } - } /* @@ -227,10 +225,10 @@ public class V1JobServlet extends BaseJobServlet { ServletInputStream is = request.getInputStream(); byte[] b = new byte[101]; while (is.readLine(b, 0, 100) != -1) { - XLog.getLog(getClass()).warn("Printing :" + new String(b)); + XLog.getLog(getClass()).warn("Printing :" + new String(b, Charsets.UTF_8)); } - JsonBean jobBean = null; + JsonBean jobBean; String jobId = getResourceName(request); if (jobId.endsWith("-B")) { jobBean = getBundleJob(request, response); @@ -591,10 +589,7 @@ public class V1JobServlet extends BaseJobServlet { coordEngine.kill(jobId); } } - catch (CoordinatorEngineException ex) { - throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex); - } - catch (CommandException ex) { + catch (CoordinatorEngineException | CommandException ex) { throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex); } return json; @@ -690,7 +685,6 @@ public class V1JobServlet extends BaseJobServlet { */ private void rerunBundleJob(HttpServletRequest request, HttpServletResponse response, Configuration conf) throws XServletException { - JSONObject json = new JSONObject(); BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(getUser(request)); String jobId = getResourceName(request); @@ -753,18 +747,13 @@ public class V1JobServlet extends BaseJobServlet { } json.put(JsonTags.COORDINATOR_ACTIONS, CoordinatorActionBean.toJSONArray(coordActions, "GMT")); } - catch (BaseEngineException ex) { - throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex); - } - catch (CommandException ex) { + catch (BaseEngineException | CommandException ex) { throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex); } return json; } - - /** * Get workflow job * @@ -789,7 +778,7 @@ public class V1JobServlet extends BaseJobServlet { * @throws XServletException */ protected JsonBean getWorkflowJobBean(HttpServletRequest request, HttpServletResponse response) throws XServletException { - JsonBean jobBean = null; + JsonBean jobBean; String jobId = getResourceName(request); String startStr = request.getParameter(RestConstants.OFFSET_PARAM); String lenStr = request.getParameter(RestConstants.LEN_PARAM); @@ -829,7 +818,7 @@ public class V1JobServlet extends BaseJobServlet { } private String getConsoleBase(String url) { - String consoleBase = null; + String consoleBase; if (url.indexOf("application") != -1) { consoleBase = url.split("application_[0-9]+_[0-9]+")[0]; } @@ -849,7 +838,6 @@ public class V1JobServlet extends BaseJobServlet { */ protected JsonBean getWorkflowAction(HttpServletRequest request, HttpServletResponse response) throws XServletException { - JsonBean actionBean = getWorkflowActionBean(request, response); // for backward compatibility (OOZIE-1231) swapMRActionID((WorkflowAction)actionBean); @@ -882,7 +870,7 @@ public class V1JobServlet extends BaseJobServlet { */ protected JsonBean getCoordinatorJob(HttpServletRequest request, HttpServletResponse response) throws XServletException, BaseEngineException { - JsonBean jobBean = null; + JsonBean jobBean; CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine( getUser(request)); String jobId = getResourceName(request); @@ -931,12 +919,12 @@ public class V1JobServlet extends BaseJobServlet { */ private JsonBean getBundleJob(HttpServletRequest request, HttpServletResponse response) throws XServletException, BaseEngineException { - JsonBean jobBean = null; + JsonBean jobBean; BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(getUser(request)); String jobId = getResourceName(request); try { - jobBean = (JsonBean) bundleEngine.getBundleJob(jobId); + jobBean = bundleEngine.getBundleJob(jobId); return jobBean; } @@ -956,7 +944,7 @@ public class V1JobServlet extends BaseJobServlet { */ private JsonBean getCoordinatorAction(HttpServletRequest request, HttpServletResponse response) throws XServletException, BaseEngineException { - JsonBean actionBean = null; + JsonBean actionBean; CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine( getUser(request)); String actionId = getResourceName(request); @@ -1098,10 +1086,7 @@ public class V1JobServlet extends BaseJobServlet { try { coordEngine.streamLog(jobId, logRetrievalScope, logRetrievalType, response.getWriter(), request.getParameterMap()); } - catch (BaseEngineException ex) { - throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex); - } - catch (CommandException ex) { + catch (BaseEngineException | CommandException ex) { throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex); } } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/servlet/V2ValidateServlet.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/servlet/V2ValidateServlet.java b/core/src/main/java/org/apache/oozie/servlet/V2ValidateServlet.java index 36a9de2..8a0da93 100644 --- a/core/src/main/java/org/apache/oozie/servlet/V2ValidateServlet.java +++ b/core/src/main/java/org/apache/oozie/servlet/V2ValidateServlet.java @@ -18,6 +18,7 @@ package org.apache.oozie.servlet; +import com.google.common.base.Charsets; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; @@ -55,7 +56,6 @@ public class V2ValidateServlet extends JsonRestServlet { new ParameterInfo(RestConstants.USER_PARAM, String.class, true, Arrays.asList("POST")))); public static final String VALID_WORKFLOW_APP = "Valid workflow-app"; - public V2ValidateServlet() { super(INSTRUMENTATION_NAME, RESOURCE_INFO); } @@ -82,15 +82,14 @@ public class V2ValidateServlet extends JsonRestServlet { FileSystem fs = has.createFileSystem(user, uri, fsConf); Path path = new Path(uri.getPath()); - IOUtils.copyCharStream(new InputStreamReader(fs.open(path)), stringWriter); - + IOUtils.copyCharStream(new InputStreamReader(fs.open(path), Charsets.UTF_8), stringWriter); } catch (Exception e) { throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0505, "File does not exist, "+ file); } } else { - IOUtils.copyCharStream(new InputStreamReader(request.getInputStream()), stringWriter); + IOUtils.copyCharStream(new InputStreamReader(request.getInputStream(), Charsets.UTF_8), stringWriter); } try { validate(stringWriter.toString()); @@ -147,5 +146,4 @@ public class V2ValidateServlet extends JsonRestServlet { jsonObject.put(JsonTags.VALIDATE, content); return jsonObject; } - } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/util/AuthUrlClient.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/util/AuthUrlClient.java b/core/src/main/java/org/apache/oozie/util/AuthUrlClient.java index 4fc8f57..d7f19b2 100644 --- a/core/src/main/java/org/apache/oozie/util/AuthUrlClient.java +++ b/core/src/main/java/org/apache/oozie/util/AuthUrlClient.java @@ -16,7 +16,6 @@ * limitations under the License. */ - package org.apache.oozie.util; import java.io.BufferedReader; @@ -30,6 +29,7 @@ import java.net.URLEncoder; import java.security.PrivilegedExceptionAction; import java.util.Map; +import com.google.common.base.Charsets; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.authentication.client.AuthenticatedURL; import org.apache.hadoop.security.authentication.client.AuthenticationException; @@ -64,13 +64,7 @@ public class AuthUrlClient { try { conn = new AuthenticatedURL(AuthenticatorClass.newInstance()).openConnection(url, token); } - catch (AuthenticationException ex) { - throw new IOException("Could not authenticate, " + ex.getMessage(), ex); - } - catch (InstantiationException ex) { - throw new IOException("Could not authenticate, " + ex.getMessage(), ex); - } - catch (IllegalAccessException ex) { + catch (AuthenticationException | InstantiationException | IllegalAccessException ex) { throw new IOException("Could not authenticate, " + ex.getMessage(), ex); } if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { @@ -94,14 +88,16 @@ public class AuthUrlClient { throw new IOException("Authentication type must be specified: simple|kerberos|<class>"); } authName = authName.trim(); - if (authName.equals("simple")) { - authClassName = PseudoAuthenticator.class.getName(); - } - else if (authName.equals("kerberos")) { - authClassName = KerberosAuthenticator.class.getName(); - } - else { - authClassName = authName; + switch (authName) { + case "simple": + authClassName = PseudoAuthenticator.class.getName(); + break; + case "kerberos": + authClassName = KerberosAuthenticator.class.getName(); + break; + default: + authClassName = authName; + break; } authClass = (Class<? extends Authenticator>) Thread.currentThread().getContextClassLoader() @@ -123,7 +119,7 @@ public class AuthUrlClient { } final URL url = new URL(server); - BufferedReader reader = null; + BufferedReader reader; try { reader = UserGroupInformation.getLoginUser().doAs(new PrivilegedExceptionAction<BufferedReader>() { @Override @@ -133,7 +129,7 @@ public class AuthUrlClient { BufferedReader reader = null; if ((conn.getResponseCode() == HttpURLConnection.HTTP_OK)) { InputStream is = conn.getInputStream(); - reader = new BufferedReader(new InputStreamReader(is)); + reader = new BufferedReader(new InputStreamReader(is, Charsets.UTF_8)); } return reader; } @@ -156,10 +152,9 @@ public class AuthUrlClient { String value = params.get(key)[0]; // We don't support multi value. stringBuilder.append(key); stringBuilder.append("="); - stringBuilder.append(URLEncoder.encode(value,"UTF-8")); + stringBuilder.append(URLEncoder.encode(value,Charsets.UTF_8.name())); } } return stringBuilder.toString(); } - } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/util/IOUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/util/IOUtils.java b/core/src/main/java/org/apache/oozie/util/IOUtils.java index 3674dc4..94db257 100644 --- a/core/src/main/java/org/apache/oozie/util/IOUtils.java +++ b/core/src/main/java/org/apache/oozie/util/IOUtils.java @@ -18,6 +18,8 @@ package org.apache.oozie.util; +import com.google.common.base.Charsets; + import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -116,7 +118,7 @@ public abstract class IOUtils { * @throws IOException thrown if the resource could not be read. */ public static Reader getResourceAsReader(String path, int maxLen) throws IOException { - return new InputStreamReader(getResourceAsStream(path, maxLen)); + return new InputStreamReader(getResourceAsStream(path, maxLen), Charsets.UTF_8); } /** @@ -133,7 +135,7 @@ public abstract class IOUtils { if (is == null) { throw new IllegalArgumentException(XLog.format("resource [{0}] not found", path)); } - Reader reader = new InputStreamReader(is); + Reader reader = new InputStreamReader(is, Charsets.UTF_8); return getReaderAsString(reader, maxLen); } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/util/MultiFileReader.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/util/MultiFileReader.java b/core/src/main/java/org/apache/oozie/util/MultiFileReader.java index 1ab5a7a..9078f36 100644 --- a/core/src/main/java/org/apache/oozie/util/MultiFileReader.java +++ b/core/src/main/java/org/apache/oozie/util/MultiFileReader.java @@ -18,6 +18,8 @@ package org.apache.oozie.util; +import com.google.common.base.Charsets; + import java.io.File; import java.io.FileInputStream; import java.io.FileReader; @@ -79,11 +81,11 @@ public class MultiFileReader extends Reader { // gzip files if (files.get(index).getName().endsWith(".gz")) { GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(files.get(index))); - reader = new InputStreamReader(gzipInputStream); + reader = new InputStreamReader(gzipInputStream, Charsets.UTF_8); } // regular files else { - reader = new FileReader(files.get(index)); + reader = new InputStreamReader(new FileInputStream(files.get(index)), Charsets.UTF_8); } index++; } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/util/XConfiguration.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/util/XConfiguration.java b/core/src/main/java/org/apache/oozie/util/XConfiguration.java index e3591db..d9e16e9 100644 --- a/core/src/main/java/org/apache/oozie/util/XConfiguration.java +++ b/core/src/main/java/org/apache/oozie/util/XConfiguration.java @@ -18,6 +18,7 @@ package org.apache.oozie.util; +import com.google.common.base.Charsets; import org.apache.hadoop.conf.Configuration; import org.apache.oozie.service.ConfigurationService; import org.apache.oozie.service.Services; @@ -283,10 +284,7 @@ public class XConfiguration extends Configuration { parseDocument(doc); } - catch (SAXException e) { - throw new IOException(e); - } - catch (ParserConfigurationException e) { + catch (SAXException | ParserConfigurationException e) { throw new IOException(e); } } @@ -297,10 +295,7 @@ public class XConfiguration extends Configuration { Document doc = getDocumentBuilder().parse(new InputSource(reader)); parseDocument(doc); } - catch (SAXException e) { - throw new IOException(e); - } - catch (ParserConfigurationException e) { + catch (SAXException | ParserConfigurationException e) { throw new IOException(e); } } @@ -351,7 +346,6 @@ public class XConfiguration extends Configuration { set(attr, value); } } - } catch (DOMException e) { throw new IOException(e); @@ -373,7 +367,7 @@ public class XConfiguration extends Configuration { ByteArrayOutputStream baos = new ByteArrayOutputStream(); this.writeXml(baos); baos.close(); - xml = new String(baos.toByteArray()); + xml = new String(baos.toByteArray(), Charsets.UTF_8); } catch (IOException ex) { throw new RuntimeException("It should not happen, " + ex.getMessage(), ex); http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/core/src/main/java/org/apache/oozie/util/XmlUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/util/XmlUtils.java b/core/src/main/java/org/apache/oozie/util/XmlUtils.java index 9db46b3..054d5d9 100644 --- a/core/src/main/java/org/apache/oozie/util/XmlUtils.java +++ b/core/src/main/java/org/apache/oozie/util/XmlUtils.java @@ -46,6 +46,7 @@ import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; +import com.google.common.base.Charsets; import org.apache.hadoop.conf.Configuration; import org.apache.oozie.service.SchemaService; import org.apache.oozie.service.SchemaService.SchemaName; @@ -164,10 +165,7 @@ public class XmlUtils { Document doc = saxBuilder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath)); return doc.getRootElement().getAttributeValue(attributeName); } - catch (JDOMException e) { - throw new RuntimeException(); - } - catch (IOException e) { + catch (JDOMException | IOException e) { throw new RuntimeException(); } } @@ -221,7 +219,6 @@ public class XmlUtils { */ public static PrettyPrint prettyPrint(Element element) { return new PrettyPrint(element); - } /** @@ -271,7 +268,7 @@ public class XmlUtils { */ public static void validateXml(Schema schema, String xml) throws SAXException, IOException { Validator validator = SchemaService.getValidator(schema); - validator.validate(new StreamSource(new ByteArrayInputStream(xml.getBytes()))); + validator.validate(new StreamSource(new ByteArrayInputStream(xml.getBytes(Charsets.UTF_8)))); } public static void validateData(String xmlData, SchemaName xsdFile) throws SAXException, IOException { @@ -402,9 +399,8 @@ public class XmlUtils { public static Element getSLAElement(Element elem) { Element eSla_1 = elem.getChild("info", Namespace.getNamespace(SchemaService.SLA_NAME_SPACE_URI)); Element eSla_2 = elem.getChild("info", Namespace.getNamespace(SchemaService.SLA_NAMESPACE_URI_2)); - Element eSla = (eSla_2 != null) ? eSla_2 : eSla_1; - return eSla; + return (eSla_2 != null) ? eSla_2 : eSla_1; } } http://git-wip-us.apache.org/repos/asf/oozie/blob/2f6bced4/release-log.txt ---------------------------------------------------------------------- diff --git a/release-log.txt b/release-log.txt index 9847b7b..5bb8fad 100644 --- a/release-log.txt +++ b/release-log.txt @@ -1,5 +1,6 @@ -- Oozie 5.1.0 release (trunk - unreleased) +OOZIE-2956 Fix Findbugs warnings related to reliance on default encoding in oozie-core (Jan Hentschel, kmarton via andras.piros) OOZIE-3295 Flaky test TestSLACalculatorMemory#testAddMultipleRestartRemoveMultipleInstrumentedCorrectly (pbacsko via andras.piros) OOZIE-3289 TestJMSAccessorService#testConnectionRetry is still flaky (pbacsko via andras.piros) OOZIE-3270 Upgrade Derby to 10.14.1.0 (gezapeti)
