workcraft/workcraft

View on GitHub
workcraft/WorkcraftCore/src/org/workcraft/observation/HierarchySupervisor.java

Summary

Maintainability
A
1 hr
Test Coverage
package org.workcraft.observation;

import org.workcraft.dom.Node;

public abstract class HierarchySupervisor implements HierarchyObserver {
    private Node root = null;

    protected Node getRoot() {
        return root;
    }

    private void attachInternal(Node root) {
        if (root instanceof ObservableHierarchy) {
            ((ObservableHierarchy) root).addObserver(this);
        }
        for (Node node : root.getChildren()) {
            attachInternal(node);
        }
    }

    public void attach(Node root, boolean sendRootAddedEvent) {
        this.root = root;
        if (sendRootAddedEvent) {
            handleEvent(new NodesAddedEvent(root.getParent(), root));
        }
        attachInternal(root);
    }

    public void attach(Node root) {
        attach(root, true);
    }

    private void detachInternal(Node root) {
        if (root instanceof ObservableHierarchy) {
            ((ObservableHierarchy) root).removeObserver(this);
        }
        for (Node node : root.getChildren()) {
            detachInternal(node);
        }
    }

    public void detach() {
        detachInternal(root);
        this.root = null;
    }

    @Override
    public void notify(HierarchyEvent e) {
        if (e instanceof NodesDeletedEvent) {
            for (Node n : e.getAffectedNodes()) {
                detachInternal(n);
            }
        } else if (e instanceof NodesAddedEvent) {
            for (Node n : e.getAffectedNodes()) {
                attachInternal(n);
            }
        }
        handleEvent(e);
    }

    public abstract void handleEvent(HierarchyEvent e);

}