/** * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * 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. */ package gov.redhawk.ide.graphiti.sad.ui.internal.modelmap; import java.util.Map; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.emf.common.util.URI; import org.eclipse.jdt.annotation.NonNull; import CF.DataType; import gov.redhawk.core.graphiti.sad.ui.modelmap.GraphitiSADModelMap; import gov.redhawk.core.graphiti.sad.ui.modelmap.SADNodeMapEntry; import gov.redhawk.core.graphiti.ui.editor.AbstractGraphitiMultiPageEditor; import gov.redhawk.core.graphiti.ui.modelmap.AbstractGraphitiModelMap; import gov.redhawk.ide.debug.LocalScaComponent; import gov.redhawk.ide.debug.LocalScaWaveform; import gov.redhawk.ide.graphiti.sad.ui.SADUIGraphitiPlugin; import gov.redhawk.ide.graphiti.ui.GraphitiUIPlugin; import gov.redhawk.model.sca.ScaWaveform; import gov.redhawk.sca.util.SubMonitor; import mil.jpeojtrs.sca.sad.SadComponentInstantiation; import mil.jpeojtrs.sca.spd.SoftPkg; import mil.jpeojtrs.sca.util.ScaEcoreUtils; public class GraphitiSADLocalModelMap extends GraphitiSADModelMap { public GraphitiSADLocalModelMap(AbstractGraphitiMultiPageEditor editor, ScaWaveform waveform) { super(editor, waveform); Assert.isTrue(waveform instanceof LocalScaWaveform, "This model map only supports local (sandbox) waveforms"); } @Override public void add(@NonNull final SadComponentInstantiation compInst) { final SADNodeMapEntry nodeMapEntry = new SADNodeMapEntry(); nodeMapEntry.setProfile(compInst); final Map<String, SADNodeMapEntry> nodes = getNodes(); synchronized (nodes) { if (nodes.get(nodeMapEntry.getKey()) != null) { return; } else { nodes.put(nodeMapEntry.getKey(), nodeMapEntry); } } final String implID = ((SadComponentInstantiation) compInst).getImplID(); Job job = new Job("Launching " + compInst.getUsageName()) { @Override protected IStatus run(IProgressMonitor monitor) { SubMonitor subMonitor = SubMonitor.convert(monitor, "Launching " + compInst.getUsageName(), IProgressMonitor.UNKNOWN); LocalScaComponent newComp = null; try { newComp = GraphitiSADLocalModelMap.this.launch(compInst, implID); nodeMapEntry.setScaComponent(newComp); updateEnabledState(compInst, true); getEditor().refreshSelectedObject(compInst); return Status.OK_STATUS; } catch (final CoreException e) { nodes.remove(nodeMapEntry.getKey()); return new Status(e.getStatus().getSeverity(), SADUIGraphitiPlugin.PLUGIN_ID, e.getStatus().getMessage(), e); } finally { if (nodes.get(nodeMapEntry.getKey()) == null) { delete(compInst); } subMonitor.done(); } } }; job.schedule(); } /** * Launch an instance of the specified SPD. * @param compInst The instantiation as per the SAD * @param implID The implementation to launch, or null for any * @throws CoreException */ protected LocalScaComponent launch(final SadComponentInstantiation compInst, final String implID) throws CoreException { LocalScaWaveform localWaveform = (LocalScaWaveform) getWaveform(); DataType[] initConfiguration = getInitialProperties(compInst); final SoftPkg spd = ScaEcoreUtils.getFeature(compInst, AbstractGraphitiModelMap.COMP_INST_TO_SPD_PATH); if (spd == null) { throw new CoreException(new Status(IStatus.ERROR, GraphitiUIPlugin.PLUGIN_ID, "Failed to resolve SPD.", null)); } final URI spdURI = spd.eResource().getURI(); return localWaveform.launch(compInst.getId(), initConfiguration, spdURI, implID, ILaunchManager.RUN_MODE); } }