[Nodal-cvs] nodal/j-src/storage/framework NodeFactoryFramework.java,NONE,1.1 BasicNodeFactory.java,1
Status: Pre-Alpha
Brought to you by:
leei
From: Lee I. <le...@us...> - 2004-09-15 20:57:28
|
Update of /cvsroot/nodal/nodal/j-src/storage/framework In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5231/storage/framework Modified Files: BasicNodeFactory.java AbstractRepository.java GeneratedNode.java RepoServices.java AbstractRepoServices.java SBNStreamServices.java AbstractNode.java SBNURLServices.java StreamBasedNode.java Added Files: NodeFactoryFramework.java Log Message: Substantial modifications for Node id save/restore on local file systems. --- NEW FILE: NodeFactoryFramework.java --- /* * Distributed under the Apache Software License, Version 1.1 * (see below, or the file LICENSE for terms and conditions) * * Copyright (c) 2004 University of British Columbia. All rights reserved. * * Created on Sep 9, 2004 by leei */ package storage.framework; import org.nodal.model.AnchorNode; import org.nodal.model.Node; import org.nodal.model.NodeContent; import org.nodal.nav.Path; import org.nodal.type.NodeType; /** * An interface that represents the basic framework for creating Node instances. * {@link BasicNodeFactory} is built on top of this interface, and at its most basic * it is provided by {@link RepoServices} * @see BasicNodeFactory * @see RepoServices * @author leei */ public interface NodeFactoryFramework { /** * Create a brand new Node with the given NodeType. The * <tt>context</tt> Node determines the base metadata for the new * Node, including permissions and versioning. * * @param type a NodeType describing the Node to be created * @param context a Node from which to inherit metadata context * @return a new Node of the given NodeType */ NodeContent.Editor createNode(NodeType type, Node context); /** * Clone a brand new Node copying the content from an existing * Node. The <tt>context</tt> Node determines the base metadata for * the new Node, including permissions and versioning. * @param node a Node from which to inherit type and initial content * @param context a Node from which to inherit metadata context * @return a new Node of cloned from node */ NodeContent.Editor cloneNode(Node node, Node context); /** * Create an AnchorNode with that references an absolute Path. * @param abs the absolute Path providing the reference * @return and AnchorNode that references the abs Path */ AnchorNode createAnchor(Path abs); /** * Create an AnchorNode with a relative Path reference to a given context * in the Repository. * @param context an absolute Path that provides context for the rel * @param rel a relative Path that is evaluated in context * @return an AnchorNode that evaluates the relative Path in context */ AnchorNode createAnchor(Path context, Path rel); } Index: RepoServices.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/RepoServices.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** RepoServices.java 14 May 2004 17:31:24 -0000 1.8 --- RepoServices.java 15 Sep 2004 20:57:14 -0000 1.9 *************** *** 11,20 **** import org.nodal.Repository; - import org.nodal.model.AnchorNode; - import org.nodal.model.Node; - import org.nodal.model.NodeContent; - import org.nodal.nav.Path; - import org.nodal.type.NodeType; - /** --- 11,14 ---- *************** *** 25,29 **** * @author Lee Iverson <le...@ec...> */ ! public interface RepoServices { /** * Return the Repository associated with these services. --- 19,23 ---- * @author Lee Iverson <le...@ec...> */ ! public interface RepoServices extends NodeFactoryFramework { /** * Return the Repository associated with these services. *************** *** 31,48 **** */ Repository repository(); - - /** - * Create a brand new Node with the given NodeType. The - * <tt>context</tt> Node determines the base metadata for the new - * Node, including permissions and versioning. - */ - NodeContent.Editor createNode(NodeType type, Node context); - - /** - * Clone a brand new Node copying the content from an existing - * Node. The <tt>context</tt> Node determines the base metadata for - * the new Node, including permissions and versioning. - */ - NodeContent.Editor cloneNode(Node node, Node context); /** --- 25,28 ---- *************** *** 60,78 **** */ void commitTxn (TxnManager.Resolver resolver); - - /** - * Create an AnchorNode with a relative Path reference to a given context - * in the Repository. - * @param context an absolute Path that provides context for the rel - * @param rel a relative Path that is evaluated in context - * @return an AnchorNode that evaluates the relative Path in context - */ - AnchorNode createAnchor(Path context, Path rel); - - /** - * Create an AnchorNode with that references an absolute Path. - * @param abs the absolute Path providing the reference - * @return and AnchorNode that references the abs Path - */ - AnchorNode createAnchor(Path abs); } --- 40,42 ---- Index: GeneratedNode.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/GeneratedNode.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** GeneratedNode.java 11 Feb 2004 19:20:17 -0000 1.3 --- GeneratedNode.java 15 Sep 2004 20:57:14 -0000 1.4 *************** *** 15,18 **** --- 15,19 ---- import org.nodal.type.NodeType; import org.nodal.util.CapabilityImpl; + import org.nodal.util.Name; import storage.memory.memContent; *************** *** 39,44 **** * @param type */ ! protected GeneratedNode(AbstractRepository repo, NodeType type) { ! super(repo, type); } --- 40,45 ---- * @param type */ ! protected GeneratedNode(AbstractRepository repo, NodeType type, Name id) { ! super(repo, type, id); } Index: BasicNodeFactory.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/BasicNodeFactory.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** BasicNodeFactory.java 14 May 2004 17:31:24 -0000 1.4 --- BasicNodeFactory.java 15 Sep 2004 20:57:14 -0000 1.5 *************** *** 22,38 **** */ public class BasicNodeFactory implements NodeFactory { ! private TxnManager txnMgr; ! private RepoServices services; /** * All we need to construct one of these is a set of RepoServices. */ ! public BasicNodeFactory(RepoServices services) { ! this.services = services; ! this.txnMgr = services.txnManager(); } public final NodeContent.Editor createNode(NodeType type) { ! NodeContent.Editor newNode = services.createNode(type, null); if (txnMgr != null) { txnMgr.addOpCreate(newNode, null, type); --- 22,38 ---- */ public class BasicNodeFactory implements NodeFactory { ! protected final TxnManager txnMgr; ! protected final NodeFactoryFramework fmwk; /** * All we need to construct one of these is a set of RepoServices. */ ! public BasicNodeFactory(NodeFactoryFramework fmwk, TxnManager txnMgr) { ! this.fmwk = fmwk; ! this.txnMgr = txnMgr; } public final NodeContent.Editor createNode(NodeType type) { ! NodeContent.Editor newNode = fmwk.createNode(type, null); if (txnMgr != null) { txnMgr.addOpCreate(newNode, null, type); *************** *** 42,46 **** public final NodeContent.Editor createNode(NodeType type, Node context) { ! NodeContent.Editor newNode = services.createNode(type, context); if (txnMgr != null) { txnMgr.addOpCreate(newNode, context, type); --- 42,46 ---- public final NodeContent.Editor createNode(NodeType type, Node context) { ! NodeContent.Editor newNode = fmwk.createNode(type, context); if (txnMgr != null) { txnMgr.addOpCreate(newNode, context, type); *************** *** 50,54 **** public final NodeContent.Editor cloneNode(Node node) { ! NodeContent.Editor newNode = services.cloneNode(node, null); if (txnMgr != null) { txnMgr.addOpClone (newNode, node, null); --- 50,54 ---- public final NodeContent.Editor cloneNode(Node node) { ! NodeContent.Editor newNode = fmwk.cloneNode(node, null); if (txnMgr != null) { txnMgr.addOpClone (newNode, node, null); *************** *** 58,62 **** public final NodeContent.Editor cloneNode(Node node, Node context) { ! NodeContent.Editor newNode = services.cloneNode(node, context); if (txnMgr != null) { txnMgr.addOpClone (newNode, node, context); --- 58,62 ---- public final NodeContent.Editor cloneNode(Node node, Node context) { ! NodeContent.Editor newNode = fmwk.cloneNode(node, context); if (txnMgr != null) { txnMgr.addOpClone (newNode, node, context); *************** *** 66,70 **** public final AnchorNode createAnchor(Path context, Path rel) { ! AnchorNode newNode = services.createAnchor(context, rel); if (txnMgr != null) { txnMgr.addOpAnchor(newNode, context, rel); --- 66,70 ---- public final AnchorNode createAnchor(Path context, Path rel) { ! AnchorNode newNode = fmwk.createAnchor(context, rel); if (txnMgr != null) { txnMgr.addOpAnchor(newNode, context, rel); *************** *** 74,78 **** public final AnchorNode createAnchor(Path abs) { ! AnchorNode newNode = services.createAnchor(abs); if (txnMgr != null) { txnMgr.addOpAnchor(newNode, abs); --- 74,78 ---- public final AnchorNode createAnchor(Path abs) { ! AnchorNode newNode = fmwk.createAnchor(abs); if (txnMgr != null) { txnMgr.addOpAnchor(newNode, abs); Index: AbstractRepoServices.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/AbstractRepoServices.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** AbstractRepoServices.java 14 May 2004 17:31:24 -0000 1.6 --- AbstractRepoServices.java 15 Sep 2004 20:57:14 -0000 1.7 *************** *** 10,15 **** package storage.framework; - import java.util.WeakHashMap; - import org.nodal.Repository; import org.nodal.model.AnchorNode; --- 10,13 ---- *************** *** 23,46 **** /** ! * This base class should be overriden to provide a facility for ! * creating new Nodes. ! * * @author Lee Iverson <le...@ec...> */ public abstract class AbstractRepoServices implements RepoServices { ! // NEXT Make nid generation potentially Document-dependant ! protected final Repository repo; protected final Store store; ! ! private final WeakHashMap nodes; private int nextIdx; - private Namespace ns; ! protected AbstractRepoServices(Repository repo, Store store) { this.repo = repo; this.store = store; ! this.ns = Names.getNamespace(repo.path()); nextIdx = 0; - nodes = new WeakHashMap(); } --- 21,58 ---- /** ! * This base class should be overriden to provide a facility for creating new ! * Nodes. ! * * @author Lee Iverson <le...@ec...> */ public abstract class AbstractRepoServices implements RepoServices { ! protected final AbstractRepository repo; protected final Store store; ! protected final Path path; ! protected final Namespace ns; private int nextIdx; ! protected AbstractRepoServices(AbstractRepository repo, Path path, Store store) { this.repo = repo; this.store = store; ! this.path = path; ! this.ns = Names.getNamespace(path); ! nextIdx = 0; ! } ! ! protected AbstractRepoServices(AbstractRepository repo, Path path) { ! this.repo = repo; ! this.store = null; ! this.path = path; ! this.ns = Names.getNamespace(path); ! nextIdx = 0; ! } ! ! protected AbstractRepoServices(AbstractRepository repo) { ! this.repo = repo; ! this.store = null; ! this.path = repo.path(); ! this.ns = Names.getNamespace(path); nextIdx = 0; } *************** *** 49,77 **** */ public final synchronized Name createNodeID(Node node) { ! Name nid = ns.name("N" + (nextIdx++)); ! nodes.put(nid, node); return nid; } /** * Recover a Node from a backing store. */ ! public final synchronized Node getNodeNamed(Name nid) { ! // If this is in the global Namespace, reseat it. ! if (nid.namespace().path() == null) { ! nid = ns.name(nid.string()); ! } ! ! // Check for existing association ! Node node = (Node) nodes.get(nid); ! if (node == null) { ! if (store != null) { ! node = store.recoverNode(nid); ! if (node != null) { ! nodes.put(nid, node); ! } } } ! return node; } --- 61,87 ---- */ public final synchronized Name createNodeID(Node node) { ! // NEXT Get rid of this and the two-argument associateID method ! Name nid = nextID(); ! repo.associateID(nid, node); return nid; } + public synchronized Name nextID() { + return ns.name("n" + (nextIdx++)); + } + /** * Recover a Node from a backing store. */ ! public final synchronized Node recoverNodeNamed(Name nid) { ! // Recover from store ! if (store != null) { ! Node node = store.recoverNode(nid); ! if (node != null) { ! repo.associateID(node); } + return node; } ! return null; } *************** *** 84,107 **** /** ! * Create a brand new Node with the given NodeType. The ! * <tt>context</tt> Node determines the base metadata for the new ! * Node, including permissions and versioning. */ public abstract NodeContent.Editor createNode(NodeType type, Node context); /** ! * Clone a brand new Node copying the content from an existing ! * Node. The <tt>context</tt> Node determines the base metadata for ! * the new Node, including permissions and versioning. */ public abstract NodeContent.Editor cloneNode(Node node, Node context); ! public abstract AnchorNode createAnchor (Path context, Path rel); ! ! public abstract AnchorNode createAnchor (Path abs); ! /** * Return the TxnManager used by this Repository. */ public abstract TxnManager txnManager(); ! } --- 94,117 ---- /** ! * Create a brand new Node with the given NodeType. The <tt>context</tt> ! * Node determines the base metadata for the new Node, including permissions ! * and versioning. */ public abstract NodeContent.Editor createNode(NodeType type, Node context); /** ! * Clone a brand new Node copying the content from an existing Node. The ! * <tt>context</tt> Node determines the base metadata for the new Node, ! * including permissions and versioning. */ public abstract NodeContent.Editor cloneNode(Node node, Node context); ! public abstract AnchorNode createAnchor(Path context, Path rel); ! ! public abstract AnchorNode createAnchor(Path abs); ! /** * Return the TxnManager used by this Repository. */ public abstract TxnManager txnManager(); ! } \ No newline at end of file Index: StreamBasedNode.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/StreamBasedNode.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** StreamBasedNode.java 2 Sep 2004 19:11:29 -0000 1.12 --- StreamBasedNode.java 15 Sep 2004 20:57:14 -0000 1.13 *************** *** 14,17 **** --- 14,18 ---- import java.net.URLConnection; import java.util.HashMap; + import java.util.Iterator; import java.util.Map; import org.nodal.Repository; *************** *** 38,42 **** public class StreamBasedNode extends ProxyNode implements Node { private NodeContent node; ! private Services services; private DocumentFormat format; --- 39,43 ---- public class StreamBasedNode extends ProxyNode implements Node { private NodeContent node; ! private LoadServices services; private DocumentFormat format; *************** *** 48,53 **** * @author leei */ ! public interface Services { ! Repository repository(); /** --- 49,69 ---- * @author leei */ ! public interface LoadServices { ! /** ! * Notify this set of LoadServices that we are reloading a Document with ! * known Node identities. ! * ! * @param reloading ! * a boolean establishing whether or not we are reloading a ! * Document with these LoadServices ! */ ! void setReloading(boolean reloading); ! ! /** ! * The RepoServices ! * ! * @return the RepoServices associated with this Document loading context ! */ ! RepoServices repoServices(); /** *************** *** 73,77 **** /** ! * A factory for building Node instances in the context of this stream loader. * * @return --- 89,94 ---- /** ! * A factory for building Node instances in the context of this stream ! * loader. * * @return *************** *** 80,91 **** /** - * A factory for building Node instances with temporary IDs in the context - * of this stream loader. - * - * @return - */ - NodeFactory tempFactory(); - - /** * A method to rename Nodes produced by the sequence. * --- 97,100 ---- *************** *** 95,106 **** /** ! * A list of NID names that represent the node names in DFS visit order. * ! * @return a list of NID names or null if unavailable */ Map getNIDMap(); /** ! * @param nidList */ void saveNIDMap(Map nidMap); --- 104,117 ---- /** ! * A Map of Path->NID for all Nodes in this Document. * ! * @return a Map of Path->NID for all Nodes in this Document */ Map getNIDMap(); /** ! * Save the Map of Path->NID for all of the Nodes in this Document. ! * ! * @param nidMap */ void saveNIDMap(Map nidMap); *************** *** 108,118 **** /** ! * Create a Document from a given set of StreamBasedNode.Services. * * @param services ! * a set of StreamBasedNode.Services that can define a Document * creation environment. */ ! public static Document createStreamDoc(Services services) throws IOException { NodeContent.Editor node = StreamBasedNode.createDocStreamNode(services); DocumentFormat format = DocumentFormat.Registry.get(services.mimeType()); --- 119,130 ---- /** ! * Create a Document from a given set of StreamBasedNode.LoadServices. * * @param services ! * a set of StreamBasedNode.LoadServices that can define a Document * creation environment. */ ! public static Document createStreamDoc(LoadServices services) ! throws IOException { NodeContent.Editor node = StreamBasedNode.createDocStreamNode(services); DocumentFormat format = DocumentFormat.Registry.get(services.mimeType()); *************** *** 120,128 **** } ! public static RecordNode.Editor createDocStreamNode(Services services) { try { ! RecordNode.Editor docNode = ! AbstractDocument.createDocumentNode(services.nodeFactory(), services.mimeType()); ! Node root = new StreamBasedNode (services); docNode.setField("root").setNode(root); return docNode; --- 132,140 ---- } ! public static RecordNode.Editor createDocStreamNode(LoadServices services) { try { ! RecordNode.Editor docNode = AbstractDocument.createDocumentNode(services ! .nodeFactory(), services.mimeType()); ! Node root = new StreamBasedNode(services); docNode.setField("root").setNode(root); return docNode; *************** *** 132,136 **** } ! private StreamBasedNode(Services services) { this.services = services; } --- 144,148 ---- } ! private StreamBasedNode(LoadServices services) { this.services = services; } *************** *** 142,146 **** */ public Repository repository() { ! return services.repository(); } --- 154,158 ---- */ public Repository repository() { ! return services.repoServices().repository(); } *************** *** 203,207 **** // This may be necessary to establish context dec.setURI(services.path().toURLString()); - // Load and decode the document graph InputStream in = services.inputStream(); --- 215,218 ---- *************** *** 209,215 **** Map nidMap = services.getNIDMap(); boolean restoring = (nidMap != null); ! NodeFactory factory = (restoring ? services.tempFactory() : services.nodeFactory()); Node root = dec.decode(in, factory); - // Restore the correct set of Node IDs if possible if (root != null) { --- 220,226 ---- Map nidMap = services.getNIDMap(); boolean restoring = (nidMap != null); ! services.setReloading(restoring); ! NodeFactory factory = services.nodeFactory(); Node root = dec.decode(in, factory); // Restore the correct set of Node IDs if possible if (root != null) { *************** *** 217,221 **** restoreNIDs(nidMap, root); } else { ! saveNIDs (root); } return root.content(); --- 228,232 ---- restoreNIDs(nidMap, root); } else { ! saveNIDs(root); } return root.content(); *************** *** 229,234 **** /** * @param root */ ! private void saveNIDs(Node root) { Map nidMap = new HashMap(); GraphIterator iter = new GraphIterator(root); --- 240,246 ---- /** * @param root + * @throws IOException */ ! private void saveNIDs(Node root) throws IOException { Map nidMap = new HashMap(); GraphIterator iter = new GraphIterator(root); *************** *** 236,247 **** Path path = iter.nextPath(); Node node = iter.nextNode(); ! System.out.println (""+path+" => "+node); ! nidMap.put (path, node.id()); } ! services.saveNIDMap (nidMap); } private void restoreNIDs(Map nidMap, Node root) throws IOException { GraphIterator iter = new GraphIterator(root); while (iter.hasNext()) { Path path = iter.nextPath(); --- 248,264 ---- Path path = iter.nextPath(); Node node = iter.nextNode(); ! if (node.id().isGlobal()) { ! throw new IOException("Attempt to save reference to temporary Node " ! + node); ! } ! //System.out.println (""+path+" => "+node); ! nidMap.put(path, node.id()); } ! services.saveNIDMap(nidMap); } private void restoreNIDs(Map nidMap, Node root) throws IOException { GraphIterator iter = new GraphIterator(root); + Map defer = null; while (iter.hasNext()) { Path path = iter.nextPath(); *************** *** 249,258 **** Name nid = (Name) nidMap.get(path); if (nid == null) { ! throw new IOException("NID map doesn't contain "+path); } - services.renameNode(node, nid); - nidMap.remove(path); } ! if (! nidMap.isEmpty()) { throw new IOException("Unused nodes in NID map"); } --- 266,305 ---- Name nid = (Name) nidMap.get(path); if (nid == null) { ! // This is likely to be a forward reference to a Path with a Node ! // selector PathOperator in it. Defer evaluation until all other Node id ! // assignments have been resolved. ! if (defer == null) { ! defer = new HashMap(); ! } ! System.out.println ("Defer rename "+path+" => "+node); ! defer.put(path, node); ! } else { ! services.renameNode(node, nid); ! nidMap.remove(path); } } ! // Now deal with these deferrals. ! // Repeatedly try to resolve deferred Path->Node pairs until we have no ! // more, or we don't change but still have some left (error!). ! while (defer != null && !defer.isEmpty()) { ! Iterator i = defer.keySet().iterator(); ! boolean changed = false; ! while (i.hasNext()) { ! Path path = (Path) i.next(); ! Node node = (Node) defer.get(path); ! Name nid = (Name) nidMap.get(path); ! if (nid != null) { ! services.renameNode(node, nid); ! nidMap.remove(path); ! changed = true; ! i.remove(); ! } ! } ! // Check if we've reached an impasse. ! if (!defer.isEmpty() && !changed) { ! throw new IOException("Unresolved Path->Node references in NIDMap."); ! } ! } ! if (!nidMap.isEmpty()) { throw new IOException("Unused nodes in NID map"); } Index: AbstractRepository.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/AbstractRepository.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** AbstractRepository.java 2 Mar 2004 00:15:35 -0000 1.13 --- AbstractRepository.java 15 Sep 2004 20:57:14 -0000 1.14 *************** *** 7,15 **** * */ - package storage.framework; import java.io.OutputStream; - import org.nodal.Repository; import org.nodal.filesystem.Directory; --- 7,13 ---- *************** *** 21,33 **** import org.nodal.util.CacheMap; import org.nodal.util.Name; import org.nodal.util.User; /** ! * A basic starting point for creating Repository instances that takes ! * care of some of the basic bookkeeping in a consistent manner. ! * * @author Lee Iverson <le...@ec...> */ - public abstract class AbstractRepository implements Repository { /** --- 19,31 ---- import org.nodal.util.CacheMap; import org.nodal.util.Name; + import org.nodal.util.Names; import org.nodal.util.User; /** ! * A basic starting point for creating Repository instances that takes care of ! * some of the basic bookkeeping in a consistent manner. ! * * @author Lee Iverson <le...@ec...> */ public abstract class AbstractRepository implements Repository { /** *************** *** 35,42 **** */ private static CacheMap repositories; /** * Use the cache of created Repositories to check for the existence of one. ! * @param p a Path reference to the Repository * @return a Repository with Path p or null */ --- 33,46 ---- */ private static CacheMap repositories; + private CacheMap repoIDMap; + + static int tempIDCount; + static private CacheMap tempIDMap = new CacheMap(); /** * Use the cache of created Repositories to check for the existence of one. ! * ! * @param p ! * a Path reference to the Repository * @return a Repository with Path p or null */ *************** *** 55,58 **** --- 59,63 ---- this.path = path; this.services = services; + this.repoIDMap = new CacheMap(); // Remember this Repository in the index. *************** *** 66,70 **** // Ensure that it is only set once. if (this.services != null && this.services != services) { ! throw new RuntimeException(this +".services initialized twice"); } this.services = services; --- 71,75 ---- // Ensure that it is only set once. if (this.services != null && this.services != services) { ! throw new RuntimeException(this + ".services initialized twice"); } this.services = services; *************** *** 91,95 **** public final Document document(Path docPath) throws Path.Failure { - // Only use the Document part of Path docPath = docPath.documentPath(); --- 96,99 ---- *************** *** 131,141 **** public abstract void close(); ! public final Node nodeNamed(Name nid) { ! //Namespace ns = nid.namespace(); ! ! return services.getNodeNamed(nid); } public final Document getNodeDocument(Name nid) { Node node = nodeNamed(nid); if (node == null) { --- 135,154 ---- public abstract void close(); ! public final Node nodeNamed(Name id) { ! Node node; ! if (id.isGlobal()) { ! node = (Node) tempIDMap.get(id); ! } else { ! node = (Node) repoIDMap.get(id); ! } ! if (node == null) { ! //Namespace ns = nid.namespace(); ! return services.recoverNodeNamed(id); ! } ! return node; } public final Document getNodeDocument(Name nid) { + // TODO What is getNodeDocument() for? Is it necessary at all? Node node = nodeNamed(nid); if (node == null) { *************** *** 165,168 **** --- 178,182 ---- return null; } + public Node root() { return node; *************** *** 173,185 **** } ! /* (non-Javadoc) * @see org.nodal.filesystem.Document#nodeFromName(org.nodal.util.Name) */ public Node nodeNamed(Name name) { // TODO Auto-generated method stub return null; } ! /* (non-Javadoc) * @see org.nodal.filesystem.Document#docNode() */ --- 187,204 ---- } ! /* ! * (non-Javadoc) ! * * @see org.nodal.filesystem.Document#nodeFromName(org.nodal.util.Name) */ public Node nodeNamed(Name name) { + // TODO Auto-generated method stub return null; } ! /* ! * (non-Javadoc) ! * * @see org.nodal.filesystem.Document#docNode() */ *************** *** 189,193 **** } ! /* (non-Javadoc) * @see org.nodal.filesystem.Document#nodeNamed(java.lang.String) */ --- 208,214 ---- } ! /* ! * (non-Javadoc) ! * * @see org.nodal.filesystem.Document#nodeNamed(java.lang.String) */ *************** *** 197,201 **** } ! /* (non-Javadoc) * @see org.nodal.filesystem.Document#asDirectory() */ --- 218,224 ---- } ! /* ! * (non-Javadoc) ! * * @see org.nodal.filesystem.Document#asDirectory() */ *************** *** 207,209 **** } } ! } --- 230,262 ---- } } ! ! /** ! * Remember the association between a Node and its id(). If the id() is a ! * global Name, then this is temporary and local and is stored in the global ! * map. If it is a local Name, then it is permanent and associated with the ! * Repositroy. ! * ! * @param node ! * the Node to be associated. ! */ ! public void associateID(Node node) { ! Name id = node.id(); ! associateID(id, node.bareNode()); ! } ! ! public synchronized void associateID(Name id, Node node) { ! if (id.isGlobal()) { ! tempIDMap.put(id, node); ! } else { ! repoIDMap.put(id, node); ! } ! } ! ! /** ! * Create a globally unique (within this runtime environment) temporary Node id. ! * @return a globally unique Name ! */ ! public synchronized static Name nextTempID () { ! return Names.getName ("t"+tempIDCount++); ! } ! } \ No newline at end of file Index: AbstractNode.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/AbstractNode.java,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** AbstractNode.java 5 May 2004 03:24:35 -0000 1.9 --- AbstractNode.java 15 Sep 2004 20:57:14 -0000 1.10 *************** *** 19,22 **** --- 19,23 ---- import org.nodal.nav.Path; import org.nodal.type.NodeType; + import org.nodal.util.Name; /** *************** *** 27,34 **** protected final AbstractRepository repo; protected Path path; ! protected AbstractNode(AbstractRepository repo, NodeType type) { this.repo = repo; this.type = type; } --- 28,59 ---- protected final AbstractRepository repo; protected Path path; + private Name id; ! protected AbstractNode(AbstractRepository repo, NodeType type, Name id) { this.repo = repo; this.type = type; + setID(id); + } + + /** + * Set/change the ID of a particular Node. We have two kinds of IDs, a + * temporary ID, distingushed by a global namespace, and a permanent ID, which + * has a local namespace. + * + * @param id + * the Name to be associated with this Node. + */ + public void setID(Name id) { + if (this.id != id) { + if (this.id != null) { + if (!this.id.isGlobal()) { + throw new RuntimeException("Attempt to reset permanent Node ID " + + this); + } + //System.out.println("Rename " + this.id + " -> " + id); + } + this.id = id; + repo.associateID(this); + } } *************** *** 133,135 **** return "Node[" + path().toURLString() + "]"; } ! } --- 158,164 ---- return "Node[" + path().toURLString() + "]"; } ! ! public final Name id() { ! return id; ! } ! } \ No newline at end of file Index: SBNStreamServices.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/SBNStreamServices.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** SBNStreamServices.java 2 Sep 2004 19:11:29 -0000 1.6 --- SBNStreamServices.java 15 Sep 2004 20:57:14 -0000 1.7 *************** *** 13,17 **** import java.util.Map; - import org.nodal.Repository; import org.nodal.model.Node; import org.nodal.model.NodeFactory; --- 13,16 ---- *************** *** 21,37 **** public class SBNStreamServices extends BasicNodeFactory implements ! StreamBasedNode.Services { ! String mimeType; ! final InputStream stream; ! final Path path; ! final AbstractRepository repo; ! ! public SBNStreamServices(AbstractRepository repo, Path path, InputStream stream, String mimeType) throws IOException { ! super(repo.services); ! this.repo = repo; this.path = path; this.stream = stream; this.mimeType = mimeType; } --- 20,38 ---- public class SBNStreamServices extends BasicNodeFactory implements ! StreamBasedNode.LoadServices { ! protected String mimeType; ! protected final InputStream stream; ! protected final Path path; ! protected final RepoServices svc; ! protected boolean reloading; ! ! public SBNStreamServices(RepoServices svc, Path path, InputStream stream, String mimeType) throws IOException { ! super(svc, svc.txnManager()); ! this.svc = svc; this.path = path; this.stream = stream; this.mimeType = mimeType; + this.reloading = false; } *************** *** 40,56 **** } /* * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.Services#repository() */ ! public Repository repository() { ! return repo; } ! /* * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.Services#path() */ public Path path() { --- 41,61 ---- } + public void setReloading (boolean reloading) { + this.reloading = reloading; + } + /* * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.LoadServices#repoServices() */ ! public RepoServices repoServices() { ! return svc; } ! /* * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.LoadServices#path() */ public Path path() { *************** *** 61,65 **** * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.Services#inputStream() */ public InputStream inputStream() { --- 66,70 ---- * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.LoadServices#inputStream() */ public InputStream inputStream() { *************** *** 70,74 **** * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.Services#nodeFactory() */ public NodeFactory nodeFactory() { --- 75,79 ---- * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.LoadServices#nodeFactory() */ public NodeFactory nodeFactory() { *************** *** 76,85 **** } - public NodeFactory tempFactory() { - return this; - } - /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.Services#nidList() */ public Map getNIDMap() { --- 81,86 ---- } /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.LoadServices#nidList() */ public Map getNIDMap() { *************** *** 88,92 **** /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.Services#nidList() */ public void saveNIDMap(Map map) { --- 89,93 ---- /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.LoadServices#nidList() */ public void saveNIDMap(Map map) { *************** *** 94,98 **** /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.Services#renameNode(org.nodal.model.Node, org.nodal.util.Name) */ public boolean renameNode(Node node, Name nid) { --- 95,99 ---- /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.LoadServices#renameNode(org.nodal.model.Node, org.nodal.util.Name) */ public boolean renameNode(Node node, Name nid) { Index: SBNURLServices.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/SBNURLServices.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** SBNURLServices.java 20 Feb 2004 20:32:37 -0000 1.1 --- SBNURLServices.java 15 Sep 2004 20:57:14 -0000 1.2 *************** *** 20,24 **** public SBNURLServices(AbstractRepository repo, Path path, URL url) throws IOException { ! super (repo, path, url.openConnection().getInputStream(), null); this.url = url; --- 20,24 ---- public SBNURLServices(AbstractRepository repo, Path path, URL url) throws IOException { ! super (repo.services, path, url.openConnection().getInputStream(), null); this.url = url; |