/** * 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.sca.internal.ui.handlers; import gov.redhawk.model.sca.CorbaObjWrapper; import gov.redhawk.model.sca.ScaComponent; import gov.redhawk.model.sca.ScaProvidesPort; import gov.redhawk.model.sca.ScaUsesPort; import gov.redhawk.sca.ui.ConnectPortWizard; import gov.redhawk.sca.ui.ScaUiPlugin; import gov.redhawk.sca.util.PluginUtil; import java.util.concurrent.Callable; import mil.jpeojtrs.sca.scd.SupportsInterface; import mil.jpeojtrs.sca.util.CorbaUtils; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.expressions.IEvaluationContext; 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.emf.ecore.EObject; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.handlers.HandlerUtil; import org.omg.CORBA.SystemException; import CF.PortPackage.InvalidPort; import CF.PortPackage.OccupiedPort; /** * */ public class ConnectPortHandler extends AbstractHandler implements IHandler { private static class ConnectJob extends Job { private final org.omg.CORBA.Object target; private final ScaUsesPort usesPort; private String connectionID; public ConnectJob(final ScaUsesPort usesPort, final org.omg.CORBA.Object target, String connectionID) { super("Connecting"); this.usesPort = usesPort; this.target = target; this.connectionID = connectionID; setPriority(Job.LONG); setUser(true); } @Override protected IStatus run(final IProgressMonitor monitor) { monitor.beginTask("Connecting " + usesPort.getName(), IProgressMonitor.UNKNOWN); try { CorbaUtils.invoke(new Callable<Object>() { @Override public Object call() throws Exception { try { usesPort.connectPort(target, connectionID); } catch (final InvalidPort e) { throw new CoreException(new Status(IStatus.ERROR, ScaUiPlugin.PLUGIN_ID, "Failed to connect " + e.msg, e)); } catch (final OccupiedPort e) { throw new CoreException(new Status(IStatus.ERROR, ScaUiPlugin.PLUGIN_ID, "Failed to connect", e)); } catch (final SystemException e) { throw new CoreException(new Status(IStatus.ERROR, ScaUiPlugin.PLUGIN_ID, "Failed to connect", e)); } return null; } }, monitor); } catch (CoreException e) { return new Status(e.getStatus().getSeverity(), ScaUiPlugin.PLUGIN_ID, e.getLocalizedMessage(), e); } catch (InterruptedException e) { return Status.CANCEL_STATUS; } return Status.OK_STATUS; } } /** * {@inheritDoc} */ @Override public Object execute(final ExecutionEvent event) throws ExecutionException { final ISelection sel = HandlerUtil.getActiveMenuSelection(event); Shell shell = HandlerUtil.getActiveShell(event); if (sel instanceof IStructuredSelection) { final IStructuredSelection ss = (IStructuredSelection) sel; ScaUsesPort usesPort = null; CorbaObjWrapper< ? > target = null; for (final Object obj : ss.toArray()) { if (PluginUtil.adapt(ScaUsesPort.class, obj, true) != null) { usesPort = PluginUtil.adapt(ScaUsesPort.class, obj, true); } else if (PluginUtil.adapt(ScaProvidesPort.class, obj, true) != null) { target = PluginUtil.adapt(ScaProvidesPort.class, obj, true); } else if (PluginUtil.adapt(ScaComponent.class, obj, true) != null) { target = PluginUtil.adapt(ScaComponent.class, obj, true); } } if (usesPort != null && target != null) { new ConnectJob(usesPort, target.getCorbaObj(), ConnectPortWizard.generateDefaultConnectionID()).schedule(); } else { ConnectPortWizard wizard = new ConnectPortWizard(); if (usesPort != null) { wizard.setSource(usesPort); wizard.setSourceInput(usesPort.eContainer()); wizard.setShowAllInputs(false); } if (target != null) { wizard.setTarget(target); wizard.setTargetInput(target.eContainer()); wizard.setShowAllOutputs(false); } WizardDialog dialog = new WizardDialog(shell, wizard); dialog.open(); } } return null; } @Override public void setEnabled(final Object evaluationContext) { if ((evaluationContext != null) && (evaluationContext instanceof IEvaluationContext)) { final IEvaluationContext context = (IEvaluationContext) evaluationContext; final Object sel = context.getVariable("selection"); if (sel instanceof IStructuredSelection) { final IStructuredSelection ss = (IStructuredSelection) sel; ScaUsesPort usesPort = null; EObject target = null; for (final Object obj : ss.toArray()) { if (PluginUtil.adapt(ScaUsesPort.class, obj, true) != null) { usesPort = PluginUtil.adapt(ScaUsesPort.class, true); } else if (PluginUtil.adapt(ScaProvidesPort.class, obj, true) != null) { target = PluginUtil.adapt(ScaProvidesPort.class, true); } else if (PluginUtil.adapt(ScaComponent.class, obj, true) != null) { target = PluginUtil.adapt(ScaComponent.class, true); } } if (usesPort != null && usesPort.getProfileObj() != null && usesPort.getProfileObj().getInterface() != null) { if (target instanceof ScaProvidesPort) { final ScaProvidesPort providesPort = (ScaProvidesPort) target; setBaseEnabled(usesPort.getProfileObj().getInterface().isInstance(providesPort.getProfileObj().getInterface())); } else if (target instanceof ScaComponent) { final ScaComponent component = (ScaComponent) target; for (final SupportsInterface i : component.getProfileObj().getDescriptor().getComponent().getComponentFeatures().getSupportsInterface()) { if (usesPort.getProfileObj().getInterface().isInstance(i.getInterface())) { setBaseEnabled(true); return; } } setBaseEnabled(false); } else if (target == null) { setBaseEnabled(true); } else { setBaseEnabled(false); } } else { setBaseEnabled(true); } } else { super.setEnabled(evaluationContext); } } } }