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 2004/12/16 18:15:16 UTC
svn commit: r122553 - incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype
Author: stefan
Date: Thu Dec 16 09:15:13 2004
New Revision: 122553
URL: http://svn.apache.org/viewcvs?view=rev&rev=122553
Log:
allow re-registering node type definition if change is trivial
Modified:
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistryListener.java
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java?view=diff&rev=122553&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java&r1=122552&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java&r2=122553
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java Thu Dec 16 09:15:13 2004
@@ -129,6 +129,14 @@
}
/**
+ * @see NodeTypeRegistryListener#nodeTypeReRegistered(QName)
+ */
+ public void nodeTypeReRegistered(QName ntName) {
+ // flush cache
+ ntCache.remove(ntName);
+ }
+
+ /**
* @see NodeTypeRegistryListener#nodeTypeUnregistered(QName)
*/
public void nodeTypeUnregistered(QName ntName) {
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=122553&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java&r1=122552&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java&r2=122553
==============================================================================
--- 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 Thu Dec 16 09:15:13 2004
@@ -363,6 +363,64 @@
return ent;
}
+ private void internalUnregister(QName name)
+ throws NoSuchNodeTypeException, RepositoryException {
+ if (!registeredNTDefs.containsKey(name)) {
+ throw new NoSuchNodeTypeException(name.toString());
+ }
+ if (builtInNTDefs.contains(name)) {
+ throw new RepositoryException(name.toString() + ": can't unregister built-in node type.");
+ }
+
+ NodeTypeDef ntd = (NodeTypeDef) registeredNTDefs.get(name);
+ registeredNTDefs.remove(name);
+ // remove all affected effective node types from aggregates cache
+ Iterator iter = entCache.keys();
+ while (iter.hasNext()) {
+ WeightedKey k = (WeightedKey) iter.next();
+ EffectiveNodeType ent = (EffectiveNodeType) entCache.get(k);
+ if (ent.includesNodeType(name)) {
+ entCache.remove(k);
+ }
+ }
+
+ // remove poperty & child node definitions
+ PropDef[] pda = ntd.getPropertyDefs();
+ for (int i = 0; i < pda.length; i++) {
+ PropDefId id = new PropDefId(pda[i]);
+ propDefs.remove(id);
+ }
+ ChildNodeDef[] nda = ntd.getChildNodeDefs();
+ for (int i = 0; i < nda.length; i++) {
+ NodeDefId id = new NodeDefId(nda[i]);
+ nodeDefs.remove(id);
+ }
+ }
+
+ private void persistCustomNTDefs() throws RepositoryException {
+ OutputStream out = null;
+ try {
+ out = customNodeTypesResource.getOutputStream();
+ customNTDefs.store(out, nsReg);
+ } catch (IOException ioe) {
+ String error = "internal error: failed to persist custom node type definitions to " + customNodeTypesResource.getPath();
+ log.error(error, ioe);
+ throw new RepositoryException(error, ioe);
+ } catch (FileSystemException fse) {
+ String error = "internal error: failed to persist custom node type definitions to " + customNodeTypesResource.getPath();
+ log.error(error, fse);
+ throw new RepositoryException(error, fse);
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException ioe) {
+ // ignore
+ }
+ }
+ }
+ }
+
/**
* Add a <code>NodeTypeRegistryListener</code>
*
@@ -403,6 +461,24 @@
}
/**
+ * Notify the listeners that a node type <code>ntName</code> has been re-registered.
+ */
+ private void notifyReRegistered(QName ntName) {
+ // copy listeners to array to avoid ConcurrentModificationException
+ NodeTypeRegistryListener[] la = new NodeTypeRegistryListener[listeners.size()];
+ Iterator iter = listeners.values().iterator();
+ int cnt = 0;
+ while (iter.hasNext()) {
+ la[cnt++] = (NodeTypeRegistryListener) iter.next();
+ }
+ for (int i = 0; i < la.length; i++) {
+ if (la[i] != null) {
+ la[i].nodeTypeReRegistered(ntName);
+ }
+ }
+ }
+
+ /**
* Notify the listeners that a node type <code>ntName</code> has been unregistered.
*/
private void notifyUnregistered(QName ntName) {
@@ -1052,29 +1128,10 @@
throws InvalidNodeTypeDefException, RepositoryException {
// validate and register new node type definition
EffectiveNodeType ent = internalRegister(ntd);
+
// persist new node type definition
customNTDefs.add(ntd);
- OutputStream out = null;
- try {
- out = customNodeTypesResource.getOutputStream();
- customNTDefs.store(out, nsReg);
- } catch (IOException ioe) {
- String error = "internal error: failed to write custom node type definition to " + customNodeTypesResource.getPath();
- log.error(error, ioe);
- throw new RepositoryException(error, ioe);
- } catch (FileSystemException fse) {
- String error = "internal error: failed to write custom node type definition to " + customNodeTypesResource.getPath();
- log.error(error, fse);
- throw new RepositoryException(error, fse);
- } finally {
- if (out != null) {
- try {
- out.close();
- } catch (IOException ioe) {
- // ignore
- }
- }
- }
+ persistCustomNTDefs();
// notify listeners
notifyRegistered(ntd.getName());
@@ -1131,27 +1188,7 @@
QName ntName = (QName) iter.next();
customNTDefs.add((NodeTypeDef) registeredNTDefs.get(ntName));
}
- OutputStream out = null;
- try {
- out = customNodeTypesResource.getOutputStream();
- customNTDefs.store(out, nsReg);
- } catch (IOException ioe) {
- String error = "internal error: failed to write custom node type definition to " + customNodeTypesResource.getPath();
- log.error(error, ioe);
- throw new RepositoryException(error, ioe);
- } catch (FileSystemException fse) {
- String error = "internal error: failed to write custom node type definition to " + customNodeTypesResource.getPath();
- log.error(error, fse);
- throw new RepositoryException(error, fse);
- } finally {
- if (out != null) {
- try {
- out.close();
- } catch (IOException ioe) {
- // ignore
- }
- }
- }
+ persistCustomNTDefs();
// notify listeners
for (Iterator iter = newNTNames.iterator(); iter.hasNext();) {
@@ -1217,48 +1254,11 @@
throw new RepositoryException("not yet implemented");
}
- NodeTypeDef ntd = (NodeTypeDef) registeredNTDefs.get(name);
- registeredNTDefs.remove(name);
- // remove effective node type from aggregates cache
- entCache.remove(new QName[]{name});
-
- // remove poperty & child node definitions
- PropDef[] pda = ntd.getPropertyDefs();
- for (int i = 0; i < pda.length; i++) {
- PropDefId id = new PropDefId(pda[i]);
- propDefs.remove(id);
- }
- ChildNodeDef[] nda = ntd.getChildNodeDefs();
- for (int i = 0; i < nda.length; i++) {
- NodeDefId id = new NodeDefId(nda[i]);
- nodeDefs.remove(id);
- }
+ internalUnregister(name);
// persist removal of node type definition
customNTDefs.remove(name);
- OutputStream out = null;
- try {
- out = customNodeTypesResource.getOutputStream();
- customNTDefs.store(out, nsReg);
- } catch (IOException ioe) {
- String error = "internal error: failed to write custom node type definition to " + customNodeTypesResource.getPath();
- log.error(error, ioe);
- throw new RepositoryException(error, ioe);
- } catch (FileSystemException fse) {
- String error = "internal error: failed to write custom node type definition to " + customNodeTypesResource.getPath();
- log.error(error, fse);
- throw new RepositoryException(error, fse);
- } finally {
- if (out != null) {
- try {
- out.close();
- } catch (IOException ioe) {
- // ignore
- }
- }
- }
-
- // @todo remove also any node types & aggregates which have dependencies on this node type
+ persistCustomNTDefs();
// notify listeners
notifyUnregistered(name);
@@ -1274,59 +1274,90 @@
public synchronized EffectiveNodeType reregisterNodeType(NodeTypeDef ntd)
throws NoSuchNodeTypeException, InvalidNodeTypeDefException,
RepositoryException {
- QName name = ntd.getName();
- if (!registeredNTDefs.containsKey(name)) {
- throw new NoSuchNodeTypeException(name.toString());
- }
- if (builtInNTDefs.contains(name)) {
- throw new RepositoryException(name.toString() + ": can't reregister built-in node type.");
- }
-
- /**
- * validate new node type definition
- */
- validateNodeTypeDef(ntd);
-
- /**
- * build diff of current and new definition and determine type of change
- */
- NodeTypeDef ntdOld = (NodeTypeDef) registeredNTDefs.get(name);
- NodeTypeDefDiff diff = NodeTypeDefDiff.create(ntdOld, ntd);
- if (diff.isTrivial()) {
- /**
- * the change is trivial and has no effect on current content
- * (e.g. that would be the case when non-mandatory properties were
- * added)
- * todo re-register node type definition and update caches & notify listeners on re-registration
- */
- //return entNew;
- }
-
- /**
- * collect names of node types that have dependencies on the given
- * node type
- */
- Set dependentNTs = getDependentNodeTypes(name);
-
- /**
- * non-trivial change of node type definition
- * todo
- * 1. apply deep locks on root nodes in every workspace or alternatively
- * put repository in 'exclusive' or 'single-user' mode
- * 2. check if the given node type (or any node type that has
- * dependencies on this node type) is currently referenced by nodes
- * in the repository.
- * 3. check if applying changes to affected nodes would violate
- * existing node type constraints
- * 4. re-register node type definition and update caches
- * 5. notify listeners on re-registration
- * 7. apply and persist changes to affected nodes (e.g. update
- * definition id's, etc.)
- * 7. what else?
- */
- //unregisterNodeType(name);
- //return registerNodeType(ntd);
- throw new RepositoryException("not yet implemented");
+ QName name = ntd.getName();
+ if (!registeredNTDefs.containsKey(name)) {
+ throw new NoSuchNodeTypeException(name.toString());
+ }
+ if (builtInNTDefs.contains(name)) {
+ throw new RepositoryException(name.toString() + ": can't reregister built-in node type.");
+ }
+
+ /**
+ * validate new node type definition
+ */
+ validateNodeTypeDef(ntd);
+
+ /**
+ * build diff of current and new definition and determine type of change
+ */
+ NodeTypeDef ntdOld = (NodeTypeDef) registeredNTDefs.get(name);
+ NodeTypeDefDiff diff = NodeTypeDefDiff.create(ntdOld, ntd);
+ if (diff.isTrivial()) {
+ /**
+ * the change is trivial and has no effect on current content
+ * (e.g. that would be the case when non-mandatory properties were
+ * added);
+ * re-register node type definition and update caches &
+ * notify listeners on re-registration
+ */
+ internalUnregister(name);
+ // remove old node type definition from store
+ customNTDefs.remove(name);
+
+ EffectiveNodeType entNew = internalRegister(ntd);
+
+ // add new node type definition to store
+ customNTDefs.add(ntd);
+ // persist node type definitions
+ persistCustomNTDefs();
+
+ // notify listeners
+ notifyReRegistered(name);
+ return entNew;
+ }
+
+ /**
+ * collect names of node types that have dependencies on the given
+ * node type
+ */
+ Set dependentNTs = getDependentNodeTypes(name);
+
+ /**
+ * non-trivial change of node type definition
+ * todo
+ * 1. apply deep locks on root nodes in every workspace or alternatively
+ * put repository in 'exclusive' or 'single-user' mode
+ * 2. check if the given node type (or any node type that has
+ * dependencies on this node type) is currently referenced by nodes
+ * in the repository.
+ * 3. check if applying changes to affected nodes would violate
+ * existing node type constraints
+ * 4. apply and persist changes to affected nodes (e.g. update
+ * definition id's, etc.)
+ *
+ * the above checks/actions are absolutely necessary in order to
+ * guarantee integrity of repository content.
+ *
+ * throw exception while this is not implemented properly yet
+ */
+ boolean conflictingContent = true;
+ if (conflictingContent) {
+ throw new RepositoryException("not yet implemented");
+ }
+
+ // unregister old node type definition
+ internalUnregister(name);
+ // register new definition
+ EffectiveNodeType entNew = internalRegister(ntd);
+
+ // persist modified node type definitions
+ customNTDefs.remove(name);
+ customNTDefs.add(ntd);
+ persistCustomNTDefs();
+
+ // notify listeners
+ notifyReRegistered(name);
+ return entNew;
}
/**
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistryListener.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistryListener.java?view=diff&rev=122553&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistryListener.java&r1=122552&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistryListener.java&r2=122553
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistryListener.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistryListener.java Thu Dec 16 09:15:13 2004
@@ -34,6 +34,13 @@
public void nodeTypeRegistered(QName ntName);
/**
+ * Called when a node type has been re-registered.
+ *
+ * @param ntName name of the node type that has been registered
+ */
+ public void nodeTypeReRegistered(QName ntName);
+
+ /**
* Called when a node type has been deregistered.
*
* @param ntName name of the node type that has been unregistered