blob: 806ebdcbf5e92e5f68433d504bd96cda8f127d33 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.wst.server.discovery.internal.model;
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.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.ILicense;
import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.planner.IPlanner;
import org.eclipse.equinox.p2.planner.IProfileChangeRequest;
import org.eclipse.equinox.p2.repository.IRepositoryManager;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.server.discovery.internal.Activator;
import org.eclipse.wst.server.discovery.internal.ExtensionUtility;
import org.osgi.framework.BundleContext;
public class Extension implements IServerExtension{
private IInstallableUnit iu;
private URI uri;
private ProvisioningContext provContext;
private IProvisioningPlan plan;
public Extension(IInstallableUnit iu, URI uri) {
this.iu = iu;
this.uri = uri;
}
public String getName() {
return iu.getProperty(IInstallableUnit.PROP_NAME, null);
}
public String getDescription() {
return iu.getProperty(IInstallableUnit.PROP_DESCRIPTION, null);
}
public Image getImage() {
// TODO no image support in p2 yet
return null;
}
public String getLicense() {
Collection<ILicense> licenses = iu.getLicenses(null);
if (licenses == null || licenses.isEmpty())
return "";
// TODO support multiple licenses
return licenses.iterator().next().getBody();
}
public String getProvider() {
return iu.getProperty(IInstallableUnit.PROP_PROVIDER, null);
}
public String getId() {
return iu.getId();
}
public Version getVersion() {
return iu.getVersion();
}
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};
}
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);
IProfile[] profiles = profileRegistry.getProfiles();
if (profile == null ) {//it happens sometime , possibility of bug in profileRegistry
for (int i = 0; i < profiles.length; i++) {
if (profiles[i].getProfileId().equals(IProfileRegistry.SELF)){
profile = profiles[i];
break;
}
}
}
if (profile == null)
return null;
IProfileChangeRequest pcr = planner.createChangeRequest(profile);
pcr.add(iu);
IProvisioningAgent agent = ExtensionUtility.getAgent(bundleContext);
if (agent == null) {
return null;
}
// Get all the known repositories when installing the server adapter.
// If these repositories are not added, it can cause install problems if
// the server adapter relies on the list of available software install sites
URI[] knownRepositories = null;
IMetadataRepositoryManager manager = (IMetadataRepositoryManager) agent.getService(IMetadataRepositoryManager.SERVICE_NAME);
if (manager != null){
manager.addRepository(uri);
// Note: IRepositoryManager.REPOSITORIES_ALL will exclude the deselected update sites
knownRepositories = manager.getKnownRepositories(IRepositoryManager.REPOSITORIES_ALL);
// A fall back in case known repositories returns null
if (knownRepositories == null){
knownRepositories = new URI[] {uri};
}
}
else {
knownRepositories = new URI[] {uri};
}
provContext = new ProvisioningContext(agent);
// Add the new URLs to both the Metadata and Artifact repositories.
// Note: only the IInstallableUnit that is passed into this class will be installed
// as a server adapter. For example, if multiple update site URLs for discovery server
// adapters are present, they will not be installed.
provContext.setMetadataRepositories(knownRepositories);
provContext.setArtifactRepositories(knownRepositories);
if (!explain)
provContext.setProperty("org.eclipse.equinox.p2.director.explain", "false"); //$NON-NLS-1$ //$NON-NLS-2$
provContext.setProperty(ProvisioningContext.FOLLOW_REPOSITORY_REFERENCES,"true"); //$NON-NLS-1$
plan = planner.getProvisioningPlan(pcr, provContext, monitor);
//System.out.println("Time: " + (System.currentTimeMillis() - time)); // TODO
return plan;
}
public String getURI() {
return uri.toString();
}
public String getServerId() {
return iu.getProperty("serverId", null);
}
}