[MNG-6571] cache VersionRange instances, they are immutable
authorHervé Boutemy <hboutemy@apache.org>
Wed, 23 Jan 2019 10:01:18 +0000 (11:01 +0100)
committerHervé Boutemy <hboutemy@apache.org>
Mon, 4 Feb 2019 23:38:25 +0000 (00:38 +0100)
maven-artifact/src/main/java/org/apache/maven/artifact/ArtifactUtils.java
maven-artifact/src/main/java/org/apache/maven/artifact/versioning/VersionRange.java

index cf7d27d..a0f18ad 100644 (file)
@@ -138,7 +138,7 @@ public final class ArtifactUtils
             range = VersionRange.createFromVersion( artifact.getVersion() );
         }
 
-        DefaultArtifact clone = new DefaultArtifact( artifact.getGroupId(), artifact.getArtifactId(), range.cloneOf(),
+        DefaultArtifact clone = new DefaultArtifact( artifact.getGroupId(), artifact.getArtifactId(), range,
             artifact.getScope(), artifact.getType(), artifact.getClassifier(),
             artifact.getArtifactHandler(), artifact.isOptional() );
         clone.setRelease( artifact.isRelease() );
index e919621..5d7b254 100644 (file)
@@ -23,6 +23,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
 
 import org.apache.maven.artifact.Artifact;
 
@@ -33,6 +35,9 @@ import org.apache.maven.artifact.Artifact;
  */
 public class VersionRange
 {
+    private static final Map<String, VersionRange> CACHE =
+        Collections.<String, VersionRange>synchronizedMap( new WeakHashMap<String, VersionRange>() );
+
     private final ArtifactVersion recommendedVersion;
 
     private final List<Restriction> restrictions;
@@ -54,6 +59,11 @@ public class VersionRange
         return restrictions;
     }
 
+    /**
+     * @deprecated VersionRange is immutable, cloning is not useful and even more an issue against the cache 
+     * @return a clone
+     */
+    @Deprecated
     public VersionRange cloneOf()
     {
         List<Restriction> copiedRestrictions = null;
@@ -97,6 +107,12 @@ public class VersionRange
             return null;
         }
 
+        VersionRange cached = CACHE.get( spec );
+        if ( cached != null )
+        {
+            return cached;
+        }
+
         List<Restriction> restrictions = new ArrayList<>();
         String process = spec;
         ArtifactVersion version = null;
@@ -159,7 +175,9 @@ public class VersionRange
             }
         }
 
-        return new VersionRange( version, restrictions );
+        cached = new VersionRange( version, restrictions );
+        CACHE.put( spec, cached );
+        return cached;
     }
 
     private static Restriction parseRestriction( String spec )
@@ -218,8 +236,13 @@ public class VersionRange
 
     public static VersionRange createFromVersion( String version )
     {
-        List<Restriction> restrictions = Collections.emptyList();
-        return new VersionRange( new DefaultArtifactVersion( version ), restrictions );
+        VersionRange cached = CACHE.get( version );
+        if ( cached == null )
+        {
+            List<Restriction> restrictions = Collections.emptyList();
+            cached = new VersionRange( new DefaultArtifactVersion( version ), restrictions );
+        }
+        return cached;
     }
 
     /**