/*
* (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.edge;
import java.util.Vector;
import java.util.logging.Logger;
import org.openflexo.foundation.Inspectors;
import org.openflexo.foundation.bindings.Bindable;
import org.openflexo.foundation.validation.ValidationIssue;
import org.openflexo.foundation.validation.ValidationRule;
import org.openflexo.foundation.validation.ValidationWarning;
import org.openflexo.foundation.wkf.FlexoLevel;
import org.openflexo.foundation.wkf.FlexoProcess;
import org.openflexo.foundation.wkf.WKFObject;
import org.openflexo.foundation.wkf.node.AbstractNode;
import org.openflexo.foundation.wkf.node.OperatorNode;
import org.openflexo.foundation.wkf.ws.AbstractMessageDefinition;
import org.openflexo.foundation.wkf.ws.FlexoPort;
import org.openflexo.foundation.wkf.ws.MessageBindings;
/**
* Abstract edge used to link FlexoNode with ports or portmaps and carrying a message
*
* @author sguerin
*
*/
public abstract class MessageEdge<S extends AbstractNode, E extends AbstractNode> extends FlexoPostCondition<S, E> implements Bindable {
@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(MessageEdge.class.getPackage().getName());
private MessageBindings _inputMessage = null;
private MessageBindings _outputMessage = null;
/**
* Default constructor
*/
public MessageEdge(FlexoProcess process) {
super(process);
}
@Override
public FlexoLevel getLevel() {
return FlexoLevel.ACTIVITY;
}
@Override
public String getInspectorName() {
return Inspectors.WKF.MESSAGE_EDGE_INSPECTOR;
}
public abstract FlexoPort getFlexoPort();
public MessageBindings getInputMessage() {
if (getInputMessageDefinition() != null && isInputPort() && _inputMessage == null) {
_inputMessage = new MessageBindings(this, getInputMessageDefinition());
}
return _inputMessage;
}
public void setInputMessage(MessageBindings messageBindings) {
messageBindings.setMessageDefinition(getInputMessageDefinition());
messageBindings.setMessageEdge(this);
_inputMessage = messageBindings;
}
public MessageBindings getOutputMessage() {
if (getOutputMessageDefinition() != null && isOutputPort() && _outputMessage == null) {
_outputMessage = new MessageBindings(this, getOutputMessageDefinition());
}
return _outputMessage;
}
public void setOutputMessage(MessageBindings messageBindings) {
messageBindings.setMessageDefinition(getOutputMessageDefinition());
messageBindings.setMessageEdge(this);
_outputMessage = messageBindings;
}
public boolean getHasInputMessage() {
return getInputMessageDefinition() != null;
}
public void setHasInputMessage() {
// Read-only property
}
public boolean getHasOutputMessage() {
return getOutputMessageDefinition() != null;
}
public void setHasOutputMessage() {
// Read-only property
}
public abstract boolean isInputPort();
public abstract boolean isOutputPort();
public abstract AbstractMessageDefinition getInputMessageDefinition();
public abstract AbstractMessageDefinition getOutputMessageDefinition();
public void lookupMessageDefinition() {
if (_inputMessage != null) {
_inputMessage.setMessageDefinition(getInputMessageDefinition());
}
if (_outputMessage != null) {
_outputMessage.setMessageDefinition(getOutputMessageDefinition());
}
}
/**
* Return a Vector of all embedded WKFObjects
*
* @return a Vector of WKFObject instances
*/
@Override
public Vector<WKFObject> getAllEmbeddedWKFObjects() {
Vector<WKFObject> returned = super.getAllEmbeddedWKFObjects();
if (getInputMessage() != null) {
returned.add(getInputMessage());
}
if (getOutputMessage() != null) {
returned.add(getOutputMessage());
}
return returned;
}
public static class MessageEdgeCannotBeLinkedWithGateway extends
ValidationRule<MessageEdgeCannotBeLinkedWithGateway, MessageEdge<AbstractNode, AbstractNode>> {
public MessageEdgeCannotBeLinkedWithGateway() {
super(MessageEdge.class, "MessageEdgeCannotBeLinkedWithGateway");
}
@Override
public ValidationIssue<MessageEdgeCannotBeLinkedWithGateway, MessageEdge<AbstractNode, AbstractNode>> applyValidation(
MessageEdge<AbstractNode, AbstractNode> post) {
if (post.getStartNode() instanceof OperatorNode || post.getEndNode() instanceof OperatorNode) {
return new ValidationWarning<MessageEdgeCannotBeLinkedWithGateway, MessageEdge<AbstractNode, AbstractNode>>(this, post,
"MessageEdgeCannotBeLinkedWithGateway");
}
return null;
}
}
}