Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java')
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java47
1 files changed, 47 insertions, 0 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);
}
+
}

Back to the top