/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.foundation.wkf.node; import java.util.Vector; import java.util.logging.Logger; import org.openflexo.foundation.Inspectors; import org.openflexo.foundation.bindings.BindingAssignment; import org.openflexo.foundation.bindings.BindingDefinition.BindingDefinitionType; import org.openflexo.foundation.bindings.BindingValue; import org.openflexo.foundation.bindings.WKFBindingDefinition; import org.openflexo.foundation.dm.DMType; import org.openflexo.foundation.wkf.FlexoProcess; import org.openflexo.foundation.wkf.OperationPetriGraph; import org.openflexo.foundation.wkf.WKFObject; import org.openflexo.foundation.wkf.dm.PetriGraphSet; import org.openflexo.foundation.wkf.dm.WKFAttributeDataModification; import org.openflexo.foundation.xml.FlexoProcessBuilder; import org.openflexo.localization.FlexoLocalization; /** * Represents a self activated operation node * * @author sguerin * */ public final class SelfExecutableOperationNode extends OperationNode implements SelfExecutableNode { @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(SelfExecutableOperationNode.class.getPackage().getName()); /** * Constructor used during deserialization */ public SelfExecutableOperationNode(FlexoProcessBuilder builder) { this(builder.process); initializeDeserialization(builder); } /** * Default constructor */ public SelfExecutableOperationNode(FlexoProcess process) { super(process); assignments = new Vector<BindingAssignment>(); assignmentDescriptions = new Vector<String>(); } @Override public void finalizeDeserialization(Object builder) { for (int i = 0; i < assignments.size() && i < assignmentDescriptions.size(); i++) { String desc = assignmentDescriptions.get(i); if ("null".equals(desc)) { desc = null; } assignments.get(i).setDescription(desc); } super.finalizeDeserialization(builder); } public static final String EXECUTION_PRIMITIVE = "executionPrimitive"; private BindingValue _executionPrimitive; @Override public WKFBindingDefinition getExecutionPrimitiveBindingDefinition() { return WKFBindingDefinition.get(this, EXECUTION_PRIMITIVE, (DMType) null, BindingDefinitionType.EXECUTE, false); } @Override public BindingValue getExecutionPrimitive() { if (isBeingCloned()) { return null; } return _executionPrimitive; } @Override public void setExecutionPrimitive(BindingValue executionPrimitive) { BindingValue oldBindingValue = _executionPrimitive; _executionPrimitive = executionPrimitive; if (_executionPrimitive != null) { _executionPrimitive.setOwner(this); _executionPrimitive.setBindingDefinition(getExecutionPrimitiveBindingDefinition()); } setChanged(); notifyObservers(new WKFAttributeDataModification(EXECUTION_PRIMITIVE, oldBindingValue, executionPrimitive)); } @Override public String getDefaultName() { return FlexoLocalization.localizedForKey("execution"); } @Override public String getInspectorName() { return Inspectors.WKF.SELF_EXECUTABLE_OPERATION_INSPECTOR; } private Vector<BindingAssignment> assignments; @Override public Vector<BindingAssignment> getAssignments() { return assignments; } @Override public void setAssignments(Vector<BindingAssignment> someAssignments) { this.assignments = someAssignments; setChanged(); notifyObservers(new WKFAttributeDataModification("assignments", null, null)); // TODO notify better } @Override public void addToAssignments(BindingAssignment assignment) { if (assignment == null) { return; } assignment.setOwner(this); assignments.add(assignment); setChanged(); notifyObservers(new WKFAttributeDataModification("assignments", null, null)); // TODO notify better } @Override public void removeFromAssignments(BindingAssignment assignment) { assignment.setOwner(null); assignments.remove(assignment); setChanged(); notifyObservers(new WKFAttributeDataModification("assignments", null, null)); // TODO notify better } private Vector<String> assignmentDescriptions; public Vector<String> getAssignmentDescriptions() { Vector<String> returned = new Vector<String>(); for (BindingAssignment a : getAssignments()) { returned.add(a.getDescription() != null ? a.getDescription() : "null"); } return returned; } public void setAssignmentDescriptions(Vector<String> someAssignments) { this.assignmentDescriptions = someAssignments; } public void addToAssignmentDescriptions(String assignment) { assignmentDescriptions.add(assignment); } public void removeFromAssignmentDescriptions(String assignment) { assignmentDescriptions.remove(assignment); } public BindingAssignment createAssignement() { BindingAssignment returned = new BindingAssignment(this); addToAssignments(returned); return returned; } public void deleteAssignement(BindingAssignment assignment) { removeFromAssignments(assignment); } public boolean isAssignementDeletable(BindingAssignment assignment) { return true; } @Override public boolean mightHaveActionPetriGraph() { return false; } private OperationPetriGraph _executionPetriGraph = null; @Override public boolean hasExecutionPetriGraph() { return _executionPetriGraph != null; } @Override public OperationPetriGraph getExecutionPetriGraph() { return _executionPetriGraph; } public void setExecutionPetriGraph(OperationPetriGraph executionPetriGraph) { _executionPetriGraph = executionPetriGraph; _executionPetriGraph.setContainer(this, FlexoProcess.EXECUTION_CONTEXT); setChanged(); notifyObservers(new PetriGraphSet(executionPetriGraph)); } @Override public boolean isInteractive() { return false; } @Override public Vector<WKFObject> getAllEmbeddedWKFObjects() { Vector<WKFObject> returned = super.getAllEmbeddedWKFObjects(); if (getExecutionPetriGraph() != null) { returned.addAll(getExecutionPetriGraph().getAllEmbeddedWKFObjects()); } return returned; } }