/******************************************************************************* * Copyright 2017 Capital One Services, LLC and Bitwise, Inc. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package hydrograph.ui.graph.command; import hydrograph.ui.graph.model.Component; import hydrograph.ui.graph.model.Link; import hydrograph.ui.graph.model.Port; import hydrograph.ui.graph.model.PortDetails; import hydrograph.ui.logging.factory.LogFactory; import org.eclipse.gef.commands.Command; import org.slf4j.Logger; /** * The Class LinkReconnectTargetCommand. */ public class LinkReconnectTargetCommand extends Command{ private static final Logger logger = LogFactory.INSTANCE.getLogger(LinkReconnectTargetCommand.class); Link link; private Component oldTarget; private Component newTarget; private String oldTargetTerminal; private String newTargetTerminal; private final Component oldSource; /** * Instantiates a new link reconnect target command. * * @param link * the link */ public LinkReconnectTargetCommand(Link link){ if (link == null) { throw new IllegalArgumentException(); } this.link=link; this.oldSource=link.getSource(); this.oldTarget = link.getTarget(); setLabel("Target Reconnection"); } @Override public boolean canExecute(){ if(newTarget != null){ if(newTarget.equals(oldSource)){ return false; } for (PortDetails p : newTarget.getPortDetails()) { for(Port port:p.getPorts().values()){ String portTerminal=port.getTerminal(); if(portTerminal.equals(newTargetTerminal)){ if(p.isAllowMultipleLinks() || !newTarget.isInputPortEngaged(newTargetTerminal)){ logger.debug("Reconnectable source {}", newTargetTerminal); }else{ return false; } } } } } return true; } @Override public void execute(){ if(newTarget != null){ link.detachTarget(); link.getTarget().freeInputPort(link.getTargetTerminal()); link.setTarget(newTarget); link.setTargetTerminal(newTargetTerminal); oldTarget.freeInputPort(link.getTargetTerminal()); oldTarget.disconnectInput(link); link.attachTarget(); newTarget.engageInputPort(newTargetTerminal); } } public void setNewTarget(Component linkTarget) { if (linkTarget == null) { throw new IllegalArgumentException(); } newTarget = linkTarget; } public void setNewTargetTerminal(String newTargetTerminal){ this.newTargetTerminal=newTargetTerminal; } public void setOldTarget(Link w){ oldTarget=w.getTarget(); oldTargetTerminal=w.getTargetTerminal(); } @Override public void redo() { execute(); } @Override public void undo(){ newTarget=link.getTarget(); newTargetTerminal=link.getTargetTerminal(); newTarget.disconnectInput(link); newTarget.freeInputPort(link.getTargetTerminal()); link.detachTarget(); link.setTarget(oldTarget); link.setTargetTerminal(oldTargetTerminal); link.attachTarget(); } }