001 package com.hammurapi.reasoning.impl;
002
003 import java.util.ArrayList;
004
005 import org.eclipse.emf.common.util.TreeIterator;
006 import org.eclipse.emf.ecore.EObject;
007
008 import com.hammurapi.flow.Flow;
009 import com.hammurapi.flow.Node;
010 import com.hammurapi.flow.Pin;
011 import com.hammurapi.flow.Transition;
012 import com.hammurapi.flow.runtime.impl.PassThroughNode;
013 import com.hammurapi.flow.runtime.impl.PassThroughTransition;
014
015 public class PassThroughOptimizer implements RuleSetFlowOptimizer {
016
017 // TODO - Copy connection keys during optimization.
018
019 @Override
020 public void optimize(Flow ruleSetFlow) {
021 boolean optimized;
022 Z: do {
023 optimized = false;
024 TreeIterator<EObject> rcit = ruleSetFlow.eAllContents();
025 while (rcit.hasNext()) {
026 EObject next = rcit.next();
027 if (next instanceof Node) {
028 Node node = (Node) next;
029 if (PassThroughNode.class.getName().equals(node.getType())) {
030 Pin pin = node.getPin().get(0);
031 if (pin.getInput().size()==1) {
032 Transition input = pin.getInput().get(0);
033 if (PassThroughTransition.class.getName().equals(input.getType())) {
034 for (Transition output: new ArrayList<Transition>(pin.getOutput())) {
035 output.setFromPin(input.getFromPin());
036 }
037 input.setFromPin(null);
038 ruleSetFlow.getFlowElement().remove(input);
039 ruleSetFlow.getFlowElement().remove(node);
040 optimized = true;
041 continue Z;
042 }
043 }
044
045 if (pin.getOutput().size()==1) {
046 Transition output = pin.getOutput().get(0);
047 if (PassThroughTransition.class.getName().equals(output.getType())) {
048 for (Transition input: new ArrayList<Transition>(pin.getInput())) {
049 input.setToPin(output.getToPin());
050 }
051 output.setToPin(null);
052 ruleSetFlow.getFlowElement().remove(output);
053 ruleSetFlow.getFlowElement().remove(node);
054 optimized = true;
055 continue Z;
056 }
057 }
058 }
059 }
060 }
061 } while (optimized);
062 }
063
064 @Override
065 public int getOrder() {
066 return 0;
067 }
068
069 }