private String getReconnectionKindFeatureName() { String featureName = "sourceNode"; if (tool.getReconnectionKind() == ReconnectionKind.RECONNECT_TARGET_LITERAL) { featureName = "targetNode"; } else if (tool.getReconnectionKind() == ReconnectionKind.RECONNECT_BOTH_LITERAL && oldTarget == reconnectionSource) { featureName = "targetNode"; } return featureName; }
private EdgeMapping getEdgeMappingReconnector() { EdgeMapping bestMapping = null; DiagramElementMapping sourceMapping = null; DiagramElementMapping targetMapping = null; if (tool.getReconnectionKind() == ReconnectionKind.RECONNECT_BOTH_LITERAL) { if (edge.getTargetNode() == reconnectionSource) { sourceMapping = getMapping(reconnectionTarget); targetMapping = getMapping(oldTarget); } else { sourceMapping = getMapping(oldSource); targetMapping = getMapping(reconnectionTarget); } } else if (tool.getReconnectionKind() == ReconnectionKind.RECONNECT_SOURCE_LITERAL) { sourceMapping = getMapping(reconnectionTarget); targetMapping = getMapping(oldTarget); } else if (tool.getReconnectionKind() == ReconnectionKind.RECONNECT_TARGET_LITERAL) { sourceMapping = getMapping(oldSource); targetMapping = getMapping(reconnectionTarget); } if (sourceMapping != null && targetMapping != null) { final Iterator<EdgeMapping> iterMappings = tool.getMappings().iterator(); while (iterMappings.hasNext()) { final EdgeMapping currentMapping = iterMappings.next(); if (currentMapping.getTargetMapping().contains(targetMapping) && currentMapping.getSourceMapping().contains(sourceMapping)) { bestMapping = currentMapping; if (currentMapping.equals(edge.getActualMapping())) { break; } } } } return bestMapping; }
/** * {@inheritDoc} * * @see org.eclipse.sirius.tools.internal.command.builders.CommandBuilder#buildCommand() */ @Override public Command buildCommand() { Command result = UnexecutableCommand.INSTANCE; if (permissionAuthority.canEditInstance(reconnectionSource) && permissionAuthority.canEditInstance(reconnectionTarget) && permissionAuthority.canEditInstance(edge) // Layouting mode on diagrams // if the ddiagram is in LayoutingMode, we do not allow reconnection && !isInLayoutingModeDiagram(edge)) { final EObject semanticSource = SiriusUtil.getNearestDecorateSemanticElement(reconnectionSource).getTarget(); final EObject semanticTarget = SiriusUtil.getNearestDecorateSemanticElement(reconnectionTarget).getTarget(); final Map<AbstractVariable, Object> variables = new HashMap<AbstractVariable, Object>(); variables.put(tool.getElement(), edge.getTarget()); variables.put(tool.getSource(), semanticSource); variables.put(tool.getSourceView(), reconnectionSource); variables.put(tool.getTarget(), semanticTarget); variables.put(tool.getTargetView(), reconnectionTarget); variables.put(tool.getEdgeView(), edge); // we create an hidden variable that will be used to // correct reconnection issues ICommandTask createOtherEndVariableTask = getOtherEndVariableCreationTask(variables); final DCommand cmd = createEnclosingCommand(); cmd.getTasks().add(createOtherEndVariableTask); cmd.getTasks() .add( new InitInterpreterVariablesTask( variables, InterpreterUtil.getInterpreter(reconnectionSource), uiCallback)); Option<DDiagram> parentDiagram = getDDiagram(); if (tool.getInitialOperation() != null && tool.getInitialOperation().getFirstModelOperations() != null) { cmd.getTasks() .add( taskHelper.buildTaskFromModelOperation( parentDiagram.get(), edge.getTarget(), tool.getInitialOperation().getFirstModelOperations())); } final SetObject setObject = ToolFactory.eINSTANCE.createSetObject(); final String featureName = getReconnectionKindFeatureName(); setObject.setFeatureName(featureName); setObject.setObject(reconnectionTarget); Option<DRepresentation> representation = new EObjectQuery(edge).getRepresentation(); final CommandContext edgeContext = new CommandContext(edge, representation.get()); cmd.getTasks() .add( new SetValueTask( edgeContext, this.modelAccessor, setObject, new EObjectQuery(edge).getSession().getInterpreter())); final EdgeMapping newEdgeMapping = getEdgeMappingReconnector(); addRefreshTask(edge, cmd, tool); final CompoundCommand cc = new CompoundCommand(); if (newEdgeMapping != null && !newEdgeMapping.equals(edge.getActualMapping())) { cc.append(new SetEdgeActualMappingCommand(editingDomain, edge, newEdgeMapping)); } if (reconnectionSource.equals(oldSource) && (newEdgeMapping != null && !newEdgeMapping.isUseDomainElement() || isEdgeActualMappingUsingDomainElement())) { cc.append( new ReconnectSourceNodeCommand( editingDomain, edge, reconnectionTarget, semanticTarget)); } cc.append(cmd); result = cc; } return result; }