From fbf6bdaf01607a9b934d02b53a062e45539d6140 Mon Sep 17 00:00:00 2001 From: Andrey Bruykhov Date: Tue, 7 Feb 2023 17:28:03 +0300 Subject: [PATCH] [MNG-7686] Speed up by replacing non-pattern #replaceAll() with #replace() or precompiled patterns This closes #984 --- .../activation/JdkPrefixProfileActivator.java | 2 +- .../maven/project/AbstractMavenProjectTestCase.java | 6 +++--- .../maven/project/ClasspathArtifactResolver.java | 5 +++-- .../org/apache/maven/project/TestProjectBuilder.java | 3 ++- .../maven/internal/MultilineMessageHelper.java | 5 ++++- .../plugin/PluginParameterExpressionEvaluator.java | 6 +----- .../maven/settings/DefaultMavenSettingsBuilder.java | 9 +++++---- .../maven/project/AbstractMavenProjectTestCase.java | 6 +++--- .../src/main/java/org/apache/maven/cli/MavenCli.java | 4 +++- .../activation/JdkVersionProfileActivator.java | 11 ++++++++--- .../maven/plugin/descriptor/PluginDescriptor.java | 5 ++++- .../internal/RemoteSnapshotMetadataTest.java | 7 +++++-- .../validation/DefaultSettingsValidator.java | 12 ++++++------ 13 files changed, 48 insertions(+), 33 deletions(-) diff --git a/maven-compat/src/main/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivator.java b/maven-compat/src/main/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivator.java index 736f8fdd56..a1e9b9b880 100644 --- a/maven-compat/src/main/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivator.java +++ b/maven-compat/src/main/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivator.java @@ -68,7 +68,7 @@ public class JdkPrefixProfileActivator extends DetectedProfileActivator { } private String convertJdkToMavenVersion(String jdk) { - return jdk.replaceAll("_", "-"); + return jdk.replace("_", "-"); } protected String getJdkVersion() { diff --git a/maven-compat/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java b/maven-compat/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java index 02d4c300e5..0d827eaa03 100644 --- a/maven-compat/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java +++ b/maven-compat/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java @@ -20,7 +20,6 @@ package org.apache.maven.project; import java.io.File; import java.io.FileNotFoundException; -import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Arrays; @@ -92,7 +91,8 @@ public abstract class AbstractMavenProjectTestCase extends PlexusTestCase { return markerFile.getAbsoluteFile().getParentFile(); } - protected static File getFileForClasspathResource(String resource) throws FileNotFoundException { + protected static File getFileForClasspathResource(String resource) + throws FileNotFoundException, URISyntaxException { ClassLoader cloader = Thread.currentThread().getContextClassLoader(); URL resourceUrl = cloader.getResource(resource); @@ -101,7 +101,7 @@ public abstract class AbstractMavenProjectTestCase extends PlexusTestCase { throw new FileNotFoundException("Unable to find: " + resource); } - return new File(URI.create(resourceUrl.toString().replaceAll(" ", "%20"))); + return new File(resourceUrl.toURI()); } protected ArtifactRepository getLocalRepository() throws Exception { diff --git a/maven-compat/src/test/java/org/apache/maven/project/ClasspathArtifactResolver.java b/maven-compat/src/test/java/org/apache/maven/project/ClasspathArtifactResolver.java index 0cef04d774..4fdb7b0dea 100644 --- a/maven-compat/src/test/java/org/apache/maven/project/ClasspathArtifactResolver.java +++ b/maven-compat/src/test/java/org/apache/maven/project/ClasspathArtifactResolver.java @@ -19,6 +19,7 @@ package org.apache.maven.project; import java.io.FileNotFoundException; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -56,8 +57,8 @@ public class ClasspathArtifactResolver implements ArtifactResolver { artifact = artifact.setFile(ProjectClasspathTest.getFileForClasspathResource( ProjectClasspathTest.dir + "transitive-" + scope + "-dep.xml")); result.setArtifact(artifact); - } catch (FileNotFoundException e) { - throw new IllegalStateException("Missing test POM for " + artifact); + } catch (FileNotFoundException | URISyntaxException e) { + throw new IllegalStateException("Missing test POM for " + artifact, e); } } else { result.addException(new ArtifactNotFoundException(artifact, null)); diff --git a/maven-compat/src/test/java/org/apache/maven/project/TestProjectBuilder.java b/maven-compat/src/test/java/org/apache/maven/project/TestProjectBuilder.java index 79c8edc379..3403067a53 100644 --- a/maven-compat/src/test/java/org/apache/maven/project/TestProjectBuilder.java +++ b/maven-compat/src/test/java/org/apache/maven/project/TestProjectBuilder.java @@ -20,6 +20,7 @@ package org.apache.maven.project; import java.io.File; import java.io.FileNotFoundException; +import java.net.URISyntaxException; import java.util.Collections; import org.apache.maven.artifact.Artifact; @@ -38,7 +39,7 @@ public class TestProjectBuilder extends DefaultProjectBuilder { try { artifact.setFile(ProjectClasspathTest.getFileForClasspathResource( ProjectClasspathTest.dir + "transitive-" + scope + "-dep.xml")); - } catch (FileNotFoundException e) { + } catch (FileNotFoundException | URISyntaxException e) { throw new IllegalStateException("Missing test POM for " + artifact); } } diff --git a/maven-core/src/main/java/org/apache/maven/internal/MultilineMessageHelper.java b/maven-core/src/main/java/org/apache/maven/internal/MultilineMessageHelper.java index 0e52e4c61a..9ff2d200e0 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/MultilineMessageHelper.java +++ b/maven-core/src/main/java/org/apache/maven/internal/MultilineMessageHelper.java @@ -20,6 +20,7 @@ package org.apache.maven.internal; import java.util.ArrayList; import java.util.List; +import java.util.regex.Pattern; /** * Helper class to format multiline messages to the console @@ -29,6 +30,8 @@ public class MultilineMessageHelper { private static final int DEFAULT_MAX_SIZE = 65; private static final char BOX_CHAR = '*'; + private static final Pattern S_FILTER = Pattern.compile("\\s+"); + public static String separatorLine() { StringBuilder sb = new StringBuilder(DEFAULT_MAX_SIZE); repeat(sb, '*', DEFAULT_MAX_SIZE); @@ -47,7 +50,7 @@ public class MultilineMessageHelper { // lines for (String line : lines) { sb.setLength(0); - String[] words = line.split("\\s+"); + String[] words = S_FILTER.split(line); for (String word : words) { if (sb.length() >= remainder - word.length() - (sb.length() > 0 ? 1 : 0)) { repeat(sb, ' ', remainder - sb.length()); diff --git a/maven-core/src/main/java/org/apache/maven/plugin/PluginParameterExpressionEvaluator.java b/maven-core/src/main/java/org/apache/maven/plugin/PluginParameterExpressionEvaluator.java index 4623c51668..dd62795e49 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/PluginParameterExpressionEvaluator.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/PluginParameterExpressionEvaluator.java @@ -173,11 +173,7 @@ public class PluginParameterExpressionEvaluator implements TypeAwareExpressionEv } // Was not an expression - if (expression.contains("$$")) { - return expression.replaceAll("\\$\\$", "\\$"); - } else { - return expression; - } + return expression.replace("$$", "$"); } MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor(); diff --git a/maven-core/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java b/maven-core/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java index 4361590d1b..9b1254f506 100644 --- a/maven-core/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java +++ b/maven-core/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java @@ -112,11 +112,12 @@ public class DefaultMavenSettingsBuilder extends AbstractLogEnabled implements M basedir = System.getProperty("user.dir"); } - basedir = basedir.replaceAll("\\\\", "/"); - basedir = basedir.replaceAll("\\$", "\\\\\\$"); + basedir = basedir.replace("\\", "/"); + basedir = basedir.replace("$", "\\$"); - path = pathPattern.replaceAll("\\$\\{" + basedirSysProp + "\\}", basedir); - path = path.replaceAll("\\\\", "/"); + // basedirSysProp is non regexp and basedir too + path = pathPattern.replace("${" + basedirSysProp + "}", basedir); + path = path.replace("\\", "/"); // --------------------------------------------------------------------------------- // I'm not sure if this last regexp was really intended to disallow the usage of // network paths as user.home directory. Unfortunately it did. I removed it and diff --git a/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java b/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java index 0b37a02bc2..0ce4925c84 100644 --- a/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java +++ b/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java @@ -20,7 +20,6 @@ package org.apache.maven.project; import java.io.File; import java.io.FileNotFoundException; -import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Arrays; @@ -90,7 +89,8 @@ public abstract class AbstractMavenProjectTestCase extends PlexusTestCase { return markerFile.getAbsoluteFile().getParentFile(); } - protected static File getFileForClasspathResource(String resource) throws FileNotFoundException { + protected static File getFileForClasspathResource(String resource) + throws FileNotFoundException, URISyntaxException { ClassLoader cloader = Thread.currentThread().getContextClassLoader(); URL resourceUrl = cloader.getResource(resource); @@ -99,7 +99,7 @@ public abstract class AbstractMavenProjectTestCase extends PlexusTestCase { throw new FileNotFoundException("Unable to find: " + resource); } - return new File(URI.create(resourceUrl.toString().replaceAll(" ", "%20"))); + return new File(resourceUrl.toURI()); } protected ArtifactRepository getLocalRepository() throws Exception { diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java index 7824709c47..61b0e60f68 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java @@ -169,6 +169,8 @@ public class MavenCli { private CLIManager cliManager; + private static final Pattern NEXT_LINE = Pattern.compile("\r?\n"); + public MavenCli() { this(null); } @@ -932,7 +934,7 @@ public class MavenCli { } } - String[] lines = msg.split("(\r\n)|(\r)|(\n)"); + String[] lines = NEXT_LINE.split(msg); String currentColor = ""; for (int i = 0; i < lines.length; i++) { diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/JdkVersionProfileActivator.java b/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/JdkVersionProfileActivator.java index 33b41a41ef..993241775a 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/JdkVersionProfileActivator.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/JdkVersionProfileActivator.java @@ -24,6 +24,7 @@ import javax.inject.Singleton; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.regex.Pattern; import org.apache.maven.model.Activation; import org.apache.maven.model.Profile; @@ -43,6 +44,10 @@ import org.apache.maven.model.profile.ProfileActivationContext; @Singleton public class JdkVersionProfileActivator implements ProfileActivator { + private static final Pattern FILTER_1 = Pattern.compile("[^0-9._-]"); + private static final Pattern FILTER_2 = Pattern.compile("[._-]"); + private static final Pattern FILTER_3 = Pattern.compile("\\."); // used for split now + @Override public boolean isActive(Profile profile, ProfileActivationContext context, ModelProblemCollector problems) { Activation activation = profile.getActivation(); @@ -110,10 +115,10 @@ public class JdkVersionProfileActivator implements ProfileActivator { return isLeft ? 1 : -1; } - value = value.replaceAll("[^0-9\\.\\-\\_]", ""); + value = FILTER_1.matcher(value).replaceAll(""); - List valueTokens = new ArrayList<>(Arrays.asList(value.split("[\\.\\-\\_]"))); - List rangeValueTokens = new ArrayList<>(Arrays.asList(rangeValue.value.split("\\."))); + List valueTokens = new ArrayList<>(Arrays.asList(FILTER_2.split(value))); + List rangeValueTokens = new ArrayList<>(Arrays.asList(FILTER_3.split(rangeValue.value))); addZeroTokens(valueTokens, 3); addZeroTokens(rangeValueTokens, 3); diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java index fdf683d66a..e4f5cc4935 100644 --- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java +++ b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.ArtifactUtils; @@ -49,6 +50,8 @@ public class PluginDescriptor extends ComponentSetDescriptor implements Cloneabl private static final String LIFECYCLE_DESCRIPTOR = "META-INF/maven/lifecycle.xml"; + private static final Pattern PATTERN_FILTER_1 = Pattern.compile("-?(maven|plugin)-?"); + private String groupId; private String artifactId; @@ -164,7 +167,7 @@ public class PluginDescriptor extends ComponentSetDescriptor implements Cloneabl if ("maven-plugin-plugin".equals(artifactId)) { return "plugin"; } else { - return artifactId.replaceAll("-?maven-?", "").replaceAll("-?plugin-?", ""); + return PATTERN_FILTER_1.matcher(artifactId).replaceAll(""); } } diff --git a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/RemoteSnapshotMetadataTest.java b/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/RemoteSnapshotMetadataTest.java index 752a6b0c82..63473f5f57 100644 --- a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/RemoteSnapshotMetadataTest.java +++ b/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/RemoteSnapshotMetadataTest.java @@ -25,6 +25,7 @@ import java.util.GregorianCalendar; import java.util.HashSet; import java.util.Locale; import java.util.Set; +import java.util.regex.Pattern; import org.apache.maven.artifact.repository.metadata.Metadata; import org.eclipse.aether.artifact.DefaultArtifact; @@ -37,6 +38,8 @@ import static org.junit.Assert.assertTrue; public class RemoteSnapshotMetadataTest { private Locale defaultLocale; + private static final Pattern DATE_FILTER = Pattern.compile("\\..*"); + @Before public void setLocaleToUseBuddhistCalendar() { defaultLocale = Locale.getDefault(); @@ -66,10 +69,10 @@ public class RemoteSnapshotMetadataTest { String dateAfter = gregorianDate(); String ts = metadata.metadata.getVersioning().getSnapshot().getTimestamp(); - String datePart = ts.replaceAll("\\..*", ""); + String datePart = DATE_FILTER.matcher(ts).replaceAll(""); /* Allow for this test running across midnight */ - Set expected = new HashSet(Arrays.asList(dateBefore, dateAfter)); + Set expected = new HashSet<>(Arrays.asList(dateBefore, dateAfter)); assertTrue("Expected " + datePart + " to be in " + expected, expected.contains(datePart)); } } diff --git a/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java b/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java index 11ec66d61b..3706775f73 100644 --- a/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java +++ b/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java @@ -24,6 +24,7 @@ import javax.inject.Singleton; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.regex.Pattern; import org.apache.maven.settings.Mirror; import org.apache.maven.settings.Profile; @@ -42,11 +43,10 @@ import org.codehaus.plexus.util.StringUtils; @Singleton public class DefaultSettingsValidator implements SettingsValidator { - private static final String ID_REGEX = "[A-Za-z0-9_\\-.]+"; + private static final String ID = "[\\w.-]+"; + private static final Pattern ID_REGEX = Pattern.compile(ID); - private static final String ILLEGAL_FS_CHARS = "\\/:\"<>|?*"; - - private static final String ILLEGAL_REPO_ID_CHARS = ILLEGAL_FS_CHARS; + private static final String ILLEGAL_REPO_ID_CHARS = "\\/:\"<>|?*"; // ILLEGAL_FS_CHARS @Override public void validate(Settings settings, SettingsProblemCollector problems) { @@ -63,13 +63,13 @@ public class DefaultSettingsValidator implements SettingsValidator { if (StringUtils.isBlank(pluginGroup)) { addViolation( problems, Severity.ERROR, "pluginGroups.pluginGroup[" + i + "]", null, "must not be empty"); - } else if (!pluginGroup.matches(ID_REGEX)) { + } else if (!ID_REGEX.matcher(pluginGroup).matches()) { addViolation( problems, Severity.ERROR, "pluginGroups.pluginGroup[" + i + "]", null, - "must denote a valid group id and match the pattern " + ID_REGEX); + "must denote a valid group id and match the pattern " + ID); } } }