/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * 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 org.kie.workbench.common.stunner.core.graph.command.impl; import java.util.Collection; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; import org.jboss.errai.common.client.api.annotations.MapsTo; import org.jboss.errai.common.client.api.annotations.Portable; import org.kie.workbench.common.stunner.core.command.CommandResult; import org.kie.workbench.common.stunner.core.command.exception.BadCommandArgumentsException; import org.kie.workbench.common.stunner.core.graph.Edge; import org.kie.workbench.common.stunner.core.graph.Node; import org.kie.workbench.common.stunner.core.graph.command.GraphCommandExecutionContext; import org.kie.workbench.common.stunner.core.graph.command.GraphCommandResultBuilder; import org.kie.workbench.common.stunner.core.graph.content.view.View; import org.kie.workbench.common.stunner.core.rule.RuleViolation; import org.kie.workbench.common.stunner.core.rule.context.CardinalityContext; import org.kie.workbench.common.stunner.core.rule.context.impl.RuleContextBuilder; import org.uberfire.commons.validation.PortablePreconditions; /** * A Command to deregister a node from the graph storage. */ @Portable public class DeregisterNodeCommand extends AbstractGraphCommand { private static Logger LOGGER = Logger.getLogger(DeregisterNodeCommand.class.getName()); protected final String uuid; transient Node<?, Edge> node; transient Node<?, Edge> removed; public DeregisterNodeCommand(final @MapsTo("uuid") String uuid) { this.uuid = PortablePreconditions.checkNotNull("uuid", uuid); this.removed = null; } public DeregisterNodeCommand(final Node<?, Edge> node) { this(node.getUUID()); this.node = node; } @Override public CommandResult<RuleViolation> execute(final GraphCommandExecutionContext context) { CommandResult<RuleViolation> results = allow(context); if (!results.getType().equals(CommandResult.Type.ERROR)) { LOGGER.log(Level.FINE, "Executing..."); final org.kie.workbench.common.stunner.core.graph.Graph graph = getGraph(context); final Node<?, Edge> candidate = getCandidate(context); this.removed = candidate; graph.removeNode(candidate.getUUID()); getMutableIndex(context).removeNode(candidate); LOGGER.log(Level.FINE, "Node [" + uuid + " removed from strcture and index."); } return results; } @Override public CommandResult<RuleViolation> undo(final GraphCommandExecutionContext context) { final RegisterNodeCommand undoCommand = new RegisterNodeCommand(removed); return undoCommand.execute(context); } @SuppressWarnings("unchecked") protected CommandResult<RuleViolation> check(final GraphCommandExecutionContext context) { // And check it really exist on the graph storage as well. final org.kie.workbench.common.stunner.core.graph.Graph graph = getGraph(context); final Node<View<?>, Edge> candidate = (Node<View<?>, Edge>) checkCandidateNotNull(context); final GraphCommandResultBuilder builder = new GraphCommandResultBuilder(); final Collection<RuleViolation> cardinalityRuleViolations = doEvaluate(context, RuleContextBuilder.GraphContexts.cardinality(graph, Optional.of(candidate), Optional.of(CardinalityContext.Operation.DELETE))); builder.addViolations(cardinalityRuleViolations); return builder.build(); } public Node<?, Edge> getNode() { return node; } public Node<?, Edge> getRemoved() { return removed; } @SuppressWarnings("unchecked") protected Node<?, Edge> getCandidate(final GraphCommandExecutionContext context) { if (null == node) { node = getNode(context, uuid); } return node; } protected Node<?, Edge> checkCandidateNotNull(final GraphCommandExecutionContext context) { final Node<?, Edge> e = getCandidate(context); if (null == e) { throw new BadCommandArgumentsException(this, uuid, "Node not found for [" + uuid + "]."); } return e; } @Override public String toString() { return "DeregisterNodeCommand [candidate=" + uuid + "]"; } }