Let us start with a simple Node and Leaf class: // Node public class Node implements IZipNode { private String name; private final List<Node> children; public Node(final String name, final Node... children) { super(); assert(name != null); assert(children != null); this.name = name; this.children = Arrays.asList(children); } public String getName() { return name; } public Collection<Node> getChild