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    }