You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2005/01/03 16:01:30 UTC
svn commit: r123983 - in incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core: . jndi/provider nodetype version version/persistence
Author: stefan
Date: Mon Jan 3 07:01:28 2005
New Revision: 123983
URL: http://svn.apache.org/viewcvs?view=rev&rev=123983
Log:
fixed issue JCR-36: NodeTypeRegistry.reregister unregisters dependent types
http://issues.apache.org/jira/browse/JCR-36
Modified:
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/provider/DummyInitialContextFactory.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java?view=diff&rev=123983&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java&r1=123982&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java&r2=123983
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java Mon Jan 3 07:01:28 2005
@@ -586,7 +586,7 @@
// primary type
set.add(nodeType.getQName());
try {
- return ntReg.buildEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+ return ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
} catch (NodeTypeConflictException ntce) {
String msg = "internal error: failed to build effective node type for node " + safeGetJCRPath();
log.error(msg, ntce);
@@ -1704,7 +1704,7 @@
}
NodeTypeRegistry ntReg = session.getNodeTypeManager().getNodeTypeRegistry();
try {
- EffectiveNodeType ent = ntReg.buildEffectiveNodeType((QName[]) mixinNames.toArray(new QName[mixinNames.size()]));
+ EffectiveNodeType ent = ntReg.getEffectiveNodeType((QName[]) mixinNames.toArray(new QName[mixinNames.size()]));
return ent.includesNodeType(ntName);
} catch (NodeTypeConflictException ntce) {
String msg = "internal error: invalid mixin node type(s)";
@@ -1788,14 +1788,14 @@
// primary type
set.add(nodeType.getQName());
// build effective node type representing primary type including existing mixin's
- entExisting = ntReg.buildEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+ entExisting = ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
if (entExisting.includesNodeType(ntName)) {
throw new RepositoryException(mixinName + ": already contained in mixin types");
}
// add new mixin
set.add(ntName);
// try to build new effective node type (will throw in case of conflicts)
- ntReg.buildEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+ ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
} catch (NodeTypeConflictException ntce) {
throw new ConstraintViolationException(ntce.getMessage());
}
@@ -1916,7 +1916,7 @@
// primary type
set.add(nodeType.getQName());
// build effective node type representing primary type including remaining mixin's
- entRemaining = ntReg.buildEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+ entRemaining = ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
} catch (NodeTypeConflictException ntce) {
throw new ConstraintViolationException(ntce.getMessage());
}
@@ -2010,14 +2010,14 @@
// primary type
set.add(nodeType.getQName());
// build effective node type representing primary type including existing mixin's
- entExisting = ntReg.buildEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+ entExisting = ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
if (entExisting.includesNodeType(ntName)) {
return false;
}
// add new mixin
set.add(ntName);
// try to build new effective node type (will throw in case of conflicts)
- ntReg.buildEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+ ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
} catch (NodeTypeConflictException ntce) {
return false;
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java?view=diff&rev=123983&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java&r1=123982&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java&r2=123983
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java Mon Jan 3 07:01:28 2005
@@ -406,7 +406,7 @@
// primary type
set.add(state.getNodeTypeName());
try {
- return ntReg.buildEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+ return ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
} catch (NodeTypeConflictException ntce) {
String msg = "internal error: failed to build effective node type for node " + state.getUUID();
log.error(msg, ntce);
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/provider/DummyInitialContextFactory.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/provider/DummyInitialContextFactory.java?view=diff&rev=123983&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/provider/DummyInitialContextFactory.java&r1=123982&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/provider/DummyInitialContextFactory.java&r2=123983
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/provider/DummyInitialContextFactory.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/provider/DummyInitialContextFactory.java Mon Jan 3 07:01:28 2005
@@ -19,8 +19,8 @@
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.spi.InitialContextFactory;
-import java.util.Hashtable;
import java.util.HashMap;
+import java.util.Hashtable;
/**
* <code>DummyInitialContextFactory</code> ...
@@ -28,23 +28,24 @@
public class DummyInitialContextFactory implements InitialContextFactory {
private static HashMap contexts = new HashMap();
+
/**
* @see InitialContextFactory#getInitialContext(java.util.Hashtable)
*/
public Context getInitialContext(Hashtable environment) throws NamingException {
- String url = (String) environment.get(Context.PROVIDER_URL);
- if (url==null) {
- throw new NamingException("Unable to create context. Environment is missing a " + Context.PROVIDER_URL);
- }
+ String url = (String) environment.get(Context.PROVIDER_URL);
+ if (url == null) {
+ throw new NamingException("Unable to create context. Environment is missing a " + Context.PROVIDER_URL);
+ }
- synchronized (DummyInitialContextFactory.contexts) {
- DummyContext ctx = (DummyContext) contexts.get(url);
- if (ctx==null) {
- ctx = new DummyContext(environment);
- contexts.put(url, ctx);
- }
- return ctx;
- }
+ synchronized (DummyInitialContextFactory.contexts) {
+ DummyContext ctx = (DummyContext) contexts.get(url);
+ if (ctx == null) {
+ ctx = new DummyContext(environment);
+ contexts.put(url, ctx);
+ }
+ return ctx;
+ }
}
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java?view=diff&rev=123983&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java&r1=123982&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java&r2=123983
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java Mon Jan 3 07:01:28 2005
@@ -167,7 +167,7 @@
// resolve supertypes recursively
QName[] supertypes = ntd.getSupertypes();
if (supertypes != null && supertypes.length > 0) {
- ent.internalMerge(ntReg.buildEffectiveNodeType(supertypes), true);
+ ent.internalMerge(ntReg.getEffectiveNodeType(supertypes), true);
}
// we're done
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java?view=diff&rev=123983&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java&r1=123982&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java&r2=123983
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java Mon Jan 3 07:01:28 2005
@@ -568,7 +568,7 @@
*/
if (supertypes != null && supertypes.length > 0) {
try {
- EffectiveNodeType est = buildEffectiveNodeType(supertypes);
+ EffectiveNodeType est = getEffectiveNodeType(supertypes);
// make sure that all primary types except nt:base extend from nt:base
if (!ntd.isMixin() && !NT_BASE.equals(ntd.getName()) &&
!est.includesNodeType(NT_BASE)) {
@@ -913,24 +913,46 @@
}
/**
+ *
* @param ntName
* @return
+ * @throws NoSuchNodeTypeException
*/
public synchronized EffectiveNodeType getEffectiveNodeType(QName ntName)
throws NoSuchNodeTypeException {
+ // 1. make sure that the specified node type is registered
+ if (!registeredNTDefs.containsKey(ntName)) {
+ throw new NoSuchNodeTypeException(ntName.toString());
+ }
+
+ // 2. check if effective node type has already been built
WeightedKey key = new WeightedKey(new QName[]{ntName});
if (entCache.contains(key)) {
return entCache.get(key);
- } else {
- throw new NoSuchNodeTypeException(ntName.toString());
+ }
+
+ // 3. build effective node type
+ try {
+ EffectiveNodeType ent = EffectiveNodeType.create(this, ntName);
+ // store new effective node type
+ entCache.put(ent);
+ return ent;
+ } catch (NodeTypeConflictException ntce) {
+ // should never get here as all registered node types have to be valid!
+ String msg = "internal error: encountered invalid registered node type " + ntName;
+ log.error(msg, ntce);
+ throw new NoSuchNodeTypeException(msg, ntce);
}
}
/**
+ *
* @param ntNames
* @return
+ * @throws NodeTypeConflictException
+ * @throws NoSuchNodeTypeException
*/
- public synchronized EffectiveNodeType buildEffectiveNodeType(QName[] ntNames)
+ public synchronized EffectiveNodeType getEffectiveNodeType(QName[] ntNames)
throws NodeTypeConflictException, NoSuchNodeTypeException {
// 1. make sure every single node type is registered
for (int i = 0; i < ntNames.length; i++) {
@@ -941,7 +963,7 @@
WeightedKey key = new WeightedKey(ntNames);
- // 2. check if aggregate has already been build
+ // 2. check if aggregate has already been built
if (entCache.contains(key)) {
return entCache.get(key);
}
@@ -960,14 +982,18 @@
key = key.subtract(key);
break;
}
- // walk list of existing aggregates sorted by 'weight' of
- // aggregate (i.e. the cost of building it)
+ /**
+ * walk list of existing aggregates sorted by 'weight' of
+ * aggregate (i.e. the cost of building it)
+ */
boolean foundSubResult = false;
Iterator iter = entCache.keys();
while (iter.hasNext()) {
WeightedKey k = (WeightedKey) iter.next();
- // check if the existing aggregate is a 'subset' of the one
- // we're looking for
+ /**
+ * check if the existing aggregate is a 'subset' of the one
+ * we're looking for
+ */
if (key.contains(k)) {
tmpResults.add(entCache.get(k));
// subtract the result from the temporary key
@@ -977,8 +1003,10 @@
}
}
if (!foundSubResult) {
- // no matching sub-aggregates found:
- // build aggregate of remaining node types through iteration
+ /**
+ * no matching sub-aggregates found:
+ * build aggregate of remaining node types through iteration
+ */
QName[] remainder = key.toArray();
for (int i = 0; i < remainder.length; i++) {
EffectiveNodeType ent = null;
@@ -1296,7 +1324,7 @@
NodeTypeDef ntdOld = (NodeTypeDef) registeredNTDefs.get(name);
NodeTypeDefDiff diff = NodeTypeDefDiff.create(ntdOld, ntd);
if (!diff.isModified()) {
- // the definition has been modified, there's nothing to do here...
+ // the definition has not been modified, there's nothing to do here...
return getEffectiveNodeType(name);
}
if (diff.isTrivial()) {
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java?view=diff&rev=123983&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java&r1=123982&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java&r2=123983
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java Mon Jan 3 07:01:28 2005
@@ -292,15 +292,10 @@
def = getApplicableChildNodeDef(parent, name, nodeType == null ? null : nodeType.getQName());
} catch (RepositoryException re) {
// hack, use nt:unstructured as parent
- try {
- NodeTypeRegistry ntReg = getNodeTypeManager().getNodeTypeRegistry();
- EffectiveNodeType ent = ntReg.buildEffectiveNodeType(new QName[]{NodeTypeRegistry.NT_UNSTRUCTURED});
- ChildNodeDef cnd = ent.getApplicableChildNodeDef(name, nodeTypeName);
- def = getNodeTypeManager().getNodeDef(new NodeDefId(cnd));
- } catch (NodeTypeConflictException e) {
- String msg = "no definition found in parent node's node type for new node";
- throw new ConstraintViolationException(msg, re);
- }
+ NodeTypeRegistry ntReg = getNodeTypeManager().getNodeTypeRegistry();
+ EffectiveNodeType ent = ntReg.getEffectiveNodeType(NodeTypeRegistry.NT_UNSTRUCTURED);
+ ChildNodeDef cnd = ent.getApplicableChildNodeDef(name, nodeTypeName);
+ def = getNodeTypeManager().getNodeDef(new NodeDefId(cnd));
}
if (nodeType == null) {
// use default node type
@@ -408,7 +403,7 @@
// primary type
set.add(parent.getNodeTypeName());
try {
- return ntReg.buildEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+ return ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
} catch (NodeTypeConflictException ntce) {
String msg = "internal error: failed to build effective node type for node " + parent.getUUID();
throw new RepositoryException(msg, ntce);
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java?view=diff&rev=123983&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java&r1=123982&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java&r2=123983
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java Mon Jan 3 07:01:28 2005
@@ -295,7 +295,7 @@
// primary type
set.add(nodeState.getNodeTypeName());
try {
- return ntReg.buildEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+ return ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
} catch (NodeTypeConflictException ntce) {
String msg = "internal error: failed to build effective node type for node " + nodeState.getUUID();
throw new RepositoryException(msg, ntce);
@@ -396,15 +396,10 @@
def = getApplicableChildNodeDef(name, nodeType == null ? null : nodeType.getQName());
} catch (RepositoryException re) {
// hack, use nt:unstructured as parent
- try {
- NodeTypeRegistry ntReg = ntMgr.getNodeTypeRegistry();
- EffectiveNodeType ent = ntReg.buildEffectiveNodeType(new QName[]{NodeTypeRegistry.NT_UNSTRUCTURED});
- ChildNodeDef cnd = ent.getApplicableChildNodeDef(name, nodeTypeName);
- def = ntMgr.getNodeDef(new NodeDefId(cnd));
- } catch (NodeTypeConflictException e) {
- String msg = "no definition found in parent node's node type for new node";
- throw new ConstraintViolationException(msg, re);
- }
+ NodeTypeRegistry ntReg = ntMgr.getNodeTypeRegistry();
+ EffectiveNodeType ent = ntReg.getEffectiveNodeType(NodeTypeRegistry.NT_UNSTRUCTURED);
+ ChildNodeDef cnd = ent.getApplicableChildNodeDef(name, nodeTypeName);
+ def = ntMgr.getNodeDef(new NodeDefId(cnd));
}
if (nodeType == null) {