package rba.tool.core.sort; import java.util.ArrayList; import java.util.Collection; import java.util.List; import rba.core.ComparisonAnd; import rba.core.ComparisonOperator; import rba.core.EqualToOperator; import rba.core.Expression; import rba.core.GreaterThanOperator; import rba.core.MuchGreaterThanOperator; import rba.core.RuleObject; import rba.core.ValueExpression; abstract public class ValueSortedList { private List> list; private Collection unsorted; public ValueSortedList(Collection originalList) { list = new ArrayList>(); list.add(new ValueGroup("MIN")); list.add(new ValueGroup("1")); list.add(new ValueGroup("MAX")); unsorted = new ArrayList(originalList); sort(); } public void add(T o) { unsorted.add(o); sort(); } public void addAll(Collection list) { unsorted.addAll(list); sort(); } public void sort() { list.get(0).getMember().addAll(unsorted); unsorted.clear(); boolean trysort = true; int retry = 0; while (trysort) { trysort = false; retry = retry + 1; if (retry > 100) { throw new RuntimeException("Could not sort value [" + list + "]"); } for (T i : sortedList()) { int currentIndex = this.getGroupIndexOf(i); Expression e = this.getValueExpression(i); if (e == null) continue; if (e instanceof ValueExpression) { int index = this.getGroupIndexOf(e.getExpression()); if (index == -1) { index = ((ValueExpression) e).getExpressionValue(); if (index == -1) { index = 0; } if (index >= list.size() - 1) { list.get(currentIndex).remove(i); addGroupAt(index, i); trysort = true; continue; } } if (index != currentIndex) { list.get(currentIndex).remove(i); list.get(index).add(i); trysort = true; } else { } } else if (e instanceof ComparisonOperator) { ComparisonOperatorEvaluator evaluator = createEvaluator((ComparisonOperator) e); int index = evaluator.suggestIndex(this); if (index < 0) continue; if (index >= list.size() - 1) { list.get(currentIndex).remove(i); addGroupAt(index, i); trysort = true; } else if (index != currentIndex) { list.get(currentIndex).remove(i); list.get(index).add(i); trysort = true; } else { } } else { throw new RuntimeException("Unsupported expression [" + e.getExpression() + "]"); } } } } private void addGroupAt(int index, T e) { if (index >= list.size() - 1) { for (int i = list.size() - 1; i <= index; ++i) { ValueGroup newGroup = new ValueGroup(Integer.toString(i)); list.add(i, newGroup); } } list.get(index).add(e); } public List sortedList() { List result = new ArrayList(); for (ValueGroup i : list) { result.addAll(i.getMember()); } return result; } public List> getGroupList() { return list; } public List sortedListByBig() { List result = new ArrayList(); for (int index = list.size() - 1; index >= 0; index--) { ValueGroup i = list.get(index); result.addAll(i.getMember()); } return result; } abstract protected Expression getValueExpression(T e); public int getGroupIndexOf(T e) { for (ValueGroup i : list) { if (i.getMember().contains(e)) { return list.indexOf(i); } } return -1; } public int getGroupIndexOf(String groupName) { for (ValueGroup i : list) { if (i.getName().contentEquals(groupName)) { return list.indexOf(i); } } return -1; } public ComparisonOperatorEvaluator createEvaluator(ComparisonOperator e) { ComparisonOperatorEvaluator evaluator; if (e instanceof GreaterThanOperator) { evaluator = new GreaterThanOperatorEvaluator((GreaterThanOperator) e); } else if (e instanceof MuchGreaterThanOperator) { evaluator = new MuchGreaterThanOperatorEvaluator((MuchGreaterThanOperator) e); } else if (e instanceof ComparisonAnd) { evaluator = new ComparisonAndEvaluator((ComparisonAnd) e); } else if (e instanceof EqualToOperator) { evaluator = new EqualToOperatorEvaluator((EqualToOperator) e); } else { throw new RuntimeException("Unsupported expression [" + e.getExpression() + "]"); } return evaluator; } }