/******************************************************************************* * 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.diagram.patterns; import gov.redhawk.core.graphiti.ui.ext.RHContainerShape; import gov.redhawk.ide.graphiti.sad.ui.diagram.wizards.UsesDeviceWizard; import gov.redhawk.ide.graphiti.ui.diagram.providers.ImageProvider; import gov.redhawk.ide.graphiti.ui.diagram.util.DUtil; import java.util.List; import mil.jpeojtrs.sca.partitioning.PartitioningFactory; import mil.jpeojtrs.sca.partitioning.ProvidesPortStub; import mil.jpeojtrs.sca.partitioning.UsesDeviceStub; import mil.jpeojtrs.sca.partitioning.UsesPortStub; import mil.jpeojtrs.sca.sad.SadFactory; import mil.jpeojtrs.sca.sad.SoftwareAssembly; import mil.jpeojtrs.sca.sad.UsesDeviceDependencies; import mil.jpeojtrs.sca.spd.SpdFactory; import mil.jpeojtrs.sca.spd.UsesDevice; import org.eclipse.emf.transaction.RecordingCommand; import org.eclipse.emf.transaction.TransactionalCommandStack; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.graphiti.features.context.ICreateContext; public class UsesDevicePattern extends AbstractUsesDevicePattern { public static final String NAME = "Use Device"; public UsesDevicePattern() { super(); } @Override public String getCreateName() { return NAME; } @Override public String getCreateDescription() { return ""; } @Override public String getCreateImageId() { return ImageProvider.IMG_USES_DEVICE; } // THE FOLLOWING METHOD DETERMINE IF PATTERN IS APPLICABLE TO OBJECT @Override public boolean isMainBusinessObjectApplicable(Object mainBusinessObject) { if (mainBusinessObject instanceof UsesDeviceStub) { UsesDeviceStub usesDeviceStub = (UsesDeviceStub) mainBusinessObject; if (usesDeviceStub != null && !AbstractUsesDevicePattern.isFrontEndDevice(usesDeviceStub.getUsesDevice())) { return true; } } return false; } // @Override // protected boolean isPatternRoot(PictogramElement pictogramElement) { // return true; // } // DIAGRAM FEATURES @Override public Object[] create(ICreateContext context) { // get sad from diagram final SoftwareAssembly sad = DUtil.getDiagramSAD(getDiagram()); // prompt user for final UsesDeviceWizard wizard = (UsesDeviceWizard) openWizard( new UsesDeviceWizard(sad)); if (wizard == null) { return null; } //extract values from wizard final String usesDeviceId = wizard.getNamePage().getModel().getUsesDeviceId(); final List<String> usesPortNames = wizard.getPortsWizardPage().getModel().getUsesPortNames(); final List<String> providesPortNames = wizard.getPortsWizardPage().getModel().getProvidesPortNames(); final UsesDeviceStub[] usesDeviceStubs = new UsesDeviceStub[1]; // editing domain for our transaction TransactionalEditingDomain editingDomain = getFeatureProvider().getDiagramTypeProvider().getDiagramBehavior().getEditingDomain(); // Create Component Related objects in SAD model TransactionalCommandStack stack = (TransactionalCommandStack) editingDomain.getCommandStack(); stack.execute(new RecordingCommand(editingDomain) { @Override protected void doExecute() { //set uses device dependencies if not already set UsesDeviceDependencies usesDeviceDependencies = sad.getUsesDeviceDependencies(); if (usesDeviceDependencies == null) { usesDeviceDependencies = SadFactory.eINSTANCE.createUsesDeviceDependencies(); sad.setUsesDeviceDependencies(usesDeviceDependencies); } //create device //WE ADD DEVICE TO BOTH UsesDeviceStub & UsesDeviceDependencies //UsesDeviceStub is contained in the Graphiti diagram file, UsesDeviceDependencies is stored in the sad file UsesDevice usesDevice = SpdFactory.eINSTANCE.createUsesDevice(); usesDeviceDependencies.getUsesdevice().add(usesDevice); usesDevice.setId(usesDeviceId); //usesDevice.setType(); //not using this type on purpose, no value according to Core Framework team //UsesDeviceStub usesDeviceStubs[0] = createUsesDeviceStub(usesDevice); // if applicable add uses port stub(s) if (usesPortNames != null) { for (String usesPortName : usesPortNames) { UsesPortStub usesPortStub = PartitioningFactory.eINSTANCE.createUsesPortStub(); usesPortStub.setName(usesPortName); usesDeviceStubs[0].getUsesPortStubs().add(usesPortStub); } } // if applicable add provides port stub(s) if (providesPortNames != null) { for (String providesPortName : providesPortNames) { ProvidesPortStub providesPortStub = PartitioningFactory.eINSTANCE.createProvidesPortStub(); providesPortStub.setName(providesPortName); usesDeviceStubs[0].getProvidesPortStubs().add(providesPortStub); } } } }); //store UsesDeviceStub in graphiti diagram getDiagram().eResource().getContents().add(usesDeviceStubs[0]); addGraphicalRepresentation(context, usesDeviceStubs[0]); return new Object[] { usesDeviceStubs[0] }; } @Override public String getEditName() { return NAME; } /** * Open Wizard allowing edit of generic UsesDevice allocation * Persist selections in UsesDevice * @param usesDevice * @param usesDeviceShape */ protected boolean editUsesDevice(final UsesDeviceStub usesDeviceStub, final RHContainerShape usesDeviceShape) { // get sad from diagram final SoftwareAssembly sad = DUtil.getDiagramSAD(getDiagram()); // prompt user for final UsesDeviceWizard wizard = openWizard(new UsesDeviceWizard(sad, usesDeviceStub)); if (wizard == null) { return false; } //extract values from wizard final String usesDeviceId = wizard.getNamePage().getModel().getUsesDeviceId(); final List<String> usesPortNames = wizard.getPortsWizardPage().getModel().getUsesPortNames(); final List<String> providesPortNames = wizard.getPortsWizardPage().getModel().getProvidesPortNames(); // editing domain for our transaction TransactionalEditingDomain editingDomain = getFeatureProvider().getDiagramTypeProvider().getDiagramBehavior().getEditingDomain(); TransactionalCommandStack stack = (TransactionalCommandStack) editingDomain.getCommandStack(); stack.execute(new RecordingCommand(editingDomain) { @Override protected void doExecute() { UsesDevice usesDevice = usesDeviceStub.getUsesDevice(); //uses device id usesDevice.setId(usesDeviceId); //clear existing structs usesDevice.getStructRef().clear(); //update ports updateUsesPortStubs(usesDeviceStub, usesPortNames); updateProvidesPortStubs(usesDeviceStub, providesPortNames); } }); return true; } }