package org.semanticsoft.vaaclipse.p2.service.impl; import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager; import org.eclipse.equinox.p2.core.IProvisioningAgent; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.engine.ProvisioningContext; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.operations.InstallOperation; import org.eclipse.equinox.p2.operations.ProvisioningJob; import org.eclipse.equinox.p2.operations.ProvisioningSession; 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.repository.IRepositoryManager; import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository; import org.semanticsoft.vaaclipse.p2.iservice.IInstallNewSoftwareService; import org.semanticsoft.vaaclipse.p2.util.Utils; /******************************************************************************* * Copyright (c) 2012 Klevis Ramo 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: * Klevis Ramo - initial API and implementation *******************************************************************************/ public class InstallNewSoftwareService implements IInstallNewSoftwareService { NullProgressMonitor nullProgressMonitor; URI uri; IProvisioningAgent agent; IMetadataRepository loadRepository = null; @Override public synchronized List<IInstallableUnit> loadRepository(String uriString, IProvisioningAgent agent) { uri = null; nullProgressMonitor = new NullProgressMonitor(); this.agent = agent; if (!Utils.containsString(uriString, "http", false) && !(uriString.contains(".jar") || uriString.contains(".zip"))) { uri = new File(uriString).toURI(); } if (uri == null) try { uri = new URI(uriString); } catch (URISyntaxException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } MetadataRepositoryManager metadataRepositoryManager = new MetadataRepositoryManager( agent); try { loadRepository = metadataRepositoryManager.loadRepository(uri, IRepositoryManager.REPOSITORIES_ALL, nullProgressMonitor); } catch (ProvisionException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException(e.getMessage()); } IQuery<IInstallableUnit> createQuery = QueryUtil .createIUCategoryQuery(); IQueryResult<IInstallableUnit> query = loadRepository.query( createQuery, nullProgressMonitor); List<IInstallableUnit> list = toList(query); return list; } private List<IInstallableUnit> toList(IQueryResult<IInstallableUnit> query) { List<IInstallableUnit> list = new ArrayList<IInstallableUnit>(); for (IInstallableUnit iInstallableUnit : query) { System.out.println(iInstallableUnit); list.add(iInstallableUnit); } return list; } @Override public boolean isCategory(IInstallableUnit installableUnit) { return QueryUtil.isCategory(installableUnit); } @Override public List<IInstallableUnit> extractFromCategory(IInstallableUnit category) { IQuery<IInstallableUnit> createIUCategoryMemberQuery = QueryUtil .createIUCategoryMemberQuery(category); IQueryResult<IInstallableUnit> query = loadRepository.query( createIUCategoryMemberQuery, nullProgressMonitor); return toList(query); } @Override public synchronized String validate( List<IInstallableUnit> listIInstallableUnits) { if (uri == null || agent == null || nullProgressMonitor == null) { throw new IllegalArgumentException( "Must first call method laod repository"); } try { final ProvisioningSession session = new ProvisioningSession(agent); InstallOperation installOperation = new InstallOperation(session, listIInstallableUnits); installOperation.setProvisioningContext(new ProvisioningContext(agent)); /*installOperation.getProvisioningContext().setArtifactRepositories( new URI[] { uri }); installOperation.getProvisioningContext().setMetadataRepositories( new URI[] { uri });*/ IStatus resolveModal = installOperation .resolveModal(nullProgressMonitor); String resolutionDetails = installOperation.getResolutionDetails(); if (!resolveModal.isOK()) { return resolutionDetails; } if (resolveModal.getSeverity() == IStatus.ERROR) { return resolutionDetails; } if (resolveModal.getCode() == IStatus.ERROR) { return resolutionDetails; } else if (resolveModal.getCode() == IStatus.WARNING) { return resolutionDetails; } else if (resolveModal.getCode() == IStatus.CANCEL) { return resolutionDetails; } else if (resolveModal.getCode() == IStatus.INFO) { return resolutionDetails; } } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } return null; } @Override public synchronized String installNewSoftware( List<IInstallableUnit> listIInstallableUnits) { if (uri == null || agent == null || nullProgressMonitor == null) { throw new IllegalArgumentException( "Must first call method laod repository"); } try { final ProvisioningSession session = new ProvisioningSession(agent); InstallOperation installOperation = new InstallOperation(session, listIInstallableUnits); installOperation.getProvisioningContext().setArtifactRepositories( new URI[] { uri }); installOperation.getProvisioningContext().setMetadataRepositories( new URI[] { uri }); IStatus resolveModal = installOperation .resolveModal(nullProgressMonitor); String resolutionDetails = installOperation.getResolutionDetails(); if (!resolveModal.isOK()) { return resolutionDetails; } if (resolveModal.getSeverity() == IStatus.ERROR) { return resolutionDetails; } if (resolveModal.getCode() == IStatus.ERROR) { return resolutionDetails; } else if (resolveModal.getCode() == IStatus.WARNING) { return resolutionDetails; } else if (resolveModal.getCode() == IStatus.CANCEL) { return resolutionDetails; } else if (resolveModal.getCode() == IStatus.INFO) { return resolutionDetails; } ProvisioningJob provisioningJob = installOperation .getProvisioningJob(null); provisioningJob.addJobChangeListener(new JobChangeAdapter() { @Override public void scheduled(IJobChangeEvent event) { // TODO Auto-generated method stub super.scheduled(event); } @Override public void sleeping(IJobChangeEvent event) { // TODO Auto-generated method stub super.sleeping(event); } @Override public void aboutToRun(IJobChangeEvent event) { // TODO Auto-generated method stub super.aboutToRun(event); } @Override public void running(IJobChangeEvent event) { // TODO Auto-generated method stub super.running(event); } @Override public void done(IJobChangeEvent event) { // TODO Auto-generated method stub super.done(event); } }); IStatus run = provisioningJob.runModal(nullProgressMonitor); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); throw new RuntimeException(e); } return "Wait a minute and see to plugins folder if jar was added than restart application"; } private List<IInstallableUnit> getUpdatedGroups() { nullProgressMonitor = new NullProgressMonitor(); this.agent = agent; MetadataRepositoryManager metadataRepositoryManager = new MetadataRepositoryManager( agent); try { loadRepository = metadataRepositoryManager.loadRepository(uri, 0, nullProgressMonitor); } catch (ProvisionException e) { // TODO Auto-generated catch block e.printStackTrace(); } IQuery<IInstallableUnit> createQuery = QueryUtil.createIUGroupQuery(); IQueryResult<IInstallableUnit> query = loadRepository.query( createQuery, nullProgressMonitor); List<IInstallableUnit> list = toList(query); return list; } @Override public String loadAndInstallNewSoftware(String uriString, IProvisioningAgent agent) { return installNewSoftware(loadRepository(uriString, agent)); } }