/*******************************************************************************
* Copyright (c) 2014 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package fr.obeo.releng.targetplatform.ui.handler;
import java.io.File;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.pde.core.target.ITargetDefinition;
import org.eclipse.pde.core.target.ITargetHandle;
import org.eclipse.pde.core.target.ITargetPlatformService;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.target.WorkspaceFileTargetHandle;
import com.google.common.base.Optional;
/**
* Class wrapping PDE Targetplatform API calls. If the TargetPlatform service
* can't be acquired, calls will have no effects and will not throw any error.
*
* @author <a href="mailto:cedric.brun@obeo.fr">Cedric Brun</a>
*/
@SuppressWarnings("restriction")
public class PDEIntegration {
private Optional<ITargetPlatformService> service;
public PDEIntegration() {
service = Optional.fromNullable(
(ITargetPlatformService) PDECore.getDefault().acquireService(ITargetPlatformService.class.getName())
);
}
public void setTargetPlatform(URI targetFileURIToSet, IProgressMonitor monitor) throws CoreException {
if (service.isPresent()) {
SubMonitor subMonitor = SubMonitor.convert(monitor, 100);
ITargetHandle[] targets = service.get().getTargets(subMonitor.newChild(20));
boolean hasBeenSet = false;
for (int i = 0; i < targets.length && !hasBeenSet; i++) {
if (targets[i] instanceof WorkspaceFileTargetHandle) {
WorkspaceFileTargetHandle fileHandle = (WorkspaceFileTargetHandle) targets[i];
hasBeenSet = trySetTargetPlatform(targetFileURIToSet, subMonitor, fileHandle);
}
}
}
}
private boolean trySetTargetPlatform(URI targetFileURIToSet, SubMonitor subMonitor, WorkspaceFileTargetHandle fileHandle) throws CoreException {
File targetFile = ((WorkspaceFileTargetHandle) fileHandle).getTargetFile().getLocation().toFile();
URI targetFileURI = URI.createFileURI(targetFile.getAbsolutePath());
if (targetFileURI.equals(targetFileURIToSet)) {
ITargetDefinition targetDefinitionToSet = fileHandle.getTargetDefinition();
if (!targetDefinitionToSet.isResolved()) {
targetDefinitionToSet.resolve(subMonitor.newChild(80));
}
subMonitor.setWorkRemaining(0);
IStatus compare = service.get().compareWithTargetPlatform(targetDefinitionToSet);
if (compare != null && !compare.isOK()) {
org.eclipse.pde.core.target.LoadTargetDefinitionJob.load(targetDefinitionToSet);
}
return true;
}
return false;
}
public Optional<URI> getActiveTargetPlatformFileURI() throws CoreException {
if (service.isPresent()) {
ITargetDefinition currentlySelected = service.get().getWorkspaceTargetHandle().getTargetDefinition();
if (currentlySelected.getHandle() instanceof WorkspaceFileTargetHandle) {
IFile targetFile = ((WorkspaceFileTargetHandle) currentlySelected.getHandle()).getTargetFile();
URI targetFileURI = URI.createFileURI(targetFile.getLocation().toFile().getAbsolutePath());
return Optional.of(targetFileURI);
}
}
return Optional.absent();
}
}