stefan 2004/07/07 09:05:45
Modified: proposals/jcrri/src/org/apache/slide/jcr/core
ItemManager.java RepositoryImpl.java Test.java
TicketImpl.java
Log:
jcrri
Revision Changes Path
1.7 +65 -471
jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/ItemManager.java
Index: ItemManager.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/ItemManager.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ItemManager.java 1 Jul 2004 18:29:41 -0000 1.6
+++ ItemManager.java 7 Jul 2004 16:05:45 -0000 1.7
@@ -25,10 +25,11 @@
import org.apache.commons.collections.ReferenceMap;
import org.apache.log4j.Logger;
+import org.apache.slide.jcr.core.nodetype.NodeDefId;
import org.apache.slide.jcr.core.nodetype.NodeTypeImpl;
+import org.apache.slide.jcr.core.nodetype.PropDefId;
import org.apache.slide.jcr.core.state.*;
import org.apache.slide.jcr.util.IteratorHelper;
-import org.apache.slide.jcr.util.MalformedPathException;
import javax.jcr.*;
import javax.jcr.access.AccessDeniedException;
@@ -61,7 +62,7 @@
* @author Stefan Guggisberg
* @version $Revision$, $Date$
*/
-public class ItemManager implements ItemLifeCycleListener, HierarchyManager {
+public class ItemManager implements ItemLifeCycleListener {
private static Logger log = Logger.getLogger(ItemManager.class);
@@ -70,8 +71,8 @@
private final TicketImpl ticket;
- private final PersistentItemStateManager persistentStateMgr;
- private final TransientItemStateManager transientStateMgr;
+ private final ItemStateProvider itemStateProvider;
+ private final HierarchyManager hierMgr;
private NodeImpl root;
@@ -83,17 +84,17 @@
/**
* Creates a new per-workspace instance <code>ItemManager</code> instance.
*
- * @param persistentStateMgr the persistent state manager associated with
- * the new instance
- * @param ticket the ticket associated with the new instance
- * @param rootNodeDef the definition of the root node
- * @param rootNodeUUID the UUID of the root node
- */
- ItemManager(PersistentItemStateManager persistentStateMgr, TicketImpl ticket,
- NodeDef rootNodeDef, String rootNodeUUID) {
+ * @param itemStateProvider the item state provider associated with
+ * the new instance
+ * @param ticket the ticket associated with the new instance
+ * @param rootNodeDef the definition of the root node
+ * @param rootNodeUUID the UUID of the root node
+ */
+ ItemManager(ItemStateProvider itemStateProvider, HierarchyManager hierMgr,
+ TicketImpl ticket, NodeDef rootNodeDef, String rootNodeUUID) {
+ this.itemStateProvider = itemStateProvider;
+ this.hierMgr = hierMgr;
this.ticket = ticket;
- this.persistentStateMgr = persistentStateMgr;
- this.transientStateMgr = new TransientItemStateManager(getHierarchyMgr());
this.rootNodeDef = rootNodeDef;
rootNodeId = new NodeId(rootNodeUUID);
// setup item cache with soft references to items
@@ -101,33 +102,6 @@
}
/**
- * Returns the persistent state manager
- *
- * @return the persistent state manager
- */
- PersistentItemStateManager getPersistentItemStateManager() {
- return persistentStateMgr;
- }
-
- /**
- * Returns the transient state manager
- *
- * @return the transient state manager
- */
- TransientItemStateManager getTransientStateMgr() {
- return transientStateMgr;
- }
-
- /**
- * Returns the hierarchy manager
- *
- * @return the hierarchy manager
- */
- HierarchyManager getHierarchyMgr() {
- return this;
- }
-
- /**
* Returns the root node instance of the repository.
*
* @return the root node.
@@ -138,37 +112,16 @@
// to avoid chicken & egg kind of problems
if (root == null) {
try {
- NodeState rootState = (NodeState) getItemState(rootNodeId);
+ NodeState rootState = (NodeState)
itemStateProvider.getItemState(rootNodeId);
// keep a hard reference to root node
root = createNodeInstance(rootState, rootNodeDef);
- } catch (NoSuchItemStateException e) {
- String msg = "failed to retrieve state of root node";
- log.error(msg, e);
- throw new RepositoryException(msg, e);
- }
- }
- return root;
- }
-
- private synchronized ItemState getItemState(ItemId id)
- throws NoSuchItemStateException, RepositoryException {
- // check if there's transient state for the specified item
- try {
- return transientStateMgr.getItemState(id);
- } catch (NoSuchItemStateException nsise) {
- // check if there's persistent state for the specified item
- try {
- if (id.denotesNode()) {
- return persistentStateMgr.getNodeState((NodeId) id);
- } else {
- return persistentStateMgr.getPropertyState((PropertyId) id);
- }
} catch (ItemStateException ise) {
- String msg = "failed to load persistent state of " + id;
+ String msg = "failed to retrieve state of root node";
log.error(msg, ise);
throw new RepositoryException(msg, ise);
}
}
+ return root;
}
/**
@@ -176,7 +129,6 @@
* (used for diagnostic purposes).
*
* @param ps
- *
* @throws RepositoryException
*/
void dump(PrintStream ps) throws RepositoryException {
@@ -193,10 +145,6 @@
ps.println(id + "\t" + item.getPath() + " (" + item + ")");
}
ps.println();
- persistentStateMgr.dump(ps);
- ps.println();
- transientStateMgr.dump(ps);
- ps.println();
}
//--------------------------------------------------< item access methods >
@@ -234,7 +182,7 @@
*/
synchronized ItemImpl getItem(Path path)
throws PathNotFoundException, AccessDeniedException, RepositoryException {
- ItemId id = resolvePath(path);
+ ItemId id = hierMgr.resolvePath(path);
return getItem(id);
}
@@ -292,11 +240,15 @@
ItemState state = null;
try {
- state = getItemState(parentId);
+ state = itemStateProvider.getItemState(parentId);
} catch (NoSuchItemStateException nsise) {
String msg = "no such item: " + parentId;
log.error(msg);
throw new ItemNotFoundException(msg);
+ } catch (ItemStateException ise) {
+ String msg = "failed to retrieve item state of node " + parentId;
+ log.error(msg);
+ throw new RepositoryException(msg);
}
if (!state.isNode()) {
@@ -343,11 +295,15 @@
ItemState state = null;
try {
- state = getItemState(parentId);
+ state = itemStateProvider.getItemState(parentId);
} catch (NoSuchItemStateException nsise) {
String msg = "no such item: " + parentId;
log.error(msg);
throw new ItemNotFoundException(msg);
+ } catch (ItemStateException ise) {
+ String msg = "failed to retrieve item state of node " + parentId;
+ log.error(msg);
+ throw new RepositoryException(msg);
}
if (!state.isNode()) {
@@ -378,9 +334,13 @@
ItemImpl item = null;
ItemState state = null;
try {
- state = getItemState(id);
+ state = itemStateProvider.getItemState(id);
} catch (NoSuchItemStateException ise) {
throw new ItemNotFoundException(id.toString());
+ } catch (ItemStateException ise) {
+ String msg = "failed to retrieve item state of item " + id;
+ log.error(msg);
+ throw new RepositoryException(msg);
}
if (state.isNode()) {
@@ -410,19 +370,24 @@
NodeImpl parent = (NodeImpl) getItem(parentId);
// 2. get its node type
NodeTypeImpl ntParent = (NodeTypeImpl) parent.getPrimaryNodeType();
- // 3. get matching definition for the specified child node
-
- // @todo need a cleaner way to determine matching definition; persist id of
definition with node?
- NodeState parentState = (NodeState) parent.getItemState();
- List entries = parentState.getChildNodeEntries(state.getUUID());
- if (entries.isEmpty()) {
- String msg = parentState.getUUID() + " has no child entry for " +
state.getUUID();
- log.error(msg);
- throw new RepositoryException(msg);
+ // 3. get definition for the specified child node
+ NodeDef def = null;
+ NodeDefId defId = state.getDefinitionId();
+ if (defId != null) {
+ def = ticket.getNodeTypeManager().getNodeDef(defId);
+ }
+ if (def == null) {
+ // fallback: find matching definition in parent node's node type
+ NodeState parentState = (NodeState) parent.getItemState();
+ List entries = parentState.getChildNodeEntries(state.getUUID());
+ if (entries.isEmpty()) {
+ String msg = parentState.getUUID() + " has no child entry for " +
state.getUUID();
+ log.error(msg);
+ throw new RepositoryException(msg);
+ }
+ NodeState.ChildNodeEntry entry = (NodeState.ChildNodeEntry) entries.get(0);
+ def = ntParent.getApplicableChildNodeDef(entry.getName(),
state.getNodeTypeName());
}
- NodeState.ChildNodeEntry entry = (NodeState.ChildNodeEntry) entries.get(0);
-
- NodeDef def = ntParent.getApplicableChildNodeDef(entry.getName(),
state.getNodeTypeName());
// create instance
return createNodeInstance(state, def);
@@ -448,7 +413,15 @@
// 2. get its node type
NodeTypeImpl ntParent = (NodeTypeImpl) parent.getPrimaryNodeType();
// 3. get matching definition for the specified property
- PropertyDef def = ntParent.getApplicablePropertyDef(state.getName(),
state.getType());
+ PropertyDef def = null;
+ PropDefId defId = state.getDefinitionId();
+ if (defId != null) {
+ def = ticket.getNodeTypeManager().getPropDef(defId);
+ }
+ if (def == null) {
+ // fallback: find matching definition in parent node's node type
+ def = ntParent.getApplicablePropertyDef(state.getName(), state.getType());
+ }
// create instance
return createPropertyInstance(state, def);
@@ -526,6 +499,7 @@
/**
* Failsafe conversion of internal <code>Path</code> to JCR path for use in
* error messages etc.
+ *
* @param path path to convert
* @return JCR path
*/
@@ -542,397 +516,17 @@
/**
* Failsafe translation of internal <code>ItemId</code> to JCR path for use in
* error messages etc.
+ *
* @param id path to convert
* @return JCR path
*/
String safeGetJCRPath(ItemId id) {
try {
- return safeGetJCRPath(getPath(id));
+ return safeGetJCRPath(hierMgr.getPath(id));
} catch (RepositoryException re) {
log.error(id + ": failed to determine path to");
// return string representation if id as a fallback
return id.toString();
- }
- }
-
- //-----------------------------------------------------< HierarchyManager >
- /**
- * @see HierarchyManager#listParents(ItemId)
- */
- public NodeId[] listParents(ItemId id) throws ItemNotFoundException,
RepositoryException {
- ArrayList list = new ArrayList();
- try {
- if (id.denotesNode()) {
- NodeState state = (NodeState) getItemState(id);
- Iterator iter = state.getParentUUIDs().iterator();
- while (iter.hasNext()) {
- list.add(new NodeId((String) iter.next()));
- }
- } else {
- PropertyState state = (PropertyState) getItemState(id);
- list.add(new NodeId(state.getParentUUID()));
- }
- } catch (NoSuchItemStateException e) {
- String msg = "failed to retrieve state of item " + id;
- log.error(msg, e);
- throw new ItemNotFoundException(msg, e);
- }
- return (NodeId[]) list.toArray(new NodeId[list.size()]);
- }
-
- /**
- * @see HierarchyManager#listChildren(NodeId)
- */
- public ItemId[] listChildren(NodeId id) throws ItemNotFoundException,
RepositoryException {
- NodeState parentState;
- try {
- parentState = (NodeState) getItemState(id);
- } catch (NoSuchItemStateException e) {
- String msg = "failed to retrieve state of parent node " + id;
- log.error(msg, e);
- throw new ItemNotFoundException(msg, e);
- }
- ArrayList list = new ArrayList();
- Iterator iter = parentState.getPropertyEntries().iterator();
- while (iter.hasNext()) {
- // properties
- NodeState.PropertyEntry pe = (NodeState.PropertyEntry) iter.next();
- list.add(new PropertyId(id.getUUID(), pe.getName()));
- }
- iter = parentState.getChildNodeEntries().iterator();
- while (iter.hasNext()) {
- // child nodes
- NodeState.ChildNodeEntry cne = (NodeState.ChildNodeEntry) iter.next();
- list.add(new NodeId(cne.getUUID()));
- }
- return (ItemId[]) list.toArray(new ItemId[list.size()]);
- }
-
- /**
- * @see HierarchyManager#listZombieChildren(NodeId)
- */
- public ItemId[] listZombieChildren(NodeId id) throws ItemNotFoundException,
RepositoryException {
- // FIXME messy code
- NodeState parentState;
- try {
- // get transient/persistent state
- parentState = (NodeState) getItemState(id);
- } catch (NoSuchItemStateException e) {
- // try attic
- try {
- parentState = (NodeState) transientStateMgr.getItemStateInAttic(id);
- } catch (NoSuchItemStateException nsise) {
- String msg = "failed to retrieve state of parent node " + id;
- log.error(msg, nsise);
- throw new ItemNotFoundException(msg, nsise);
- }
- }
-
- ArrayList list = new ArrayList();
- Iterator iter = parentState.getRemovedPropertyEntries().iterator();
- while (iter.hasNext()) {
- // removed properties
- NodeState.PropertyEntry pe = (NodeState.PropertyEntry) iter.next();
- list.add(new PropertyId(id.getUUID(), pe.getName()));
- }
- iter = parentState.getRemovedChildNodeEntries().iterator();
- while (iter.hasNext()) {
- // removed child nodes
- NodeState.ChildNodeEntry cne = (NodeState.ChildNodeEntry) iter.next();
- list.add(new NodeId(cne.getUUID()));
- }
- return (ItemId[]) list.toArray(new ItemId[list.size()]);
- }
-
- /**
- * @see HierarchyManager#resolvePath(Path)
- */
- public synchronized ItemId resolvePath(Path path)
- throws PathNotFoundException, RepositoryException {
- // shortcut
- if (path.denotesRoot()) {
- return rootNodeId;
- }
-
- if (!path.isCanonical()) {
- String msg = "path is not canonical";
- log.error(msg);
- throw new RepositoryException(msg);
- }
-
- NodeState parentState;
- try {
- parentState = (NodeState) getItemState(rootNodeId);
- } catch (NoSuchItemStateException e) {
- String msg = "failed to retrieve state of root node";
- log.error(msg, e);
- throw new RepositoryException(msg, e);
- }
-
- Path.PathElement[] elems = path.getElements();
- for (int i = 1; i < elems.length; i++) {
- Path.PathElement elem = elems[i];
- QName name = elem.getName();
- int index = elem.getIndex();
- if (parentState.hasChildNodeEntry(name, index == 0 ? 1 : index)) {
- // child node
- NodeState.ChildNodeEntry nodeEntry =
parentState.getChildNodeEntry(name, index == 0 ? 1 : index);
- if (i == elems.length - 1) {
- // last element in the path
- return new NodeId(nodeEntry.getUUID());
- }
- try {
- parentState = (NodeState) getItemState(new
NodeId(nodeEntry.getUUID()));
- } catch (NoSuchItemStateException e) {
- String msg = "failed to retrieve state of intermediary node";
- log.error(msg, e);
- throw new RepositoryException(msg, e);
- }
- continue;
- } else if (parentState.hasPropertyEntry(name)) {
- // property
- if (index > 1) {
- // properties can't have same name siblings
- throw new PathNotFoundException(safeGetJCRPath(path));
- }
- if (i == elems.length - 1) {
- return new PropertyId(parentState.getUUID(), name);
- } else {
- // property is not the last element in the path
- throw new PathNotFoundException(safeGetJCRPath(path));
- }
- } else {
- // no such item
- throw new PathNotFoundException(safeGetJCRPath(path));
- }
- }
-
- throw new PathNotFoundException(safeGetJCRPath(path));
- }
-
- /**
- * @see HierarchyManager#getPath(ItemId)
- */
- public synchronized Path getPath(ItemId id) throws ItemNotFoundException,
RepositoryException {
- try {
- Path.PathBuilder builder = new Path.PathBuilder();
-
- ItemState state = getItemState(id);
- String parentUUID = state.getParentUUID();
- if (parentUUID == null) {
- // specified id denotes the root node
- builder.addRoot();
- return builder.getPath();
- }
-
- NodeState parent = (NodeState) getItemState(new NodeId(parentUUID));
- do {
- if (state.isNode()) {
- NodeState nodeState = (NodeState) state;
- String uuid = nodeState.getUUID();
- List entries = parent.getChildNodeEntries(uuid);
- if (entries.isEmpty()) {
- String msg = "failed to build path of " + id + ": " +
parent.getUUID() + " has no child entry for " + uuid;
- log.error(msg);
- throw new RepositoryException(msg);
- }
- // if the parent has more than one child node entries pointing
- // to the same child node, always use the first one
- NodeState.ChildNodeEntry entry = (NodeState.ChildNodeEntry)
entries.get(0);
- QName name = entry.getName();
- // add to path
- builder.addFirst(name.getNamespaceURI(), name.getLocalName(),
entry.getIndex());
- } else {
- PropertyState propState = (PropertyState) state;
- QName name = propState.getName();
- // add to path
- builder.addFirst(name.getNamespaceURI(), name.getLocalName());
- }
- parentUUID = parent.getParentUUID();
- if (parentUUID != null) {
- state = parent;
- parent = (NodeState) getItemState(new NodeId(parentUUID));
- } else {
- parent = null;
- state = null;
- }
- } while (parent != null);
-
- // add root to path
- builder.addRoot();
- return builder.getPath();
- } catch (NoSuchItemStateException nsise) {
- String msg = "failed to build path of " + id;
- log.error(msg, nsise);
- throw new ItemNotFoundException(msg, nsise);
- } catch (MalformedPathException mpe) {
- String msg = "failed to build path of " + id;
- log.error(msg, mpe);
- throw new RepositoryException(msg, mpe);
- }
- }
-
- /**
- * @see HierarchyManager#getName(ItemId)
- */
- public QName getName(ItemId itemId) throws ItemNotFoundException,
RepositoryException {
- if (itemId.denotesNode()) {
- NodeId nodeId = (NodeId) itemId;
- NodeState parentState;
- try {
- NodeState nodeState = (NodeState) getItemState(nodeId);
- String parentUUID = nodeState.getParentUUID();
- if (parentUUID == null) {
- // this is the root or an orphaned node
- // FIXME
- return new QName(NamespaceRegistryImpl.NS_DEFAULT_URI, "");
- }
- parentState = (NodeState) getItemState(new NodeId(parentUUID));
- } catch (NoSuchItemStateException nsise) {
- String msg = "failed to resolve name of " + nodeId;
- log.error(msg, nsise);
- throw new RepositoryException(msg, nsise);
- }
-
- List entries = parentState.getChildNodeEntries(nodeId.getUUID());
- if (entries.size() == 0) {
- String msg = "failed to resolve name of " + nodeId;
- log.error(msg);
- throw new RepositoryException(msg);
- }
- NodeState.ChildNodeEntry entry = (NodeState.ChildNodeEntry) entries.get(0);
- return entry.getName();
- } else {
- PropertyId propId = (PropertyId) itemId;
- return propId.getName();
- }
- }
-
- /**
- * @see HierarchyManager#getAllPaths(ItemId)
- */
- public synchronized Path[] getAllPaths(ItemId id) throws ItemNotFoundException,
RepositoryException {
- Path.PathBuilder builder = new Path.PathBuilder();
- ArrayList list = new ArrayList();
- list.add(builder);
-
- NodeId nodeId = null;
- if (!id.denotesNode()) {
- try {
- PropertyState propState = (PropertyState) getItemState(id);
- QName name = propState.getName();
- // add to path
- builder.addFirst(name.getNamespaceURI(), name.getLocalName());
- nodeId = new NodeId(propState.getParentUUID());
- } catch (NoSuchItemStateException nsise) {
- String msg = "failed to build path of " + id;
- log.error(msg, nsise);
- throw new ItemNotFoundException(msg, nsise);
- }
- } else {
- nodeId = (NodeId) id;
- }
-
- // recursively traverse parent nodes
- recursiveBuildPaths(nodeId, builder, list);
-
- Path[] paths = new Path[list.size()];
- int i = 0;
- Iterator iter = list.iterator();
- while (iter.hasNext()) {
- Path.PathBuilder pb = (Path.PathBuilder) iter.next();
- try {
- paths[i++] = pb.getPath();
- } catch (MalformedPathException mpe) {
- String msg = "failed to build all paths of " + id;
- log.error(msg, mpe);
- throw new RepositoryException(msg, mpe);
- }
- }
- return paths;
- }
-
- /**
- *
- * @param nodeId
- * @param builder
- * @param builders
- * @throws ItemNotFoundException
- * @throws RepositoryException
- */
- private void recursiveBuildPaths(NodeId nodeId, Path.PathBuilder builder, List
builders)
- throws ItemNotFoundException, RepositoryException {
- try {
- NodeState nodeState = (NodeState) getItemState(nodeId);
-
- String uuid = nodeState.getUUID();
- /**
- * the parent uuid list contains an entry for every parent-child
- * link to the specified node. this list may contain duplicate
- * entries if the same parent node has more than one child link to
- * the same target node. because the following code expects unique
- * entries in the parent uuid list, we put them into a set.
- */
- HashSet parentUUIDs = new HashSet(nodeState.getParentUUIDs());
- if (parentUUIDs.size() == 0) {
- // nodeId denotes the root node
- builder.addRoot();
- return;
- }
-
- // if the specified node has n parents,
- // we need to create n - 1 path builder clones
- LinkedList queue = new LinkedList();
- queue.add(builder);
- int n = parentUUIDs.size() - 1;
- while (n-- > 0) {
- Path.PathBuilder clone = (Path.PathBuilder) builder.clone();
- queue.addLast(clone);
- // add to list of path builders
- builders.add(clone);
- }
-
-
- Iterator iter = parentUUIDs.iterator();
- while (iter.hasNext()) {
- String parentUUID = (String) iter.next();
- NodeState parent = (NodeState) getItemState(new NodeId(parentUUID));
- List entries = parent.getChildNodeEntries(uuid);
- if (entries.isEmpty()) {
- String msg = "failed to build path of " + nodeId + ": " +
parent.getUUID() + " has no child entry for " + uuid;
- log.error(msg);
- throw new RepositoryException(msg);
- }
- n = entries.size() - 1;
- while (n-- > 0) {
- // the same parent has multiple child references to
- // this node, more path builder clones are needed
-
- // since we are consuming the queue of path builders
- // starting at the tail, we can safely clone 'builder'
- // because it will be consumed as the very last queue entry
- Path.PathBuilder clone = (Path.PathBuilder) builder.clone();
- queue.add(clone);
- // add to list of path builders
- builders.add(clone);
- }
- for (int i = 0; i < entries.size(); i++) {
- NodeState.ChildNodeEntry entry = (NodeState.ChildNodeEntry)
entries.get(i);
- QName name = entry.getName();
-
- // get a path builder clone from the tail of the queue
- Path.PathBuilder pb = (Path.PathBuilder) queue.removeLast();
- // add entry to path
- pb.addFirst(name.getNamespaceURI(), name.getLocalName(),
entry.getIndex());
-
- // recurse
- recursiveBuildPaths(new NodeId(parentUUID), pb, builders);
- }
- }
- } catch (NoSuchItemStateException nsise) {
- String msg = "failed to build path of " + nodeId;
- log.error(msg, nsise);
- throw new ItemNotFoundException(msg, nsise);
}
}
1.12 +9 -3
jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/RepositoryImpl.java
Index: RepositoryImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/RepositoryImpl.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- RepositoryImpl.java 1 Jul 2004 18:29:41 -0000 1.11
+++ RepositoryImpl.java 7 Jul 2004 16:05:45 -0000 1.12
@@ -26,6 +26,7 @@
import org.apache.commons.collections.BeanMap;
import org.apache.log4j.Logger;
import org.apache.slide.jcr.core.nodetype.NodeTypeRegistry;
+import org.apache.slide.jcr.core.nodetype.NodeDefId;
import org.apache.slide.jcr.core.observation.ObservationManagerFactory;
import org.apache.slide.jcr.core.state.ItemStateException;
import org.apache.slide.jcr.core.state.PersistenceManager;
@@ -59,6 +60,7 @@
new SimpleCredentials(ANONYMOUS_USER, new char[0]);
private String rootNodeUUID;
+ private NodeDefId rootNodeDefinitionId;
private final NamespaceRegistryImpl nsReg;
private final NodeTypeRegistry ntReg;
@@ -225,6 +227,10 @@
nsReg = new NamespaceRegistryImpl(new BasedFileSystem(repStore,
"/namespaces"));
ntReg = NodeTypeRegistry.create(nsReg, new BasedFileSystem(repStore,
"/nodetypes"));
+
+ // FIXME relies on definition of nt:unstructured:
+ // first (and only) child node definition is applied to root node
+ rootNodeDefinitionId = new
NodeDefId(ntReg.getNodeTypeDef(NodeTypeRegistry.NT_UNSTRUCTURED).getChildNodeDefs()[0]);
}
NamespaceRegistry getNamespaceRegistry() {
@@ -261,7 +267,7 @@
StableWorkspaceDef swd = (StableWorkspaceDef) wd;
PersistenceManager persistMgr = createPersistenceManager(swd);
try {
- stateMgr = new PersistentItemStateManager(persistMgr,
rootNodeUUID);
+ stateMgr = new PersistentItemStateManager(persistMgr,
rootNodeUUID, ntReg);
} catch (ItemStateException ise) {
String msg = "failed to instantiate the persistent state manager";
log.error(msg, ise);
1.5 +2 -2
jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/Test.java
Index: Test.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/Test.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Test.java 29 Jun 2004 17:11:47 -0000 1.4
+++ Test.java 7 Jul 2004 16:05:45 -0000 1.5
@@ -91,7 +91,7 @@
System.out.println();
dumpTree(root, System.out);
- root.setProperty("blob", new FileInputStream(new File("d:/temp/jcrri.zip")));
+ //root.setProperty("blob", new FileInputStream(new File("d:/temp/jcrri.zip")));
root.setProperty("bla", 1);
root.setProperty("bla", 1.4);
1.11 +38 -7
jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/TicketImpl.java
Index: TicketImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/TicketImpl.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- TicketImpl.java 1 Jul 2004 18:29:41 -0000 1.10
+++ TicketImpl.java 7 Jul 2004 16:05:45 -0000 1.11
@@ -26,6 +26,7 @@
import org.apache.log4j.Logger;
import org.apache.slide.jcr.core.nodetype.NodeTypeManagerImpl;
import org.apache.slide.jcr.core.nodetype.NodeTypeRegistry;
+import org.apache.slide.jcr.core.state.TicketItemStateManager;
import org.apache.slide.jcr.util.MalformedPathException;
import org.xml.sax.ContentHandler;
@@ -76,6 +77,16 @@
protected final AccessManagerImpl accessMgr;
/**
+ * the item state mgr associated with this ticket
+ */
+ protected final TicketItemStateManager itemStateMgr;
+
+ /**
+ * the HierarchyManager associated with this ticket
+ */
+ protected final HierarchyManager hierMgr;
+
+ /**
* the item mgr associated with this ticket
*/
protected final ItemManager itemMgr;
@@ -120,8 +131,10 @@
ntMgr = new NodeTypeManagerImpl(rep.getNodeTypeRegistry(), this);
wsp = new WorkspaceImpl(wd, rep.getWorkspaceStateManager(wd), rep, this);
- itemMgr = new ItemManager(wsp.getPersistentStateManager(), this,
ntMgr.getRootNodeDefinition(), rep.getRootNodeUUID());
- accessMgr = new AccessManagerImpl(credentials, itemMgr.getHierarchyMgr(),
getNamespaceResolver());
+ itemStateMgr = new TicketItemStateManager(rep.getRootNodeUUID(),
wsp.getPersistentStateManager(), getNamespaceResolver());
+ hierMgr = itemStateMgr.getHierarchyMgr();
+ itemMgr = new ItemManager(itemStateMgr, hierMgr, this,
ntMgr.getRootNodeDefinition(), rep.getRootNodeUUID());
+ accessMgr = new AccessManagerImpl(credentials, itemStateMgr.getHierarchyMgr(),
getNamespaceResolver());
nsMappings = new TransientNamespaceMappings(rep.getNamespaceRegistry());
}
@@ -154,6 +167,24 @@
}
/**
+ * Returns the <code>TicketItemStateManager</code> associated with this ticket.
+ *
+ * @return the <code>TicketItemStateManager</code> associated with this ticket
+ */
+ TicketItemStateManager getItemStateManager() {
+ return itemStateMgr;
+ }
+
+ /**
+ * Returns the <code>HierarchyManager</code> associated with this ticket.
+ *
+ * @return the <code>HierarchyManager</code> associated with this ticket
+ */
+ HierarchyManager getHierarchyManager() {
+ return hierMgr;
+ }
+
+ /**
* Dumps the state of this <code>Ticket</code> instance
* (used for diagnostic purposes).
*
@@ -249,7 +280,7 @@
public void refresh(boolean keepChanges) throws RepositoryException {
if (!keepChanges) {
// optimization
- itemMgr.getTransientStateMgr().disposeAllItemStates();
+ itemStateMgr.disposeAllTransientItemStates();
return;
}
itemMgr.getRootNode().refresh(keepChanges);
@@ -259,7 +290,7 @@
* @see Ticket#hasPendingChanges
*/
public boolean hasPendingChanges() throws RepositoryException {
- return itemMgr.getTransientStateMgr().hasAnyItemStates();
+ return itemStateMgr.hasAnyTransientItemStates();
}
/**
@@ -355,7 +386,7 @@
*/
public void logout() {
// discard all transient changes
- itemMgr.getTransientStateMgr().disposeAllItemStates();
+ itemStateMgr.disposeAllTransientItemStates();
log.debug("disposing workspace");
wsp.dispose();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]