/**
* 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.
*
*/
// BEGIN GENERATED CODE
package gov.redhawk.diagram.edit.helpers;
import gov.redhawk.diagram.activator.PluginActivator;
import gov.redhawk.sca.util.PluginUtil;
import mil.jpeojtrs.sca.partitioning.ComponentFile;
import mil.jpeojtrs.sca.partitioning.ComponentFileRef;
import mil.jpeojtrs.sca.partitioning.ComponentFiles;
import mil.jpeojtrs.sca.partitioning.ComponentInstantiation;
import mil.jpeojtrs.sca.partitioning.ComponentPlacement;
import mil.jpeojtrs.sca.partitioning.PartitioningFactory;
import mil.jpeojtrs.sca.spd.SoftPkg;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelperAdvice;
import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
import org.eclipse.ui.statushandlers.StatusManager;
/**
* @since 3.0
*/
public abstract class ComponentPlacementEditHelperAdvice< CI extends ComponentInstantiation, CP extends ComponentPlacement<CI> > extends
AbstractEditHelperAdvice {
public static final String CONFIGURE_OPTIONS_SPD_URI = "SPD_URI";
/**
* @since 6.0
*/
public static final String CONFIGURE_OPTIONS_IMPL_ID = "IMPL_ID";
public static final String CONFIGURE_OPTIONS_CP_FILE = "CP_FILE";
/**
* @since 6.1
*/
public static final String CONFIGURE_OPTIONS_ALWAYS_CP_CREATE_FILE = "ALWAYS_CREATE_CP_FILE";
/**
* @since 5.0
*/
public static final String CONFIGURE_COMPONENT_INSTANTIATION = "COMP_INST";
/**
* @since 4.0
*/
public static final String CONFIGURE_OPTIONS_INST_ID = "INST_ID";
/**
* @since 4.0
*/
public static final String CONFIGURE_OPTIONS_INST_NAME = "INST_NAME";
public ComponentPlacementEditHelperAdvice() {
}
@Override
protected ICommand getBeforeConfigureCommand(final ConfigureRequest request) {
return new ConfigureCommand(request);
}
protected class ConfigureCommand extends AbstractTransactionalCommand {
protected final ConfigureRequest request;
public ConfigureCommand(final ConfigureRequest req) {
super(req.getEditingDomain(), "Configure Component Placement", null);
this.request = req;
}
@Override
public boolean canExecute() {
final Object obj = this.request.getElementToConfigure();
final ComponentPlacement< ? > cp = (ComponentPlacement< ? >) obj;
if (cp.eResource() == null) {
return false;
}
final SoftPkg spd = getSoftPkg();
if (spd != null) {
return true;
} else {
return false;
}
}
@Override
protected CommandResult doExecuteWithResult(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
final SoftPkg spd = getSoftPkg();
if (spd == null) {
return CommandResult.newErrorCommandResult("Invalid SPD reference.");
}
// See if we have to add a new <componentfile>
ComponentFile file = null;
final Object cpFileParam = this.request.getParameter(ComponentPlacementEditHelperAdvice.CONFIGURE_OPTIONS_CP_FILE);
boolean alwaysCreateFile = Boolean.valueOf(String.valueOf(this.request.getParameter(ComponentPlacementEditHelperAdvice.CONFIGURE_OPTIONS_ALWAYS_CP_CREATE_FILE)));
if (cpFileParam instanceof ComponentFile) {
file = (ComponentFile) cpFileParam;
}
if (file == null) {
file = setupComponentFile(spd, alwaysCreateFile);
}
// Now add the component placement
if (file != null) {
final CI inst = createComponentInstantiation(this.request, spd);
// Set the implementation ID, this is mainly used for local debugging and isn't saved to the file.
String implId = getImplementationID();
if (implId == null) {
if (!spd.getImplementation().isEmpty()) { // Panic! Just choose first implementation
implId = spd.getImplementation().get(0).getId();
} else {
StatusManager.getManager().handle(
new Status(IStatus.ERROR, PluginActivator.ID, spd.getName() + " Component has no implementation. ID: " + spd.getId()),
StatusManager.LOG | StatusManager.SHOW);
return CommandResult.newErrorCommandResult("No SPD implementation available for " + spd.getName());
}
}
inst.setImplID(implId);
Assert.isNotNull(inst.getId());
Assert.isNotNull(inst.getUsageName());
final ComponentFileRef ref = PartitioningFactory.eINSTANCE.createComponentFileRef();
ref.setFile(file);
final CP obj = getObjectToConfigure(this.request);
obj.setComponentFileRef(ref);
obj.getComponentInstantiation().add(inst);
}
return CommandResult.newOKCommandResult();
}
public SoftPkg getSoftPkg() {
final URI spdUri = getSPDURI();
SoftPkg spd = null;
if (spdUri != null) {
final EObject eObj = this.request.getEditingDomain().getResourceSet().getEObject(spdUri, true);
if (eObj instanceof SoftPkg) {
spd = (SoftPkg) eObj;
}
}
return spd;
}
public URI getSPDURI() {
final Object spdParam = this.request.getParameter(ComponentPlacementEditHelperAdvice.CONFIGURE_OPTIONS_SPD_URI);
URI spdUri = null;
if (spdParam instanceof String) {
spdUri = URI.createURI(spdParam.toString());
} else if (spdParam instanceof URI) {
spdUri = (URI) spdParam;
}
if (spdUri != null && (spdUri.fragment() == null || spdUri.fragment().equals(""))) {
spdUri = spdUri.appendFragment(SoftPkg.EOBJECT_PATH);
}
return spdUri;
}
/**
* @since 6.0
* */
public String getImplementationID() {
Object param = this.request.getParameter(ComponentPlacementEditHelperAdvice.CONFIGURE_OPTIONS_IMPL_ID);
if (param instanceof String) {
return (String) param;
}
return null;
}
public ComponentFile setupComponentFile(final SoftPkg spd) {
final CP obj = getObjectToConfigure(this.request);
ComponentFile file = null;
ComponentFiles files = getComponentFiles(obj);
if (files == null) {
files = PartitioningFactory.eINSTANCE.createComponentFiles();
setComponentFiles(obj, files);
}
for (final ComponentFile f : files.getComponentFile()) {
if (f == null) {
continue;
}
final SoftPkg fSpd = f.getSoftPkg();
if (fSpd != null && PluginUtil.equals(spd.getId(), fSpd.getId())) {
file = f;
break;
}
}
if (file == null) {
file = createComponentFile();
files.getComponentFile().add(file);
file.setSoftPkg(spd);
}
return file;
}
/**
* @since 6.1
*/
public ComponentFile setupComponentFile(final SoftPkg spd, boolean alwaysCreate) {
if (!alwaysCreate) {
return setupComponentFile(spd);
}
final CP obj = getObjectToConfigure(this.request);
ComponentFile file = null;
ComponentFiles files = getComponentFiles(obj);
if (files == null) {
files = PartitioningFactory.eINSTANCE.createComponentFiles();
setComponentFiles(obj, files);
}
file = createComponentFile();
files.getComponentFile().add(file);
file.setSoftPkg(spd);
return file;
}
}
/**
* @since 4.0
*/
public abstract CI createComponentInstantiation(ConfigureRequest request, SoftPkg spd);
public abstract ComponentFile createComponentFile();
public abstract CP getObjectToConfigure(ConfigureRequest request);
public abstract void setComponentFiles(CP obj, ComponentFiles files);
public abstract ComponentFiles getComponentFiles(CP obj);
/**
* @since 4.0
*/
public String getInstantiationID(final ConfigureRequest request) {
return (String) request.getParameter(ComponentPlacementEditHelperAdvice.CONFIGURE_OPTIONS_INST_ID);
}
/**
* @since 4.0
*/
public String getInstantiationName(final ConfigureRequest request) {
return (String) request.getParameter(ComponentPlacementEditHelperAdvice.CONFIGURE_OPTIONS_INST_NAME);
}
}