protected void encode(HierNode<T> node) { Collection<HierNode<T>> parents = node.getParents(); // System.out.println( "Trying to encode " + node ); switch (parents.size()) { case 0: BitSet zero = new BitSet(); if (hasKey(zero)) { HierNode root = getNodeByKey(zero); if (root.getValue() != null) { fixedRoot = true; HierNode previousRoot = root; root = new HierNode((Object) null); root.addChild(previousRoot); previousRoot.addParent(root); root.setBitMask(zero); propagate(previousRoot, freeBit(root)); add(root); } node.addParent(root); updateMask(node, increment(root.getBitMask(), freeBit(root))); } else { updateMask(node, new BitSet()); } break; case 1: HierNode<T> parent = parents.iterator().next(); updateMask(node, increment(parent.getBitMask(), freeBit(parent))); break; default: inheritMerged(node); // System.out.println( " // ----------------------------------------------------------------------------------------- // " ); resolveConflicts(node); break; } }
public BitSet encode(T member, Collection<T> parents) { BitSet existing = getCode(member); if (existing != null) { return existing; } HierNode<T> node = new HierNode<T>(member); Set<HierNode<T>> parentNodes = floor(parents); for (HierNode<T> parentNode : parentNodes) { node.addParent(parentNode); parentNode.addChild(node); } encode(node); add(node); return node.getBitMask(); }