package org.cloudsmith.geppetto.onetimeinstall;
import static org.eclipse.equinox.p2.engine.IProfile.PROP_PROFILE_ROOT_IU;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.director.ProfileChangeRequest;
import org.eclipse.equinox.internal.provisional.p2.director.IDirector;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.engine.IProfile;
import org.eclipse.equinox.p2.engine.IProfileRegistry;
import org.eclipse.equinox.p2.engine.ProvisioningContext;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.planner.IProfileChangeRequest;
import org.eclipse.equinox.p2.query.IQuery;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
public class Activator implements BundleActivator {
private static final String PROP_INCLUSION_RULES = "org.eclipse.equinox.p2.internal.inclusion.rules";
private static final String INCLUSION_RULE_STRICT = "STRICT";
private static void error(ILog log, String message) {
log(log, message, IStatus.ERROR);
}
private static void info(ILog log, String message) {
log(log, message, IStatus.INFO);
}
private static void log(ILog log, String message, int severity) {
log.log(new Status(severity, "org.cloudsmith.geppetto.onetimeinstall", message));
}
public void start(BundleContext context) throws Exception {
ILog log = Platform.getLog(context.getBundle());
IProvisioningAgent agent = null;
ServiceReference<IProvisioningAgent> agentRef = context.getServiceReference(IProvisioningAgent.class);
if(agentRef != null)
agent = context.getService(agentRef);
if(agent == null) {
error(log, "Unable to obtain provisioning agent");
return;
}
IProfileRegistry profileRegistry = (IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME);
IProfile profile = profileRegistry.getProfile(IProfileRegistry.SELF);
boolean propertyUpdatesNeeded = false;
List<String> ids = new ArrayList<String>();
ids.add("org.cloudsmith.geppetto.ide2");
ids.add("org.eclipse.team.svn.feature.group");
ids.add("org.polarion.eclipse.team.svn.connector.feature.group");
ids.add("org.polarion.eclipse.team.svn.connector.svnkit17.feature.group");
ids.add("org.eclipse.egit.feature.group");
ids.add("org.eclipse.jgit.feature.group");
IQuery<IInstallableUnit> query = QueryUtil.createMatchQuery("$0.exists(x | x == id)", ids);
IProfileChangeRequest changeRequest = new ProfileChangeRequest(profile);
for(IInstallableUnit iu : profile.query(query, null).toUnmodifiableSet()) {
if(profile.getInstallableUnitProperty(iu, PROP_INCLUSION_RULES) == null) {
changeRequest.setInstallableUnitInclusionRules(iu, INCLUSION_RULE_STRICT);
info(log, iu.getId() + " needs STRICT inclusion rule");
propertyUpdatesNeeded = true;
}
String isRoot = profile.getInstallableUnitProperty(iu, PROP_PROFILE_ROOT_IU);
if(!Boolean.valueOf(isRoot)) {
changeRequest.setInstallableUnitProfileProperty(iu, PROP_PROFILE_ROOT_IU, "true");
info(log, iu.getId() + " needs to become root");
propertyUpdatesNeeded = true;
}
}
query = QueryUtil.createIUQuery("org.cloudsmith.geppetto.ide");
Set<IInstallableUnit> iusToUninstall = profile.query(query, null).toUnmodifiableSet();
if(iusToUninstall.isEmpty() && !propertyUpdatesNeeded) {
info(log, "No updates were needed");
return;
}
IDirector director = (IDirector) agent.getService(IDirector.SERVICE_NAME);
ProvisioningContext provisioningContext = new ProvisioningContext(agent);
if(propertyUpdatesNeeded) {
info(log, "Performing property updates");
director.provision(changeRequest, provisioningContext, null);
info(log, "Property update complete");
}
if(!iusToUninstall.isEmpty()) {
changeRequest = new ProfileChangeRequest(profile);
changeRequest.removeAll(iusToUninstall);
info(log, "Removing obsolete IU's");
director.provision(changeRequest, provisioningContext, null);
info(log, "Removal complete");
}
}
public void stop(BundleContext bundleContext) throws Exception {
}
}