/**
* 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.core.graphiti.dcd.ui.diagram.feature;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalCommandStack;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICreateContext;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import gov.redhawk.core.graphiti.dcd.ui.diagram.providers.DeviceManagerImageProvider;
import gov.redhawk.core.graphiti.ui.diagram.features.AbstractCreateInstatiationFeature;
import gov.redhawk.core.graphiti.ui.util.DUtil;
import mil.jpeojtrs.sca.dcd.DcdComponentInstantiation;
import mil.jpeojtrs.sca.dcd.DcdComponentPlacement;
import mil.jpeojtrs.sca.dcd.DcdFactory;
import mil.jpeojtrs.sca.dcd.DeviceConfiguration;
import mil.jpeojtrs.sca.partitioning.ComponentFile;
import mil.jpeojtrs.sca.partitioning.ComponentFileRef;
import mil.jpeojtrs.sca.partitioning.ComponentFiles;
import mil.jpeojtrs.sca.partitioning.PartitioningFactory;
import mil.jpeojtrs.sca.spd.SoftPkg;
public class ServiceCreateFeature extends AbstractCreateInstatiationFeature {
public static final String SHAPE_TYPE = "serviceShape";
public static final String OVERRIDE_USAGE_NAME = "OverrideUsageName";
public static final String OVERRIDE_INSTANTIATION_ID = "OverrideInstantiationId";
public static final String OVERRIDE_IMPLEMENTATION_ID = "OverrideImplementationId";
@Override
public String getDescription() {
// Provides the context menu Undo/Redo description
return "Add Service to Diagram";
}
public ServiceCreateFeature(IFeatureProvider fp, SoftPkg spd, String implId) {
super(fp, spd, implId);
}
@Override
public boolean canCreate(ICreateContext context) {
if (context.getTargetContainer() instanceof Diagram) {
return true;
}
return false;
}
@Override
public Object[] create(ICreateContext context) {
if (getSoftPkg() == null) {
// TODO: return some kind of error
return null;
}
// collect overrides (currently used by GraphitiDcdModelMap)
final String usageName = (String) context.getProperty(OVERRIDE_USAGE_NAME);
final String instantiationId = (String) context.getProperty(OVERRIDE_INSTANTIATION_ID);
final String implementationId = (String) context.getProperty(OVERRIDE_IMPLEMENTATION_ID);
// editing domain for our transaction
TransactionalEditingDomain editingDomain = getFeatureProvider().getDiagramTypeProvider().getDiagramBehavior().getEditingDomain();
// Get dcd from diagram
final DeviceConfiguration dcd = DUtil.getDiagramDCD(getDiagram());
// Add to dcd partitioning
final EList<DcdComponentPlacement> componentPlacementList = dcd.getPartitioning().getComponentPlacement();
// container for new component instantiation, necessary for reference after command execution
final DcdComponentInstantiation[] componentInstantiations = new DcdComponentInstantiation[1];
// Create Service related objects in DCD model
TransactionalCommandStack stack = (TransactionalCommandStack) editingDomain.getCommandStack();
stack.execute(new RecordingCommand(editingDomain) {
@Override
protected void doExecute() {
// add component file
ComponentFile componentFile = createComponentFile(dcd);
// create component placement and add to list
final DcdComponentPlacement componentPlacement = DcdFactory.eINSTANCE.createDcdComponentPlacement();
componentPlacementList.add(componentPlacement);
// create component file ref
final ComponentFileRef ref = PartitioningFactory.eINSTANCE.createComponentFileRef();
ref.setFile(componentFile);
componentPlacement.setComponentFileRef(ref);
// component instantiation
componentInstantiations[0] = createComponentInstantiation(dcd, componentPlacement, usageName, instantiationId, implementationId);
}
});
// Call add feature
context.putProperty("shapeType", SHAPE_TYPE);
addGraphicalRepresentation(context, componentInstantiations[0]);
return new Object[] { componentInstantiations[0] };
}
// adds corresponding component file to sad if not already present
private ComponentFile createComponentFile(final DeviceConfiguration dcd) {
// Create the componentfiles element if it doesn't exist already
ComponentFiles componentFiles = dcd.getComponentFiles();
if (componentFiles == null) {
componentFiles = PartitioningFactory.eINSTANCE.createComponentFiles();
dcd.setComponentFiles(componentFiles);
}
// Find the matching component file, or create if necessary
return getComponentFile(componentFiles);
}
// create ComponentInstantiation
private DcdComponentInstantiation createComponentInstantiation(final DeviceConfiguration dcd, DcdComponentPlacement componentPlacement,
final String providedUsageName, final String providedInstantiationId, final String providedImplId) {
DcdComponentInstantiation dcdComponentInstantiation = DcdFactory.eINSTANCE.createDcdComponentInstantiation();
String serviceName = (providedUsageName != null) ? providedUsageName : DeviceConfiguration.Util.createDeviceUsageName(dcd, getSoftPkg().getName());
String id = (providedInstantiationId != null) ? providedInstantiationId : dcd.getName() + ":" + serviceName;
String implementationId = (providedImplId != null) ? providedImplId : getImplementationId();
dcdComponentInstantiation.setUsageName(serviceName);
dcdComponentInstantiation.setId(id);
dcdComponentInstantiation.setImplID(implementationId);
// add to placement
componentPlacement.getComponentInstantiation().add(dcdComponentInstantiation);
return dcdComponentInstantiation;
}
@Override
public String getCreateImageId() {
return DeviceManagerImageProvider.IMG_SERVICE;
}
}