292678 - WTP p2 API usage
diff --git a/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/ExtensionInstallableUnitQuery.java b/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/ExtensionInstallableUnitQuery.java
index e30a659..80c5977 100644
--- a/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/ExtensionInstallableUnitQuery.java
+++ b/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/ExtensionInstallableUnitQuery.java
@@ -12,8 +12,8 @@
import java.util.List;
-import org.eclipse.equinox.internal.p2.metadata.query.MatchQuery;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
+import org.eclipse.equinox.p2.query.MatchQuery;
public class ExtensionInstallableUnitQuery extends MatchQuery<IInstallableUnit> {
private List<String> list;
diff --git a/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/ExtensionUtility.java b/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/ExtensionUtility.java
index ff88668..99a1c9a 100644
--- a/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/ExtensionUtility.java
+++ b/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/ExtensionUtility.java
@@ -19,9 +19,7 @@
import org.eclipse.equinox.p2.engine.IProfileRegistry;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.Version;
-import org.eclipse.equinox.p2.query.IQuery;
-import org.eclipse.equinox.p2.query.IQueryResult;
-import org.eclipse.equinox.p2.query.QueryUtil;
+import org.eclipse.equinox.p2.query.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.server.discovery.internal.model.Extension;
import org.eclipse.wst.server.discovery.internal.model.ExtensionUpdateSite;
@@ -36,10 +34,10 @@
} catch (Exception e) {
Trace.trace(Trace.SEVERE, "Could not load URL " + url);
}
-
+
if (in == null)
throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, "Could not load extensions", null));
-
+
try {
IMemento memento = XMLMemento.loadMemento(in);
IMemento children[] = memento.getChildren("site");
@@ -50,7 +48,7 @@
ExtensionUpdateSite item = new ExtensionUpdateSite(url2, null, null);
list.add(item);
}
-
+
ExtensionUpdateSite[] items = new ExtensionUpdateSite[list.size()];
list.toArray(items);
return items;
@@ -69,7 +67,7 @@
*/
private static ExtensionUpdateSite[] getExtensionUpdateSites() {
URL url = Activator.getDefault().getBundle().getEntry("serverAdapterSites.xml");
-
+
try {
return getExtensionUpdateSites(url);
} catch (CoreException ce) {
@@ -88,9 +86,9 @@
private static boolean alreadyExists(List<Extension> existing, Extension newFeature) {
if (existing.contains(newFeature))
return true;
-
+
Version newV = newFeature.getVersion();
-
+
Iterator<Extension> iterator = existing.iterator();
while (iterator.hasNext()) {
Extension feature = iterator.next();
@@ -99,25 +97,26 @@
return true;
}
}
-
+
return false;
}
private static void addExtension(List<Extension> list, List<Extension> existing, Extension newFeature, ExtensionListener listener) {
if (alreadyExists(existing, newFeature))
return;
-
+
synchronized (list) {
Version newV = newFeature.getVersion();
Extension remove = null;
-
+
Iterator<Extension> iterator = list.iterator();
while (iterator.hasNext()) {
- Extension feature = iterator.next();
+ Extension feature = iterator.next();
if (feature.getId().equals(newFeature.getId())) {
if (feature.getVersion().compareTo(newV) < 0) {
remove = feature;
- } else // new feature is older
+ } else
+ // new feature is older
return;
}
}
@@ -125,7 +124,7 @@
list.remove(remove);
listener.extensionRemoved(remove);
}
-
+
list.add(newFeature);
}
listener.extensionFound(newFeature);
@@ -139,23 +138,25 @@
public interface ExtensionListener {
public void extensionFound(Extension extension);
+
public void extensionRemoved(Extension feature);
+
public void siteFailure(String host);
}
private static List<Extension> getExistingFeatures(IProgressMonitor monitor) throws CoreException {
monitor.beginTask(Messages.discoverLocalConfiguration, 100);
-
+
IProfileRegistry profileRegistry = (IProfileRegistry) getService(Activator.getDefault().getBundle().getBundleContext(), IProfileRegistry.class.getName());
IProfile[] profiles = profileRegistry.getProfiles();
IProfile profile = profileRegistry.getProfile(IProfileRegistry.SELF);
-
+
IQuery<IInstallableUnit> query = QueryUtil.createIUAnyQuery();
//Query query = new InstallableUnitQuery("org.eclipse.wst.server.core.serverAdapter");
//List<String> list2 = new ArrayList();
//Query query = new ExtensionInstallableUnitQuery(list2);
IQueryResult<IInstallableUnit> collector = profile.query(query, monitor);
-
+
List<Extension> list = new ArrayList<Extension>();
Iterator<IInstallableUnit> iter = collector.iterator();
while (iter.hasNext()) {
@@ -163,34 +164,34 @@
if (!list.contains(iu))
list.add(new Extension(iu, null));
}
-
+
monitor.done();
-
+
return list;
}
public static Extension[] getAllExtensions(final String id, final ExtensionListener listener, IProgressMonitor monitor) throws CoreException {
monitor = ProgressUtil.getMonitorFor(monitor);
monitor.beginTask("", 1100);
-
+
monitor.subTask(Messages.discoverLocalConfiguration);
final List<Extension> existing = getExistingFeatures(ProgressUtil.getSubMonitorFor(monitor, 100));
-
+
final ExtensionUpdateSite[] items = getExtensionUpdateSites();
if (items == null || items.length == 0)
return new Extension[0];
final int x = 1000 / items.length;
-
+
monitor.worked(50);
final List<Extension> list = new ArrayList<Extension>();
int size = items.length;
-
+
Thread[] threads = new Thread[size];
for (int i = 0; i < size; i++) {
try {
if (monitor.isCanceled())
return null;
-
+
monitor.subTask(NLS.bind(Messages.discoverSearching, items[i].getUrl()));
final int ii = i;
final IProgressMonitor monitor2 = monitor;
@@ -211,19 +212,19 @@
Trace.trace(Trace.WARNING, "Error downloading extension info 2", e);
}
}
-
+
for (int i = 0; i < size; i++) {
try {
if (monitor.isCanceled())
return null;
-
+
if (threads[i].isAlive())
threads[i].join();
} catch (Exception e) {
Trace.trace(Trace.WARNING, "Error downloading extension info 3", e);
}
}
-
+
Extension[] ef = new Extension[list.size()];
list.toArray(ef);
monitor.done();
@@ -240,16 +241,27 @@
* @return The requested service
*/
public static Object getService(BundleContext context, String name) {
+ IProvisioningAgent agent = getAgent(context);
+ return agent == null ? null : agent.getService(name);
+ }
+
+ /**
+ * Returns the provisioning agent if available or <code>null</code> otherwise. Note that this
+ * is a helper class that <b>immediately</b> ungets the agent service reference. This results
+ * in a window where the system thinks the agent service is not in use but indeed the caller is about to
+ * use the returned agent object.
+ *
+ * @param context the bundle context
+ * @return the agent or <code>null</code>
+ */
+ public static IProvisioningAgent getAgent(BundleContext context) {
if (context == null)
return null;
ServiceReference reference = context.getServiceReference(IProvisioningAgent.SERVICE_NAME);
if (reference == null)
return null;
- IProvisioningAgent result = (IProvisioningAgent) context.getService(reference);
- if (result == null)
- return null;
try {
- return result.getService(name);
+ return (IProvisioningAgent) context.getService(reference);
} finally {
context.ungetService(reference);
}
diff --git a/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/PatternInstallableUnitQuery.java b/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/PatternInstallableUnitQuery.java
index 1decbae..2087223 100644
--- a/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/PatternInstallableUnitQuery.java
+++ b/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/PatternInstallableUnitQuery.java
@@ -10,8 +10,9 @@
*******************************************************************************/
package org.eclipse.wst.server.discovery.internal;
-import org.eclipse.equinox.internal.p2.metadata.query.MatchQuery;
+
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
+import org.eclipse.equinox.p2.query.MatchQuery;
public class PatternInstallableUnitQuery extends MatchQuery<IInstallableUnit> {
private String categoryId;
diff --git a/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/model/Extension.java b/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/model/Extension.java
index 5f22923..44d452e 100644
--- a/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/model/Extension.java
+++ b/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/model/Extension.java
@@ -12,9 +12,9 @@
import java.net.URI;
import java.util.Collection;
-
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.engine.*;
import org.eclipse.equinox.p2.metadata.*;
import org.eclipse.equinox.p2.planner.IPlanner;
@@ -71,33 +71,39 @@
public IStatus install(IProgressMonitor monitor) {
BundleContext bundleContext = Activator.getDefault().getBundle().getBundleContext();
-
+
IProvisioningPlan plan = getProvisioningPlan(true, monitor);
if (!plan.getStatus().isOK())
return plan.getStatus();
-
+
IEngine engine = (IEngine) ExtensionUtility.getService(bundleContext, IEngine.SERVICE_NAME);
return engine.perform(plan, PhaseSetFactory.createDefaultPhaseSet(), monitor);
}
public IInstallableUnit[] getIUs() {
- return new IInstallableUnit[] { iu };
+ return new IInstallableUnit[] {iu};
}
public IProvisioningPlan getProvisioningPlan(boolean explain, IProgressMonitor monitor) {
if (plan != null)
return plan;
-
+
//long time = System.currentTimeMillis();
BundleContext bundleContext = Activator.getDefault().getBundle().getBundleContext();
IPlanner planner = (IPlanner) ExtensionUtility.getService(bundleContext, IPlanner.SERVICE_NAME);
-
+
IProfileRegistry profileRegistry = (IProfileRegistry) ExtensionUtility.getService(bundleContext, IProfileRegistry.SERVICE_NAME);
IProfile profile = profileRegistry.getProfile(IProfileRegistry.SELF);
IProfileChangeRequest pcr = planner.createChangeRequest(profile);
pcr.add(iu);
- provContext = new ProvisioningContext(new URI[] { uri });
- provContext.setArtifactRepositories(new URI[] { uri });
+ IProvisioningAgent agent = ExtensionUtility.getAgent(bundleContext);
+ if (agent == null) {
+ // TODO eek!
+ return null;
+ }
+ provContext = new ProvisioningContext(agent);
+ provContext.setMetadataRepositories(new URI[] {uri});
+ provContext.setArtifactRepositories(new URI[] {uri});
if (!explain)
provContext.setProperty("org.eclipse.equinox.p2.director.explain", "false");
//provContext = new ProvisioningContext();