package LinGUIne.utilities; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.equinox.internal.p2.ui.ProvUI; import org.eclipse.equinox.internal.p2.ui.ProvUIActivator; import org.eclipse.equinox.p2.core.IProvisioningAgent; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.operations.InstallOperation; import org.eclipse.equinox.p2.operations.ProvisioningSession; import org.eclipse.equinox.p2.query.IQueryResult; import org.eclipse.equinox.p2.query.QueryUtil; import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository; import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager; import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository; import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager; import org.eclipse.equinox.p2.ui.ProvisioningUI; /** * Provides all the back end functionality of the p2 install process * * @author Matthew Talbot * */ public class InstallUtils { /** * Generates a list of all the Installable Units from a repository * @param repo the metadata repository that is the source of the installable units * @return array list of all installable units in a repository */ public static ArrayList<IInstallableUnit> generateIUList(IMetadataRepository repo){ ArrayList<IInstallableUnit> iuList = new ArrayList<IInstallableUnit>(); IQueryResult<IInstallableUnit> results = repo.query(QueryUtil.createIUAnyQuery(), new NullProgressMonitor()); for (IInstallableUnit iu : results.toUnmodifiableSet()) { if(!iu.getId().contains("feature")) iuList.add(iu); } return iuList; } /** * Establishes all the repositories and repository managers needed for the install job * * @param agent the current ProvisioningAgent * @param repositoryLocation the valid p2 repository location * @return metadata repository object from a valid p2 repository * @throws ProvisionException */ @SuppressWarnings("restriction") public static IMetadataRepository loadRepository(IProvisioningAgent agent, URI repositoryLocation) throws ProvisionException{ final ProvisioningUI ui = ProvUIActivator.getDefault().getProvisioningUI(); IArtifactRepositoryManager artifactManager = ProvUI.getArtifactRepositoryManager(ui.getSession()); IMetadataRepositoryManager manager = (IMetadataRepositoryManager) agent.getService(IMetadataRepositoryManager.SERVICE_NAME); artifactManager.addRepository(repositoryLocation); IMetadataRepository repository = manager.loadRepository(repositoryLocation, new NullProgressMonitor()); return repository; } /** * Queries a repository to get a collection of results * * @param repository * @return */ public static IQueryResult<IInstallableUnit> getInstallable(IMetadataRepository repository){ return repository.query(QueryUtil.createIUAnyQuery(), new NullProgressMonitor()); } /** * Starts the install job * * @param agent current provisioning agent * @param toInstall list of the IUs to be installed * @param uri the repository URI * @return true if install was completed, false if not */ public static boolean installIUs(final IProvisioningAgent agent, Collection<IInstallableUnit> toInstall, URI uri){ InstallOperation installOperation = new InstallOperation(new ProvisioningSession(agent), toInstall); installOperation.getProvisioningContext().setArtifactRepositories(new URI[]{uri}); installOperation.getProvisioningContext().setMetadataRepositories(new URI[]{uri}); IStatus result = installOperation.resolveModal(new NullProgressMonitor()); if (installOperation.resolveModal(new NullProgressMonitor()).isOK()) { Job job = installOperation.getProvisioningJob(new NullProgressMonitor()); job.schedule(); return true; } return false; } }