Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Bull2011-03-29 14:05:18 -0400
committerIan Bull2011-03-29 14:05:18 -0400
commit75e49fbbdb600fe4636c56f3593bccdcc51e85f8 (patch)
treed6214e93e0318a8941a1a320486d99c320df4146 /bundles/org.eclipse.equinox.p2.artifact.repository
parent4cbd932c9a8b82666cf30a99b9c59dca90e0cbd6 (diff)
downloadrt.equinox.p2-75e49fbbdb600fe4636c56f3593bccdcc51e85f8.tar.gz
rt.equinox.p2-75e49fbbdb600fe4636c56f3593bccdcc51e85f8.tar.xz
rt.equinox.p2-75e49fbbdb600fe4636c56f3593bccdcc51e85f8.zip
NEW - bug 339164: File level locking doesn't 'lock' the file between multiple threads in the same VM (Java 1.5)
https://bugs.eclipse.org/bugs/show_bug.cgi?id=339164
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.artifact.repository')
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java47
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java18
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepositoryIO.java17
3 files changed, 52 insertions, 30 deletions
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java
index 043ba761d..ffe716f3f 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java
@@ -10,6 +10,14 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.artifact.repository;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.runtime.URIUtil;
+import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
+import org.eclipse.osgi.service.datalocation.Location;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
@@ -17,7 +25,10 @@ public class Activator implements BundleActivator {
public static final String ID = "org.eclipse.equinox.p2.artifact.repository"; //$NON-NLS-1$
public static final String REPO_PROVIDER_XPT = ID + '.' + "artifactRepositories"; //$NON-NLS-1$
+ private Map<URI, Location> locationCache = null;
+
private static BundleContext context;
+ private static Activator instance;
public static BundleContext getContext() {
return Activator.context;
@@ -25,9 +36,45 @@ public class Activator implements BundleActivator {
public void start(BundleContext aContext) throws Exception {
Activator.context = aContext;
+ Activator.instance = this;
+ this.locationCache = new HashMap<URI, Location>();
}
public void stop(BundleContext aContext) throws Exception {
Activator.context = null;
+ Activator.instance = null;
+ this.locationCache = null;
+ }
+
+ public static Activator getInstance() {
+ return Activator.instance;
+ }
+
+ /**
+ * Returns the lock location for a given artifact repository
+ * @param repositoryLocation A URI pointing to an artifact repository. Currently only
+ * file:// repositories are supported
+ * @return The Location that can be locked when using an artifact repository
+ * @throws IOException Thrown if a Location can not be created
+ */
+ public synchronized Location getLockLocation(URI repositoryLocation) throws IOException {
+ if (locationCache.containsKey(repositoryLocation)) {
+ return locationCache.get(repositoryLocation);
+ }
+ Location anyLoc = (Location) ServiceHelper.getService(Activator.getContext(), Location.class.getName());
+ File repositoryFile = URIUtil.toFile(repositoryLocation);
+ Location location = anyLoc.createLocation(null, getLockFile(repositoryLocation).toURL(), !repositoryFile.canWrite());
+ location.set(getLockFile(repositoryLocation).toURL(), false);
+ locationCache.put(repositoryLocation, location);
+ return location;
+ }
+
+ private File getLockFile(URI repositoryLocation) throws IOException {
+ if (!URIUtil.isFileURI(repositoryLocation)) {
+ throw new IOException("Cannot lock a non file based repository"); //$NON-NLS-1$
+ }
+ URI result = URIUtil.append(repositoryLocation, ".artifactlock"); //$NON-NLS-1$
+ return URIUtil.toFile(result);
}
+
}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java
index 53223540b..7a71e8b23 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java
@@ -27,7 +27,6 @@ import org.eclipse.equinox.internal.p2.artifact.processors.md5.MD5Verifier;
import org.eclipse.equinox.internal.p2.artifact.repository.*;
import org.eclipse.equinox.internal.p2.artifact.repository.Messages;
import org.eclipse.equinox.internal.p2.core.helpers.FileUtils;
-import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
import org.eclipse.equinox.internal.p2.metadata.expression.CompoundIterator;
import org.eclipse.equinox.internal.p2.metadata.index.IndexProvider;
@@ -1385,21 +1384,7 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
throw new IOException("Cannot lock a non file based repository"); //$NON-NLS-1$
}
- // TODO: Throw an IO Exception if we cannot lock this location
- Location anyLoc = (Location) ServiceHelper.getService(Activator.getContext(), Location.class.getName());
- File repositoryFile = URIUtil.toFile(repositoryLocation);
- Location location = anyLoc.createLocation(null, getLockFile().toURL(), !repositoryFile.canWrite());
- location.set(getLockFile().toURL(), false);
- return location;
- }
-
- private File getLockFile() throws IOException {
- URI repositoryLocation = getLocation();
- if (!URIUtil.isFileURI(repositoryLocation)) {
- throw new IOException("Cannot lock a non file based repository"); //$NON-NLS-1$
- }
- URI result = URIUtil.append(repositoryLocation, ".artifactlock"); //$NON-NLS-1$
- return URIUtil.toFile(result);
+ return Activator.getInstance().getLockLocation(repositoryLocation);
}
/**
@@ -1496,4 +1481,5 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
}
lockLocation = null;
}
+
}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepositoryIO.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepositoryIO.java
index 3ba5983e1..bbb92f57a 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepositoryIO.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepositoryIO.java
@@ -17,7 +17,8 @@ import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.artifact.repository.Activator;
import org.eclipse.equinox.internal.p2.artifact.repository.Messages;
-import org.eclipse.equinox.internal.p2.core.helpers.*;
+import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
+import org.eclipse.equinox.internal.p2.core.helpers.OrderedProperties;
import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
import org.eclipse.equinox.internal.p2.persistence.XMLParser;
import org.eclipse.equinox.internal.p2.persistence.XMLWriter;
@@ -173,19 +174,7 @@ public class SimpleArtifactRepositoryIO {
if (!URIUtil.isFileURI(repositoryLocation)) {
throw new IOException("Cannot lock a non file based repository"); //$NON-NLS-1$
}
- File repositoryFile = URIUtil.toFile(repositoryLocation);
- Location anyLoc = (Location) ServiceHelper.getService(Activator.getContext(), Location.class.getName());
- Location location = anyLoc.createLocation(null, getLockFile(repositoryLocation).toURL(), !repositoryFile.canWrite());
- location.set(getLockFile(repositoryLocation).toURL(), false);
- return location;
- }
-
- private File getLockFile(URI repositoryLocation) throws IOException {
- if (!URIUtil.isFileURI(repositoryLocation)) {
- throw new IOException("Cannot lock a non file based repository"); //$NON-NLS-1$
- }
- URI result = URIUtil.append(repositoryLocation, ".artifactlock"); //$NON-NLS-1$
- return URIUtil.toFile(result);
+ return Activator.getInstance().getLockLocation(repositoryLocation);
}
private interface XMLConstants extends org.eclipse.equinox.internal.p2.persistence.XMLConstants {

Back to the top