You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by hi...@apache.org on 2017/06/01 11:09:22 UTC

[1/2] ant-ivy git commit: IVY-1495 Delay the processing of configured cache ttls, until the IvySettings object is usable

Repository: ant-ivy
Updated Branches:
  refs/heads/master 1f0c99d0e -> f2a899979


IVY-1495 Delay the processing of configured cache ttls, until the IvySettings object is usable


Project: http://git-wip-us.apache.org/repos/asf/ant-ivy/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant-ivy/commit/3d30c8ca
Tree: http://git-wip-us.apache.org/repos/asf/ant-ivy/tree/3d30c8ca
Diff: http://git-wip-us.apache.org/repos/asf/ant-ivy/diff/3d30c8ca

Branch: refs/heads/master
Commit: 3d30c8ca715492e11c5c7d196668d5dcec1bcbed
Parents: 5601c44
Author: Jaikiran Pai <ja...@gmail.com>
Authored: Fri May 19 14:30:33 2017 +0530
Committer: Jaikiran Pai <ja...@gmail.com>
Committed: Tue May 30 09:50:03 2017 +0530

----------------------------------------------------------------------
 .../cache/DefaultRepositoryCacheManager.java    | 59 +++++++++++++++++---
 .../core/settings/XmlSettingsParserTest.java    | 26 +++++++++
 .../settings/ivysettings-cache-ttl-matcher.xml  | 25 +++++++++
 3 files changed, 102 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/3d30c8ca/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java b/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java
index ea01797..1a1fa0f 100644
--- a/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java
+++ b/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java
@@ -25,8 +25,14 @@ import java.net.URL;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.regex.Pattern;
 
 import org.apache.ivy.Ivy;
@@ -121,6 +127,8 @@ public class DefaultRepositoryCacheManager implements RepositoryCacheManager, Iv
 
     private PackagingManager packagingManager = new PackagingManager();
 
+    private final List<ConfiguredTTL> configuredTTLs = new ArrayList<ConfiguredTTL>();
+
     public DefaultRepositoryCacheManager() {
     }
 
@@ -134,9 +142,16 @@ public class DefaultRepositoryCacheManager implements RepositoryCacheManager, Iv
         return settings;
     }
 
-    public void setSettings(IvySettings settings) {
+    public void setSettings(final IvySettings settings) {
         this.settings = settings;
         packagingManager.setSettings(settings);
+        // process and setup the configured TTLs (which weren't yet processed since they needed a settings instance to be present)
+        for (final ConfiguredTTL configuredTTL : configuredTTLs) {
+            this.addTTL(configuredTTL.attributes,
+                    configuredTTL.matcher == null ? ExactPatternMatcher.INSTANCE : settings.getMatcher(configuredTTL.matcher), configuredTTL.duration);
+        }
+        // clear off the configured TTLs since we have now processed them and created TTL rules out of them
+        this.configuredTTLs.clear();
     }
 
     public File getIvyFileInCache(ModuleRevisionId mrid) {
@@ -242,15 +257,16 @@ public class DefaultRepositoryCacheManager implements RepositoryCacheManager, Iv
         ttlRules.defineRule(new MapMatcher(attributes, matcher), new Long(duration));
     }
 
-    public void addConfiguredTtl(Map<String, String> attributes) {
-        String duration = attributes.remove("duration");
-        if (duration == null) {
+    public void addConfiguredTtl(final Map<String, String> attributes) {
+        final String durationValue = attributes.get("duration");
+        if (durationValue == null) {
             throw new IllegalArgumentException("'duration' attribute is mandatory for ttl");
         }
-        String matcher = attributes.remove("matcher");
-        addTTL(attributes,
-            matcher == null ? ExactPatternMatcher.INSTANCE : settings.getMatcher(matcher),
-            parseDuration(duration));
+        final long duration = parseDuration(durationValue);
+        final ConfiguredTTL configuredTTL = new ConfiguredTTL(duration, attributes.get("matcher"), attributes);
+        // Processing TTLs requires access to an initialized/usable IvySettings instance.
+        // we keep track of these configured TTLs and process them when the IvySettings instance becomes usable
+        this.configuredTTLs.add(configuredTTL);
     }
 
     public void setMemorySize(int size) {
@@ -1562,4 +1578,31 @@ public class DefaultRepositoryCacheManager implements RepositoryCacheManager, Iv
 
     }
 
+    private static final class ConfiguredTTL {
+        // attributes on the TTL, that don't contribute to module matching
+        private static final Set<String> attributesNotContributingToMatching = new HashSet<String>();
+        static {
+            attributesNotContributingToMatching.add("duration");
+            attributesNotContributingToMatching.add("matcher");
+        }
+
+        private final String matcher;
+        private final long duration;
+        private final Map<String, String> attributes;
+
+        private ConfiguredTTL(final long duration, final String matcher, final Map<String, String> attributes) {
+            this.matcher = matcher;
+            this.duration = duration;
+            if (attributes == null) {
+                this.attributes = Collections.emptyMap();
+            } else {
+                final Map<String, String> attrs = new HashMap<String, String>(attributes);
+                for (final String removable : attributesNotContributingToMatching) {
+                    attrs.remove(removable);
+                }
+                this.attributes = Collections.unmodifiableMap(attrs);
+            }
+        }
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/3d30c8ca/test/java/org/apache/ivy/core/settings/XmlSettingsParserTest.java
----------------------------------------------------------------------
diff --git a/test/java/org/apache/ivy/core/settings/XmlSettingsParserTest.java b/test/java/org/apache/ivy/core/settings/XmlSettingsParserTest.java
index c75ffcf..6bbd885 100644
--- a/test/java/org/apache/ivy/core/settings/XmlSettingsParserTest.java
+++ b/test/java/org/apache/ivy/core/settings/XmlSettingsParserTest.java
@@ -23,6 +23,7 @@ import java.text.ParseException;
 import java.util.List;
 
 import org.apache.ivy.core.cache.DefaultRepositoryCacheManager;
+import org.apache.ivy.core.cache.RepositoryCacheManager;
 import org.apache.ivy.core.cache.ResolutionCacheManager;
 import org.apache.ivy.core.module.descriptor.Artifact;
 import org.apache.ivy.core.module.id.ModuleId;
@@ -641,6 +642,31 @@ public class XmlSettingsParserTest {
             settings.getVariable("ivy.basedir"));
     }
 
+    /**
+     * Tests that a <code>&lt;ttl&gt;</code> containing the <code>matcher</code> attribute, in a ivy settings file,
+     * works as expected.
+     *
+     * @throws Exception
+     * @see <a href="https://issues.apache.org/jira/browse/IVY-1495">IVY-1495</a>
+     */
+    @Test
+    public void testCacheTTLMatcherAttribute() throws Exception {
+        final IvySettings settings = new IvySettings();
+        settings.setBaseDir(new File("test/base/dir"));
+        final XmlSettingsParser parser = new XmlSettingsParser(settings);
+        parser.parse(XmlSettingsParserTest.class.getResource("ivysettings-cache-ttl-matcher.xml"));
+        // verify ttl
+        final DefaultRepositoryCacheManager cacheManager = (DefaultRepositoryCacheManager) settings.getRepositoryCacheManager("foo");
+        assertNotNull("Missing cache manager 'foo'", cacheManager);
+        assertEquals("Unexpected default ttl on cache manager", 30000, cacheManager.getDefaultTTL());
+        final ModuleRevisionId module1 = new ModuleRevisionId(new ModuleId("foo", "bar"), "*");
+        final long module1SpecificTTL = cacheManager.getTTL(module1);
+        assertEquals("Unexpected ttl for module " + module1 + " on cache manager", 60000, module1SpecificTTL);
+        final ModuleRevisionId module2 = new ModuleRevisionId(new ModuleId("food", "*"), "1.2.4");
+        final long module2SpecificTTL = cacheManager.getTTL(module2);
+        assertEquals("Unexpected ttl for module " + module2 + " on cache manager", 60000, module2SpecificTTL);
+    }
+
     public static class MyOutputter implements ReportOutputter {
         public void output(ResolveReport report, ResolutionCacheManager cacheMgr,
                 ResolveOptions options) {

http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/3d30c8ca/test/java/org/apache/ivy/core/settings/ivysettings-cache-ttl-matcher.xml
----------------------------------------------------------------------
diff --git a/test/java/org/apache/ivy/core/settings/ivysettings-cache-ttl-matcher.xml b/test/java/org/apache/ivy/core/settings/ivysettings-cache-ttl-matcher.xml
new file mode 100644
index 0000000..0dd0e39
--- /dev/null
+++ b/test/java/org/apache/ivy/core/settings/ivysettings-cache-ttl-matcher.xml
@@ -0,0 +1,25 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.
+-->
+<ivysettings>
+    <caches default="foo">
+        <cache name="foo" defaultTTL="30000ms">
+            <ttl organisation="foo\S*" duration="60000ms" matcher="regexp"/>
+        </cache>
+    </caches>
+</ivysettings>


[2/2] ant-ivy git commit: This closes #21

Posted by hi...@apache.org.
This closes #21


Project: http://git-wip-us.apache.org/repos/asf/ant-ivy/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant-ivy/commit/f2a89997
Tree: http://git-wip-us.apache.org/repos/asf/ant-ivy/tree/f2a89997
Diff: http://git-wip-us.apache.org/repos/asf/ant-ivy/diff/f2a89997

Branch: refs/heads/master
Commit: f2a899979a183a398132409dba59e1e530fa1697
Parents: 1f0c99d 3d30c8c
Author: Nicolas Lalevée <ni...@hibnet.org>
Authored: Thu Jun 1 13:07:42 2017 +0200
Committer: Nicolas Lalevée <ni...@hibnet.org>
Committed: Thu Jun 1 13:07:42 2017 +0200

----------------------------------------------------------------------
 .../cache/DefaultRepositoryCacheManager.java    | 59 +++++++++++++++++---
 .../core/settings/XmlSettingsParserTest.java    | 26 +++++++++
 .../settings/ivysettings-cache-ttl-matcher.xml  | 25 +++++++++
 3 files changed, 102 insertions(+), 8 deletions(-)
----------------------------------------------------------------------