Advertisement
Guest User

Untitled

a guest
Jul 18th, 2014
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.83 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. enum State {
  4.     error(0),
  5.     warning(1),
  6.     normal(2);
  7.  
  8.     private int severity;
  9.  
  10.     State(int severity) {
  11.         this.severity = severity;
  12.     }
  13.  
  14.     public int getSeverity() {
  15.         return severity;
  16.     }
  17.  
  18.     public static State initial() {
  19.         return normal;
  20.     }
  21. }
  22.  
  23. class Marker {
  24.  
  25.     private State state;
  26.     private Node container;
  27.  
  28.     Marker() {
  29.         this.state = State.initial();
  30.     }
  31.  
  32.     public State getState() {
  33.         return state;
  34.     }
  35.  
  36.     public void setState(State newState) {
  37.         if (state == null) {
  38.             throw new IllegalArgumentException("state == null");
  39.         }
  40.         State previousState = state;
  41.         state = newState;
  42.         if (container != null) {
  43.             container.onMarkerRemovedOrStateChanged(this, previousState);
  44.         }
  45.     }
  46.  
  47.     public void setContainer(Node container) {
  48.         if (container == null) {
  49.             throw new IllegalArgumentException("container == null");
  50.         }
  51.         this.container = container;
  52.     }
  53. }
  54.  
  55. interface Node {
  56.     State getCommonState();
  57.  
  58.     Collection<Node> getChildren();
  59.  
  60.     Node addChild(Node childNode);
  61.  
  62.     void setParent(Node node);
  63.  
  64.     Collection<Marker> getMarkers();
  65.  
  66.     Node addMarker(Marker marker);
  67.  
  68.     Node removeMarker(Marker marker);
  69.  
  70.     void onMarkerRemovedOrStateChanged(Marker marker, State previousState);
  71. }
  72.  
  73. class SimpleNode implements Node {
  74.     // todo override equals&hashCode
  75.     private final Set<Node> children = new HashSet<>();
  76.     // todo override equals&hashCode
  77.     private final Set<Marker> markers = new HashSet<>();
  78.     private final TreeMap<State, Integer> states = new TreeMap<>(new Comparator<State>() {
  79.         @Override
  80.         public int compare(State left, State right) {
  81.             return Integer.compare(left.getSeverity(), right.getSeverity());
  82.         }
  83.     });
  84.  
  85.     private Node parent = null;
  86.     private State commonState = State.initial();
  87.  
  88.     @Override
  89.     public State getCommonState() {
  90.         return commonState;
  91.     }
  92.  
  93.     @Override
  94.     public Collection<Node> getChildren() {
  95.         return Collections.unmodifiableSet(children);
  96.     }
  97.  
  98.     @Override
  99.     public Node addChild(Node childNode) {
  100.         children.add(childNode);
  101.         childNode.setParent(this);
  102.         return this;
  103.     }
  104.  
  105.     @Override
  106.     public void setParent(Node node) {
  107.         this.parent = node;
  108.     }
  109.  
  110.     @Override
  111.     public Collection<Marker> getMarkers() {
  112.         return markers;
  113.     }
  114.  
  115.     @Override
  116.     public Node addMarker(Marker marker) {
  117.         markers.add(marker);
  118.         marker.setContainer(this);
  119.         incStates(marker.getState());
  120.         return this;
  121.     }
  122.  
  123.     @Override
  124.     public Node removeMarker(Marker marker) {
  125.         markers.remove(marker);
  126.         onMarkerRemovedOrStateChanged(null, marker.getState());
  127.         return this;
  128.     }
  129.  
  130.     private void incStates(State state) {
  131.         if (!states.containsKey(state)) {
  132.             states.put(state, 1);
  133.         } else {
  134.             states.put(state, states.get(state) + 1);
  135.         }
  136.     }
  137.  
  138.     private void decStates(State state) {
  139.         if (!states.containsKey(state)) {
  140.             states.put(state, 0);
  141.         } else {
  142.             final Integer counter = states.get(state);
  143.             if (counter > 0) {
  144.                 states.put(state, counter - 1);
  145.             }
  146.         }
  147.     }
  148.  
  149.     @Override
  150.     public void onMarkerRemovedOrStateChanged(/* Optional<> or @Nullable */ Marker marker, State previousState) {
  151.         if (marker != null) {
  152.             incStates(marker.getState());
  153.         }
  154.         decStates(previousState);
  155.         this.commonState = State.initial();
  156.         for (Map.Entry<State, Integer> stateCounter : states.entrySet()) {
  157.             if (stateCounter.getValue() > 0) {
  158.                 this.commonState = stateCounter.getKey();
  159.                 break;
  160.             }
  161.         }
  162.         if (parent != null) {
  163.             parent.onMarkerRemovedOrStateChanged(marker, previousState);
  164.         }
  165.     }
  166. }
  167.  
  168. interface Visitor {
  169.     void visit(Node node, int depth);
  170. }
  171.  
  172. class PrettyPrinter implements Visitor {
  173.     private String padding(int depth) {
  174.         StringBuilder sb = new StringBuilder();
  175.         if (depth > 0) {
  176.             for (int i = 0; i < depth; i++) {
  177.                 sb.append("\t");
  178.             }
  179.         }
  180.         return sb.toString();
  181.     }
  182.  
  183.     @Override
  184.     public void visit(Node node, int depth) {
  185.         System.out.println(padding(depth) + "commonState = " + node.getCommonState());
  186.         for (Marker m : node.getMarkers()) {
  187.             System.out.println(padding(depth + 1) + "markerState = " + m.getState());
  188.         }
  189.     }
  190. }
  191.  
  192. public class Main {
  193.     private static void traverseNode(Node root, Visitor visitor) {
  194.         traverseNode(root, visitor, 0);
  195.     }
  196.  
  197.     private static void traverseNode(Node root, Visitor visitor, int depth) {
  198.         visitor.visit(root, depth);
  199.         traverseChildren(root.getChildren(), visitor, depth + 1);
  200.     }
  201.  
  202.     private static void traverseChildren(Collection<Node> children, Visitor visitor, int depth) {
  203.         for (Node node : children) {
  204.             traverseNode(node, visitor, depth);
  205.         }
  206.     }
  207.  
  208.     public static void main(String[] args) {
  209.         Node root = new SimpleNode();
  210.         Marker testMarker = new Marker();
  211.         Node testNode = new SimpleNode()
  212.                 .addMarker(new Marker())
  213.                 .addMarker(testMarker)
  214.                 .addMarker(new Marker());
  215.         root.addChild(
  216.                 new SimpleNode()
  217.                         .addMarker(new Marker())
  218.                         .addMarker(new Marker())
  219.                         .addMarker(new Marker())
  220.                         .addChild(testNode)
  221.                         .addChild(
  222.                                 new SimpleNode()
  223.                                         .addMarker(new Marker())
  224.                                         .addMarker(new Marker())
  225.                         )
  226.         ).addChild(
  227.                 new SimpleNode()
  228.                         .addMarker(new Marker())
  229.                         .addMarker(new Marker())
  230.         );
  231.  
  232.         traverseNode(root, new PrettyPrinter());
  233.         System.out.println("--------------------------------------------------------------");
  234.         testMarker.setState(State.error);
  235.         traverseNode(root, new PrettyPrinter());
  236.         System.out.println("--------------------------------------------------------------");
  237.         testMarker.setState(State.warning);
  238.         traverseNode(root, new PrettyPrinter());
  239.         System.out.println("--------------------------------------------------------------");
  240.         testNode.removeMarker(testMarker);
  241.         traverseNode(root, new PrettyPrinter());
  242.     }
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement