diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/resources/visitor/ResourceTreeVisitor.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/resources/visitor/ResourceTreeVisitor.java index 5cf118800a..391822e535 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/resources/visitor/ResourceTreeVisitor.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/resources/visitor/ResourceTreeVisitor.java @@ -50,6 +50,7 @@ public class ResourceTreeVisitor implements Visitor{ * visit * @return resoruce component */ + @Override public ResourceComponent visit() { ResourceComponent rootDirectory = new Directory(); for (Resource resource : resourceList) { @@ -117,6 +118,7 @@ public class ResourceTreeVisitor implements Visitor{ }else{ tempResourceComponent = new FileLeaf(); } + tempResourceComponent.setName(resource.getAlias()); tempResourceComponent.setFullName(resource.getFullName().replaceFirst("/","")); tempResourceComponent.setId(resource.getId()); diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ResourcesService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ResourcesService.java index 8f3075476e..ef1251964c 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ResourcesService.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ResourcesService.java @@ -104,7 +104,7 @@ public class ResourcesService extends BaseService { putMsg(result, Status.HDFS_NOT_STARTUP); return result; } - String fullName = currentDir.equals("/") ? String.format("%s%s",currentDir,name):String.format("%s/%s",currentDir,name); + String fullName = "/".equals(currentDir) ? String.format("%s%s",currentDir,name):String.format("%s/%s",currentDir,name); if (pid != -1) { Resource parentResource = resourcesMapper.selectById(pid); @@ -229,7 +229,7 @@ public class ResourcesService extends BaseService { } // check resoure name exists - String fullName = currentDir.equals("/") ? String.format("%s%s",currentDir,name):String.format("%s/%s",currentDir,name); + String fullName = "/".equals(currentDir) ? String.format("%s%s",currentDir,name):String.format("%s/%s",currentDir,name); if (checkResourceExists(fullName, 0, type.ordinal())) { logger.error("resource {} has exist, can't recreate", name); putMsg(result, Status.RESOURCE_EXIST); @@ -839,7 +839,7 @@ public class ResourcesService extends BaseService { } String name = fileName.trim() + "." + nameSuffix; - String fullName = currentDirectory.equals("/") ? String.format("%s%s",currentDirectory,name):String.format("%s/%s",currentDirectory,name); + String fullName = "/".equals(currentDirectory) ? String.format("%s%s",currentDirectory,name):String.format("%s/%s",currentDirectory,name); result = verifyResourceName(fullName,type,loginUser); if (!result.getCode().equals(Status.SUCCESS.getCode())) { diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/task/datax/DataxParameters.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/task/datax/DataxParameters.java index 872b3aa174..a6f08cd628 100755 --- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/task/datax/DataxParameters.java +++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/task/datax/DataxParameters.java @@ -187,7 +187,9 @@ public class DataxParameters extends AbstractParameters { @Override public boolean checkParameters() { - if (customConfig == null) return false; + if (customConfig == null) { + return false; + } if (customConfig == 0) { return dataSource != 0 && dataTarget != 0 diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/OSUtils.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/OSUtils.java index 3505e59fb5..652b981e1e 100644 --- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/OSUtils.java +++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/OSUtils.java @@ -57,6 +57,12 @@ public class OSUtils { private OSUtils() {} + /** + * Initialization regularization, solve the problem of pre-compilation performance, + * avoid the thread safety problem of multi-thread operation + */ + private static final Pattern PATTERN = Pattern.compile("\\s+"); + /** * get memory usage @@ -219,8 +225,7 @@ public class OSUtils { List users = new ArrayList<>(); while (startPos <= endPos) { - Pattern pattern = Pattern.compile("\\s+"); - users.addAll(Arrays.asList(pattern.split(lines[startPos]))); + users.addAll(Arrays.asList(PATTERN.split(lines[startPos]))); startPos++; } @@ -313,7 +318,7 @@ public class OSUtils { String currentProcUserName = System.getProperty("user.name"); String result = exeCmd(String.format("net user \"%s\"", currentProcUserName)); String line = result.split("\n")[22]; - String group = Pattern.compile("\\s+").split(line)[1]; + String group = PATTERN.split(line)[1]; if (group.charAt(0) == '*') { return group.substring(1); } else { diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessBuilderForWin32.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessBuilderForWin32.java index eee456d019..9d51eaec1c 100644 --- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessBuilderForWin32.java +++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessBuilderForWin32.java @@ -189,8 +189,9 @@ public class ProcessBuilderForWin32 { * @throws NullPointerException if the argument is null */ public ProcessBuilderForWin32(List command) { - if (command == null) + if (command == null) { throw new NullPointerException(); + } this.command = command; } @@ -207,8 +208,9 @@ public class ProcessBuilderForWin32 { */ public ProcessBuilderForWin32(String... command) { this.command = new ArrayList<>(command.length); - for (String arg : command) + for (String arg : command) { this.command.add(arg); + } } /** @@ -238,8 +240,9 @@ public class ProcessBuilderForWin32 { * @throws NullPointerException if the argument is null */ public ProcessBuilderForWin32 command(List command) { - if (command == null) + if (command == null) { throw new NullPointerException(); + } this.command = command; return this; } @@ -257,8 +260,9 @@ public class ProcessBuilderForWin32 { */ public ProcessBuilderForWin32 command(String... command) { this.command = new ArrayList<>(command.length); - for (String arg : command) + for (String arg : command) { this.command.add(arg); + } return this; } @@ -344,11 +348,13 @@ public class ProcessBuilderForWin32 { */ public Map environment() { SecurityManager security = System.getSecurityManager(); - if (security != null) + if (security != null) { security.checkPermission(new RuntimePermission("getenv.*")); + } - if (environment == null) + if (environment == null) { environment = ProcessEnvironmentForWin32.environment(); + } assert environment != null; @@ -369,15 +375,17 @@ public class ProcessBuilderForWin32 { // for compatibility with old broken code. // Silently discard any trailing junk. - if (envstring.indexOf((int) '\u0000') != -1) + if (envstring.indexOf((int) '\u0000') != -1) { envstring = envstring.replaceFirst("\u0000.*", ""); + } int eqlsign = envstring.indexOf('=', ProcessEnvironmentForWin32.MIN_NAME_LENGTH); // Silently ignore envstrings lacking the required `='. - if (eqlsign != -1) + if (eqlsign != -1) { environment.put(envstring.substring(0,eqlsign), envstring.substring(eqlsign+1)); + } } } return this; @@ -425,6 +433,7 @@ public class ProcessBuilderForWin32 { static class NullInputStream extends InputStream { static final ProcessBuilderForWin32.NullInputStream INSTANCE = new ProcessBuilderForWin32.NullInputStream(); private NullInputStream() {} + @Override public int read() { return -1; } @Override public int available() { return 0; } @@ -436,6 +445,7 @@ public class ProcessBuilderForWin32 { static class NullOutputStream extends OutputStream { static final ProcessBuilderForWin32.NullOutputStream INSTANCE = new ProcessBuilderForWin32.NullOutputStream(); private NullOutputStream() {} + @Override public void write(int b) throws IOException { throw new IOException("Stream closed"); } @@ -516,7 +526,9 @@ public class ProcessBuilderForWin32 { * } */ public static final ProcessBuilderForWin32.Redirect PIPE = new ProcessBuilderForWin32.Redirect() { + @Override public Type type() { return Type.PIPE; } + @Override public String toString() { return type().toString(); }}; /** @@ -531,7 +543,9 @@ public class ProcessBuilderForWin32 { * } */ public static final ProcessBuilderForWin32.Redirect INHERIT = new ProcessBuilderForWin32.Redirect() { + @Override public Type type() { return Type.INHERIT; } + @Override public String toString() { return type().toString(); }}; /** @@ -565,12 +579,15 @@ public class ProcessBuilderForWin32 { * @return a redirect to read from the specified file */ public static ProcessBuilderForWin32.Redirect from(final File file) { - if (file == null) + if (file == null) { throw new NullPointerException(); + } return new ProcessBuilderForWin32.Redirect() { + @Override public Type type() { return Type.READ; } @Override public File file() { return file; } + @Override public String toString() { return "redirect to read from file \"" + file + "\""; } @@ -593,12 +610,15 @@ public class ProcessBuilderForWin32 { * @return a redirect to write to the specified file */ public static ProcessBuilderForWin32.Redirect to(final File file) { - if (file == null) + if (file == null) { throw new NullPointerException(); + } return new ProcessBuilderForWin32.Redirect() { + @Override public Type type() { return Type.WRITE; } @Override public File file() { return file; } + @Override public String toString() { return "redirect to write to file \"" + file + "\""; } @@ -626,12 +646,15 @@ public class ProcessBuilderForWin32 { * @return a redirect to append to the specified file */ public static ProcessBuilderForWin32.Redirect appendTo(final File file) { - if (file == null) + if (file == null) { throw new NullPointerException(); + } return new ProcessBuilderForWin32.Redirect() { + @Override public Type type() { return Type.APPEND; } @Override public File file() { return file; } + @Override public String toString() { return "redirect to append to file \"" + file + "\""; } @@ -647,14 +670,18 @@ public class ProcessBuilderForWin32 { * instances of the same type associated with non-null equal * {@code File} instances. */ + @Override public boolean equals(Object obj) { - if (obj == this) + if (obj == this) { return true; - if (! (obj instanceof ProcessBuilderForWin32.Redirect)) + } + if (! (obj instanceof ProcessBuilderForWin32.Redirect)) { return false; + } ProcessBuilderForWin32.Redirect r = (ProcessBuilderForWin32.Redirect) obj; - if (r.type() != this.type()) + if (r.type() != this.type()) { return false; + } assert this.file() != null; return this.file().equals(r.file()); } @@ -663,12 +690,14 @@ public class ProcessBuilderForWin32 { * Returns a hash code value for this {@code Redirect}. * @return a hash code value for this {@code Redirect} */ + @Override public int hashCode() { File file = file(); - if (file == null) + if (file == null) { return super.hashCode(); - else + } else { return file.hashCode(); + } } /** @@ -679,10 +708,11 @@ public class ProcessBuilderForWin32 { } private ProcessBuilderForWin32.Redirect[] redirects() { - if (redirects == null) - redirects = new ProcessBuilderForWin32.Redirect[] { - ProcessBuilderForWin32.Redirect.PIPE, ProcessBuilderForWin32.Redirect.PIPE, ProcessBuilderForWin32.Redirect.PIPE + if (redirects == null) { + redirects = new Redirect[] { + Redirect.PIPE, Redirect.PIPE, Redirect.PIPE }; + } return redirects; } @@ -711,9 +741,10 @@ public class ProcessBuilderForWin32 { */ public ProcessBuilderForWin32 redirectInput(ProcessBuilderForWin32.Redirect source) { if (source.type() == ProcessBuilderForWin32.Redirect.Type.WRITE || - source.type() == ProcessBuilderForWin32.Redirect.Type.APPEND) + source.type() == ProcessBuilderForWin32.Redirect.Type.APPEND) { throw new IllegalArgumentException( "Redirect invalid for reading: " + source); + } redirects()[0] = source; return this; } @@ -741,9 +772,10 @@ public class ProcessBuilderForWin32 { * @since 1.7 */ public ProcessBuilderForWin32 redirectOutput(ProcessBuilderForWin32.Redirect destination) { - if (destination.type() == ProcessBuilderForWin32.Redirect.Type.READ) + if (destination.type() == ProcessBuilderForWin32.Redirect.Type.READ) { throw new IllegalArgumentException( "Redirect invalid for writing: " + destination); + } redirects()[1] = destination; return this; } @@ -775,9 +807,10 @@ public class ProcessBuilderForWin32 { * @since 1.7 */ public ProcessBuilderForWin32 redirectError(ProcessBuilderForWin32.Redirect destination) { - if (destination.type() == ProcessBuilderForWin32.Redirect.Type.READ) + if (destination.type() == ProcessBuilderForWin32.Redirect.Type.READ) { throw new IllegalArgumentException( "Redirect invalid for writing: " + destination); + } redirects()[2] = destination; return this; } @@ -1019,15 +1052,18 @@ public class ProcessBuilderForWin32 { String[] cmdarray = command.toArray(new String[command.size()]); cmdarray = cmdarray.clone(); - for (String arg : cmdarray) - if (arg == null) + for (String arg : cmdarray) { + if (arg == null) { throw new NullPointerException(); + } + } // Throws IndexOutOfBoundsException if command is empty String prog = cmdarray[0]; SecurityManager security = System.getSecurityManager(); - if (security != null) + if (security != null) { security.checkExec(prog); + } String dir = directory == null ? null : directory.toString(); diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessEnvironmentForWin32.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessEnvironmentForWin32.java index 39fddfbad9..85d9a2120c 100644 --- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessEnvironmentForWin32.java +++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessEnvironmentForWin32.java @@ -27,22 +27,25 @@ final class ProcessEnvironmentForWin32 extends HashMap { private static String validateName(String name) { // An initial `=' indicates a magic Windows variable name -- OK if (name.indexOf('=', 1) != -1 || - name.indexOf('\u0000') != -1) + name.indexOf('\u0000') != -1) { throw new IllegalArgumentException ("Invalid environment variable name: \"" + name + "\""); + } return name; } private static String validateValue(String value) { - if (value.indexOf('\u0000') != -1) + if (value.indexOf('\u0000') != -1) { throw new IllegalArgumentException ("Invalid environment variable value: \"" + value + "\""); + } return value; } private static String nonNullString(Object o) { - if (o == null) + if (o == null) { throw new NullPointerException(); + } return (String) o; } @@ -70,26 +73,38 @@ final class ProcessEnvironmentForWin32 extends HashMap { private static class CheckedEntry implements Entry { private final Entry e; public CheckedEntry(Entry e) {this.e = e;} + @Override public String getKey() { return e.getKey();} + @Override public String getValue() { return e.getValue();} + @Override public String setValue(String value) { return e.setValue(validateValue(value)); } + @Override public String toString() { return getKey() + "=" + getValue();} + @Override public boolean equals(Object o) {return e.equals(o);} + @Override public int hashCode() {return e.hashCode();} } private static class CheckedEntrySet extends AbstractSet> { private final Set> s; public CheckedEntrySet(Set> s) {this.s = s;} + @Override public int size() {return s.size();} + @Override public boolean isEmpty() {return s.isEmpty();} + @Override public void clear() { s.clear();} + @Override public Iterator> iterator() { return new Iterator>() { Iterator> i = s.iterator(); + @Override public boolean hasNext() { return i.hasNext();} + @Override public Entry next() { return new CheckedEntry(i.next()); } @@ -104,18 +119,22 @@ final class ProcessEnvironmentForWin32 extends HashMap { nonNullString(e.getValue()); return e; } + @Override public boolean contains(Object o) {return s.contains(checkedEntry(o));} + @Override public boolean remove(Object o) {return s.remove(checkedEntry(o));} } private static class CheckedValues extends AbstractCollection { private final Collection c; public CheckedValues(Collection c) {this.c = c;} + @Override public int size() {return c.size();} @Override public boolean isEmpty() {return c.isEmpty();} @Override public void clear() { c.clear();} + @Override public Iterator iterator() {return c.iterator();} @Override public boolean contains(Object o) {return c.contains(nonNullString(o));} @@ -126,11 +145,17 @@ final class ProcessEnvironmentForWin32 extends HashMap { private static class CheckedKeySet extends AbstractSet { private final Set s; public CheckedKeySet(Set s) {this.s = s;} + @Override public int size() {return s.size();} + @Override public boolean isEmpty() {return s.isEmpty();} + @Override public void clear() { s.clear();} + @Override public Iterator iterator() {return s.iterator();} + @Override public boolean contains(Object o) {return s.contains(nonNullString(o));} + @Override public boolean remove(Object o) {return s.remove(nonNullString(o));} } @Override @@ -147,6 +172,7 @@ final class ProcessEnvironmentForWin32 extends HashMap { } private static final class NameComparator implements Comparator { + @Override public int compare(String s1, String s2) { // We can't use String.compareToIgnoreCase since it // canonicalizes to lower case, while Windows @@ -163,7 +189,9 @@ final class ProcessEnvironmentForWin32 extends HashMap { c2 = Character.toUpperCase(c2); if (c1 != c2) // No overflow because of numeric promotion + { return c1 - c2; + } } } return n1 - n2; @@ -171,6 +199,7 @@ final class ProcessEnvironmentForWin32 extends HashMap { } private static final class EntryComparator implements Comparator> { + @Override public int compare(Entry e1, Entry e2) { return nameComparator.compare(e1.getKey(), e2.getKey()); @@ -278,8 +307,9 @@ final class ProcessEnvironmentForWin32 extends HashMap { // add the environment variable to the child, if it exists in parent private static void addToEnvIfSet(StringBuilder sb, String name) { String s = getenv(name); - if (s != null) + if (s != null) { addToEnv(sb, name, s); + } } private static void addToEnv(StringBuilder sb, String name, String val) { diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessImplForWin32.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessImplForWin32.java index 4f6d719ef3..1efde52e62 100644 --- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessImplForWin32.java +++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/process/ProcessImplForWin32.java @@ -93,13 +93,15 @@ public class ProcessImplForWin32 extends Process { if (append) { String path = f.getPath(); SecurityManager sm = System.getSecurityManager(); - if (sm != null) + if (sm != null) { sm.checkWrite(path); + } long handle = openForAtomicAppend(path); final FileDescriptor fd = new FileDescriptor(); setHandle(fd, handle); return AccessController.doPrivileged( new PrivilegedAction() { + @Override public FileOutputStream run() { return new FileOutputStream(fd); } @@ -133,30 +135,30 @@ public class ProcessImplForWin32 extends Process { } else { stdHandles = new long[3]; - if (redirects[0] == ProcessBuilderForWin32.Redirect.PIPE) + if (redirects[0] == ProcessBuilderForWin32.Redirect.PIPE) { stdHandles[0] = -1L; - else if (redirects[0] == ProcessBuilderForWin32.Redirect.INHERIT) + } else if (redirects[0] == ProcessBuilderForWin32.Redirect.INHERIT) { stdHandles[0] = getHandle(FileDescriptor.in); - else { + } else { f0 = new FileInputStream(redirects[0].file()); stdHandles[0] = getHandle(f0.getFD()); } - if (redirects[1] == ProcessBuilderForWin32.Redirect.PIPE) + if (redirects[1] == ProcessBuilderForWin32.Redirect.PIPE) { stdHandles[1] = -1L; - else if (redirects[1] == ProcessBuilderForWin32.Redirect.INHERIT) + } else if (redirects[1] == ProcessBuilderForWin32.Redirect.INHERIT) { stdHandles[1] = getHandle(FileDescriptor.out); - else { + } else { f1 = newFileOutputStream(redirects[1].file(), redirects[1].append()); stdHandles[1] = getHandle(f1.getFD()); } - if (redirects[2] == ProcessBuilderForWin32.Redirect.PIPE) + if (redirects[2] == ProcessBuilderForWin32.Redirect.PIPE) { stdHandles[2] = -1L; - else if (redirects[2] == ProcessBuilderForWin32.Redirect.INHERIT) + } else if (redirects[2] == ProcessBuilderForWin32.Redirect.INHERIT) { stdHandles[2] = getHandle(FileDescriptor.err); - else { + } else { f2 = newFileOutputStream(redirects[2].file(), redirects[2].append()); stdHandles[2] = getHandle(f2.getFD()); @@ -167,10 +169,19 @@ public class ProcessImplForWin32 extends Process { } finally { // In theory, close() can throw IOException // (although it is rather unlikely to happen here) - try { if (f0 != null) f0.close(); } + try { if (f0 != null) { + f0.close(); + } + } finally { - try { if (f1 != null) f1.close(); } - finally { if (f2 != null) f2.close(); } + try { if (f1 != null) { + f1.close(); + } + } + finally { if (f2 != null) { + f2.close(); + } + } } } @@ -193,8 +204,9 @@ public class ProcessImplForWin32 extends Process { private static String[] getTokensFromCommand(String command) { ArrayList matchList = new ArrayList<>(8); Matcher regexMatcher = ProcessImplForWin32.LazyPattern.PATTERN.matcher(command); - while (regexMatcher.find()) + while (regexMatcher.find()) { matchList.add(regexMatcher.group()); + } return matchList.toArray(new String[matchList.size()]); } @@ -378,8 +390,9 @@ public class ProcessImplForWin32 extends Process { // .bat files don't include backslashes as part of the quote private static int countLeadingBackslash(int verificationType, CharSequence input, int start) { - if (verificationType == VERIFICATION_CMD_BAT) + if (verificationType == VERIFICATION_CMD_BAT) { return 0; + } int j; for (j = start - 1; j >= 0 && input.charAt(j) == BACKSLASH; j--) { // just scanning backwards @@ -417,8 +430,9 @@ public class ProcessImplForWin32 extends Process { String executablePath = new File(cmd[0]).getPath(); // No worry about internal, unpaired ["], and redirection/piping. - if (needsEscaping(VERIFICATION_LEGACY, executablePath) ) + if (needsEscaping(VERIFICATION_LEGACY, executablePath) ) { executablePath = quoteString(executablePath); + } cmdstr = createCommandLine( //legacy mode doesn't worry about extended verification @@ -442,16 +456,18 @@ public class ProcessImplForWin32 extends Process { // Restore original command line. StringBuilder join = new StringBuilder(); // terminal space in command line is ok - for (String s : cmd) + for (String s : cmd) { join.append(s).append(' '); + } // Parse the command line again. cmd = getTokensFromCommand(join.toString()); executablePath = getExecutablePath(cmd[0]); // Check new executable name once more - if (security != null) + if (security != null) { security.checkExec(executablePath); + } } // Quotation protects from interpretation of the [path] argument as @@ -471,28 +487,29 @@ public class ProcessImplForWin32 extends Process { AccessController.doPrivileged( new PrivilegedAction() { + @Override public Void run() { - if (stdHandles[0] == -1L) + if (stdHandles[0] == -1L) { stdinStream = ProcessBuilderForWin32.NullOutputStream.INSTANCE; - else { + } else { FileDescriptor stdinFd = new FileDescriptor(); setHandle(stdinFd, stdHandles[0]); stdinStream = new BufferedOutputStream( new FileOutputStream(stdinFd)); } - if (stdHandles[1] == -1L) + if (stdHandles[1] == -1L) { stdoutStream = ProcessBuilderForWin32.NullInputStream.INSTANCE; - else { + } else { FileDescriptor stdoutFd = new FileDescriptor(); setHandle(stdoutFd, stdHandles[1]); stdoutStream = new BufferedInputStream( new FileInputStream(stdoutFd)); } - if (stdHandles[2] == -1L) + if (stdHandles[2] == -1L) { stderrStream = ProcessBuilderForWin32.NullInputStream.INSTANCE; - else { + } else { FileDescriptor stderrFd = new FileDescriptor(); setHandle(stderrFd, stdHandles[2]); stderrStream = new FileInputStream(stderrFd); @@ -501,33 +518,41 @@ public class ProcessImplForWin32 extends Process { return null; }}); } + @Override public OutputStream getOutputStream() { return stdinStream; } + @Override public InputStream getInputStream() { return stdoutStream; } + @Override public InputStream getErrorStream() { return stderrStream; } + @Override protected void finalize() { closeHandle(handle); } + @Override public int exitValue() { int exitCode = getExitCodeProcess(handle); - if (exitCode == STILL_ACTIVE) + if (exitCode == STILL_ACTIVE) { throw new IllegalThreadStateException("process has not exited"); + } return exitCode; } + @Override public int waitFor() throws InterruptedException { waitForInterruptibly(handle); - if (Thread.interrupted()) + if (Thread.interrupted()) { throw new InterruptedException(); + } return exitValue(); } @@ -535,8 +560,12 @@ public class ProcessImplForWin32 extends Process { public boolean waitFor(long timeout, TimeUnit unit) throws InterruptedException { - if (getExitCodeProcess(handle) != STILL_ACTIVE) return true; - if (timeout <= 0) return false; + if (getExitCodeProcess(handle) != STILL_ACTIVE) { + return true; + } + if (timeout <= 0) { + return false; + } long remainingNanos = unit.toNanos(timeout); long deadline = System.nanoTime() + remainingNanos ; @@ -545,8 +574,9 @@ public class ProcessImplForWin32 extends Process { // Round up to next millisecond long msTimeout = TimeUnit.NANOSECONDS.toMillis(remainingNanos + 999_999L); waitForTimeoutInterruptibly(handle, msTimeout); - if (Thread.interrupted()) + if (Thread.interrupted()) { throw new InterruptedException(); + } if (getExitCodeProcess(handle) != STILL_ACTIVE) { return true; } @@ -556,6 +586,7 @@ public class ProcessImplForWin32 extends Process { return (getExitCodeProcess(handle) != STILL_ACTIVE); } + @Override public void destroy() { terminateProcess(handle); } @Override diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessInstanceMap.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessInstanceMap.java index 637d573b11..58e5411563 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessInstanceMap.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessInstanceMap.java @@ -91,14 +91,24 @@ public class ProcessInstanceMap { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } ProcessInstanceMap that = (ProcessInstanceMap) o; - if (id != that.id) return false; - if (parentProcessInstanceId != that.parentProcessInstanceId) return false; - if (parentTaskInstanceId != that.parentTaskInstanceId) return false; + if (id != that.id) { + return false; + } + if (parentProcessInstanceId != that.parentProcessInstanceId) { + return false; + } + if (parentTaskInstanceId != that.parentTaskInstanceId) { + return false; + } return processInstanceId == that.processInstanceId; } diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Queue.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Queue.java index 5d8f7e2149..57b678d2a7 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Queue.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Queue.java @@ -104,13 +104,21 @@ public class Queue { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Queue queue1 = (Queue) o; - if (id != queue1.id) return false; - if (!queueName.equals(queue1.queueName)) return false; + if (id != queue1.id) { + return false; + } + if (!queueName.equals(queue1.queueName)) { + return false; + } return queue.equals(queue1.queue); } diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Session.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Session.java index 83bf2461c1..39bf6143dd 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Session.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Session.java @@ -93,14 +93,24 @@ public class Session { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Session session = (Session) o; - if (userId != session.userId) return false; - if (!id.equals(session.id)) return false; - if (!lastLoginTime.equals(session.lastLoginTime)) return false; + if (userId != session.userId) { + return false; + } + if (!id.equals(session.id)) { + return false; + } + if (!lastLoginTime.equals(session.lastLoginTime)) { + return false; + } return ip.equals(session.ip); } diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Tenant.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Tenant.java index bf23ad58cf..a289f4f1f5 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Tenant.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/Tenant.java @@ -166,8 +166,12 @@ public class Tenant { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Tenant tenant = (Tenant) o; diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/utils/MysqlPerformance.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/utils/MysqlPerformance.java index 1e1ee78036..e7e9c70f47 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/utils/MysqlPerformance.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/utils/MysqlPerformance.java @@ -56,7 +56,7 @@ public class MysqlPerformance extends BaseDBPerformance{ try (ResultSet rs1 = pstmt.executeQuery("show global variables")) { while(rs1.next()){ - if(rs1.getString(VARIABLE_NAME).equalsIgnoreCase("MAX_CONNECTIONS")){ + if("MAX_CONNECTIONS".equalsIgnoreCase(rs1.getString(VARIABLE_NAME))){ monitorRecord.setMaxConnections( Long.parseLong(rs1.getString("value"))); } } @@ -64,11 +64,11 @@ public class MysqlPerformance extends BaseDBPerformance{ try (ResultSet rs2 = pstmt.executeQuery("show global status")) { while(rs2.next()){ - if(rs2.getString(VARIABLE_NAME).equalsIgnoreCase("MAX_USED_CONNECTIONS")){ + if("MAX_USED_CONNECTIONS".equalsIgnoreCase(rs2.getString(VARIABLE_NAME))){ monitorRecord.setMaxUsedConnections(Long.parseLong(rs2.getString("value"))); - }else if(rs2.getString(VARIABLE_NAME).equalsIgnoreCase("THREADS_CONNECTED")){ + }else if("THREADS_CONNECTED".equalsIgnoreCase(rs2.getString(VARIABLE_NAME))){ monitorRecord.setThreadsConnections(Long.parseLong(rs2.getString("value"))); - }else if(rs2.getString(VARIABLE_NAME).equalsIgnoreCase("THREADS_RUNNING")){ + }else if("THREADS_RUNNING".equalsIgnoreCase(rs2.getString(VARIABLE_NAME))){ monitorRecord.setThreadsRunningConnections(Long.parseLong(rs2.getString("value"))); } } diff --git a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/utils/ProcessUtils.java b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/utils/ProcessUtils.java index 5074a5e0f5..310ab62bf1 100644 --- a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/utils/ProcessUtils.java +++ b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/utils/ProcessUtils.java @@ -46,6 +46,14 @@ public class ProcessUtils { */ private final static Logger logger = LoggerFactory.getLogger(ProcessUtils.class); + /** + * Initialization regularization, solve the problem of pre-compilation performance, + * avoid the thread safety problem of multi-thread operation + */ + private static final Pattern MACPATTERN = Pattern.compile("-[+|-]-\\s(\\d+)"); + + private static final Pattern WINDOWSATTERN = Pattern.compile("(\\d+)"); + /** * build command line characters * @param commandList command list @@ -356,10 +364,10 @@ public class ProcessUtils { // pstree pid get sub pids if (OSUtils.isMacOS()) { String pids = OSUtils.exeCmd("pstree -sp " + processId); - mat = Pattern.compile("-[+|-]-\\s(\\d+)").matcher(pids); + mat = MACPATTERN.matcher(pids); } else { String pids = OSUtils.exeCmd("pstree -p " + processId); - mat = Pattern.compile("(\\d+)").matcher(pids); + mat = WINDOWSATTERN.matcher(pids); } while (mat.find()){ diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/AbstractZKClient.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/AbstractZKClient.java index e75e20becb..a27a89af45 100644 --- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/AbstractZKClient.java +++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/AbstractZKClient.java @@ -272,7 +272,7 @@ public abstract class AbstractZKClient extends ZookeeperCachedOperator { try { mutex.release(); } catch (Exception e) { - if(e.getMessage().equals("instance must be started before calling this method")){ + if("instance must be started before calling this method".equals(e.getMessage())){ logger.warn("lock release"); }else{ logger.error("lock release failed",e);