You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by jl...@apache.org on 2015/02/06 19:33:02 UTC
[1/3] ant-easyant-core git commit: update to ivy 2.4
Repository: ant-easyant-core
Updated Branches:
refs/heads/master d2d5fb91e -> 0d30d6fa0
update to ivy 2.4
Project: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/commit/a23f26a5
Tree: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/tree/a23f26a5
Diff: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/diff/a23f26a5
Branch: refs/heads/master
Commit: a23f26a522ea17eefb1c96e620f4ad312046ecd1
Parents: d2d5fb9
Author: Jean-Louis Boudart <je...@gmail.com>
Authored: Fri Feb 6 19:13:14 2015 +0100
Committer: Jean-Louis Boudart <je...@gmail.com>
Committed: Fri Feb 6 19:13:14 2015 +0100
----------------------------------------------------------------------
build.xml | 2 +-
module.ivy | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/a23f26a5/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index af87b8b..a0c20dd 100644
--- a/build.xml
+++ b/build.xml
@@ -21,7 +21,7 @@
<target name="ivy:init">
<mkdir dir="${bootstrap.dir}"/>
- <property name="ivy.version" value="2.3.0"/>
+ <property name="ivy.version" value="2.4.0"/>
<mkdir dir="${user.home}/.ivy2/jars" />
<get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.version}/ivy-${ivy.version}.jar" dest="${user.home}/.ivy2/jars/ivy-${ivy.version}.jar" usetimestamp="true"/>
<taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpath="${user.home}/.ivy2/jars/ivy-${ivy.version}.jar" />
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/a23f26a5/module.ivy
----------------------------------------------------------------------
diff --git a/module.ivy b/module.ivy
index eb49790..abe92ad 100644
--- a/module.ivy
+++ b/module.ivy
@@ -28,7 +28,7 @@
<dependencies>
<dependency org="junit" name="junit" rev="4.11" conf="test->default"/>
<dependency org="org.apache.ant" name="ant" rev="1.9.4" conf="default->default"/>
- <dependency org="org.apache.ivy" name="ivy" rev="2.3.0" conf="default->default"/>
+ <dependency org="org.apache.ivy" name="ivy" rev="2.4.0" conf="default->default"/>
<dependency org="ant-contrib" name="ant-contrib" rev="1.0b2" conf="default->default"/>
<dependency org="commons-cli" name="commons-cli" rev="1.2" conf="default->default"/>
<!-- ivy uses a different namespace to reference ant -->
[2/3] ant-easyant-core git commit: disable useOrigin on cache since
it's creating error with jarResolver and absolute path
Posted by jl...@apache.org.
disable useOrigin on cache since it's creating error with jarResolver and absolute path
Project: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/commit/d2df32a8
Tree: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/tree/d2df32a8
Diff: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/diff/d2df32a8
Branch: refs/heads/master
Commit: d2df32a881b6b0926399ea46f011e63323dfeb99
Parents: a23f26a
Author: Jean-Louis Boudart <je...@gmail.com>
Authored: Fri Feb 6 19:13:58 2015 +0100
Committer: Jean-Louis Boudart <je...@gmail.com>
Committed: Fri Feb 6 19:13:58 2015 +0100
----------------------------------------------------------------------
.../org/apache/easyant/core/default-easyant-ivysettings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/d2df32a8/src/main/resources/org/apache/easyant/core/default-easyant-ivysettings.xml
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/easyant/core/default-easyant-ivysettings.xml b/src/main/resources/org/apache/easyant/core/default-easyant-ivysettings.xml
index 2e3dc71..b1cf89e 100644
--- a/src/main/resources/org/apache/easyant/core/default-easyant-ivysettings.xml
+++ b/src/main/resources/org/apache/easyant/core/default-easyant-ivysettings.xml
@@ -17,7 +17,7 @@
<ivysettings>
<property name="apache.easyant.public.url" value="http://repository.easyant.org/apache-easyant"/>
<settings defaultResolver="easyant-default-chain"/>
- <caches defaultCacheDir="${user.home}/.easyant/easyant-cache" useOrigin="true" />
+ <caches defaultCacheDir="${user.home}/.easyant/easyant-cache"/>
<resolvers>
<jar name="easyant-core-modules" url="${easyant.core.jar.url}" descriptor="required">
<ivy pattern="repository/core/[organisation]/[module]/[revision]/[module].ivy"/>
[3/3] ant-easyant-core git commit: drop dead code since ivy now
exposes procted method to specify how to choose ModuleDescriptors
Posted by jl...@apache.org.
drop dead code since ivy now exposes procted method to specify how to choose ModuleDescriptors
Project: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/commit/0d30d6fa
Tree: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/tree/0d30d6fa
Diff: http://git-wip-us.apache.org/repos/asf/ant-easyant-core/diff/0d30d6fa
Branch: refs/heads/master
Commit: 0d30d6fa0e341039eed9ee69d66defd7fbaaa105
Parents: d2df32a
Author: Jean-Louis Boudart <je...@gmail.com>
Authored: Fri Feb 6 19:24:08 2015 +0100
Committer: Jean-Louis Boudart <je...@gmail.com>
Committed: Fri Feb 6 19:25:16 2015 +0100
----------------------------------------------------------------------
.../org/apache/easyant/core/EasyAntEngine.java | 4 +-
.../core/ivy/EasyAntRepositoryCacheManager.java | 54 +
.../core/ivy/EasyantResolutionCacheManager.java | 48 +
.../tasks/ConfigureBuildScopedRepository.java | 2 +-
.../org/apache/easyant/tasks/LoadModule.java | 4 +-
.../cache/EasyAntRepositoryCacheManager.java | 1342 ------------------
.../cache/EasyantResolutionCacheManager.java | 304 ----
.../apache/easyant/core/EasyAntEngineTest.java | 4 +-
.../ConfigureBuildScopedRepositoryTest.java | 2 +-
.../easyant/tasks/RegisterArtifactTest.java | 4 +-
10 files changed, 112 insertions(+), 1656 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/0d30d6fa/src/main/java/org/apache/easyant/core/EasyAntEngine.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/easyant/core/EasyAntEngine.java b/src/main/java/org/apache/easyant/core/EasyAntEngine.java
index e41cead..f06e94e 100755
--- a/src/main/java/org/apache/easyant/core/EasyAntEngine.java
+++ b/src/main/java/org/apache/easyant/core/EasyAntEngine.java
@@ -32,8 +32,8 @@ import org.apache.easyant.tasks.LoadModule;
import org.apache.ivy.Ivy;
import org.apache.ivy.ant.IvyAntSettings;
import org.apache.ivy.ant.IvyConfigure;
-import org.apache.ivy.core.cache.EasyAntRepositoryCacheManager;
-import org.apache.ivy.core.cache.EasyantResolutionCacheManager;
+import org.apache.easyant.core.ivy.EasyAntRepositoryCacheManager;
+import org.apache.easyant.core.ivy.EasyantResolutionCacheManager;
import org.apache.tools.ant.*;
import org.apache.tools.ant.input.DefaultInputHandler;
import org.apache.tools.ant.input.InputHandler;
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/0d30d6fa/src/main/java/org/apache/easyant/core/ivy/EasyAntRepositoryCacheManager.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/easyant/core/ivy/EasyAntRepositoryCacheManager.java b/src/main/java/org/apache/easyant/core/ivy/EasyAntRepositoryCacheManager.java
new file mode 100644
index 0000000..b519b1e
--- /dev/null
+++ b/src/main/java/org/apache/easyant/core/ivy/EasyAntRepositoryCacheManager.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ *
+ */
+package org.apache.easyant.core.ivy;
+
+import org.apache.ivy.core.cache.DefaultRepositoryCacheManager;
+import org.apache.ivy.core.settings.IvySettings;
+import org.apache.ivy.plugins.parser.ModuleDescriptorParser;
+import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
+import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParser;
+import org.apache.ivy.plugins.repository.url.URLResource;
+
+import java.io.File;
+import java.net.MalformedURLException;
+
+/**
+ * Fork default CacheManager as default cache resolver use {@link XmlModuleDescriptorParser} to resolve files from cache
+ * If parent module is resolved from cache with {@link XmlModuleDescriptorParser} then easyant is not able to handle
+ * inherit properties or plugins
+ */
+public class EasyAntRepositoryCacheManager extends DefaultRepositoryCacheManager {
+ public EasyAntRepositoryCacheManager() {
+ super();
+ }
+
+ public EasyAntRepositoryCacheManager(String name, IvySettings settings, File basedir) {
+ super(name, settings, basedir);
+ }
+
+
+ @Override
+ protected ModuleDescriptorParser getModuleDescriptorParser(File moduleDescriptorFile) {
+ try {
+ return ModuleDescriptorParserRegistry.getInstance().getParser(
+ new URLResource(moduleDescriptorFile.toURI().toURL()));
+ } catch (MalformedURLException e) {
+ throw new RuntimeException("Can't access to " + moduleDescriptorFile.getAbsolutePath(), e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/0d30d6fa/src/main/java/org/apache/easyant/core/ivy/EasyantResolutionCacheManager.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/easyant/core/ivy/EasyantResolutionCacheManager.java b/src/main/java/org/apache/easyant/core/ivy/EasyantResolutionCacheManager.java
new file mode 100644
index 0000000..26a3b84
--- /dev/null
+++ b/src/main/java/org/apache/easyant/core/ivy/EasyantResolutionCacheManager.java
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ *
+ */
+package org.apache.easyant.core.ivy;
+
+import org.apache.ivy.core.cache.DefaultResolutionCacheManager;
+import org.apache.ivy.plugins.parser.ModuleDescriptorParser;
+import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
+import org.apache.ivy.plugins.repository.url.URLResource;
+
+import java.io.File;
+import java.net.MalformedURLException;
+
+public class EasyantResolutionCacheManager extends DefaultResolutionCacheManager {
+
+ public EasyantResolutionCacheManager() {
+ super();
+ }
+
+ public EasyantResolutionCacheManager(File basedir) {
+ super(basedir);
+ }
+
+ @Override
+ protected ModuleDescriptorParser getModuleDescriptorParser(File moduleDescriptorFile) {
+ try {
+ return ModuleDescriptorParserRegistry.getInstance().getParser(
+ new URLResource(moduleDescriptorFile.toURI().toURL()));
+ } catch (MalformedURLException e) {
+ throw new RuntimeException("Can't access to " + moduleDescriptorFile.getAbsolutePath(), e);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/0d30d6fa/src/main/java/org/apache/easyant/tasks/ConfigureBuildScopedRepository.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/easyant/tasks/ConfigureBuildScopedRepository.java b/src/main/java/org/apache/easyant/tasks/ConfigureBuildScopedRepository.java
index 83694d8..5179661 100644
--- a/src/main/java/org/apache/easyant/tasks/ConfigureBuildScopedRepository.java
+++ b/src/main/java/org/apache/easyant/tasks/ConfigureBuildScopedRepository.java
@@ -22,7 +22,7 @@ import java.io.File;
import org.apache.easyant.core.EasyAntMagicNames;
import org.apache.easyant.core.ivy.IvyInstanceHelper;
import org.apache.ivy.ant.IvyTask;
-import org.apache.ivy.core.cache.EasyAntRepositoryCacheManager;
+import org.apache.easyant.core.ivy.EasyAntRepositoryCacheManager;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.plugins.resolver.ChainResolver;
import org.apache.ivy.plugins.resolver.DependencyResolver;
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/0d30d6fa/src/main/java/org/apache/easyant/tasks/LoadModule.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/easyant/tasks/LoadModule.java b/src/main/java/org/apache/easyant/tasks/LoadModule.java
index 78c51af..c6a2ef9 100644
--- a/src/main/java/org/apache/easyant/tasks/LoadModule.java
+++ b/src/main/java/org/apache/easyant/tasks/LoadModule.java
@@ -29,8 +29,8 @@ import org.apache.ivy.ant.IvyConfigure;
import org.apache.ivy.ant.IvyDependency;
import org.apache.ivy.ant.IvyInfo;
import org.apache.ivy.core.IvyContext;
-import org.apache.ivy.core.cache.EasyAntRepositoryCacheManager;
-import org.apache.ivy.core.cache.EasyantResolutionCacheManager;
+import org.apache.easyant.core.ivy.EasyAntRepositoryCacheManager;
+import org.apache.easyant.core.ivy.EasyantResolutionCacheManager;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.plugins.parser.ModuleDescriptorParser;
import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/0d30d6fa/src/main/java/org/apache/ivy/core/cache/EasyAntRepositoryCacheManager.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/ivy/core/cache/EasyAntRepositoryCacheManager.java b/src/main/java/org/apache/ivy/core/cache/EasyAntRepositoryCacheManager.java
deleted file mode 100644
index 3b6f1e5..0000000
--- a/src/main/java/org/apache/ivy/core/cache/EasyAntRepositoryCacheManager.java
+++ /dev/null
@@ -1,1342 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.ivy.core.cache;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.text.ParseException;
-import java.util.Date;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-import org.apache.ivy.Ivy;
-import org.apache.ivy.core.IvyPatternHelper;
-import org.apache.ivy.core.module.descriptor.Artifact;
-import org.apache.ivy.core.module.descriptor.DefaultArtifact;
-import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
-import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-import org.apache.ivy.core.module.id.ModuleRevisionId;
-import org.apache.ivy.core.module.id.ModuleRules;
-import org.apache.ivy.core.report.ArtifactDownloadReport;
-import org.apache.ivy.core.report.DownloadStatus;
-import org.apache.ivy.core.report.MetadataArtifactDownloadReport;
-import org.apache.ivy.core.resolve.ResolvedModuleRevision;
-import org.apache.ivy.core.settings.IvySettings;
-import org.apache.ivy.plugins.IvySettingsAware;
-import org.apache.ivy.plugins.lock.LockStrategy;
-import org.apache.ivy.plugins.matcher.ExactPatternMatcher;
-import org.apache.ivy.plugins.matcher.MapMatcher;
-import org.apache.ivy.plugins.matcher.Matcher;
-import org.apache.ivy.plugins.matcher.NoMatcher;
-import org.apache.ivy.plugins.matcher.PatternMatcher;
-import org.apache.ivy.plugins.namespace.NameSpaceHelper;
-import org.apache.ivy.plugins.parser.ModuleDescriptorParser;
-import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
-import org.apache.ivy.plugins.parser.ParserSettings;
-import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParser;
-import org.apache.ivy.plugins.repository.ArtifactResourceResolver;
-import org.apache.ivy.plugins.repository.Repository;
-import org.apache.ivy.plugins.repository.Resource;
-import org.apache.ivy.plugins.repository.ResourceDownloader;
-import org.apache.ivy.plugins.repository.ResourceHelper;
-import org.apache.ivy.plugins.repository.url.URLResource;
-import org.apache.ivy.plugins.resolver.AbstractResolver;
-import org.apache.ivy.plugins.resolver.DependencyResolver;
-import org.apache.ivy.plugins.resolver.util.ResolvedResource;
-import org.apache.ivy.util.Checks;
-import org.apache.ivy.util.FileUtil;
-import org.apache.ivy.util.HexEncoder;
-import org.apache.ivy.util.Message;
-import org.apache.ivy.util.PropertiesFile;
-
-/**
- * Fork default CacheManager as default cache resolver use {@link XmlModuleDescriptorParser} to resolve files from cache
- * If parent module is resolved from cache with {@link XmlModuleDescriptorParser} then easyant is not able to handle
- * inherit properties or plugins We use the same package as original {@link RepositoryCacheManager} to access
- * {@link ModuleDescriptorMemoryCache}
- */
-public class EasyAntRepositoryCacheManager implements RepositoryCacheManager, IvySettingsAware {
- private static final String DEFAULT_ARTIFACT_PATTERN = "[organisation]/[module](/[branch])/[type]s/[artifact]-[revision](-[classifier])(.[ext])";
-
- private static final String DEFAULT_DATA_FILE_PATTERN = "[organisation]/[module](/[branch])/ivydata-[revision].properties";
-
- private static final String DEFAULT_IVY_PATTERN = "[organisation]/[module](/[branch])/ivy-[revision].xml";
-
- private static final int DEFAULT_MEMORY_CACHE_SIZE = 150;
-
- private static MessageDigest SHA_DIGEST;
- static {
- try {
- SHA_DIGEST = MessageDigest.getInstance("SHA1");
- } catch (NoSuchAlgorithmException e) {
- throw new RuntimeException("The SHA1 algorithm is not available in your classpath", e);
- }
- }
-
- private IvySettings settings;
-
- private File basedir;
-
- private LockStrategy lockStrategy;
-
- private String name;
-
- private String ivyPattern;
-
- private String dataFilePattern = DEFAULT_DATA_FILE_PATTERN;
-
- private String artifactPattern;
-
- private String lockStrategyName;
-
- private String changingPattern;
-
- private String changingMatcherName = PatternMatcher.EXACT_OR_REGEXP;
-
- private Boolean checkmodified;
-
- private Boolean useOrigin;
-
- private ModuleRules/* <Long> */ttlRules = new ModuleRules();
-
- private Long defaultTTL = null;
-
- private ModuleDescriptorMemoryCache memoryModuleDescrCache;
-
- public EasyAntRepositoryCacheManager() {
- }
-
- public EasyAntRepositoryCacheManager(String name, IvySettings settings, File basedir) {
- setName(name);
- setSettings(settings);
- setBasedir(basedir);
- }
-
- public IvySettings getSettings() {
- return settings;
- }
-
- public void setSettings(IvySettings settings) {
- this.settings = settings;
- }
-
- public File getIvyFileInCache(ModuleRevisionId mrid) {
- String file = IvyPatternHelper.substitute(getIvyPattern(), DefaultArtifact.newIvyArtifact(mrid, null));
- return new File(getRepositoryCacheRoot(), file);
- }
-
- public String getIvyPattern() {
- if (ivyPattern == null) {
- if (settings != null) {
- ivyPattern = settings.getDefaultCacheIvyPattern();
- }
- if (ivyPattern == null) {
- ivyPattern = DEFAULT_IVY_PATTERN;
- }
- }
- return ivyPattern;
- }
-
- public String getArtifactPattern() {
- if (artifactPattern == null) {
- if (settings != null) {
- artifactPattern = settings.getDefaultCacheArtifactPattern();
- }
- if (artifactPattern == null) {
- artifactPattern = DEFAULT_ARTIFACT_PATTERN;
- }
- }
- return artifactPattern;
- }
-
- public void setArtifactPattern(String artifactPattern) {
- CacheUtil.checkCachePattern(artifactPattern);
- this.artifactPattern = artifactPattern;
- }
-
- public File getBasedir() {
- if (basedir == null) {
- basedir = settings.getDefaultRepositoryCacheBasedir();
- }
- return basedir;
- }
-
- public void setBasedir(File cache) {
- this.basedir = cache;
- }
-
- public long getDefaultTTL() {
- if (defaultTTL == null) {
- defaultTTL = parseDuration(settings.getVariable("ivy.cache.ttl.default"));
- }
- return defaultTTL;
- }
-
- public void setDefaultTTL(long defaultTTL) {
- this.defaultTTL = defaultTTL;
- }
-
- public void setDefaultTTL(String defaultTTL) {
- this.defaultTTL = parseDuration(defaultTTL);
- }
-
- public String getDataFilePattern() {
- return dataFilePattern;
- }
-
- public void setDataFilePattern(String dataFilePattern) {
- CacheUtil.checkCachePattern(dataFilePattern);
- this.dataFilePattern = dataFilePattern;
- }
-
- public void setIvyPattern(String ivyPattern) {
- CacheUtil.checkCachePattern(ivyPattern);
- this.ivyPattern = ivyPattern;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getChangingMatcherName() {
- return changingMatcherName;
- }
-
- public void setChangingMatcher(String changingMatcherName) {
- this.changingMatcherName = changingMatcherName;
- }
-
- public String getChangingPattern() {
- return changingPattern;
- }
-
- public void setChangingPattern(String changingPattern) {
- this.changingPattern = changingPattern;
- }
-
- public void addTTL(Map attributes, PatternMatcher matcher, long duration) {
- ttlRules.defineRule(new MapMatcher(attributes, matcher), duration);
- }
-
- public void addConfiguredTtl(Map/* <String,String> */attributes) {
- String duration = (String) attributes.remove("duration");
- if (duration == null) {
- throw new IllegalArgumentException("'duration' attribute is mandatory for ttl");
- }
- String matcher = (String) attributes.remove("matcher");
- addTTL(attributes, matcher == null ? ExactPatternMatcher.INSTANCE : settings.getMatcher(matcher),
- parseDuration(duration));
- }
-
- public void setMemorySize(int size) {
- memoryModuleDescrCache = new ModuleDescriptorMemoryCache(size);
- }
-
- public ModuleDescriptorMemoryCache getMemoryCache() {
- if (memoryModuleDescrCache == null) {
- memoryModuleDescrCache = new ModuleDescriptorMemoryCache(DEFAULT_MEMORY_CACHE_SIZE);
- }
- return memoryModuleDescrCache;
- }
-
- private static final Pattern DURATION_PATTERN = Pattern
- .compile("(?:(\\d+)d)? ?(?:(\\d+)h)? ?(?:(\\d+)m)? ?(?:(\\d+)s)? ?(?:(\\d+)ms)?");
-
- private static final int MILLIS_IN_SECONDS = 1000;
- private static final int MILLIS_IN_MINUTES = 60 * MILLIS_IN_SECONDS;
- private static final int MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTES;
- private static final int MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR;
-
- private long parseDuration(String duration) {
- if (duration == null) {
- return 0;
- }
- if ("eternal".equals(duration)) {
- return Long.MAX_VALUE;
- }
- java.util.regex.Matcher m = DURATION_PATTERN.matcher(duration);
- if (m.matches()) {
- // CheckStyle:MagicNumber| OFF
- int days = getGroupIntValue(m, 1);
- int hours = getGroupIntValue(m, 2);
- int minutes = getGroupIntValue(m, 3);
- int seconds = getGroupIntValue(m, 4);
- int millis = getGroupIntValue(m, 5);
- // CheckStyle:MagicNumber| ON
-
- return days * MILLIS_IN_DAY + hours * MILLIS_IN_HOUR + minutes * MILLIS_IN_MINUTES + seconds
- * MILLIS_IN_SECONDS + millis;
- } else {
- throw new IllegalArgumentException("invalid duration '" + duration + "': it must match "
- + DURATION_PATTERN.pattern() + " or 'eternal'");
- }
- }
-
- private int getGroupIntValue(java.util.regex.Matcher m, int groupNumber) {
- String g = m.group(groupNumber);
- return g == null || g.isEmpty() ? 0 : Integer.parseInt(g);
- }
-
- /**
- * True if this cache should check lastmodified date to know if ivy files are up to date.
- *
- * @return
- */
- public boolean isCheckmodified() {
- if (checkmodified == null) {
- if (getSettings() != null) {
- String check = getSettings().getVariable("ivy.resolver.default.check.modified");
- return check != null ? Boolean.valueOf(check) : false;
- } else {
- return false;
- }
- } else {
- return checkmodified;
- }
- }
-
- public void setCheckmodified(boolean check) {
- checkmodified = check;
- }
-
- /**
- * True if this cache should use artifacts original location when possible, false if they should be copied to cache.
- */
- public boolean isUseOrigin() {
- if (useOrigin == null) {
- if (getSettings() != null) {
- return getSettings().isDefaultUseOrigin();
- } else {
- return false;
- }
- } else {
- return useOrigin;
- }
- }
-
- public void setUseOrigin(boolean b) {
- useOrigin = b;
- }
-
- /**
- * Returns a File object pointing to where the artifact can be found on the local file system. This is usually in
- * the cache, but it can be directly in the repository if it is local and if the resolve has been done with
- * useOrigin = true
- */
- public File getArchiveFileInCache(Artifact artifact) {
- ArtifactOrigin origin = getSavedArtifactOrigin(artifact);
- return getArchiveFileInCache(artifact, origin);
- }
-
- /**
- * Returns a File object pointing to where the artifact can be found on the local file system. This is usually in
- * the cache, but it can be directly in the repository if it is local and if the resolve has been done with
- * useOrigin = true
- */
- public File getArchiveFileInCache(Artifact artifact, ArtifactOrigin origin) {
- File archive = new File(getRepositoryCacheRoot(), getArchivePathInCache(artifact, origin));
- if (!archive.exists() && !ArtifactOrigin.isUnknown(origin) && origin.isLocal()) {
- File original = Checks.checkAbsolute(origin.getLocation(), artifact + " origin location");
- if (original.exists()) {
- return original;
- }
- }
- return archive;
- }
-
- /**
- * Returns a File object pointing to where the artifact can be found on the local file system, using or not the
- * original location depending on the availability of origin information provided as parameter and the setting of
- * useOrigin. If useOrigin is false, this method will always return the file in the cache.
- */
- private File getArchiveFileInCache(Artifact artifact, ArtifactOrigin origin, boolean useOrigin) {
- if (useOrigin && !ArtifactOrigin.isUnknown(origin) && origin.isLocal()) {
- return Checks.checkAbsolute(origin.getLocation(), artifact + " origin location");
- } else {
- return new File(getRepositoryCacheRoot(), getArchivePathInCache(artifact, origin));
- }
- }
-
- public String getArchivePathInCache(Artifact artifact) {
- return IvyPatternHelper.substitute(getArtifactPattern(), artifact);
- }
-
- public String getArchivePathInCache(Artifact artifact, ArtifactOrigin origin) {
- if (isOriginalMetadataArtifact(artifact)) {
- return IvyPatternHelper.substitute(getIvyPattern() + ".original", artifact, origin);
- } else {
- return IvyPatternHelper.substitute(getArtifactPattern(), artifact, origin);
- }
- }
-
- /**
- * Saves the information of which resolver was used to resolve a md, so that this info can be retrieve later (even
- * after a jvm restart) by getSavedResolverName(ModuleDescriptor md)
- *
- * @param md
- * the module descriptor resolved
- * @param name
- * resolver name
- */
- private void saveResolver(ModuleDescriptor md, String name) {
- // should always be called with a lock on module metadata artifact
- PropertiesFile cdf = getCachedDataFile(md);
- cdf.setProperty("resolver", name);
- cdf.save();
- }
-
- /**
- * Saves the information of which resolver was used to resolve a md, so that this info can be retrieve later (even
- * after a jvm restart) by getSavedArtResolverName(ModuleDescriptor md)
- *
- * @param md
- * the module descriptor resolved
- */
- public void saveResolvers(ModuleDescriptor md, String metadataResolverName, String artifactResolverName) {
- ModuleRevisionId mrid = md.getResolvedModuleRevisionId();
- if (!lockMetadataArtifact(mrid)) {
- Message.error("impossible to acquire lock for " + mrid);
- return;
- }
- try {
- PropertiesFile cdf = getCachedDataFile(md);
- cdf.setProperty("resolver", metadataResolverName);
- cdf.setProperty("artifact.resolver", artifactResolverName);
- cdf.save();
- } finally {
- unlockMetadataArtifact(mrid);
- }
- }
-
- private String getSavedResolverName(ModuleDescriptor md) {
- // should always be called with a lock on module metadata artifact
- PropertiesFile cdf = getCachedDataFile(md);
- return cdf.getProperty("resolver");
- }
-
- private String getSavedArtResolverName(ModuleDescriptor md) {
- // should always be called with a lock on module metadata artifact
- PropertiesFile cdf = getCachedDataFile(md);
- return cdf.getProperty("artifact.resolver");
- }
-
- void saveArtifactOrigin(Artifact artifact, ArtifactOrigin origin) {
- // should always be called with a lock on module metadata artifact
- PropertiesFile cdf = getCachedDataFile(artifact.getModuleRevisionId());
- cdf.setProperty(getIsLocalKey(artifact), String.valueOf(origin.isLocal()));
- cdf.setProperty(getLocationKey(artifact), origin.getLocation());
- if (origin.getLastChecked() != null) {
- cdf.setProperty(getLastCheckedKey(artifact), origin.getLastChecked().toString());
- }
- cdf.setProperty(getExistsKey(artifact), Boolean.toString(origin.isExists()));
- cdf.save();
- }
-
- private void removeSavedArtifactOrigin(Artifact artifact) {
- // should always be called with a lock on module metadata artifact
- PropertiesFile cdf = getCachedDataFile(artifact.getModuleRevisionId());
- cdf.remove(getLocationKey(artifact));
- cdf.remove(getIsLocalKey(artifact));
- cdf.remove(getLastCheckedKey(artifact));
- cdf.save();
- }
-
- public ArtifactOrigin getSavedArtifactOrigin(Artifact artifact) {
- ModuleRevisionId mrid = artifact.getModuleRevisionId();
- if (!lockMetadataArtifact(mrid)) {
- Message.error("impossible to acquire lock for " + mrid);
- return ArtifactOrigin.unkwnown(artifact);
- }
- try {
- PropertiesFile cdf = getCachedDataFile(artifact.getModuleRevisionId());
- String location = cdf.getProperty(getLocationKey(artifact));
- String local = cdf.getProperty(getIsLocalKey(artifact));
- String lastChecked = cdf.getProperty(getLastCheckedKey(artifact));
- String exists = cdf.getProperty(getExistsKey(artifact));
-
- boolean isLocal = Boolean.valueOf(local);
-
- if (location == null) {
- // origin has not been specified, return null
- return ArtifactOrigin.unkwnown(artifact);
- }
-
- ArtifactOrigin origin = new ArtifactOrigin(artifact, isLocal, location);
- if (lastChecked != null) {
- origin.setLastChecked(Long.valueOf(lastChecked));
- }
- if (exists != null) {
- origin.setExist(Boolean.valueOf(exists));
- }
-
- return origin;
- } finally {
- unlockMetadataArtifact(mrid);
- }
- }
-
- /**
- * Creates the unique prefix key that will reference the artifact within the properties.
- *
- * @param artifact
- * the artifact to create the unique key from. Cannot be null.
- * @return the unique prefix key as a string.
- */
- private String getPrefixKey(Artifact artifact) {
- // use the hashcode as a uuid for the artifact (fingers crossed)
- int hashCode = artifact.getId().hashCode();
- // use just some visual cue
- return "artifact:" + artifact.getName() + "#" + artifact.getType() + "#" + artifact.getExt() + "#" + hashCode;
- }
-
- /**
- * Returns the key used to identify the location of the artifact.
- *
- * @param artifact
- * the artifact to generate the key from. Cannot be null.
- * @return the key to be used to reference the artifact location.
- */
- private String getLocationKey(Artifact artifact) {
- String prefix = getPrefixKey(artifact);
- return prefix + ".location";
- }
-
- /**
- * Returns the key used to identify if the artifact is local.
- *
- * @param artifact
- * the artifact to generate the key from. Cannot be null.
- * @return the key to be used to reference the artifact locality.
- */
- private String getIsLocalKey(Artifact artifact) {
- String prefix = getPrefixKey(artifact);
- return prefix + ".is-local";
- }
-
- /**
- * Returns the key used to identify the last time the artifact was checked to be up to date.
- *
- * @param artifact
- * the artifact to generate the key from. Cannot be null.
- * @return the key to be used to reference the artifact's last check date.
- */
- private String getLastCheckedKey(Artifact artifact) {
- String prefix = getPrefixKey(artifact);
- return prefix + ".lastchecked";
- }
-
- /**
- * Returns the key used to identify the existence of the remote artifact.
- *
- * @param artifact
- * the artifact to generate the key from. Cannot be null.
- * @return the key to be used to reference the existence of the artifact.
- */
- private String getExistsKey(Artifact artifact) {
- String prefix = getPrefixKey(artifact);
- return prefix + ".exists";
- }
-
- private PropertiesFile getCachedDataFile(ModuleDescriptor md) {
- return getCachedDataFile(md.getResolvedModuleRevisionId());
- }
-
- private PropertiesFile getCachedDataFile(ModuleRevisionId mRevId) {
- return new PropertiesFile(new File(getRepositoryCacheRoot(), IvyPatternHelper.substitute(getDataFilePattern(),
- mRevId)), "ivy cached data file for " + mRevId);
- }
-
- public ResolvedModuleRevision findModuleInCache(DependencyDescriptor dd, ModuleRevisionId requestedRevisionId,
- CacheMetadataOptions options, String expectedResolver) {
- if (isCheckmodified(dd, requestedRevisionId, options)) {
- Message.verbose("don't use cache for " + requestedRevisionId + ": checkModified=true");
- return null;
- }
- if (isChanging(dd, requestedRevisionId, options)) {
- Message.verbose("don't use cache for " + requestedRevisionId + ": changing=true");
- return null;
- }
- return doFindModuleInCache(requestedRevisionId, options, expectedResolver);
- }
-
- private ResolvedModuleRevision doFindModuleInCache(ModuleRevisionId mrid, CacheMetadataOptions options,
- String expectedResolver) {
- if (!lockMetadataArtifact(mrid)) {
- Message.error("impossible to acquire lock for " + mrid);
- return null;
- }
-
- boolean unlock = true;
-
- try {
- if (settings.getVersionMatcher().isDynamic(mrid)) {
- String resolvedRevision = getResolvedRevision(mrid, options);
- if (resolvedRevision != null) {
- Message.verbose("found resolved revision in cache: " + mrid + " => " + resolvedRevision);
-
- // we have found another module in the cache, make sure we unlock
- // the original module
- unlockMetadataArtifact(mrid);
- mrid = ModuleRevisionId.newInstance(mrid, resolvedRevision);
-
- // don't forget to request a lock on the new module!
- if (!lockMetadataArtifact(mrid)) {
- Message.error("impossible to acquire lock for " + mrid);
-
- // we couldn't lock the new module, so no need to unlock it
- unlock = false;
- return null;
- }
- } else {
- return null;
- }
- }
-
- File ivyFile = getIvyFileInCache(mrid);
- if (ivyFile.exists()) {
- // found in cache !
- try {
- ModuleDescriptorParser parser = ModuleDescriptorParserRegistry.getInstance().getParser(
- new URLResource(ivyFile.toURI().toURL()));
- ModuleDescriptor depMD = getMdFromCache(parser, options, ivyFile);
- String resolverName = getSavedResolverName(depMD);
- String artResolverName = getSavedArtResolverName(depMD);
- DependencyResolver resolver = settings.getResolver(resolverName);
- if (resolver == null) {
- Message.debug("\tresolver not found: " + resolverName
- + " => trying to use the one configured for " + mrid);
- resolver = settings.getResolver(depMD.getResolvedModuleRevisionId());
- if (resolver != null) {
- Message.debug("\tconfigured resolver found for " + depMD.getResolvedModuleRevisionId()
- + ": " + resolver.getName() + ": saving this data");
- saveResolver(depMD, resolver.getName());
- }
- }
- DependencyResolver artResolver = settings.getResolver(artResolverName);
- if (artResolver == null) {
- artResolver = resolver;
- }
- if (resolver != null) {
- Message.debug("\tfound ivy file in cache for " + mrid + " (resolved by " + resolver.getName()
- + "): " + ivyFile);
- if (expectedResolver == null || expectedResolver.equals(resolver.getName())) {
- MetadataArtifactDownloadReport madr = new MetadataArtifactDownloadReport(
- depMD.getMetadataArtifact());
- madr.setDownloadStatus(DownloadStatus.NO);
- madr.setSearched(false);
- madr.setLocalFile(ivyFile);
- madr.setSize(ivyFile.length());
- madr.setArtifactOrigin(getSavedArtifactOrigin(depMD.getMetadataArtifact()));
- return new ResolvedModuleRevision(resolver, artResolver, depMD, madr);
- } else {
- Message.debug("found module in cache but with a different resolver: " + "discarding: "
- + mrid + "; expected resolver=" + expectedResolver + "; resolver="
- + resolver.getName());
- }
- } else {
- Message.debug("\tresolver not found: " + resolverName + " => cannot use cached ivy file for "
- + mrid);
- }
- } catch (ParseException e) {
- // will try with resolver
- Message.debug("\tproblem while parsing cached ivy file for: " + mrid + ": " + e.getMessage());
- } catch (IOException e) {
- // will try with resolver
- Message.debug("\tproblem while accessing cached ivy file for: " + mrid + ": " + e.getMessage());
- }
- } else {
- Message.debug("\tno ivy file in cache for " + mrid + ": tried " + ivyFile);
- }
- } finally {
- if (unlock) {
- unlockMetadataArtifact(mrid);
- }
- }
- return null;
- }
-
- private class MyModuleDescriptorProvider implements ModuleDescriptorProvider {
-
- private final ModuleDescriptorParser mdParser;
- private final ParserSettings settings;
-
- public MyModuleDescriptorProvider(ModuleDescriptorParser mdParser, ParserSettings settings) {
- this.mdParser = mdParser;
- this.settings = settings;
- }
-
- public ModuleDescriptor provideModule(ParserSettings ivySettings, File descriptorURL, boolean validate)
- throws ParseException, IOException {
- return mdParser.parseDescriptor(settings, descriptorURL.toURI().toURL(), validate);
- }
- }
-
- private ModuleDescriptor getMdFromCache(ModuleDescriptorParser mdParser, CacheMetadataOptions options, File ivyFile)
- throws ParseException, IOException {
- ModuleDescriptorMemoryCache cache = getMemoryCache();
- ModuleDescriptorProvider mdProvider = new MyModuleDescriptorProvider(mdParser, settings);
- return cache.get(ivyFile, settings, options.isValidate(), mdProvider);
- }
-
- private ModuleDescriptor getStaledMd(ModuleDescriptorParser mdParser, CacheMetadataOptions options, File ivyFile,
- ParserSettings parserSettings) throws ParseException, IOException {
- ModuleDescriptorMemoryCache cache = getMemoryCache();
- ModuleDescriptorProvider mdProvider = new MyModuleDescriptorProvider(mdParser, parserSettings);
- return cache.getStale(ivyFile, settings, options.isValidate(), mdProvider);
- }
-
- private String getResolvedRevision(ModuleRevisionId mrid, CacheMetadataOptions options) {
- if (!lockMetadataArtifact(mrid)) {
- Message.error("impossible to acquire lock for " + mrid);
- return null;
- }
- try {
- String resolvedRevision;
- if (options.isForce()) {
- Message.verbose("refresh mode: no check for cached resolved revision for " + mrid);
- return null;
- }
- PropertiesFile cachedResolvedRevision = getCachedDataFile(mrid);
- resolvedRevision = cachedResolvedRevision.getProperty("resolved.revision");
- if (resolvedRevision == null) {
- Message.verbose(getName() + ": no cached resolved revision for " + mrid);
- return null;
- }
-
- String resolvedTime = cachedResolvedRevision.getProperty("resolved.time");
- if (resolvedTime == null) {
- Message.verbose(getName() + ": inconsistent or old cache: no cached resolved time for " + mrid);
- saveResolvedRevision(mrid, resolvedRevision);
- return resolvedRevision;
- }
- if (options.isCheckTTL()) {
- long expiration = Long.parseLong(resolvedTime) + getTTL(mrid);
- if (expiration > 0 // negative expiration means that Long.MAX_VALUE has been exceeded
- && System.currentTimeMillis() > expiration) {
- Message.verbose(getName() + ": cached resolved revision expired for " + mrid);
- return null;
- }
- }
- return resolvedRevision;
- } finally {
- unlockMetadataArtifact(mrid);
- }
- }
-
- public void saveResolvedRevision(ModuleRevisionId mrid, String revision) {
- if (!lockMetadataArtifact(mrid)) {
- Message.error("impossible to acquire lock for " + mrid);
- return;
- }
- try {
- PropertiesFile cachedResolvedRevision = getCachedDataFile(mrid);
- cachedResolvedRevision.setProperty("resolved.time", String.valueOf(System.currentTimeMillis()));
- cachedResolvedRevision.setProperty("resolved.revision", revision);
- cachedResolvedRevision.save();
- } finally {
- unlockMetadataArtifact(mrid);
- }
- }
-
- public long getTTL(ModuleRevisionId mrid) {
- Long ttl = (Long) ttlRules.getRule(mrid);
- return ttl == null ? getDefaultTTL() : ttl;
- }
-
- public String toString() {
- return name;
- }
-
- public File getRepositoryCacheRoot() {
- return getBasedir();
- }
-
- public LockStrategy getLockStrategy() {
- if (lockStrategy == null) {
- if (lockStrategyName != null) {
- lockStrategy = settings.getLockStrategy(lockStrategyName);
- } else {
- lockStrategy = settings.getDefaultLockStrategy();
- }
- }
- return lockStrategy;
- }
-
- public void setLockStrategy(LockStrategy lockStrategy) {
- this.lockStrategy = lockStrategy;
- }
-
- public void setLockStrategy(String lockStrategyName) {
- this.lockStrategyName = lockStrategyName;
- }
-
- public ArtifactDownloadReport download(Artifact artifact, ArtifactResourceResolver resourceResolver,
- ResourceDownloader resourceDownloader, CacheDownloadOptions options) {
- final ArtifactDownloadReport adr = new ArtifactDownloadReport(artifact);
- boolean useOrigin = isUseOrigin();
-
- // TODO: see if we could lock on the artifact to download only, instead of the module
- // metadata artifact. We'd need to store artifact origin and is local in artifact specific
- // file to do so, or lock the metadata artifact only to update artifact origin, which would
- // mean acquiring nested locks, which can be a dangerous thing
- ModuleRevisionId mrid = artifact.getModuleRevisionId();
- if (!lockMetadataArtifact(mrid)) {
- adr.setDownloadStatus(DownloadStatus.FAILED);
- adr.setDownloadDetails("impossible to get lock for " + mrid);
- return adr;
- }
- try {
- DownloadListener listener = options.getListener();
- if (listener != null) {
- listener.needArtifact(this, artifact);
- }
- ArtifactOrigin origin = getSavedArtifactOrigin(artifact);
- // if we can use origin file, we just ask ivy for the file in cache, and it will
- // return the original one if possible. If we are not in useOrigin mode, we use the
- // getArchivePath method which always return a path in the actual cache
- File archiveFile = getArchiveFileInCache(artifact, origin, useOrigin);
-
- if (archiveFile.exists() && !options.isForce()) {
- adr.setDownloadStatus(DownloadStatus.NO);
- adr.setSize(archiveFile.length());
- adr.setArtifactOrigin(origin);
- adr.setLocalFile(archiveFile);
- } else {
- long start = System.currentTimeMillis();
- try {
- ResolvedResource artifactRef = resourceResolver.resolve(artifact);
- if (artifactRef != null) {
- origin = new ArtifactOrigin(artifact, artifactRef.getResource().isLocal(), artifactRef
- .getResource().getName());
- if (useOrigin && artifactRef.getResource().isLocal()) {
- saveArtifactOrigin(artifact, origin);
- archiveFile = getArchiveFileInCache(artifact, origin);
- adr.setDownloadStatus(DownloadStatus.NO);
- adr.setSize(archiveFile.length());
- adr.setArtifactOrigin(origin);
- adr.setLocalFile(archiveFile);
- } else {
- // refresh archive file now that we better now its origin
- archiveFile = getArchiveFileInCache(artifact, origin, useOrigin);
- if (ResourceHelper.equals(artifactRef.getResource(), archiveFile)) {
- throw new IllegalStateException("invalid settings for '" + resourceResolver
- + "': pointing repository to ivy cache is forbidden !");
- }
- if (listener != null) {
- listener.startArtifactDownload(this, artifactRef, artifact, origin);
- }
-
- resourceDownloader.download(artifact, artifactRef.getResource(), archiveFile);
- adr.setSize(archiveFile.length());
- saveArtifactOrigin(artifact, origin);
- adr.setDownloadTimeMillis(System.currentTimeMillis() - start);
- adr.setDownloadStatus(DownloadStatus.SUCCESSFUL);
- adr.setArtifactOrigin(origin);
- adr.setLocalFile(archiveFile);
- }
- } else {
- adr.setDownloadStatus(DownloadStatus.FAILED);
- adr.setDownloadDetails(ArtifactDownloadReport.MISSING_ARTIFACT);
- adr.setDownloadTimeMillis(System.currentTimeMillis() - start);
- }
- } catch (Exception ex) {
- adr.setDownloadStatus(DownloadStatus.FAILED);
- adr.setDownloadDetails(ex.getMessage());
- adr.setDownloadTimeMillis(System.currentTimeMillis() - start);
- }
- }
- if (listener != null) {
- listener.endArtifactDownload(this, artifact, adr, archiveFile);
- }
- return adr;
- } finally {
- unlockMetadataArtifact(mrid);
- }
- }
-
- public ArtifactDownloadReport downloadRepositoryResource(final Resource resource, String name, String type,
- String extension, CacheResourceOptions options, Repository repository) {
-
- String hash = computeResourceNameHash(resource);
- ModuleRevisionId mrid = ModuleRevisionId.newInstance("_repository_metadata_", hash, Ivy.getWorkingRevision());
- Artifact artifact = new DefaultArtifact(mrid, null, name, type, extension);
- final ArtifactDownloadReport adr = new ArtifactDownloadReport(artifact);
- boolean useOrigin = isUseOrigin();
-
- try {
- DownloadListener listener = options.getListener();
- if (listener != null) {
- listener.needArtifact(this, artifact);
- }
- ArtifactOrigin savedOrigin = getSavedArtifactOrigin(artifact);
- File archiveFile = getArchiveFileInCache(artifact, savedOrigin, useOrigin);
-
- ArtifactOrigin origin = new ArtifactOrigin(artifact, resource.isLocal(), resource.getName());
-
- if (!options.isForce()
- // if the local file has been checked to be up to date enough recently, don't download
- && checkCacheUptodate(archiveFile, resource, savedOrigin, origin, options.getTtl())) {
- if (archiveFile.exists()) {
- saveArtifactOrigin(artifact, origin);
- adr.setDownloadStatus(DownloadStatus.NO);
- adr.setSize(archiveFile.length());
- adr.setArtifactOrigin(savedOrigin);
- adr.setLocalFile(archiveFile);
- } else {
- // we trust the cache to says that the resource doesn't exist
- adr.setDownloadStatus(DownloadStatus.FAILED);
- adr.setDownloadDetails("Remote resource is known to not exist");
- }
- } else {
- long start = System.currentTimeMillis();
- origin.setLastChecked(start);
- try {
- ResolvedResource artifactRef = new ResolvedResource(resource, Ivy.getWorkingRevision());
- if (useOrigin && resource.isLocal()) {
- saveArtifactOrigin(artifact, origin);
- archiveFile = getArchiveFileInCache(artifact, origin);
- adr.setDownloadStatus(DownloadStatus.NO);
- adr.setSize(archiveFile.length());
- adr.setArtifactOrigin(origin);
- adr.setLocalFile(archiveFile);
- } else {
- if (listener != null) {
- listener.startArtifactDownload(this, artifactRef, artifact, origin);
- }
-
- // actual download
- if (archiveFile.exists()) {
- archiveFile.delete();
- }
- File part = new File(archiveFile.getAbsolutePath() + ".part");
- repository.get(resource.getName(), part);
- if (!part.renameTo(archiveFile)) {
- throw new IOException("impossible to move part file to definitive one: " + part + " -> "
- + archiveFile);
- }
-
- adr.setSize(archiveFile.length());
- saveArtifactOrigin(artifact, origin);
- adr.setDownloadTimeMillis(System.currentTimeMillis() - start);
- adr.setDownloadStatus(DownloadStatus.SUCCESSFUL);
- adr.setArtifactOrigin(origin);
- adr.setLocalFile(archiveFile);
- }
- } catch (Exception ex) {
- origin.setExist(false);
- saveArtifactOrigin(artifact, origin);
- adr.setDownloadStatus(DownloadStatus.FAILED);
- adr.setDownloadDetails(ex.getMessage());
- adr.setDownloadTimeMillis(System.currentTimeMillis() - start);
- }
- }
- if (listener != null) {
- listener.endArtifactDownload(this, artifact, adr, archiveFile);
- }
- return adr;
- } finally {
- unlockMetadataArtifact(mrid);
- }
- }
-
- /**
- * Compute a SHA1 of the resource name, encoded in base64, so we can use it as a file name.
- *
- * @param resource
- * the resource which name will be hashed
- * @return the hash
- */
- private String computeResourceNameHash(Resource resource) {
- byte[] shaDigest;
- try {
- shaDigest = SHA_DIGEST.digest(resource.getName().getBytes("UTF-8"));
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException("UTF-8 not supported", e);
- }
- return HexEncoder.encode(shaDigest);
- }
-
- /**
- * Check that a cached file can be considered up to date and thus not downloaded
- *
- * @param archiveFile
- * the file in the cache
- * @param resource
- * the remote resource to check
- * @param savedOrigin
- * the saved origin which contains that last checked date
- * @param origin
- * the origin in which to store the new last checked date
- * @param ttl
- * the time to live to consider the cache up to date
- * @return <code>true</code> if the cache is considered up to date
- */
- private boolean checkCacheUptodate(File archiveFile, Resource resource, ArtifactOrigin savedOrigin,
- ArtifactOrigin origin, long ttl) {
- long time = System.currentTimeMillis();
- if (savedOrigin.getLastChecked() != null && (time - savedOrigin.getLastChecked()) < ttl) {
- // still in the ttl period, no need to check, trust the cache
- if (!archiveFile.exists()) {
- // but if the local archive doesn't exist, trust the cache only if the cached origin
- // says that the remote resource doesn't exist either
- return !savedOrigin.isExists();
- }
- return true;
- }
- if (!archiveFile.exists()) {
- // the the file doesn't exist in the cache, obviously not up to date
- return false;
- }
- origin.setLastChecked(time);
- // check if the local resource is up to date regarding the remote one
- return archiveFile.lastModified() >= resource.getLastModified();
- }
-
- public void originalToCachedModuleDescriptor(DependencyResolver resolver, ResolvedResource orginalMetadataRef,
- Artifact requestedMetadataArtifact, ResolvedModuleRevision rmr, ModuleDescriptorWriter writer) {
- ModuleDescriptor md = rmr.getDescriptor();
- Artifact originalMetadataArtifact = getOriginalMetadataArtifact(requestedMetadataArtifact);
- File mdFileInCache = getIvyFileInCache(md.getResolvedModuleRevisionId());
-
- ModuleRevisionId mrid = requestedMetadataArtifact.getModuleRevisionId();
- if (!lockMetadataArtifact(mrid)) {
- Message.warn("impossible to acquire lock for: " + mrid);
- return;
- }
- try {
- File originalFileInCache = getArchiveFileInCache(originalMetadataArtifact);
- writer.write(orginalMetadataRef, md, originalFileInCache, mdFileInCache);
-
- getMemoryCache().putInCache(mdFileInCache, new ParserSettingsMonitor(settings), true, md);
- saveResolvers(md, resolver.getName(), resolver.getName());
-
- if (!md.isDefault()) {
- rmr.getReport().setOriginalLocalFile(originalFileInCache);
- }
- rmr.getReport().setLocalFile(mdFileInCache);
- } catch (Exception e) {
- Message.warn("impossible to put metadata file in cache: "
- + (orginalMetadataRef == null ? String.valueOf(md.getResolvedModuleRevisionId()) : String
- .valueOf(orginalMetadataRef)) + ". " + e.getClass().getName() + ": " + e.getMessage());
- } finally {
- unlockMetadataArtifact(mrid);
- }
- }
-
- public ResolvedModuleRevision cacheModuleDescriptor(DependencyResolver resolver, final ResolvedResource mdRef,
- DependencyDescriptor dd, Artifact moduleArtifact, ResourceDownloader downloader,
- CacheMetadataOptions options) throws ParseException {
- Date cachedPublicationDate = null;
- ArtifactDownloadReport report;
- ModuleRevisionId mrid = moduleArtifact.getModuleRevisionId();
- if (!lockMetadataArtifact(mrid)) {
- Message.error("impossible to acquire lock for " + mrid);
- return null;
- }
-
- BackupResourceDownloader backupDownloader = new BackupResourceDownloader(downloader);
-
- try {
- if (!moduleArtifact.isMetadata()) {
- // the descriptor we are trying to cache is a default one, not much to do
- // just make sure the old artifacts are deleted...
- if (isChanging(dd, mrid, options)) {
- long repoLastModified = mdRef.getLastModified();
-
- Artifact transformedArtifact = NameSpaceHelper.transform(moduleArtifact, options.getNamespace()
- .getToSystemTransformer());
- ArtifactOrigin origin = getSavedArtifactOrigin(transformedArtifact);
- File artFile = getArchiveFileInCache(transformedArtifact, origin, false);
- if (artFile.exists() && repoLastModified > artFile.lastModified()) {
- // artifacts have changed, they should be downloaded again
- Message.verbose(mrid + " has changed: deleting old artifacts");
- Message.debug("deleting " + artFile);
- if (!artFile.delete()) {
- Message.error("Couldn't delete outdated artifact from cache: " + artFile);
- return null;
- }
- removeSavedArtifactOrigin(transformedArtifact);
- }
- }
- return null;
- }
-
- // now let's see if we can find it in cache and if it is up to date
- ResolvedModuleRevision rmr = doFindModuleInCache(mrid, options, null);
- if (rmr != null) {
- if (rmr.getDescriptor().isDefault() && rmr.getResolver() != resolver) {
- Message.verbose("\t" + getName() + ": found revision in cache: " + mrid + " (resolved by "
- + rmr.getResolver().getName() + "): but it's a default one, maybe we can find a better one");
- } else {
- if (!isCheckmodified(dd, mrid, options) && !isChanging(dd, mrid, options)) {
- Message.verbose("\t" + getName() + ": revision in cache: " + mrid);
- rmr.getReport().setSearched(true);
- return rmr;
- }
- long repLastModified = mdRef.getLastModified();
- long cacheLastModified = rmr.getDescriptor().getLastModified();
- if (!rmr.getDescriptor().isDefault() && repLastModified <= cacheLastModified) {
- Message.verbose("\t" + getName() + ": revision in cache (not updated): " + mrid);
- rmr.getReport().setSearched(true);
- return rmr;
- } else {
- Message.verbose("\t" + getName() + ": revision in cache is not up to date: " + mrid);
- if (isChanging(dd, mrid, options)) {
- // ivy file has been updated, we should see if it has a new publication
- // date to see if a new download is required (in case the dependency is
- // a changing one)
- cachedPublicationDate = rmr.getDescriptor().getResolvedPublicationDate();
- }
- }
- }
- }
-
- Artifact originalMetadataArtifact = getOriginalMetadataArtifact(moduleArtifact);
- // now download module descriptor and parse it
- report = download(originalMetadataArtifact, new ArtifactResourceResolver() {
- public ResolvedResource resolve(Artifact artifact) {
- return mdRef;
- }
- }, backupDownloader, new CacheDownloadOptions().setListener(options.getListener()).setForce(true));
- Message.verbose("\t" + report);
-
- if (report.getDownloadStatus() == DownloadStatus.FAILED) {
- Message.warn("problem while downloading module descriptor: " + mdRef.getResource() + ": "
- + report.getDownloadDetails() + " (" + report.getDownloadTimeMillis() + "ms)");
- return null;
- }
-
- try {
- ModuleDescriptorParser parser = ModuleDescriptorParserRegistry.getInstance().getParser(
- mdRef.getResource());
- ParserSettings parserSettings = settings;
- if (resolver instanceof AbstractResolver) {
- parserSettings = ((AbstractResolver) resolver).getParserSettings();
- }
- ModuleDescriptor md = getStaledMd(parser, options, report.getLocalFile(), parserSettings);
- if (md == null) {
- throw new IllegalStateException("module descriptor parser returned a null module descriptor, "
- + "which is not allowed. " + "parser=" + parser + "; parser class="
- + parser.getClass().getName() + "; module descriptor resource=" + mdRef.getResource());
- }
- Message.debug("\t" + getName() + ": parsed downloaded md file for " + mrid + "; parsed="
- + md.getModuleRevisionId());
-
- // check if we should delete old artifacts
- boolean deleteOldArtifacts = false;
- if (cachedPublicationDate != null && !cachedPublicationDate.equals(md.getResolvedPublicationDate())) {
- // artifacts have changed, they should be downloaded again
- Message.verbose(mrid + " has changed: deleting old artifacts");
- deleteOldArtifacts = true;
- }
- if (deleteOldArtifacts) {
- String[] confs = md.getConfigurationsNames();
- for (String conf : confs) {
- Artifact[] arts = md.getArtifacts(conf);
- for (Artifact art : arts) {
- Artifact transformedArtifact = NameSpaceHelper.transform(art, options.getNamespace()
- .getToSystemTransformer());
- ArtifactOrigin origin = getSavedArtifactOrigin(transformedArtifact);
- File artFile = getArchiveFileInCache(transformedArtifact, origin, false);
- if (artFile.exists()) {
- Message.debug("deleting " + artFile);
- if (!artFile.delete()) {
- // Old artifacts couldn't get deleted!
- // Restore the original ivy file so the next time we
- // resolve the old artifacts are deleted again
- backupDownloader.restore();
- Message.error("Couldn't delete outdated artifact from cache: " + artFile);
- return null;
- }
- }
- removeSavedArtifactOrigin(transformedArtifact);
- }
- }
- } else if (isChanging(dd, mrid, options)) {
- Message.verbose(mrid + " is changing, but has not changed: will trust cached artifacts if any");
- }
-
- MetadataArtifactDownloadReport madr = new MetadataArtifactDownloadReport(md.getMetadataArtifact());
- madr.setSearched(true);
- madr.setDownloadStatus(report.getDownloadStatus());
- madr.setDownloadDetails(report.getDownloadDetails());
- madr.setArtifactOrigin(report.getArtifactOrigin());
- madr.setDownloadTimeMillis(report.getDownloadTimeMillis());
- madr.setOriginalLocalFile(report.getLocalFile());
- madr.setSize(report.getSize());
-
- Artifact transformedMetadataArtifact = NameSpaceHelper.transform(md.getMetadataArtifact(), options
- .getNamespace().getToSystemTransformer());
- saveArtifactOrigin(transformedMetadataArtifact, report.getArtifactOrigin());
-
- return new ResolvedModuleRevision(resolver, resolver, md, madr);
- } catch (IOException ex) {
- Message.warn("io problem while parsing ivy file: " + mdRef.getResource() + ": " + ex.getMessage());
- return null;
- }
- } finally {
- unlockMetadataArtifact(mrid);
- backupDownloader.cleanUp();
- }
-
- }
-
- // lock used to lock all metadata related information access
- private boolean lockMetadataArtifact(ModuleRevisionId mrid) {
- Artifact artifact = getDefaultMetadataArtifact(mrid);
- try {
- // we need to provide an artifact origin to be sure we do not end up in a stack overflow
- // if the cache pattern is using original name, and the substitution thus trying to get
- // the saved artifact origin value which in turns calls this method
- return getLockStrategy().lockArtifact(artifact,
- getArchiveFileInCache(artifact, getDefaultMetadataArtifactOrigin(mrid)));
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt(); // reset interrupt status
- throw new RuntimeException("operation interrupted");
- }
- }
-
- private void unlockMetadataArtifact(ModuleRevisionId mrid) {
- Artifact artifact = getDefaultMetadataArtifact(mrid);
- getLockStrategy().unlockArtifact(artifact,
- getArchiveFileInCache(artifact, getDefaultMetadataArtifactOrigin(mrid)));
- }
-
- private ArtifactOrigin getDefaultMetadataArtifactOrigin(ModuleRevisionId mrid) {
- // it's important to say the origin is not local to make sure it won't ever be used for
- // anything else than original token
- return new ArtifactOrigin(DefaultArtifact.newIvyArtifact(mrid, null), false, getIvyFileInCache(mrid).getPath());
- }
-
- private Artifact getDefaultMetadataArtifact(ModuleRevisionId mrid) {
- return new DefaultArtifact(mrid, new Date(), "metadata", "metadata", "ivy", true);
- }
-
- // not used any more, but maybe useful for finer grain locking when downloading artifacts
- // private boolean lockArtifact(Artifact artifact) {
- // try {
- // return getLockStrategy().lockArtifact(artifact,
- // getArchiveFileInCache(artifact, null));
- // } catch (InterruptedException e) {
- // Thread.currentThread().interrupt(); // reset interrupt status
- // throw new RuntimeException("operation interrupted");
- // }
- // }
- //
- // private void unlockArtifact(Artifact artifact) {
- // getLockStrategy().unlockArtifact(artifact, getArchiveFileInCache(artifact, null));
- // }
-
- public Artifact getOriginalMetadataArtifact(Artifact moduleArtifact) {
- return DefaultArtifact.cloneWithAnotherType(moduleArtifact, moduleArtifact.getType() + ".original");
- }
-
- private boolean isOriginalMetadataArtifact(Artifact artifact) {
- return artifact.isMetadata() && artifact.getType().endsWith(".original");
- }
-
- private boolean isChanging(DependencyDescriptor dd, ModuleRevisionId requestedRevisionId,
- CacheMetadataOptions options) {
- return dd.isChanging() || getChangingMatcher(options).matches(requestedRevisionId.getRevision());
- }
-
- private Matcher getChangingMatcher(CacheMetadataOptions options) {
- String changingPattern = options.getChangingPattern() != null ? options.getChangingPattern()
- : this.changingPattern;
- if (changingPattern == null) {
- return NoMatcher.INSTANCE;
- }
- String changingMatcherName = options.getChangingMatcherName() != null ? options.getChangingMatcherName()
- : this.changingMatcherName;
- PatternMatcher matcher = settings.getMatcher(changingMatcherName);
- if (matcher == null) {
- throw new IllegalStateException("unknown matcher '" + changingMatcherName
- + "'. It is set as changing matcher in " + this);
- }
- return matcher.getMatcher(changingPattern);
- }
-
- private boolean isCheckmodified(DependencyDescriptor dd, ModuleRevisionId requestedRevisionId,
- CacheMetadataOptions options) {
- if (options.isCheckmodified() != null) {
- return options.isCheckmodified();
- }
- return isCheckmodified();
- }
-
- public void clean() {
- FileUtil.forceDelete(getBasedir());
- }
-
- public void dumpSettings() {
- Message.verbose("\t" + getName());
- Message.debug("\t\tivyPattern: " + getIvyPattern());
- Message.debug("\t\tartifactPattern: " + getArtifactPattern());
- Message.debug("\t\tlockingStrategy: " + getLockStrategy().getName());
- Message.debug("\t\tchangingPattern: " + getChangingPattern());
- Message.debug("\t\tchangingMatcher: " + getChangingMatcherName());
- }
-
- /**
- * Resource downloader which makes a copy of the previously existing file before overriding it.
- * <p>
- * The backup file can be restored or cleanuped later
- */
- private final class BackupResourceDownloader implements ResourceDownloader {
-
- private ResourceDownloader delegate;
- private File backup;
- private String originalPath;
-
- private BackupResourceDownloader(ResourceDownloader delegate) {
- this.delegate = delegate;
- }
-
- public void download(Artifact artifact, Resource resource, File dest) throws IOException {
- // keep a copy of the original file
- if (dest.exists()) {
- originalPath = dest.getAbsolutePath();
- backup = new File(dest.getAbsolutePath() + ".backup");
- FileUtil.copy(dest, backup, null, true);
- }
- delegate.download(artifact, resource, dest);
- }
-
- public void restore() throws IOException {
- if ((backup != null) && backup.exists()) {
- File original = new File(originalPath);
- FileUtil.copy(backup, original, null, true);
- backup.delete();
- }
- }
-
- public void cleanUp() {
- if ((backup != null) && backup.exists()) {
- backup.delete();
- }
- }
-
- }
-}
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/0d30d6fa/src/main/java/org/apache/ivy/core/cache/EasyantResolutionCacheManager.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/ivy/core/cache/EasyantResolutionCacheManager.java b/src/main/java/org/apache/ivy/core/cache/EasyantResolutionCacheManager.java
deleted file mode 100644
index 899c26c..0000000
--- a/src/main/java/org/apache/ivy/core/cache/EasyantResolutionCacheManager.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.ivy.core.cache;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.text.ParseException;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.ivy.core.IvyPatternHelper;
-import org.apache.ivy.core.RelativeUrlResolver;
-import org.apache.ivy.core.module.descriptor.ExtendsDescriptor;
-import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-import org.apache.ivy.core.module.id.ModuleId;
-import org.apache.ivy.core.module.id.ModuleRevisionId;
-import org.apache.ivy.core.module.status.StatusManager;
-import org.apache.ivy.core.settings.IvySettings;
-import org.apache.ivy.plugins.IvySettingsAware;
-import org.apache.ivy.plugins.conflict.ConflictManager;
-import org.apache.ivy.plugins.matcher.PatternMatcher;
-import org.apache.ivy.plugins.namespace.Namespace;
-import org.apache.ivy.plugins.parser.ModuleDescriptorParser;
-import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
-import org.apache.ivy.plugins.parser.ParserSettings;
-import org.apache.ivy.plugins.repository.url.URLResource;
-import org.apache.ivy.plugins.resolver.DependencyResolver;
-import org.apache.ivy.util.FileUtil;
-
-public class EasyantResolutionCacheManager implements ResolutionCacheManager, IvySettingsAware {
-
- private static final String DEFAULT_CACHE_RESOLVED_IVY_PATTERN = "resolved-[organisation]-[module]-[revision].xml";
-
- private static final String DEFAULT_CACHE_RESOLVED_IVY_PROPERTIES_PATTERN = "resolved-[organisation]-[module]-[revision].properties";
-
- private String resolvedIvyPattern = DEFAULT_CACHE_RESOLVED_IVY_PATTERN;
-
- private String resolvedIvyPropertiesPattern = DEFAULT_CACHE_RESOLVED_IVY_PROPERTIES_PATTERN;
-
- private File basedir;
-
- private String name = "resolution-cache";
-
- private IvySettings settings;
-
- public EasyantResolutionCacheManager() {
- }
-
- public EasyantResolutionCacheManager(File basedir) {
- setBasedir(basedir);
- }
-
- public void setSettings(IvySettings settings) {
- this.settings = settings;
- }
-
- public File getResolutionCacheRoot() {
- return basedir;
- }
-
- public File getBasedir() {
- return basedir;
- }
-
- public void setBasedir(File basedir) {
- this.basedir = basedir;
- }
-
- public String getResolvedIvyPattern() {
- return resolvedIvyPattern;
- }
-
- public void setResolvedIvyPattern(String cacheResolvedIvyPattern) {
- this.resolvedIvyPattern = cacheResolvedIvyPattern;
- }
-
- public String getResolvedIvyPropertiesPattern() {
- return resolvedIvyPropertiesPattern;
- }
-
- public void setResolvedIvyPropertiesPattern(String cacheResolvedIvyPropertiesPattern) {
- this.resolvedIvyPropertiesPattern = cacheResolvedIvyPropertiesPattern;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public File getResolvedIvyFileInCache(ModuleRevisionId mrid) {
- String file = IvyPatternHelper.substitute(getResolvedIvyPattern(), mrid.getOrganisation(), mrid.getName(),
- mrid.getRevision(), "ivy", "ivy", "xml");
- return new File(getResolutionCacheRoot(), file);
- }
-
- public File getResolvedIvyPropertiesInCache(ModuleRevisionId mrid) {
- String file = IvyPatternHelper.substitute(getResolvedIvyPropertiesPattern(), mrid.getOrganisation(),
- mrid.getName(), mrid.getRevision(), "ivy", "ivy", "xml");
- return new File(getResolutionCacheRoot(), file);
- }
-
- public File getConfigurationResolveReportInCache(String resolveId, String conf) {
- return new File(getResolutionCacheRoot(), resolveId + "-" + conf + ".xml");
- }
-
- public File[] getConfigurationResolveReportsInCache(final String resolveId) {
- final String prefix = resolveId + "-";
- final String suffix = ".xml";
- return getResolutionCacheRoot().listFiles(new FilenameFilter() {
- public boolean accept(File dir, String name) {
- return (name.startsWith(prefix) && name.endsWith(suffix));
- }
- });
- }
-
- public ModuleDescriptor getResolvedModuleDescriptor(ModuleRevisionId mrid) throws ParseException, IOException {
- File ivyFile = getResolvedIvyFileInCache(mrid);
- if (!ivyFile.exists()) {
- throw new IllegalStateException("Ivy file not found in cache for " + mrid + "!");
- }
-
- Properties paths = new Properties();
-
- File parentsFile = getResolvedIvyPropertiesInCache(ModuleRevisionId.newInstance(mrid, mrid.getRevision()
- + "-parents"));
- if (parentsFile.exists()) {
- FileInputStream in = null;
- try {
- in = new FileInputStream(parentsFile);
- paths.load(in);
-
- } finally {
- if (in != null) {
- in.close();
- }
- }
- }
-
- ParserSettings pSettings = new CacheParserSettings(settings, paths);
-
- URL ivyFileURL = ivyFile.toURI().toURL();
- ModuleDescriptorParser parser = ModuleDescriptorParserRegistry.getInstance().getParser(
- new URLResource(ivyFileURL));
- return parser.parseDescriptor(pSettings, ivyFileURL, false);
- }
-
- public void saveResolvedModuleDescriptor(ModuleDescriptor md) throws ParseException, IOException {
- ModuleRevisionId mrevId = md.getResolvedModuleRevisionId();
- File ivyFileInCache = getResolvedIvyFileInCache(mrevId);
- md.toIvyFile(ivyFileInCache);
-
- Properties paths = new Properties();
- saveLocalParents(mrevId, md, ivyFileInCache, paths);
-
- if (!paths.isEmpty()) {
- File parentsFile = getResolvedIvyPropertiesInCache(ModuleRevisionId.newInstance(mrevId,
- mrevId.getRevision() + "-parents"));
- FileOutputStream out = null;
- try {
- out = new FileOutputStream(parentsFile);
- paths.store(out, null);
- } finally {
- if (out != null) {
- out.close();
- }
- }
- }
- }
-
- private void saveLocalParents(ModuleRevisionId baseMrevId, ModuleDescriptor md, File mdFile, Properties paths)
- throws ParseException, IOException {
- ExtendsDescriptor[] parents = md.getInheritedDescriptors();
- for (ExtendsDescriptor parent1 : parents) {
- if (!parent1.isLocal()) {
- // we store only local parents in the cache!
- continue;
- }
-
- ModuleDescriptor parent = parent1.getParentMd();
- ModuleRevisionId pRevId = ModuleRevisionId.newInstance(baseMrevId, baseMrevId.getRevision() + "-parent."
- + paths.size());
- File parentFile = getResolvedIvyFileInCache(pRevId);
- parent.toIvyFile(parentFile);
-
- paths.setProperty(mdFile.getName() + "|" + parent1.getLocation(), parentFile.getAbsolutePath());
- saveLocalParents(baseMrevId, parent, parentFile, paths);
- }
- }
-
- public String toString() {
- return name;
- }
-
- public void clean() {
- FileUtil.forceDelete(getBasedir());
- }
-
- private static class CacheParserSettings implements ParserSettings {
-
- private ParserSettings delegate;
- private Map parentPaths;
-
- public CacheParserSettings(ParserSettings delegate, Map parentPaths) {
- this.delegate = delegate;
- this.parentPaths = parentPaths;
- }
-
- public String substitute(String value) {
- return delegate.substitute(value);
- }
-
- public Map substitute(Map strings) {
- return delegate.substitute(strings);
- }
-
- public ResolutionCacheManager getResolutionCacheManager() {
- return delegate.getResolutionCacheManager();
- }
-
- public ConflictManager getConflictManager(String name) {
- return delegate.getConflictManager(name);
- }
-
- public PatternMatcher getMatcher(String matcherName) {
- return delegate.getMatcher(matcherName);
- }
-
- public Namespace getNamespace(String namespace) {
- return delegate.getNamespace(namespace);
- }
-
- public StatusManager getStatusManager() {
- return delegate.getStatusManager();
- }
-
- public RelativeUrlResolver getRelativeUrlResolver() {
- return new MapURLResolver(parentPaths, delegate.getRelativeUrlResolver());
- }
-
- public DependencyResolver getResolver(ModuleRevisionId mRevId) {
- return delegate.getResolver(mRevId);
- }
-
- public File resolveFile(String filename) {
- return delegate.resolveFile(filename);
- }
-
- public String getDefaultBranch(ModuleId moduleId) {
- return delegate.getDefaultBranch(moduleId);
- }
-
- public Namespace getContextNamespace() {
- return delegate.getContextNamespace();
- }
- }
-
- private static class MapURLResolver extends RelativeUrlResolver {
-
- private Map paths;
- private RelativeUrlResolver delegate;
-
- private MapURLResolver(Map paths, RelativeUrlResolver delegate) {
- this.paths = paths;
- this.delegate = delegate;
- }
-
- public URL getURL(URL context, String url) throws MalformedURLException {
- String path = context.getPath();
- if (path.indexOf('/') >= 0) {
- String file = path.substring(path.lastIndexOf('/') + 1);
-
- if (paths.containsKey(file + "|" + url)) {
- File result = new File(paths.get(file + "|" + url).toString());
- return result.toURI().toURL();
- }
- }
-
- return delegate.getURL(context, url);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/0d30d6fa/src/test/java/org/apache/easyant/core/EasyAntEngineTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/easyant/core/EasyAntEngineTest.java b/src/test/java/org/apache/easyant/core/EasyAntEngineTest.java
index c74fbbf..cdb5d03 100644
--- a/src/test/java/org/apache/easyant/core/EasyAntEngineTest.java
+++ b/src/test/java/org/apache/easyant/core/EasyAntEngineTest.java
@@ -24,8 +24,8 @@ import org.apache.easyant.core.ivy.IvyInstanceHelper;
import org.apache.easyant.core.services.DefaultPluginService;
import org.apache.ivy.Ivy;
import org.apache.ivy.ant.IvyAntSettings;
-import org.apache.ivy.core.cache.EasyAntRepositoryCacheManager;
-import org.apache.ivy.core.cache.EasyantResolutionCacheManager;
+import org.apache.easyant.core.ivy.EasyAntRepositoryCacheManager;
+import org.apache.easyant.core.ivy.EasyantResolutionCacheManager;
import org.apache.tools.ant.BuildLogger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.input.DefaultInputHandler;
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/0d30d6fa/src/test/java/org/apache/easyant/tasks/ConfigureBuildScopedRepositoryTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/easyant/tasks/ConfigureBuildScopedRepositoryTest.java b/src/test/java/org/apache/easyant/tasks/ConfigureBuildScopedRepositoryTest.java
index e441486..f66d4b6 100644
--- a/src/test/java/org/apache/easyant/tasks/ConfigureBuildScopedRepositoryTest.java
+++ b/src/test/java/org/apache/easyant/tasks/ConfigureBuildScopedRepositoryTest.java
@@ -31,7 +31,7 @@ import org.apache.easyant.core.ant.ProjectUtils;
import org.apache.easyant.core.ivy.IvyInstanceHelper;
import org.apache.ivy.Ivy;
import org.apache.ivy.ant.IvyConfigure;
-import org.apache.ivy.core.cache.EasyAntRepositoryCacheManager;
+import org.apache.easyant.core.ivy.EasyAntRepositoryCacheManager;
import org.apache.ivy.plugins.resolver.DependencyResolver;
import org.apache.ivy.plugins.resolver.FileSystemResolver;
import org.apache.tools.ant.Project;
http://git-wip-us.apache.org/repos/asf/ant-easyant-core/blob/0d30d6fa/src/test/java/org/apache/easyant/tasks/RegisterArtifactTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/easyant/tasks/RegisterArtifactTest.java b/src/test/java/org/apache/easyant/tasks/RegisterArtifactTest.java
index 5dc2690..e045982 100644
--- a/src/test/java/org/apache/easyant/tasks/RegisterArtifactTest.java
+++ b/src/test/java/org/apache/easyant/tasks/RegisterArtifactTest.java
@@ -30,8 +30,8 @@ import org.apache.easyant.core.parser.DefaultEasyAntXmlModuleDescriptorParser;
import org.apache.ivy.ant.IvyConfigure;
import org.apache.ivy.ant.IvyPublish;
import org.apache.ivy.ant.IvyResolve;
-import org.apache.ivy.core.cache.EasyAntRepositoryCacheManager;
-import org.apache.ivy.core.cache.EasyantResolutionCacheManager;
+import org.apache.easyant.core.ivy.EasyAntRepositoryCacheManager;
+import org.apache.easyant.core.ivy.EasyantResolutionCacheManager;
import org.apache.ivy.core.report.ResolveReport;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;