/***************************************************************************** * Copyright (c) 2010, Cloudsmith Inc. * The code, documentation and other materials contained herein have been * licensed under the Eclipse Public License - v 1.0 by the copyright holder * listed above, as the Initial Contributor under such license. The text of * such license is available at www.eclipse.org. *****************************************************************************/ package org.eclipse.buckminster.pde.commands; import java.util.ArrayList; import java.util.List; import org.eclipse.buckminster.cmdline.Option; import org.eclipse.buckminster.cmdline.OptionDescriptor; import org.eclipse.buckminster.cmdline.OptionValueType; import org.eclipse.buckminster.cmdline.SimpleErrorExitException; import org.eclipse.buckminster.core.commands.WorkspaceCommand; import org.eclipse.buckminster.pde.Messages; import org.eclipse.buckminster.pde.prefs.BaselineHandler; import org.eclipse.buckminster.runtime.Buckminster; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.URIUtil; import org.eclipse.osgi.util.NLS; import org.eclipse.pde.api.tools.internal.model.ApiModelFactory; import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin; import org.eclipse.pde.api.tools.internal.provisional.IApiBaselineManager; import org.eclipse.pde.api.tools.internal.provisional.model.IApiBaseline; import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent; 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.core.target.TargetBundle; @SuppressWarnings("restriction") public class AddBaseline extends WorkspaceCommand { private String targetDefinitionName; private boolean addAsActive; static private final OptionDescriptor OPTION_ACTIVE = new OptionDescriptor('A', "active", OptionValueType.NONE); //$NON-NLS-1$ public String getTargetDefinitionName() { return targetDefinitionName; } public boolean isAddAsActive() { return addAsActive; } public void setAddAsActive(boolean importAsActive) { this.addAsActive = importAsActive; } public void setTargetDefinitionName(String targetDefinitionName) { this.targetDefinitionName = targetDefinitionName; } @Override protected void getOptionDescriptors(List<OptionDescriptor> appendHere) throws Exception { super.getOptionDescriptors(appendHere); appendHere.add(OPTION_ACTIVE); } @Override protected void handleOption(Option option) throws Exception { if (option.is(OPTION_ACTIVE)) setAddAsActive(true); else super.handleOption(option); } @Override protected void handleUnparsed(String[] unparsed) throws Exception { if (unparsed.length > 1) throw new SimpleErrorExitException(org.eclipse.buckminster.core.Messages.Too_many_arguments); if (unparsed.length < 1) throw new SimpleErrorExitException(org.eclipse.buckminster.core.Messages.Too_few_arguments); setTargetDefinitionName(unparsed[0]); } @Override protected int internalRun(IProgressMonitor monitor) throws Exception { IApiBaselineManager baselineManager = ApiPlugin.getDefault().getApiBaselineManager(); for (IApiBaseline baseline : baselineManager.getApiBaselines()) if (baseline.getName().equals(targetDefinitionName)) throw new SimpleErrorExitException(NLS.bind(Messages.Baseline_already_exists_0, targetDefinitionName)); SubMonitor submon = SubMonitor.convert(monitor, 10); Buckminster bucky = Buckminster.getDefault(); ITargetPlatformService service = bucky.getService(ITargetPlatformService.class); ITargetDefinition foundTarget = null; for (ITargetHandle handle : service.getTargets(submon.newChild(1))) { ITargetDefinition target = handle.getTargetDefinition(); String name = ListTargetDefinitions.getTargetName(target); if (name.equals(targetDefinitionName)) { foundTarget = target; break; } } if (foundTarget == null) throw new SimpleErrorExitException(NLS.bind(Messages.Found_no_target_definition_named_0, targetDefinitionName)); IApiBaseline baseline = createBaseline(foundTarget, submon.newChild(3)); baselineManager.addApiBaseline(baseline); if (addAsActive) { baselineManager.setDefaultApiBaseline(targetDefinitionName); BaselineHandler.rebuildApiProjects(); } return 0; } /** * Creates an API baseline from a target definition. * * @param target * @param monitor * progress monitor */ private IApiBaseline createBaseline(ITargetDefinition target, IProgressMonitor monitor) throws CoreException { SubMonitor submon = SubMonitor.convert(monitor, 10); target.resolve(submon.newChild(2)); TargetBundle[] bundles = target.getBundles(); List<IApiComponent> components = new ArrayList<IApiComponent>(); IApiBaseline baseline = ApiModelFactory.newApiBaseline(ListTargetDefinitions.getTargetName(target)); submon.setWorkRemaining(bundles.length); for (int i = 0; i < bundles.length; i++) { submon.worked(1); if (submon.isCanceled()) throw new OperationCanceledException(); if (bundles[i].getStatus().isOK() && !bundles[i].isSourceBundle()) { IApiComponent component = ApiModelFactory.newApiComponent(baseline, URIUtil.toFile(bundles[i].getBundleInfo().getLocation()) .getAbsolutePath()); if (component != null) { components.add(component); } } } baseline.addApiComponents(components.toArray(new IApiComponent[components.size()])); return baseline; } }