Posting Dependencies

Let's see...    Additions and Combinations can't be Posted unless their owning Operation is Posted, and Operations with Sub-Operations can't themselves be Posted but are considered Posted (for the purposes of Additions and Combinations) when any of their Sup-Operations is Posted...             ...OK?
public abstract class Labor implements Postable {

    private boolean  posted     = false;
    private boolean  enabled    = true;
    private int      lineNumber = 0;
    ...

    protected Labor(int lineNumber... ) {
        this.lineNumber  = lineNumber;
        ...
    }

    public void setPosted(boolean posted) {
        this.posted = posted && enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;

        if (!enabled && posted) {
            setPosted(false);
        }
    }

    public boolean hasSubOps()  { return false; }
    public boolean isPosted()   { return posted; }
    public boolean isEnabled()  { return enabled; }
    public boolean isIndented() { return false; }
}
public class LaborOp extends Labor {

    private LaborAdd[]   additions     = new LaborAdd[0];
    private LaborComb[]  combinations  = new LaborComb[0];
    private LaborSubOp[] subOperations = new LaborSubOp[0];

    public LaborOp(int lineNumber... 
                           LaborAdd[]   additions, 
                           LaborComb[]  combinations, 
                           LaborSubOp[] subOperations) {
        super(lineNumber...

        setEnabled(true);

        this.additions     = additions;
        this.combinations  = combinations;
        this.subOperations = subOperations;
    }

    public boolean hasSubOps() {
        return subOperations.length > 0;
    }

    public void setPosted(boolean posted) {
        if (!hasSubOps()) {
            super.setPosted(posted);
            enableDependents(posted);
        }
    }

    public void subOpPostChange() {
        boolean posted = false;
        for (int i = 0; i < subOperations.length; i++) {
            posted = posted || subOperations[i].isPosted();
        }
        enableDependents(posted);
    }

    private void enableDependents(boolean enabled) {
        for (int i = 0; i < additions.length; i++) {
            additions[i].setEnabled(enabled);
        }
        for (int i = 0; i < combinations.length; i++) {
            combinations[i].setEnabled(enabled);
        }
    }
}
public class LaborAdd extends Labor {

    public LaborAdd(int lineNumber... ) {
        super(lineNumber...

        setEnabled(false);
    }

    public boolean isIndented() {
        return true;
    }
}
public class LaborComb extends Labor {

    private LaborSubOp[] subOperations = new LaborSubOp[0];

    public LaborComb(int lineNumber...
                             LaborSubOp[] subOperations) {
        super(lineNumber...

        this.subOperations = subOperations;

        setEnabled(false);
    }

    public boolean isIndented() {
        return true;
    }

    public boolean hasSubOps() {
        return subOperations.length > 0;
    }

    public void setPosted(boolean posted) {
        if (!hasSubOps()) {
            super.setPosted(posted);
        }
    }

    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);

        for (int i = 0; i < subOperations.length; i++) {
            subOperations[i].setEnabled(enabled);
        }
    }

    public LaborSubOp[] getSubOperations() {
        return subOperations;
    }
}
public class LaborSubOp extends Labor {

    private boolean indented = false;
    private LaborOp owner    = null;

    public LaborSubOp(String estTime... boolean indented) {
        super(lineNumber...

        this.indented = indented;
    }

    public void setOwner(LaborOp owner) {
        this.owner = owner;
    }

    public void setPosted(boolean posted) {
        super.setPosted(posted);

        if (owner != null) {
            owner.subOpPostChange();
        }
    }

    public boolean isIndented() {
        return indented;
    }
}