This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch branch_1x
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/branch_1x by this push:
     new 0f7e86c  TIKA-2753 -- use -javaHome or $JAVA_HOME when starting child 
process w -spawnChild mode in tika-server
0f7e86c is described below

commit 0f7e86cced275c2db3e2456685acf24fcf44e286
Author: TALLISON <talli...@apache.org>
AuthorDate: Fri Oct 12 11:44:34 2018 -0400

    TIKA-2753 -- use -javaHome or $JAVA_HOME when starting child process w 
-spawnChild mode in tika-server
    
    # Conflicts:
    #   CHANGES.txt
---
 CHANGES.txt                                        |  3 +-
 .../java/org/apache/tika/utils/ProcessUtils.java   |  3 +-
 .../java/org/apache/tika/server/TikaServerCli.java |  3 +-
 .../org/apache/tika/server/TikaServerWatchDog.java | 41 ++++++++++++++++++++--
 4 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 5f45479..1f793d2 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,7 @@
 Release 1.20 - ???
 
-
+   * Use -javaHome or $JAVA_HOME (if they exist) when
+     spawning child in tika-server's -spawnChild mode.
 
 Release 1.19.1 - 10/4/2018
 
diff --git a/tika-core/src/main/java/org/apache/tika/utils/ProcessUtils.java 
b/tika-core/src/main/java/org/apache/tika/utils/ProcessUtils.java
index 83beda2..dba1893 100644
--- a/tika-core/src/main/java/org/apache/tika/utils/ProcessUtils.java
+++ b/tika-core/src/main/java/org/apache/tika/utils/ProcessUtils.java
@@ -33,7 +33,8 @@ public class ProcessUtils {
         }
         //need to test for " " on windows, can't just add double quotes
         //across platforms.
-        if (arg.contains(" ") && SystemUtils.IS_OS_WINDOWS) {
+        if (arg.contains(" ") && SystemUtils.IS_OS_WINDOWS &&
+                (!arg.startsWith("\"") && !arg.endsWith("\""))) {
             arg = "\"" + arg + "\"";
         }
         return arg;
diff --git 
a/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java 
b/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java
index ef95a32..d63a515 100644
--- a/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java
+++ b/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java
@@ -84,7 +84,7 @@ public class TikaServerCli {
 
     private static final List<String> ONLY_IN_SPAWN_CHILD_MODE =
             Arrays.asList(new String[] { "taskTimeoutMillis", 
"taskPulseMillis",
-            "pingTimeoutMillis", "pingPulseMillis", "maxFiles"});
+            "pingTimeoutMillis", "pingPulseMillis", "maxFiles", "javaHome"});
 
     private static Options getOptions() {
         Options options = new Options();
@@ -106,6 +106,7 @@ public class TikaServerCli {
         options.addOption("pingPulseMillis", true, "Only in spawn child mode: 
how often to check if a ping has timed out.");
 
         options.addOption("maxFiles", true, "Only in spawn child mode: 
shutdown server after this many files -- use only in 'spawnChild' mode");
+        options.addOption("javaHome", true, "Override system property 
JAVA_HOME for calling java for the child process");
         options.addOption("child", false, "this process is a child process -- 
EXPERT -- " +
                 "should normally only be invoked by parent process");
         return options;
diff --git 
a/tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java 
b/tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java
index abd5663..2452430 100644
--- a/tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java
+++ b/tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java
@@ -18,6 +18,8 @@
 package org.apache.tika.server;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.tika.utils.ProcessUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -25,10 +27,14 @@ import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.time.Duration;
 import java.time.Instant;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
 public class TikaServerWatchDog {
@@ -123,11 +129,40 @@ public class TikaServerWatchDog {
             if (args[i].startsWith("-J") || args[i].equals("-spawnChild") || 
args[i].equals("--spawnChild")) {
                 continue;
             }
+            if (args[i].equals("-javaHome")) {
+                if (i == args.length-1) {
+                    throw new IllegalArgumentException("must specify a value 
for -javaHome");
+                }
+                i++;//skip argument value
+                continue;
+            }
+
             argList.add(args[i]);
         }
         return argList;
     }
 
+    private static String extractJavaPath(String[] args) {
+        String javaHome = null;
+        for (int i = 0; i < args.length; i++) {
+            if (args[i].equals("-javaHome")) {
+                if (i == args.length-1) {
+                    throw new IllegalArgumentException("must specify a value 
for -javaHome");
+                }
+                javaHome = args[i+1];
+                break;
+            }
+        }
+        if (javaHome == null) {
+            javaHome = System.getenv("JAVA_HOME");
+        }
+        if (javaHome != null) {
+            Path jPath = Paths.get(javaHome).resolve("bin").resolve("java");
+            return ProcessUtils.escapeCommandLine(
+                    jPath.toAbsolutePath().toString());
+        }
+        return "java";
+    }
     private static List<String> extractJVMArgs(String[] args) {
         List<String> jvmArgs = new ArrayList<>();
         boolean foundHeadlessOption = false;
@@ -231,9 +266,11 @@ public class TikaServerWatchDog {
             ProcessBuilder builder = new ProcessBuilder();
             builder.redirectError(ProcessBuilder.Redirect.INHERIT);
             List<String> argList = new ArrayList<>();
+            String javaPath = extractJavaPath(args);
             List<String> jvmArgs = extractJVMArgs(args);
             List<String> childArgs = extractArgs(args);
-            argList.add("java");
+
+            argList.add(javaPath);
             if (! jvmArgs.contains("-cp") && ! 
jvmArgs.contains("--classpath")) {
                 String cp = System.getProperty("java.class.path");
                 jvmArgs.add("-cp");
@@ -243,7 +280,7 @@ public class TikaServerWatchDog {
             argList.add("org.apache.tika.server.TikaServerCli");
             argList.addAll(childArgs);
             argList.add("-child");
-
+            LOG.debug("child process commandline: " +argList.toString());
             builder.command(argList);
             Process process = builder.start();
             if (SHUTDOWN_HOOK != null) {

Reply via email to