You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by xa...@apache.org on 2007/12/06 06:41:39 UTC
svn commit: r601621 - in /ant/ivy/core/branches/2.0.0-beta1: ./
src/etc/license/ src/java/org/apache/ivy/ant/
src/java/org/apache/ivy/core/cache/ src/java/org/apache/ivy/core/resolve/
src/java/org/apache/ivy/core/settings/ src/java/org/apache/ivy/plugi...
Author: xavier
Date: Wed Dec 5 21:41:34 2007
New Revision: 601621
URL: http://svn.apache.org/viewvc?rev=601621&view=rev
Log:
merge bugfix for cache locking + makepom changes; use makepom changes + package crypto in build-release.xml
Added:
ant/ivy/core/branches/2.0.0-beta1/src/etc/license/
ant/ivy/core/branches/2.0.0-beta1/src/etc/license/license-header.xml (with props)
Modified:
ant/ivy/core/branches/2.0.0-beta1/build-release.xml
ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/ant/IvyMakePom.java
ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/cache/CacheManager.java
ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/cache/RepositoryCacheManager.java
ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/resolve/IvyNode.java
ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/settings/IvySettings.java
ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/plugins/lock/FileBasedLockStrategy.java
ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorWriter.java
Modified: ant/ivy/core/branches/2.0.0-beta1/build-release.xml
URL: http://svn.apache.org/viewvc/ant/ivy/core/branches/2.0.0-beta1/build-release.xml?rev=601621&r1=601620&r2=601621&view=diff
==============================================================================
--- ant/ivy/core/branches/2.0.0-beta1/build-release.xml (original)
+++ ant/ivy/core/branches/2.0.0-beta1/build-release.xml Wed Dec 5 21:41:34 2007
@@ -64,6 +64,7 @@
<zipfileset dir="${doc.build.dir}" prefix="${snapshot.full.name}/doc" excludes="**/reports/coverage/**,**/reports/test/**"/>
<zipfileset dir="${src.dir}" prefix="${snapshot.full.name}/src/java"/>
<zipfileset dir="${basedir}/src/example" prefix="${snapshot.full.name}/src/example"/>
+ <zipfileset dir="${basedir}/src/etc" prefix="${snapshot.full.name}/src/etc"/>
<zipfileset dir="${test.dir}" prefix="${snapshot.full.name}/test/java"/>
<zipfileset dir="${basedir}/test/repositories" prefix="${snapshot.full.name}/test/repositories"/>
<zipfileset dir="${basedir}/test/buildlist" prefix="${snapshot.full.name}/test/buildlist"/>
@@ -72,6 +73,7 @@
<zipfileset dir="${src.dir}/org/apache/ivy/plugins/parser/xml" includes="ivy.xsd" fullpath="${snapshot.full.name}/ivy.xsd"/>
<zipfileset dir="${basedir}" includes="MANIFEST.MF" fullpath="${snapshot.full.name}/MANIFEST.MF"/>
<zipfileset dir="${basedir}" includes="NOTICE" fullpath="${snapshot.full.name}/NOTICE"/>
+ <zipfileset dir="${basedir}" includes="README" fullpath="${snapshot.full.name}/README"/>
<zipfileset dir="${basedir}" includes="LICENSE*" prefix="${snapshot.full.name}"/>
<zipfileset dir="${basedir}" includes="CHANGES.txt" fullpath="${snapshot.full.name}/CHANGES.txt"/>
<zipfileset dir="${basedir}" includes="RELEASE_NOTES" fullpath="${snapshot.full.name}/RELEASE_NOTES"/>
@@ -93,6 +95,7 @@
<zipfileset dir="${doc.build.dir}" prefix="${snapshot.full.name}/doc" excludes="**/reports/coverage/**,**/reports/test/**"/>
<zipfileset dir="${basedir}/src/example" prefix="${snapshot.full.name}/src/example"/>
<zipfileset dir="${basedir}" includes="NOTICE" fullpath="${snapshot.full.name}/NOTICE"/>
+ <zipfileset dir="${basedir}" includes="README" fullpath="${snapshot.full.name}/README"/>
<zipfileset dir="${basedir}" includes="LICENSE*" prefix="${snapshot.full.name}"/>
<zipfileset dir="${basedir}" includes="CHANGES.txt" fullpath="${snapshot.full.name}/CHANGES.txt"/>
<zipfileset dir="${basedir}" includes="RELEASE_NOTES" fullpath="${snapshot.full.name}/RELEASE_NOTES"/>
@@ -116,6 +119,7 @@
<zipfileset dir="${doc.build.dir}" prefix="${snapshot.full.name}/doc" excludes="**/reports/coverage/**,**/reports/test/**"/>
<zipfileset dir="${basedir}/src/example" prefix="${snapshot.full.name}/src/example"/>
<zipfileset dir="${basedir}" includes="NOTICE" fullpath="${snapshot.full.name}/NOTICE"/>
+ <zipfileset dir="${basedir}" includes="README" fullpath="${snapshot.full.name}/README"/>
<zipfileset dir="${basedir}" includes="LICENSE*" prefix="${snapshot.full.name}"/>
<zipfileset dir="${basedir}" includes="CHANGES.txt" fullpath="${snapshot.full.name}/CHANGES.txt"/>
<zipfileset dir="${basedir}" includes="RELEASE_NOTES" fullpath="${snapshot.full.name}/RELEASE_NOTES"/>
@@ -151,7 +155,8 @@
<target name="snapshot-maven2" depends="init-snapshot, snapshot-metadata, jar, sources, javadoc">
<property name="m2.distrib.dir" value="${distrib.dir}/maven2/${build.version}" />
<ivy:makepom ivyfile="${distrib.dir}/ivy.xml"
- pomfile="${m2.distrib.dir}/ivy-${build.version}.pom">
+ pomfile="${m2.distrib.dir}/ivy-${build.version}.pom"
+ headerfile="${basedir}/src/etc/license/license-header.xml">
<mapping conf="core" scope="compile"/>
<mapping conf="test" scope="test"/>
</ivy:makepom>
Added: ant/ivy/core/branches/2.0.0-beta1/src/etc/license/license-header.xml
URL: http://svn.apache.org/viewvc/ant/ivy/core/branches/2.0.0-beta1/src/etc/license/license-header.xml?rev=601621&view=auto
==============================================================================
--- ant/ivy/core/branches/2.0.0-beta1/src/etc/license/license-header.xml (added)
+++ ant/ivy/core/branches/2.0.0-beta1/src/etc/license/license-header.xml Wed Dec 5 21:41:34 2007
@@ -0,0 +1,18 @@
+<!--
+ 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.
+-->
Propchange: ant/ivy/core/branches/2.0.0-beta1/src/etc/license/license-header.xml
------------------------------------------------------------------------------
svn:eol-style = native
Modified: ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/ant/IvyMakePom.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/ant/IvyMakePom.java?rev=601621&r1=601620&r2=601621&view=diff
==============================================================================
--- ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/ant/IvyMakePom.java (original)
+++ ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/ant/IvyMakePom.java Wed Dec 5 21:41:34 2007
@@ -30,8 +30,10 @@
import org.apache.ivy.plugins.parser.m2.PomModuleDescriptorWriter;
import org.apache.ivy.plugins.parser.m2.PomModuleDescriptorWriter.ConfigurationScopeMapping;
import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParser;
+import org.apache.ivy.util.FileUtil;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
+import org.apache.tools.ant.util.FileUtils;
/**
* Convert an ivy file to a pom
@@ -56,6 +58,8 @@
private File pomFile = null;
+ private File headerFile = null;
+
private File ivyFile = null;
private Collection mappings = new ArrayList();
@@ -75,6 +79,14 @@
public void setIvyFile(File ivyFile) {
this.ivyFile = ivyFile;
}
+
+ public File getHeaderFile() {
+ return headerFile;
+ }
+
+ public void setHeaderFile(File headerFile) {
+ this.headerFile = headerFile;
+ }
public Mapping createMapping() {
Mapping mapping = new Mapping();
@@ -92,7 +104,8 @@
}
ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor(
getSettings(), ivyFile.toURL(), false);
- PomModuleDescriptorWriter.write(md,
+ PomModuleDescriptorWriter.write(md,
+ headerFile == null ? null : FileUtil.readEntirely(getHeaderFile()),
mappings.isEmpty()
? PomModuleDescriptorWriter.DEFAULT_MAPPING
: new ConfigurationScopeMapping(getMappingsMap()), pomFile);
Modified: ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/cache/CacheManager.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/cache/CacheManager.java?rev=601621&r1=601620&r2=601621&view=diff
==============================================================================
--- ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/cache/CacheManager.java (original)
+++ ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/cache/CacheManager.java Wed Dec 5 21:41:34 2007
@@ -164,7 +164,8 @@
* @param name
* resolver name
*/
- public void saveResolver(ModuleDescriptor md, String 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();
@@ -179,38 +180,72 @@
* @param name
* artifact resolver name
*/
- public void saveArtResolver(ModuleDescriptor md, String name) {
+ 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);
- cdf.setProperty("artifact.resolver", name);
- cdf.save();
+ 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");
}
- public void saveArtifactOrigin(Artifact artifact, ArtifactOrigin origin) {
+ 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());
cdf.save();
}
- public ArtifactOrigin getSavedArtifactOrigin(Artifact artifact) {
+ private void removeSavedArtifactOrigin(Artifact artifact) {
+ // should always be called with a lock on module metadata artifact
PropertiesFile cdf = getCachedDataFile(artifact.getModuleRevisionId());
- String location = cdf.getProperty(getLocationKey(artifact));
- String local = cdf.getProperty(getIsLocalKey(artifact));
- boolean isLocal = Boolean.valueOf(local).booleanValue();
+ cdf.remove(getLocationKey(artifact));
+ cdf.remove(getIsLocalKey(artifact));
+ cdf.save();
+ }
- if (location == null) {
- // origin has not been specified, return null
+ public ArtifactOrigin getSavedArtifactOrigin(Artifact artifact) {
+ ModuleRevisionId mrid = artifact.getModuleRevisionId();
+ if (!lockMetadataArtifact(mrid)) {
+ Message.error("impossible to acquire lock for " + mrid);
return null;
}
+ try {
+ PropertiesFile cdf = getCachedDataFile(artifact.getModuleRevisionId());
+ String location = cdf.getProperty(getLocationKey(artifact));
+ String local = cdf.getProperty(getIsLocalKey(artifact));
+ boolean isLocal = Boolean.valueOf(local).booleanValue();
+
+ if (location == null) {
+ // origin has not been specified, return null
+ return null;
+ }
- return new ArtifactOrigin(isLocal, location);
- }
-
- public void removeSavedArtifactOrigin(Artifact artifact) {
- PropertiesFile cdf = getCachedDataFile(artifact.getModuleRevisionId());
- cdf.remove(getLocationKey(artifact));
- cdf.remove(getIsLocalKey(artifact));
- cdf.save();
+ return new ArtifactOrigin(isLocal, location);
+ } finally {
+ unlockMetadataArtifact(mrid);
+ }
}
/**
@@ -252,16 +287,6 @@
return prefix + ".is-local";
}
- private String getSavedResolverName(ModuleDescriptor md) {
- PropertiesFile cdf = getCachedDataFile(md);
- return cdf.getProperty("resolver");
- }
-
- private String getSavedArtResolverName(ModuleDescriptor md) {
- PropertiesFile cdf = getCachedDataFile(md);
- return cdf.getProperty("artifact.resolver");
- }
-
private PropertiesFile getCachedDataFile(ModuleDescriptor md) {
return getCachedDataFile(md.getResolvedModuleRevisionId());
}
@@ -274,58 +299,66 @@
public ResolvedModuleRevision findModuleInCache(
ModuleRevisionId mrid, boolean validate, String expectedResolver) {
- // first, check if it is in cache
if (!settings.getVersionMatcher().isDynamic(mrid)) {
- File ivyFile = getIvyFileInCache(mrid);
- if (ivyFile.exists()) {
- // found in cache !
- try {
- ModuleDescriptor depMD = XmlModuleDescriptorParser.getInstance()
- .parseDescriptor(settings, ivyFile.toURL(), validate);
- String resolverName = getSavedResolverName(depMD);
- String artResolverName = getSavedArtResolverName(depMD);
- DependencyResolver resolver = settings.getResolver(resolverName);
- if (resolver == null) {
- Message.debug("\tresolver not found: " + resolverName
+ if (!lockMetadataArtifact(mrid)) {
+ Message.error("impossible to acquire lock for " + mrid);
+ return null;
+ }
+ try {
+ // first, check if it is in cache
+ File ivyFile = getIvyFileInCache(mrid);
+ if (ivyFile.exists()) {
+ // found in cache !
+ try {
+ ModuleDescriptor depMD = XmlModuleDescriptorParser.getInstance()
+ .parseDescriptor(settings, ivyFile.toURL(), validate);
+ 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()
+ resolver = settings.getResolver(depMD.getResolvedModuleRevisionId()
.getModuleId());
- if (resolver != null) {
- Message.debug("\tconfigured resolver found for "
+ if (resolver != null) {
+ Message.debug("\tconfigured resolver found for "
+ depMD.getResolvedModuleRevisionId() + ": "
+ resolver.getName() + ": saving this data");
- saveResolver(depMD, resolver.getName());
+ 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 "
+ 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())) {
- return new DefaultModuleRevision(
- resolver, artResolver, depMD, false, false);
+ if (expectedResolver != null
+ && expectedResolver.equals(resolver.getName())) {
+ return new DefaultModuleRevision(
+ resolver, artResolver, depMD, false, false);
+ } else {
+ Message.debug(
+ "found module in cache but with a different resolver: "
+ + "discarding: " + mrid
+ + "; expected resolver=" + expectedResolver
+ + "; resolver=" + resolver.getName());
+ }
} 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
+ Message.debug("\tresolver not found: " + resolverName
+ " => cannot use cached ivy file for " + mrid);
- }
- } catch (Exception e) {
- // will try with resolver
- Message.debug("\tproblem while parsing cached ivy file for: " + mrid + ": "
+ }
+ } catch (Exception e) {
+ // will try with resolver
+ Message.debug("\tproblem while parsing cached ivy file for: " + mrid + ": "
+ e.getMessage());
+ }
+ } else {
+ Message.debug("\tno ivy file in cache for " + mrid + ": tried " + ivyFile);
}
- } else {
- Message.debug("\tno ivy file in cache for " + mrid + ": tried " + ivyFile);
+ } finally {
+ unlockMetadataArtifact(mrid);
}
}
return null;
@@ -362,11 +395,14 @@
final ArtifactDownloadReport adr = new ArtifactDownloadReport(artifact);
boolean useOrigin = options.isUseOrigin();
- LockStrategy lockStrategy = getLockStrategy();
-
- if (!lockArtifact(artifact)) {
+ // 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 artifact lock with " + lockStrategy);
+ adr.setDownloadDetails("impossible to get lock for " + mrid);
return adr;
}
try {
@@ -438,23 +474,10 @@
}
return adr;
} finally {
- unlockArtifact(artifact);
- }
- }
-
- 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");
+ unlockMetadataArtifact(mrid);
}
}
- private void unlockArtifact(Artifact artifact) {
- getLockStrategy().unlockArtifact(artifact, getArchiveFileInCache(artifact, null));
- }
-
public void originalToCachedModuleDescriptor(
DependencyResolver resolver, ResolvedResource orginalMetadataRef,
Artifact requestedMetadataArtifact,
@@ -462,8 +485,9 @@
Artifact originalMetadataArtifact = getOriginalMetadataArtifact(requestedMetadataArtifact);
File mdFileInCache = getIvyFileInCache(md.getResolvedModuleRevisionId());
- if (!lockArtifact(originalMetadataArtifact)) {
- Message.warn("impossible to get artifact lock for: " + requestedMetadataArtifact);
+ ModuleRevisionId mrid = requestedMetadataArtifact.getModuleRevisionId();
+ if (!lockMetadataArtifact(mrid)) {
+ Message.warn("impossible to acquire lock for: " + mrid);
return;
}
try {
@@ -471,8 +495,7 @@
getArchiveFileInCache(originalMetadataArtifact),
mdFileInCache);
- saveResolver(md, resolver.getName());
- saveArtResolver(md, resolver.getName());
+ saveResolvers(md, resolver.getName(), resolver.getName());
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
@@ -482,10 +505,10 @@
: String.valueOf(orginalMetadataRef))
+ ". " + e.getClass().getName() + ": " + e.getMessage());
} finally {
- unlockArtifact(originalMetadataArtifact);
+ unlockMetadataArtifact(mrid);
}
}
-
+
public ResolvedModuleRevision cacheModuleDescriptor(
DependencyResolver resolver, final ResolvedResource mdRef, Artifact moduleArtifact,
ResourceDownloader downloader, CacheMetadataOptions options) throws ParseException {
@@ -495,116 +518,164 @@
ArtifactDownloadReport report;
ModuleRevisionId mrid = moduleArtifact.getModuleRevisionId();
Artifact originalMetadataArtifact = getOriginalMetadataArtifact(moduleArtifact);
- if (!lockArtifact(originalMetadataArtifact)) {
- Message.error("impossible to acquire lock for " + originalMetadataArtifact);
+ if (!lockMetadataArtifact(mrid)) {
+ Message.error("impossible to acquire lock for " + mrid);
return null;
}
try {
- // now let's see if we can find it in cache and if it is up to date
- ResolvedModuleRevision rmr = findModuleInCache(
- mrid, options.isValidate(), resolver.getName());
- if (rmr != null) {
- if (rmr.getDescriptor().isDefault() && rmr.getResolver() != this) {
- Message.verbose("\t" + getName() + ": found revision in cache: " + mrid
+ // now let's see if we can find it in cache and if it is up to date
+ ResolvedModuleRevision rmr = findModuleInCache(
+ mrid, options.isValidate(), resolver.getName());
+ if (rmr != null) {
+ if (rmr.getDescriptor().isDefault() && rmr.getResolver() != this) {
+ 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 (!options.isCheckmodified() && !options.isChanging()) {
- Message.verbose("\t" + getName() + ": revision in cache: " + mrid);
- return DefaultModuleRevision.searchedRmr(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);
- return DefaultModuleRevision.searchedRmr(rmr);
} else {
- Message.verbose("\t" + getName() + ": revision in cache is not up to date: "
+ if (!options.isCheckmodified() && !options.isChanging()) {
+ Message.verbose("\t" + getName() + ": revision in cache: " + mrid);
+ return DefaultModuleRevision.searchedRmr(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);
- if (options.isChanging()) {
- // 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();
+ return DefaultModuleRevision.searchedRmr(rmr);
+ } else {
+ Message.verbose("\t" + getName() + ": revision in cache is not up to date: "
+ + mrid);
+ if (options.isChanging()) {
+ // 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();
+ }
}
}
}
- }
- // now download module descriptor and parse it
- report = download(
- originalMetadataArtifact,
- new ArtifactResourceResolver() {
- public ResolvedResource resolve(Artifact artifact) {
- return mdRef;
- }
- }, downloader,
- new CacheDownloadOptions().setListener(options.getListener()).setForce(true));
- Message.verbose("\t" + report);
- } finally {
- unlockArtifact(originalMetadataArtifact);
- }
-
- if (report.getDownloadStatus() == DownloadStatus.FAILED) {
- Message.warn("problem while downloading module descriptor: " + mdRef.getResource()
- + ": " + report.getDownloadDetails()
- + " (" + report.getDownloadTimeMillis() + "ms)");
- return null;
- }
+ // now download module descriptor and parse it
+ report = download(
+ originalMetadataArtifact,
+ new ArtifactResourceResolver() {
+ public ResolvedResource resolve(Artifact artifact) {
+ return mdRef;
+ }
+ }, downloader,
+ 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;
+ }
- URL cachedMDURL = null;
- try {
- cachedMDURL = report.getDownloadedFile().toURL();
- } catch (MalformedURLException ex) {
- Message.warn("malformed url exception for original in cache file: "
- + report.getDownloadedFile() + ": " + ex.getMessage());
- return null;
- }
- try {
- ModuleDescriptor md = parser.parseDescriptor(
- settings, cachedMDURL, mdRef.getResource(), options.isValidate());
- 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;
+ URL cachedMDURL = null;
+ try {
+ cachedMDURL = report.getDownloadedFile().toURL();
+ } catch (MalformedURLException ex) {
+ Message.warn("malformed url exception for original in cache file: "
+ + report.getDownloadedFile() + ": " + ex.getMessage());
+ return null;
}
- if (deleteOldArtifacts) {
- String[] confs = md.getConfigurationsNames();
- for (int i = 0; i < confs.length; i++) {
- Artifact[] arts = md.getArtifacts(confs[i]);
- for (int j = 0; j < arts.length; j++) {
- Artifact transformedArtifact = NameSpaceHelper.transform(
- arts[j], options.getNamespace().getToSystemTransformer());
- ArtifactOrigin origin = getSavedArtifactOrigin(
- transformedArtifact);
- File artFile = getArchiveFileInCache(
- transformedArtifact, origin, false);
- if (artFile.exists()) {
- Message.debug("deleting " + artFile);
- artFile.delete();
+ try {
+ ModuleDescriptor md = parser.parseDescriptor(
+ settings, cachedMDURL, mdRef.getResource(), options.isValidate());
+ 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 (int i = 0; i < confs.length; i++) {
+ Artifact[] arts = md.getArtifacts(confs[i]);
+ for (int j = 0; j < arts.length; j++) {
+ Artifact transformedArtifact = NameSpaceHelper.transform(
+ arts[j], options.getNamespace().getToSystemTransformer());
+ ArtifactOrigin origin = getSavedArtifactOrigin(
+ transformedArtifact);
+ File artFile = getArchiveFileInCache(
+ transformedArtifact, origin, false);
+ if (artFile.exists()) {
+ Message.debug("deleting " + artFile);
+ artFile.delete();
+ }
+ removeSavedArtifactOrigin(transformedArtifact);
}
- removeSavedArtifactOrigin(transformedArtifact);
}
- }
- } else if (options.isChanging()) {
- Message.verbose(mrid
+ } else if (options.isChanging()) {
+ Message.verbose(mrid
+ " is changing, but has not changed: will trust cached artifacts if any");
- }
- return new DefaultModuleRevision(resolver, resolver, md, true, true);
- } catch (IOException ex) {
- Message.warn("io problem while parsing ivy file: " + mdRef.getResource() + ": "
+ }
+ return new DefaultModuleRevision(resolver, resolver, md, true, true);
+ } catch (IOException ex) {
+ Message.warn("io problem while parsing ivy file: " + mdRef.getResource() + ": "
+ ex.getMessage());
- return null;
+ return null;
+ }
+ } finally {
+ unlockMetadataArtifact(mrid);
}
}
+
+ // 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(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.cloneWithAnotherName(moduleArtifact,
Modified: ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/cache/RepositoryCacheManager.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/cache/RepositoryCacheManager.java?rev=601621&r1=601620&r2=601621&view=diff
==============================================================================
--- ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/cache/RepositoryCacheManager.java (original)
+++ ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/cache/RepositoryCacheManager.java Wed Dec 5 21:41:34 2007
@@ -63,33 +63,22 @@
public abstract String getArchivePathInCache(Artifact artifact, ArtifactOrigin 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)
+ * Saves the information of which resolvers were used to resolve a module (both for metadata and
+ * artifact), so that this info can be loaded later (even after a jvm restart) for the use of
+ * {@link #findModuleInCache(ModuleRevisionId, boolean, String)}.
*
* @param md
* the module descriptor resolved
- * @param name
- * resolver name
- */
- public abstract void saveResolver(ModuleDescriptor md, String name);
-
- /**
- * 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
- * @param name
+ * @param metadataResolverName
+ * metadata resolver name
+ * @param artifactResolverName
* artifact resolver name
*/
- public abstract void saveArtResolver(ModuleDescriptor md, String name);
-
- public abstract void saveArtifactOrigin(Artifact artifact, ArtifactOrigin origin);
+ public abstract void saveResolvers(
+ ModuleDescriptor descriptor, String metadataResolverName, String artifactResolverName);
public abstract ArtifactOrigin getSavedArtifactOrigin(Artifact artifact);
- public abstract void removeSavedArtifactOrigin(Artifact artifact);
-
/**
* Search a module descriptor in cache for a mrid
*
@@ -130,8 +119,6 @@
DependencyResolver resolver, ResolvedResource orginalMetadataRef,
Artifact requestedMetadataArtifact,
ResourceDownloader downloader, CacheMetadataOptions options) throws ParseException;
-
- public Artifact getOriginalMetadataArtifact(Artifact moduleArtifact);
public void originalToCachedModuleDescriptor(
DependencyResolver resolver, ResolvedResource orginalMetadataRef,
Modified: ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/resolve/IvyNode.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/resolve/IvyNode.java?rev=601621&r1=601620&r2=601621&view=diff
==============================================================================
--- ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/resolve/IvyNode.java (original)
+++ ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/resolve/IvyNode.java Wed Dec 5 21:41:34 2007
@@ -225,9 +225,8 @@
new EndResolveDependencyEvent(resolver, dependencyDescriptor, module,
System.currentTimeMillis() - start));
if (module != null) {
- data.getCacheManager().saveResolver(module.getDescriptor(),
- module.getResolver().getName());
- data.getCacheManager().saveArtResolver(module.getDescriptor(),
+ data.getCacheManager().saveResolvers(module.getDescriptor(),
+ module.getResolver().getName(),
module.getArtifactResolver().getName());
if (settings.logModuleWhenFound()) {
Message.info("\tfound " + module.getId() + " in "
Modified: ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/settings/IvySettings.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/settings/IvySettings.java?rev=601621&r1=601620&r2=601621&view=diff
==============================================================================
--- ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/settings/IvySettings.java (original)
+++ ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/core/settings/IvySettings.java Wed Dec 5 21:41:34 2007
@@ -243,7 +243,7 @@
addLatestStrategy("latest-time", latestTimeStrategy);
addLockStrategy("no-lock", new NoLockStrategy());
- addLockStrategy("artifact-lock", new ArtifactLockStrategy());
+ addLockStrategy("artifact-lock", new ArtifactLockStrategy(debugLocking()));
addConflictManager("latest-revision", new LatestConflictManager("latest-revision",
latestRevisionStrategy));
@@ -1154,7 +1154,7 @@
return debugConflictResolution.booleanValue();
}
- public boolean debugLocking() {
+ public final boolean debugLocking() {
if (debugLocking == null) {
String var = getVariable("ivy.log.locking");
debugLocking = Boolean.valueOf(var != null
Modified: ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/plugins/lock/FileBasedLockStrategy.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/plugins/lock/FileBasedLockStrategy.java?rev=601621&r1=601620&r2=601621&view=diff
==============================================================================
--- ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/plugins/lock/FileBasedLockStrategy.java (original)
+++ ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/plugins/lock/FileBasedLockStrategy.java Wed Dec 5 21:41:34 2007
@@ -61,23 +61,28 @@
protected boolean acquireLock(File file) throws InterruptedException {
if (isDebugLocking()) {
- Message.info("acquiring lock on " + file);
+ debugLocking("acquiring lock on " + file);
}
long start = System.currentTimeMillis();
- synchronized (this) {
- if (hasLock(file)) {
- incrementLock(file);
- return true;
- }
- }
do {
- if (locker.tryLock(file)) {
- if (isDebugLocking()) {
- Message.info("lock acquired on " + file
- + " in " + (System.currentTimeMillis() - start) + "ms");
+ synchronized (this) {
+ if (hasLock(file)) {
+ int holdLocks = incrementLock(file);
+ if (isDebugLocking()) {
+ debugLocking("reentrant lock acquired on " + file
+ + " in " + (System.currentTimeMillis() - start) + "ms"
+ + " - hold locks = " + holdLocks);
+ }
+ return true;
+ }
+ if (locker.tryLock(file)) {
+ if (isDebugLocking()) {
+ debugLocking("lock acquired on " + file
+ + " in " + (System.currentTimeMillis() - start) + "ms");
+ }
+ incrementLock(file);
+ return true;
}
- incrementLock(file);
- return true;
}
Thread.sleep(SLEEP_TIME);
} while (System.currentTimeMillis() - start < timeout);
@@ -85,26 +90,40 @@
}
protected void releaseLock(File file) {
- if (decrementLock(file) == 0) {
- locker.unlock(file);
- if (isDebugLocking()) {
- Message.info("lock released on " + file);
+ synchronized (this) {
+ int holdLocks = decrementLock(file);
+ if (holdLocks == 0) {
+ locker.unlock(file);
+ if (isDebugLocking()) {
+ debugLocking("lock released on " + file);
+ }
+ } else {
+ if (isDebugLocking()) {
+ debugLocking("reentrant lock released on " + file
+ + " - hold locks = " + holdLocks);
+ }
}
}
}
- private synchronized boolean hasLock(File file) {
+ private static void debugLocking(String msg) {
+ Message.info(Thread.currentThread() + " " + System.currentTimeMillis() + " " + msg);
+ }
+
+ private boolean hasLock(File file) {
Integer c = (Integer) currentLockCounters.get(file);
return c != null && c.intValue() > 0;
}
- private synchronized void incrementLock(File file) {
+ private int incrementLock(File file) {
Integer c = (Integer) currentLockCounters.get(file);
- currentLockCounters.put(file, new Integer(c == null ? 1 : c.intValue() + 1));
+ int holdLocks = c == null ? 1 : c.intValue() + 1;
+ currentLockCounters.put(file, new Integer(holdLocks));
+ return holdLocks;
}
- private synchronized int decrementLock(File file) {
+ private int decrementLock(File file) {
Integer c = (Integer) currentLockCounters.get(file);
int dc = c == null ? 0 : c.intValue() - 1;
currentLockCounters.put(file, new Integer(dc));
@@ -134,7 +153,7 @@
return true;
} else {
if (debugLocking) {
- Message.info("file creation failed " + file);
+ debugLocking("file creation failed " + file);
}
}
}
@@ -177,7 +196,7 @@
return true;
} else {
if (debugLocking) {
- Message.info("failed to acquire lock on " + file);
+ debugLocking("failed to acquire lock on " + file);
}
}
} finally {
Modified: ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorWriter.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorWriter.java?rev=601621&r1=601620&r2=601621&view=diff
==============================================================================
--- ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorWriter.java (original)
+++ ant/ivy/core/branches/2.0.0-beta1/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorWriter.java Wed Dec 5 21:41:34 2007
@@ -109,7 +109,7 @@
out.println(" <scope>" + scope + "</scope>");
}
if (mapping.isOptional(dds[i].getModuleConfigurations())) {
- out.println(" <optional/>");
+ out.println(" <optional>true</optional>");
}
out.println(" </dependency>");
}