001 /* Copyright 2000, 2001, Compaq Computer Corporation */ 002 003 package javafe.filespace; 004 005 006 import java.util.Enumeration; 007 008 009 /** 010 * A PreloadedTree is a HashTree whose edges map is loaded exactly once 011 * before any children-fetching queries complete; the loading is lazy, 012 * however, and occurs when the first children-fetching method is 013 * called.<p> 014 * 015 * If a subclass adds additional methods that refer to edges, it should 016 * make sure ensureEdgesLoaded is called before edges is used.<p> 017 */ 018 019 abstract class PreloadedTree extends HashTree { 020 021 /*************************************************** 022 * * 023 * Loading the edges map: * 024 * * 025 **************************************************/ 026 027 /** Have we loaded the edges map yet? */ 028 private boolean loaded = false; 029 030 /** Ensure that the edges map is ready for use */ 031 public final void ensureEdgesLoaded() { 032 if (!loaded) { 033 loadEdges(); 034 loaded = true; 035 } 036 } 037 038 /** Load the edges map for use. */ 039 protected abstract void loadEdges(); 040 041 042 /*************************************************** 043 * * 044 * Creation: * 045 * * 046 **************************************************/ 047 048 /** Create a root node: */ 049 public PreloadedTree(Object data) { 050 super(data); 051 } 052 053 /** Create a non-root node: */ 054 //@ requires parent != null && label != null; 055 protected PreloadedTree(Tree parent, String label, Object data) { 056 super(parent, label, data); 057 } 058 059 060 /*************************************************** 061 * * 062 * Fetching and counting children: * 063 * * 064 **************************************************/ 065 066 public final Enumeration children() { 067 /* Ensure edges is loaded before we use it: */ 068 ensureEdgesLoaded(); 069 070 return super.children(); 071 } 072 073 public final Tree getChild(String label) { 074 /* Ensure edges is loaded before we use it: */ 075 ensureEdgesLoaded(); 076 077 return super.getChild(label); 078 } 079 080 /* 081 * isLeaf and getChildrenCount should be considered as made final 082 * here as well. 083 */ 084 }