/******************************************************************************* * 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.sad.internal.ui.handler; import mil.jpeojtrs.sca.partitioning.ComponentSupportedInterfaceStub; import mil.jpeojtrs.sca.partitioning.ProvidesPortStub; import mil.jpeojtrs.sca.partitioning.UsesPortStub; import mil.jpeojtrs.sca.sad.ExternalPorts; import mil.jpeojtrs.sca.sad.Port; import mil.jpeojtrs.sca.sad.SadComponentInstantiation; import mil.jpeojtrs.sca.sad.SadComponentInstantiationRef; import mil.jpeojtrs.sca.sad.SadFactory; import mil.jpeojtrs.sca.sad.SadPackage; import mil.jpeojtrs.sca.sad.SoftwareAssembly; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.emf.edit.command.SetCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.jface.action.Action; import CF.ResourceHelper; /** * */ public class AddExternalPortAction extends Action { private SadComponentInstantiation componentInstantiation; private EObject componentPort; private SoftwareAssembly softwareAssembly; private String portDescription; private EditingDomain editingDomain; public void setEditingDomain(final EditingDomain editingDomain) { this.editingDomain = editingDomain; } private EditingDomain getEditingDomain() { if (this.editingDomain == null) { return TransactionUtil.getEditingDomain(this.softwareAssembly); } return this.editingDomain; } public void setComponentInstantiation(final SadComponentInstantiation componentInstantiation) { this.componentInstantiation = componentInstantiation; } public void setComponentPort(final EObject componentPort) { this.componentPort = componentPort; } public void setSoftwareAssembly(final SoftwareAssembly softwareAssembly) { this.softwareAssembly = softwareAssembly; } public void setPortDescription(final String portDescription) { this.portDescription = portDescription; } @Override public void run() { addPort(); } private void addPort() { final EditingDomain localEditingDomain = getEditingDomain(); Command command = null; // TODO IDE-1224 - Changes should go either here or in createPort(below) final Port port = createPort(); if (this.softwareAssembly.getExternalPorts() == null) { final ExternalPorts externalPorts = SadFactory.eINSTANCE.createExternalPorts(); externalPorts.getPort().add(port); command = SetCommand.create(localEditingDomain, this.softwareAssembly, SadPackage.Literals.SOFTWARE_ASSEMBLY__EXTERNAL_PORTS, externalPorts); } else { command = AddCommand.create(localEditingDomain, this.softwareAssembly.getExternalPorts(), SadPackage.Literals.EXTERNAL_PORTS__PORT, port); } localEditingDomain.getCommandStack().execute(command); } private Port createPort() { final Port port = SadFactory.eINSTANCE.createPort(); final SadComponentInstantiationRef ref = SadFactory.eINSTANCE.createSadComponentInstantiationRef(); ref.setInstantiation(this.componentInstantiation); port.setComponentInstantiationRef(ref); if (this.componentPort instanceof ProvidesPortStub) { final ProvidesPortStub providesPort = (ProvidesPortStub) this.componentPort; port.setProvidesIdentifier(providesPort.getProvides().getProvidesName()); } else if (this.componentPort instanceof UsesPortStub) { final UsesPortStub usesPort = (UsesPortStub) this.componentPort; port.setUsesIdentifier(usesPort.getUses().getUsesName()); } else if (this.componentPort instanceof ComponentSupportedInterfaceStub) { final ComponentSupportedInterfaceStub compPort = (ComponentSupportedInterfaceStub) this.componentPort; // FIXME: I don't understand why we even need the specific interface here? port.setSupportedIdentifier(ResourceHelper.id()); } setExternalPortName(port); port.setDescription(this.portDescription); return port; } // Make sure there are not duplicate external port names private void setExternalPortName(Port port) { String portName = (port.getProvidesIdentifier() != null) ? port.getProvidesIdentifier() : port.getUsesIdentifier(); List<String> currentExtNames = new ArrayList<String>(); if (this.softwareAssembly.getExternalPorts() != null) { for (Port extPort : this.softwareAssembly.getExternalPorts().getPort()) { if (extPort.getExternalName() != null) { currentExtNames.add(extPort.getExternalName()); } else { currentExtNames.add((extPort.getProvidesIdentifier() != null) ? extPort.getProvidesIdentifier() : extPort.getUsesIdentifier()); } } } String extName = portName; int nameIncrement = 1; while ((currentExtNames.contains(extName))) { extName = String.format("%s_%d", portName, nameIncrement++); } if (!(extName.equals(portName))) { port.setExternalName(extName); } } }