From 5b77613ec628b22d72ac6fcd8239895c7ed8ae5c Mon Sep 17 00:00:00 2001 From: Ben Sidhom Date: Tue, 27 Mar 2018 15:42:53 -0700 Subject: [PATCH] Use character replacement instead of regex for artifact flattening --- .../construction/ArtifactServiceStager.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/runners/core-construction-java/src/main/java/org/apache/beam/runners/core/construction/ArtifactServiceStager.java b/runners/core-construction-java/src/main/java/org/apache/beam/runners/core/construction/ArtifactServiceStager.java index 58866f13e6482..ccda95c377fa1 100644 --- a/runners/core-construction-java/src/main/java/org/apache/beam/runners/core/construction/ArtifactServiceStager.java +++ b/runners/core-construction-java/src/main/java/org/apache/beam/runners/core/construction/ArtifactServiceStager.java @@ -18,11 +18,7 @@ package org.apache.beam.runners.core.construction; -import static com.google.common.base.Preconditions.checkState; - import com.google.auto.value.AutoValue; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; import com.google.common.io.BaseEncoding; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; @@ -47,8 +43,6 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicReference; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.annotation.Nullable; import org.apache.beam.model.jobmanagement.v1.ArtifactApi.ArtifactChunk; import org.apache.beam.model.jobmanagement.v1.ArtifactApi.ArtifactMetadata; @@ -67,13 +61,6 @@ public class ArtifactServiceStager { // 2 MB per file-request private static final int DEFAULT_BUFFER_SIZE = 2 * 1024 * 1024; - private static final Pattern PATH_ESCAPE_PATTERN = Pattern.compile("[_\\\\/.]"); - private static final Map PATH_ESCAPE_MAP = ImmutableMap.of( - "_", Matcher.quoteReplacement("__"), - "\\", Matcher.quoteReplacement("_."), - "/", Matcher.quoteReplacement("._"), - ".", Matcher.quoteReplacement("..")); - public static ArtifactServiceStager overChannel(Channel channel) { return overChannel(channel, DEFAULT_BUFFER_SIZE); } @@ -260,14 +247,26 @@ boolean isSuccess() { } private static String escapePath(String path) { - Matcher m = PATH_ESCAPE_PATTERN.matcher(path); - StringBuffer result = new StringBuffer(); - while (m.find()) { - String replacement = PATH_ESCAPE_MAP.get(m.group()); - checkState(replacement != null); - m.appendReplacement(result, replacement); + StringBuilder result = new StringBuilder(path.length() * 2); + for (int i = 0; i < path.length(); i++) { + char c = path.charAt(i); + switch (c) { + case '_': + result.append("__"); + break; + case '\\': + result.append("_."); + break; + case '/': + result.append("._"); + break; + case '.': + result.append(".."); + break; + default: + result.append(c); + } } - m.appendTail(result); return result.toString(); } }