You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2022/05/03 15:30:56 UTC

[tika] branch main updated: TIKA-3748 -- allow expansion of system properties into forked process system properties.

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 33aa848cf TIKA-3748 -- allow expansion of system properties into forked process system properties.
33aa848cf is described below

commit 33aa848cfbe1f725c1a92be6d9d9067698478d5a
Author: tallison <ta...@apache.org>
AuthorDate: Tue May 3 11:30:41 2022 -0400

    TIKA-3748 -- allow expansion of system properties into forked process system properties.
---
 CHANGES.txt                                        |  5 +++
 .../apache/tika/server/core/TikaServerConfig.java  | 39 +++++++++++++++++++++-
 .../tika/server/core/TikaServerWatchDog.java       |  2 --
 .../tika/server/core/TikaServerConfigTest.java     | 20 +++++++++++
 4 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 1fbbd8ed0..e815c5557 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,8 @@
+Release 2.4.1 - ???
+
+   * Users can expand system properties from the forking
+     process into forked tika-server processes (TIKA-3748).
+
 Release 2.4.0 - 04/23/2022
 
    * NOTE: To save on resources, we no longer include the
diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
index f0afbc6aa..4a00ba0ba 100644
--- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
@@ -31,6 +31,8 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.commons.cli.CommandLine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
@@ -44,6 +46,10 @@ import org.apache.tika.utils.XMLReaderUtils;
 
 public class TikaServerConfig extends ConfigBase {
 
+    private static final Logger LOG = LoggerFactory.getLogger(TikaServerConfig.class);
+
+    private static Pattern SYS_PROPS = Pattern.compile("\\$\\{sys:([-_0-9A-Za-z]+)\\}");
+
     public static final int DEFAULT_PORT = 9998;
     public static final String DEFAULT_HOST = "localhost";
     public static final Set<String> LOG_LEVELS = new HashSet<>(Arrays.asList("debug", "info"));
@@ -394,9 +400,10 @@ public class TikaServerConfig extends ConfigBase {
     }
 
     public void setForkedJvmArgs(List<String> forkedJvmArgs) {
-        this.forkedJvmArgs = new ArrayList<>(forkedJvmArgs);
+        this.forkedJvmArgs = new ArrayList<>(interpolateSysProps(forkedJvmArgs));
     }
 
+
     public String getTempFilePrefix() {
         return tempFilePrefix;
     }
@@ -615,4 +622,34 @@ public class TikaServerConfig extends ConfigBase {
     public Set<String> getSupportedEmitters() {
         return supportedEmitters;
     }
+
+    protected static List<String> interpolateSysProps(List<String> forkedJvmArgs) {
+        List<String> ret = new ArrayList<>();
+        for (String arg : forkedJvmArgs) {
+            if (arg.startsWith("-D")) {
+                String interpolated = interpolate(arg);
+                ret.add(interpolated);
+            } else {
+                ret.add(arg);
+            }
+        }
+        return ret;
+    }
+
+    private static String interpolate(String arg) {
+        StringBuffer sb = new StringBuffer();
+        Matcher m = SYS_PROPS.matcher(arg);
+        while (m.find()) {
+            String prop = System.getProperty(m.group(1));
+            LOG.debug("interpolating {} -> {}", m.group(1), prop);
+            if (prop == null) {
+                LOG.warn("no system property set for {}, falling back to {}", m.group(1), arg);
+                return arg;
+            }
+            m.appendReplacement(sb, prop);
+        }
+        m.appendTail(sb);
+        return sb.toString();
+    }
+
 }
diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerWatchDog.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerWatchDog.java
index 650a7e2c0..91eaec464 100644
--- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerWatchDog.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerWatchDog.java
@@ -398,8 +398,6 @@ public class TikaServerWatchDog implements Callable<WatchDogResult> {
             argList.add(Integer.toString(numRestarts));
             LOG.debug("forked process commandline: " + argList.toString());
             builder.command(argList);
-            //copy forking processes' env variables
-            builder.environment().putAll(System.getenv());
             //now overwrite with the specific server id
             //this is mostly for log4j 2.x so that different processes
             //can log to different log files via {env:tika.server.id}
diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerConfigTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerConfigTest.java
index 57ae3281e..916c092e8 100644
--- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerConfigTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerConfigTest.java
@@ -21,7 +21,9 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import org.apache.commons.cli.CommandLine;
@@ -114,4 +116,22 @@ public class TikaServerConfigTest {
         System.out.println(tlsConfig);
     }
 
+    @Test
+    public void testInterpolation() throws Exception {
+        List<String> input = new ArrayList<>();
+        System.setProperty("logpath", "qwertyuiop");
+        try {
+            input.add("-Dlogpath=\"${sys:logpath}\"");
+            input.add("-Dlogpath=no-interpolation");
+            input.add("-Xlogpath=\"${sys:logpath}\"");
+
+            List<String> output = TikaServerConfig.interpolateSysProps(input);
+            assertEquals("-Dlogpath=\"qwertyuiop\"", output.get(0));
+            assertEquals("-Dlogpath=no-interpolation", output.get(1));
+            assertEquals("-Xlogpath=\"${sys:logpath}\"", output.get(2));
+
+        } finally {
+            System.clearProperty("logpath");
+        }
+    }
 }