You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by st...@apache.org on 2004/07/07 18:04:56 UTC
cvs commit: jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/state PersistentItemStateManager.java TransientItemStateManager.java
stefan 2004/07/07 09:04:56
Modified: proposals/jcrri/src/org/apache/slide/jcr/core/state
PersistentItemStateManager.java
TransientItemStateManager.java
Log:
jcrri
Revision Changes Path
1.4 +81 -12 jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/state/PersistentItemStateManager.java
Index: PersistentItemStateManager.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/state/PersistentItemStateManager.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- PersistentItemStateManager.java 22 Jun 2004 18:02:33 -0000 1.3
+++ PersistentItemStateManager.java 7 Jul 2004 16:04:56 -0000 1.4
@@ -25,11 +25,12 @@
import org.apache.log4j.Logger;
import org.apache.slide.jcr.core.*;
+import org.apache.slide.jcr.core.nodetype.NodeDefId;
import org.apache.slide.jcr.core.nodetype.NodeTypeRegistry;
+import org.apache.slide.jcr.core.nodetype.PropDefId;
import javax.jcr.PropertyType;
-import javax.jcr.StringValue;
-import javax.jcr.Value;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
import java.io.PrintStream;
import java.util.Iterator;
@@ -39,7 +40,8 @@
* @author Stefan Guggisberg
* @version $Revision$, $Date$
*/
-public class PersistentItemStateManager extends ItemStateCache implements ItemStateListener {
+public class PersistentItemStateManager extends ItemStateCache
+ implements ItemStateProvider, ItemStateListener {
private static Logger log = Logger.getLogger(PersistentItemStateManager.class);
@@ -53,8 +55,11 @@
*
* @param persistMgr
* @param rootNodeUUID
+ * @param ntReg
*/
- public PersistentItemStateManager(PersistenceManager persistMgr, String rootNodeUUID)
+ public PersistentItemStateManager(PersistenceManager persistMgr,
+ String rootNodeUUID,
+ NodeTypeRegistry ntReg)
throws ItemStateException {
this.persistMgr = persistMgr;
@@ -62,21 +67,39 @@
root = getNodeState(new NodeId(rootNodeUUID));
} catch (NoSuchItemStateException e) {
// create root node
- root = createPersistentRootNodeState(rootNodeUUID);
+ root = createPersistentRootNodeState(rootNodeUUID, ntReg);
}
}
- private PersistentNodeState createPersistentRootNodeState(String rootNodeUUID)
+ private PersistentNodeState createPersistentRootNodeState(String rootNodeUUID,
+ NodeTypeRegistry ntReg)
throws ItemStateException {
PersistentNodeState rootState = createNodeState(rootNodeUUID, NodeTypeRegistry.NT_UNSTRUCTURED, null);
// @todo FIXME need to manually setup root node by creating mandatory jcr:primaryType property
+ NodeDefId nodeDefId = null;
+ PropDefId propDefId = null;
+
+ try {
+ // FIXME relies on definition of nt:unstructured and nt:base:
+ // first (and only) child node definition in nt:unstructured is applied to root node
+ nodeDefId = new NodeDefId(ntReg.getNodeTypeDef(NodeTypeRegistry.NT_UNSTRUCTURED).getChildNodeDefs()[0]);
+ // first property definition in nt:base is jcr:primaryType
+ propDefId = new PropDefId(ntReg.getNodeTypeDef(NodeTypeRegistry.NT_BASE).getPropertyDefs()[0]);
+ } catch (NoSuchNodeTypeException nsnte) {
+ String msg = "failed to create root node";
+ log.error(msg, nsnte);
+ throw new ItemStateException(msg, nsnte);
+ }
+ rootState.setDefinitionId(nodeDefId);
+
QName propName = new QName(NamespaceRegistryImpl.NS_JCR_URI, "primaryType");
rootState.addPropertyEntry(propName);
PersistentPropertyState prop = createPropertyState(rootNodeUUID, propName);
prop.setValues(new InternalValue[]{InternalValue.create(NodeTypeRegistry.NT_UNSTRUCTURED)});
prop.setType(PropertyType.STRING);
+ prop.setDefinitionId(propDefId);
rootState.store();
prop.store();
@@ -131,6 +154,48 @@
ps.println(id + " (" + state + ")");
}
+ //----------------------------------------------------< ItemStateProvider >
+ /**
+ * @see ItemStateProvider#getItemState(ItemId)
+ */
+ public ItemState getItemState(ItemId id)
+ throws NoSuchItemStateException, ItemStateException {
+ if (id.denotesNode()) {
+ return getNodeState((NodeId) id);
+ } else {
+ return getPropertyState((PropertyId) id);
+ }
+ }
+
+ /**
+ * @see ItemStateProvider#hasItemState(ItemId)
+ */
+ public boolean hasItemState(ItemId id) {
+ try {
+ getItemState(id);
+ return true;
+ } catch (ItemStateException ise) {
+ return false;
+ }
+ }
+
+ /**
+ * @see ItemStateProvider#getItemStateInAttic(ItemId)
+ */
+ public ItemState getItemStateInAttic(ItemId id)
+ throws NoSuchItemStateException, ItemStateException {
+ // n/a
+ throw new NoSuchItemStateException(id.toString());
+ }
+
+ /**
+ * @see ItemStateProvider#hasItemStateInAttic(ItemId)
+ */
+ public boolean hasItemStateInAttic(ItemId id) {
+ // n/a
+ return false;
+ }
+
//---------------< methods for listing and retrieving ItemState instances >
/**
* @param id
@@ -138,7 +203,7 @@
* @throws NoSuchItemStateException
* @throws ItemStateException
*/
- public synchronized PersistentNodeState getNodeState(NodeId id)
+ synchronized PersistentNodeState getNodeState(NodeId id)
throws NoSuchItemStateException, ItemStateException {
// check cache
if (isCached(id)) {
@@ -160,7 +225,7 @@
* @throws NoSuchItemStateException
* @throws ItemStateException
*/
- public synchronized PersistentPropertyState getPropertyState(PropertyId id)
+ synchronized PersistentPropertyState getPropertyState(PropertyId id)
throws NoSuchItemStateException, ItemStateException {
// check cache
if (isCached(id)) {
@@ -188,7 +253,7 @@
* @return
* @throws ItemStateException
*/
- public synchronized PersistentNodeState createNodeState(String uuid, QName nodeTypeName, String parentUUID)
+ synchronized PersistentNodeState createNodeState(String uuid, QName nodeTypeName, String parentUUID)
throws ItemStateException {
NodeId id = new NodeId(uuid);
// check cache
@@ -208,12 +273,16 @@
}
/**
+ * Creates a <code>PersistentPropertyState</code> instance representing new,
+ * i.e. not yet existing state. Call <code>{@link PersistentPropertyState#store()}</code>
+ * on the returned object to make it persistent.
+ *
* @param parentUUID
* @param propName
* @return
* @throws ItemStateException
*/
- public PersistentPropertyState createPropertyState(String parentUUID, QName propName)
+ PersistentPropertyState createPropertyState(String parentUUID, QName propName)
throws ItemStateException {
PropertyId id = new PropertyId(parentUUID, propName);
// check cache
1.7 +46 -143 jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/state/TransientItemStateManager.java
Index: TransientItemStateManager.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/state/TransientItemStateManager.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- TransientItemStateManager.java 24 Jun 2004 16:31:07 -0000 1.6
+++ TransientItemStateManager.java 7 Jul 2004 16:04:56 -0000 1.7
@@ -25,14 +25,13 @@
import org.apache.commons.collections.ReferenceMap;
import org.apache.log4j.Logger;
-import org.apache.slide.jcr.core.*;
+import org.apache.slide.jcr.core.ItemId;
+import org.apache.slide.jcr.core.NodeId;
+import org.apache.slide.jcr.core.PropertyId;
+import org.apache.slide.jcr.core.QName;
-import javax.jcr.RepositoryException;
import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Collections;
import java.util.Iterator;
-import java.util.List;
/**
* <code>TransientItemStateManager</code> ...
@@ -40,103 +39,28 @@
* @author Stefan Guggisberg
* @version $Revision$, $Date$
*/
-public class TransientItemStateManager extends ItemStateCache {
+class TransientItemStateManager extends ItemStateCache implements ItemStateProvider {
private static Logger log = Logger.getLogger(TransientItemStateManager.class);
private final Attic attic;
- private final HierarchyManager hierMgr;
-
/**
* Creates a new <code>TransientItemStateManager</code> instance.
*/
- public TransientItemStateManager(HierarchyManager hierMgr) {
+ TransientItemStateManager() {
// we're keeping hard references in the cache
super(ReferenceMap.HARD, ReferenceMap.HARD);
-
- this.hierMgr = hierMgr;
attic = new Attic();
}
- private void collectDescendantItemStates(ItemId id, List descendents) {
- try {
- if (id.denotesNode()) {
- NodeId parentId = (NodeId) id;
- ItemId[] childIds = hierMgr.listChildren(parentId);
- for (int i = 0; i < childIds.length; i++) {
- ItemId childId = childIds[i];
- if (isCached(childId)) {
- descendents.add(retrieve(childId));
- }
- // recurse
- collectDescendantItemStates(childId, descendents);
- }
- // also add transient child nodes that have been unlinked from
- // the specified parent node but are not orphaned yet (i.e.
- // they are still linked to at least one other parent node)
- if (isCached(parentId)) {
- NodeState parentState = (NodeState) retrieve(parentId);
- Iterator iter = parentState.getRemovedChildNodeEntries().iterator();
- while (iter.hasNext()) {
- // removed child nodes
- NodeState.ChildNodeEntry cne = (NodeState.ChildNodeEntry) iter.next();
- NodeId removedChildId = new NodeId(cne.getUUID());
- if (isCached(removedChildId)) {
- descendents.add(retrieve(removedChildId));
- }
- }
- }
- }
- } catch (RepositoryException re) {
- log.warn("inconsistent hierarchy state", re);
- }
- }
-
- private void collectDescendantItemStatesInAttic(ItemId id, List descendents) {
- try {
- if (id.denotesNode()) {
- NodeId parentId = (NodeId) id;
-
- // traverse zombie children (i.e. children marked as removed)
- ItemId[] childIds = hierMgr.listZombieChildren(parentId);
- for (int i = 0; i < childIds.length; i++) {
- ItemId childId = childIds[i];
- // check attic
- if (attic.isCached(childId)) {
- // found on attic, add to descendents list
- descendents.add(attic.retrieve(childId));
- }
- // recurse
- collectDescendantItemStatesInAttic(childId, descendents);
- }
-
- // traverse existing children (because parentId might denote
- // a node that was marked removed)
- childIds = hierMgr.listChildren(parentId);
- for (int i = 0; i < childIds.length; i++) {
- ItemId childId = childIds[i];
- // check attic
- if (attic.isCached(childId)) {
- // found on attic, add to descendents list
- descendents.add(attic.retrieve(childId));
- }
- // recurse
- collectDescendantItemStatesInAttic(childId, descendents);
- }
- }
- } catch (RepositoryException re) {
- log.warn("inconsistent hierarchy state", re);
- }
- }
-
/**
* Dumps the state of this <code>TransientItemStateManager</code> instance
* (used for diagnostic purposes).
*
* @param ps
*/
- public void dump(PrintStream ps) {
+ void dump(PrintStream ps) {
ps.println("TransientItemStateManager (" + this + ")");
ps.println();
ps.println("entries in cache:");
@@ -187,13 +111,12 @@
ps.println(id + " (" + state + ")");
}
- //---------------< methods for listing and retrieving ItemState instances >
+ //----------------------------------------------------< ItemStateProvider >
/**
- * @param id
- * @return
- * @throws NoSuchItemStateException
+ * @see ItemStateProvider#getItemState(ItemId)
*/
- public ItemState getItemState(ItemId id) throws NoSuchItemStateException {
+ public ItemState getItemState(ItemId id)
+ throws NoSuchItemStateException, ItemStateException {
ItemState state = retrieve(id);
if (state != null) {
return state;
@@ -203,70 +126,50 @@
}
/**
- * @param id
- * @return
+ * @see ItemStateProvider#hasItemState(ItemId)
*/
- public boolean itemStateExists(ItemId id) {
+ public boolean hasItemState(ItemId id) {
try {
getItemState(id);
- } catch (NoSuchItemStateException e) {
+ return true;
+ } catch (ItemStateException ise) {
return false;
}
- return true;
- }
-
- /**
- * @return
- */
- public boolean hasAnyItemStates() {
- return !isEmpty();
}
/**
- * Returns an iterator over those instances in the cache that are direct or
- * indirect descendents of the instance with the given <code>parentId</code>.
- * The instance with the given <code>parentId</code> itself (if there is
- * such in the cache) will not be included.
- * <p/>
- * The instances are returned in depth-first tree traversal order.
- *
- * @param parentId the id of the common parent of the instances to be returned.
- * @return an iterator over descendant instances
+ * @see ItemStateProvider#getItemStateInAttic(ItemId)
*/
- public Iterator getDescendantItemStates(ItemId parentId) {
- // @todo need a more efficient way to find descendents in cache (e.g. using hierarchical index)
- ArrayList descendents = new ArrayList();
- collectDescendantItemStates(parentId, descendents);
- return Collections.unmodifiableList(descendents).iterator();
+ public ItemState getItemStateInAttic(ItemId id)
+ throws NoSuchItemStateException, ItemStateException {
+ ItemState state = attic.retrieve(id);
+ if (state != null) {
+ return state;
+ } else {
+ throw new NoSuchItemStateException(id.toString());
+ }
}
/**
- * Same as <code>{@link #getDescendantItemStates(ItemId)}</code>
- * except that items in the attic are returned.
- *
- * @param parentId the id of the common parent of the instances to be returned.
- * @return an iterator over descendant instances in the attic
+ * @see ItemStateProvider#hasItemStateInAttic(ItemId)
*/
- public Iterator getDescendantItemStatesInAttic(ItemId parentId) {
- // @todo need a more efficient way to find descendents in attic (e.g. using hierarchical index)
- ArrayList descendents = new ArrayList();
- collectDescendantItemStatesInAttic(parentId, descendents);
- return Collections.unmodifiableList(descendents).iterator();
+ public boolean hasItemStateInAttic(ItemId id) {
+ try {
+ getItemStateInAttic(id);
+ return true;
+ } catch (ItemStateException ise) {
+ return false;
+ }
}
+ //----------< more methods for listing and retrieving ItemState instances >
/**
- * @param id
* @return
- * @throws NoSuchItemStateException
*/
- public ItemState getItemStateInAttic(ItemId id) throws NoSuchItemStateException {
- ItemState state = attic.retrieve(id);
- if (state != null) {
- return state;
- } else {
- throw new NoSuchItemStateException(id.toString());
- }
+ boolean hasAnyItemStates() {
+ return !isEmpty();
}
+
//----------------< methods for creating & discarding ItemState instances >
/**
* @param uuid
@@ -276,7 +179,7 @@
* @return
* @throws ItemStateException
*/
- public NodeState createNodeState(String uuid, QName nodeTypeName, String parentUUID, int initialStatus)
+ NodeState createNodeState(String uuid, QName nodeTypeName, String parentUUID, int initialStatus)
throws ItemStateException {
NodeId id = new NodeId(uuid);
// check cache
@@ -298,7 +201,7 @@
* @return
* @throws ItemStateException
*/
- public NodeState createNodeState(NodeState overlayedState, int initialStatus)
+ NodeState createNodeState(NodeState overlayedState, int initialStatus)
throws ItemStateException {
ItemId id = overlayedState.getId();
// check cache
@@ -321,7 +224,7 @@
* @return
* @throws ItemStateException
*/
- public PropertyState createPropertyState(String parentUUID, QName propName, int initialStatus)
+ PropertyState createPropertyState(String parentUUID, QName propName, int initialStatus)
throws ItemStateException {
PropertyId id = new PropertyId(parentUUID, propName);
// check cache
@@ -343,7 +246,7 @@
* @return
* @throws ItemStateException
*/
- public PropertyState createPropertyState(PropertyState overlayedState, int initialStatus)
+ PropertyState createPropertyState(PropertyState overlayedState, int initialStatus)
throws ItemStateException {
PropertyId id = new PropertyId(overlayedState.getParentUUID(), overlayedState.getName());
// check cache
@@ -365,7 +268,7 @@
* @param state the <code>ItemState</code> instance that should be disposed
* @see ItemState#discard()
*/
- public void disposeItemState(ItemState state) {
+ void disposeItemState(ItemState state) {
// discard item state, this will invalidate the wrapping Item
// instance of the transient state
state.discard();
@@ -381,7 +284,7 @@
* @param state the <code>ItemState</code> instance that should be moved to
* the attic
*/
- public void moveItemStateToAttic(ItemState state) {
+ void moveItemStateToAttic(ItemState state) {
// remove from cache
evict(state.getId());
// add to attic
@@ -395,7 +298,7 @@
* @param state the <code>ItemState</code> instance that should be disposed
* @see ItemState#discard()
*/
- public void disposeItemStateInAttic(ItemState state) {
+ void disposeItemStateInAttic(ItemState state) {
// discard item state, this will invalidate the wrapping Item
// instance of the transient state
state.discard();
@@ -408,7 +311,7 @@
/**
* Disposes all transient item states in the cache and in the attic.
*/
- public void disposeAllItemStates() {
+ void disposeAllItemStates() {
// dispose item states in cache
Iterator iter = entries();
while (iter.hasNext()) {
---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org