/*
* (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 org.openflexo.foundation.Inspectors;
import org.openflexo.foundation.validation.ValidationError;
import org.openflexo.foundation.validation.ValidationIssue;
import org.openflexo.foundation.validation.ValidationRule;
import org.openflexo.foundation.wkf.FlexoProcess;
import org.openflexo.foundation.wkf.edge.FlexoPostCondition;
import org.openflexo.foundation.xml.FlexoProcessBuilder;
import org.openflexo.localization.FlexoLocalization;
public class ExclusiveEventBasedOperator extends CommonOutputOperatorNode {
/**
* Constructor used during deserialization
*/
public ExclusiveEventBasedOperator(FlexoProcessBuilder builder) {
this(builder.process);
initializeDeserialization(builder);
}
/**
* Default constructor
*/
public ExclusiveEventBasedOperator(FlexoProcess process) {
super(process);
}
@Override
public String getInspectorName() {
return Inspectors.WKF.OPERATOR_EXCLUSIVE_EVENT_INSPECTOR;
}
@Override
public String getDefaultName() {
return FlexoLocalization.localizedForKey("EVENT_BASED");
}
public static class NodeAfterEventBasedGatewayRules extends
ValidationRule<NodeAfterEventBasedGatewayRules, ExclusiveEventBasedOperator> {
public NodeAfterEventBasedGatewayRules() {
super(ExclusiveEventBasedOperator.class, "node_after_event_based_gateway_rules");
}
@Override
public ValidationIssue<NodeAfterEventBasedGatewayRules, ExclusiveEventBasedOperator> applyValidation(
ExclusiveEventBasedOperator operator) {
boolean seenEvent = false;
boolean seenActivity = false;
boolean seenOthers = false;
for (FlexoPostCondition<AbstractNode, AbstractNode> post : operator.getOutgoingPostConditions()) {
if (post.getEndNode() instanceof EventNode) {
seenEvent = true;
} else if (post.getEndNode().getNode() instanceof FlexoNode
&& ((FlexoNode) post.getEndNode().getNode()).getAbstractActivityNode() != null) {
seenActivity = true;
} else {
seenOthers = true;
}
}
if (seenEvent && seenActivity) {
return new ValidationError<NodeAfterEventBasedGatewayRules, ExclusiveEventBasedOperator>(this, operator,
"event_gateway_output_must_be_either_intermediate_catching_events_or_activities_but_not_both");
}
if (seenOthers) {
return new ValidationError<NodeAfterEventBasedGatewayRules, ExclusiveEventBasedOperator>(this, operator,
"event_gateway_output_must_be_either_intermediate_catching_events_or_activities");
}
return null;
}
}
}