Author: angela
Date: Wed Jul 11 01:41:30 2007
New Revision: 555209
URL: http://svn.apache.org/viewvc?view=rev&rev=555209
Log:
minor improvement: remove unused instance fields
minor improvement: let TransientISFactory listen to states created by the WorkspaceItemStateFactory
JCR-1004 SPI: Add RepositoryService.getQNodeTypeDefinition
>> modify to RepositoryService.getQNodeTypeDefinitions(QName)
>> adjust SPI implementations
>> change NodeTypeRegistry to load definitions upon demand.
Modified:
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeManagerImpl.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistry.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistryImpl.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeStorage.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java
jackrabbit/trunk/contrib/spi/spi-logger/src/main/java/org/apache/jackrabbit/spi/logger/RepositoryServiceLogger.java
jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/client/ClientRepositoryService.java
jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/remote/RemoteRepositoryService.java
jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/server/ServerRepositoryService.java
jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
jackrabbit/trunk/contrib/spi/spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java Wed Jul 11 01:41:30 2007
@@ -138,7 +138,7 @@
nsMappings = new LocalNamespaceMappings(workspace.getNamespaceRegistryImpl());
// build nodetype manager
- ntManager = new NodeTypeManagerImpl(workspace.getNodeTypeRegistry(), this, getJcrValueFactory(), getQValueFactory());
+ ntManager = new NodeTypeManagerImpl(workspace.getNodeTypeRegistry(), this, getJcrValueFactory());
validator = new ItemStateValidator(this);
itemStateManager = createSessionItemStateManager(workspace.getUpdatableItemStateManager(), workspace.getItemStateFactory());
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Wed Jul 11 01:41:30 2007
@@ -160,7 +160,7 @@
Map repositoryDescriptors = service.getRepositoryDescriptors();
nsRegistry = createNamespaceRegistry(repositoryDescriptors);
QNodeDefinition rootNodeDef = service.getNodeDefinition(sessionInfo, service.getRootId(sessionInfo));
- ntRegistry = createNodeTypeRegistry(rootNodeDef, nsRegistry, repositoryDescriptors);
+ ntRegistry = createNodeTypeRegistry(rootNodeDef, nsRegistry);
changeFeed = createChangeFeed(pollTimeout);
definitionProvider = createDefinitionProvider(rootNodeDef, getEffectiveNodeTypeProvider());
@@ -346,7 +346,7 @@
* @return
*/
private TransientItemStateFactory createItemStateFactory() {
- ItemStateFactory isf = new WorkspaceItemStateFactory(service, sessionInfo, getItemDefinitionProvider());
+ WorkspaceItemStateFactory isf = new WorkspaceItemStateFactory(service, sessionInfo, getItemDefinitionProvider());
TransientItemStateFactory tisf = new TransientISFactory(isf, getItemDefinitionProvider());
return tisf;
}
@@ -385,13 +385,14 @@
* @return
* @throws RepositoryException
*/
- private NodeTypeRegistry createNodeTypeRegistry(QNodeDefinition rootNodeDef, NamespaceRegistry nsRegistry, Map descriptors) throws RepositoryException {
- Iterator it = service.getQNodeTypeDefinitions(sessionInfo);
- List ntDefs = new ArrayList();
- while (it.hasNext()) {
- ntDefs.add(it.next());
- }
+ private NodeTypeRegistry createNodeTypeRegistry(QNodeDefinition rootNodeDef, NamespaceRegistry nsRegistry) {
NodeTypeStorage ntst = new NodeTypeStorage() {
+ public Iterator getAllDefinitions() throws RepositoryException {
+ return service.getQNodeTypeDefinitions(sessionInfo);
+ }
+ public Iterator getDefinitions(QName[] nodeTypeNames) throws NoSuchNodeTypeException, RepositoryException {
+ return service.getQNodeTypeDefinitions(sessionInfo, nodeTypeNames);
+ }
public void registerNodeTypes(QNodeTypeDefinition[] nodeTypeDefs) throws NoSuchNodeTypeException, RepositoryException {
throw new UnsupportedOperationException("NodeType registration not yet defined by the SPI");
}
@@ -402,7 +403,7 @@
throw new UnsupportedOperationException("NodeType registration not yet defined by the SPI");
}
};
- return NodeTypeRegistryImpl.create(ntDefs, ntst, rootNodeDef, nsRegistry);
+ return NodeTypeRegistryImpl.create(ntst, rootNodeDef, nsRegistry);
}
/**
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeManagerImpl.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeManagerImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeManagerImpl.java Wed Jul 11 01:41:30 2007
@@ -29,7 +29,6 @@
import org.apache.jackrabbit.spi.QNodeDefinition;
import org.apache.jackrabbit.spi.QPropertyDefinition;
import org.apache.jackrabbit.spi.QNodeTypeDefinition;
-import org.apache.jackrabbit.spi.QValueFactory;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
@@ -77,11 +76,6 @@
private final ValueFactory valueFactory;
/**
- * The QValueFactory used to convert JCR values to qualified ones.
- */
- private final QValueFactory qValueFactory;
-
- /**
* A cache for NodeType instances created by this
* NodeTypeManager
*/
@@ -106,12 +100,11 @@
* @param nsResolver namespace resolver
*/
public NodeTypeManagerImpl(NodeTypeRegistry ntReg, ManagerProvider mgrProvider,
- ValueFactory valueFactory, QValueFactory qValueFactory) {
+ ValueFactory valueFactory) {
this.mgrProvider = mgrProvider;
this.ntReg = ntReg;
this.ntReg.addListener(this);
this.valueFactory = valueFactory;
- this.qValueFactory = qValueFactory;
// setup caches with soft references to node type
ntCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT);
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistry.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistry.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistry.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistry.java Wed Jul 11 01:41:30 2007
@@ -67,7 +67,7 @@
*
* @return the names of all registered node types.
*/
- public QName[] getRegisteredNodeTypes();
+ public QName[] getRegisteredNodeTypes() throws RepositoryException;
/**
* Validates the NodeTypeDef and returns
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistryImpl.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistryImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistryImpl.java Wed Jul 11 01:41:30 2007
@@ -38,7 +38,6 @@
import java.io.PrintStream;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
@@ -57,10 +56,8 @@
private final EffectiveNodeTypeCache entCache;
// map of node type names and node type definitions
- private final ConcurrentReaderHashMap registeredNTDefs;
-
- // definition of the root node
- private final QNodeDefinition rootNodeDef;
+ //private final ConcurrentReaderHashMap registeredNTDefs;
+ private final NodeTypeDefinitionMap registeredNTDefs;
// set of property definitions
private final Set propDefs;
@@ -90,9 +87,8 @@
* @return NodeTypeRegistry object
* @throws RepositoryException
*/
- public static NodeTypeRegistryImpl create(Collection nodeTypeDefs, NodeTypeStorage storage, QNodeDefinition rootNodeDef, NamespaceRegistry nsRegistry)
- throws RepositoryException {
- NodeTypeRegistryImpl ntRegistry = new NodeTypeRegistryImpl(nodeTypeDefs, storage, rootNodeDef, nsRegistry);
+ public static NodeTypeRegistryImpl create(NodeTypeStorage storage, QNodeDefinition rootNodeDef, NamespaceRegistry nsRegistry) {
+ NodeTypeRegistryImpl ntRegistry = new NodeTypeRegistryImpl(storage, rootNodeDef, nsRegistry);
return ntRegistry;
}
@@ -103,35 +99,21 @@
* @param nsRegistry
* @throws RepositoryException
*/
- private NodeTypeRegistryImpl(Collection nodeTypeDefs, NodeTypeStorage storage, QNodeDefinition rootNodeDef, NamespaceRegistry nsRegistry)
- throws RepositoryException {
+ private NodeTypeRegistryImpl(NodeTypeStorage storage, QNodeDefinition rootNodeDef, NamespaceRegistry nsRegistry) {
this.storage = storage;
this.validator = new DefinitionValidator(this, nsRegistry);
entCache = new BitsetENTCacheImpl();
- registeredNTDefs = new ConcurrentReaderHashMap();
+ //registeredNTDefs = new ConcurrentReaderHashMap();
+ registeredNTDefs = new NodeTypeDefinitionMap();
propDefs = new HashSet();
nodeDefs = new HashSet();
// setup definition of root node
- this.rootNodeDef = rootNodeDef;
synchronized (nodeDefs) {
nodeDefs.add(rootNodeDef);
}
-
- try {
- // validate & register the definitions
- /* Note: since the client reads all nodetypes from the server, it is
- * not able to distinguish between built-in and custom-defined
- * nodetypes (compared to Jackrabbit-core) */
- Map defMap = validator.validateNodeTypeDefs(nodeTypeDefs, new HashMap(registeredNTDefs));
- internalRegister(defMap);
- } catch (InvalidNodeTypeDefException intde) {
- String error = "Unexpected error: Found invalid node type definition.";
- log.debug(error);
- throw new RepositoryException(error, intde);
- }
}
//---------------------------------------------------< NodeTypeRegistry >---
@@ -154,8 +136,9 @@
/**
* @see NodeTypeRegistry#getRegisteredNodeTypes()
*/
- public QName[] getRegisteredNodeTypes() {
- return (QName[]) registeredNTDefs.keySet().toArray(new QName[registeredNTDefs.size()]);
+ public QName[] getRegisteredNodeTypes() throws RepositoryException {
+ Set qNames = registeredNTDefs.keySet();
+ return (QName[]) qNames.toArray(new QName[registeredNTDefs.size()]);
}
@@ -222,18 +205,14 @@
// do some preliminary checks
for (Iterator iter = nodeTypeNames.iterator(); iter.hasNext();) {
QName ntName = (QName) iter.next();
- if (!registeredNTDefs.containsKey(ntName)) {
- throw new NoSuchNodeTypeException(ntName.toString());
- }
-
- // check for node types other than those to be unregistered
- // that depend on the given node types
- Set dependents = getDependentNodeTypes(ntName);
+
+ // Best effort check for node types other than those to be
+ // unregistered that depend on the given node types
+ Set dependents = registeredNTDefs.getDependentNodeTypes(ntName);
dependents.removeAll(nodeTypeNames);
if (dependents.size() > 0) {
StringBuffer msg = new StringBuffer();
- msg.append(ntName
- + " can not be removed because the following node types depend on it: ");
+ msg.append(ntName).append(" can not be removed because the following node types depend on it: ");
for (Iterator depIter = dependents.iterator(); depIter.hasNext();) {
msg.append(depIter.next());
msg.append(" ");
@@ -290,7 +269,7 @@
throws NoSuchNodeTypeException {
QNodeTypeDefinition def = (QNodeTypeDefinition) registeredNTDefs.get(nodeTypeName);
if (def == null) {
- throw new NoSuchNodeTypeException(nodeTypeName.toString());
+ throw new NoSuchNodeTypeException("Nodetype " + nodeTypeName + " doesn't exist");
}
return def;
}
@@ -539,9 +518,13 @@
}
private void internalRegister(QNodeTypeDefinition ntd, EffectiveNodeTypeImpl ent) {
-
- // store new effective node type instance
- entCache.put(ent);
+ // store new effective node type instance if present. otherwise it
+ // will be created on demand.
+ if (ent != null) {
+ entCache.put(ent);
+ } else {
+ log.debug("Effective node type for " + ntd + " not yet built.");
+ }
// register nt-definition
registeredNTDefs.put(ntd.getQName(), ntd);
@@ -561,21 +544,22 @@
}
private void internalUnregister(QName name) {
- QNodeTypeDefinition ntd = (QNodeTypeDefinition) registeredNTDefs.get(name);
- registeredNTDefs.remove(name);
+ QNodeTypeDefinition ntd = (QNodeTypeDefinition) registeredNTDefs.remove(name);
entCache.invalidate(name);
- // remove property & child node definitions
- QPropertyDefinition[] pda = ntd.getPropertyDefs();
- synchronized (propDefs) {
- for (int i = 0; i < pda.length; i++) {
- propDefs.remove(pda[i]);
+ if (ntd != null) {
+ // remove property & child node definitions
+ QPropertyDefinition[] pda = ntd.getPropertyDefs();
+ synchronized (propDefs) {
+ for (int i = 0; i < pda.length; i++) {
+ propDefs.remove(pda[i]);
+ }
}
- }
- synchronized (nodeDefs) {
- QNodeDefinition[] nda = ntd.getChildNodeDefs();
- for (int i = 0; i < nda.length; i++) {
- nodeDefs.remove(nda[i]);
+ synchronized (nodeDefs) {
+ QNodeDefinition[] nda = ntd.getChildNodeDefs();
+ for (int i = 0; i < nda.length; i++) {
+ nodeDefs.remove(nda[i]);
+ }
}
}
}
@@ -587,32 +571,6 @@
}
}
- /**
- * Returns the names of those registered node types that have
- * dependencies on the given node type.
- *
- * @param nodeTypeName node type name
- * @return a set of node type QNames
- * @throws NoSuchNodeTypeException
- */
- private Set getDependentNodeTypes(QName nodeTypeName)
- throws NoSuchNodeTypeException {
- if (!registeredNTDefs.containsKey(nodeTypeName)) {
- throw new NoSuchNodeTypeException(nodeTypeName.toString());
- }
-
- // get names of those node types that have dependencies on the given nt
- HashSet names = new HashSet();
- Iterator iter = registeredNTDefs.values().iterator();
- while (iter.hasNext()) {
- QNodeTypeDefinition ntd = (QNodeTypeDefinition) iter.next();
- if (ntd.getDependencies().contains(nodeTypeName)) {
- names.add(ntd.getQName());
- }
- }
- return names;
- }
-
//-----------------------------------------------------------< Dumpable >---
/**
* {@inheritDoc}
@@ -620,87 +578,223 @@
public void dump(PrintStream ps) {
ps.println("NodeTypeRegistry (" + this + ")");
ps.println();
- ps.println("Registered NodeTypes:");
+ ps.println("Known NodeTypes:");
ps.println();
- Iterator iter = registeredNTDefs.values().iterator();
- while (iter.hasNext()) {
- QNodeTypeDefinition ntd = (QNodeTypeDefinition) iter.next();
- ps.println(ntd.getQName());
- QName[] supertypes = ntd.getSupertypes();
- ps.println("\tSupertypes");
- for (int i = 0; i < supertypes.length; i++) {
- ps.println("\t\t" + supertypes[i]);
- }
- ps.println("\tMixin\t" + ntd.isMixin());
- ps.println("\tOrderableChildNodes\t" + ntd.hasOrderableChildNodes());
- ps.println("\tPrimaryItemName\t" + (ntd.getPrimaryItemName() == null ? "" : ntd.getPrimaryItemName().toString()));
- QPropertyDefinition[] pd = ntd.getPropertyDefs();
- for (int i = 0; i < pd.length; i++) {
- ps.print("\tPropertyDefinition");
- ps.println(" (declared in " + pd[i].getDeclaringNodeType() + ") ");
- ps.println("\t\tName\t\t" + (pd[i].definesResidual() ? "*" : pd[i].getQName().toString()));
- String type = pd[i].getRequiredType() == 0 ? "null" : PropertyType.nameFromValue(pd[i].getRequiredType());
- ps.println("\t\tRequiredType\t" + type);
- String[] vca = pd[i].getValueConstraints();
- StringBuffer constraints = new StringBuffer();
- if (vca == null) {
- constraints.append("");
- } else {
- for (int n = 0; n < vca.length; n++) {
- if (constraints.length() > 0) {
- constraints.append(", ");
- }
- constraints.append(vca[n]);
- }
+ registeredNTDefs.dump(ps);
+ ps.println();
+
+ entCache.dump(ps);
+ }
+
+ //--------------------------------------------------------< inner class >---
+ /**
+ * Inner class representing the map of QNodeTypeDefinitions
+ * that have been loaded yet.
+ */
+ private class NodeTypeDefinitionMap implements Map, Dumpable {
+
+ // map of node type names and node type definitions
+ private final ConcurrentReaderHashMap nodetypeDefinitions = new ConcurrentReaderHashMap();
+
+ /**
+ * Returns the names of those registered node types that have
+ * dependencies on the given node type.
+ * Note, that the returned Set may not be complete with respect
+ * to all node types registered within the repository. Instead it
+ * will only contain those node type definitions that are known so far.
+ *
+ * @param nodeTypeName node type name
+ * @return a set of node type QNames
+ * @throws NoSuchNodeTypeException
+ */
+ private Set getDependentNodeTypes(QName nodeTypeName) throws NoSuchNodeTypeException {
+ if (!nodetypeDefinitions.containsKey(nodeTypeName)) {
+ throw new NoSuchNodeTypeException(nodeTypeName.toString());
+ }
+ // get names of those node types that have dependencies on the
+ // node type with the given nodeTypeName.
+ HashSet names = new HashSet();
+ Iterator iter = nodetypeDefinitions.values().iterator();
+ while (iter.hasNext()) {
+ QNodeTypeDefinition ntd = (QNodeTypeDefinition) iter.next();
+ if (ntd.getDependencies().contains(nodeTypeName)) {
+ names.add(ntd.getQName());
}
- ps.println("\t\tValueConstraints\t" + constraints.toString());
- QValue[] defVals = pd[i].getDefaultValues();
- StringBuffer defaultValues = new StringBuffer();
- if (defVals == null) {
- defaultValues.append("");
- } else {
- for (int n = 0; n < defVals.length; n++) {
- if (defaultValues.length() > 0) {
- defaultValues.append(", ");
+ }
+ return names;
+ }
+
+ private void updateInternalMap(Iterator definitions) {
+ // since definition were retrieved from the storage, valiation
+ // can be omitted -> register without building effective-nodetype.
+ // TODO: check if correct
+ while (definitions.hasNext()) {
+ internalRegister((QNodeTypeDefinition) definitions.next(), null);
+ }
+ }
+
+ //------------------------------------------------------------< Map >---
+ public int size() {
+ return nodetypeDefinitions.size();
+ }
+
+ public void clear() {
+ throw new UnsupportedOperationException("Implementation missing");
+ }
+
+ public boolean isEmpty() {
+ return nodetypeDefinitions.isEmpty();
+ }
+
+ public boolean containsKey(Object key) {
+ if (!(key instanceof QName)) {
+ return false;
+ }
+ return get(key) != null;
+ }
+
+ public boolean containsValue(Object value) {
+ if (!(value instanceof QNodeTypeDefinition)) {
+ return false;
+ }
+ return get(((QNodeTypeDefinition)value).getQName()) != null;
+ }
+
+ public Set keySet() {
+ // to be aware of all (recently) registered nodetypes retrieve
+ // complete set from the storage again and add missing / replace
+ // existing definitions.
+ try {
+ Iterator it = storage.getAllDefinitions();
+ updateInternalMap(it);
+ } catch (RepositoryException e) {
+ log.error(e.getMessage());
+ }
+ return nodetypeDefinitions.keySet();
+ }
+
+ public Collection values() {
+ // make sure all node type definitions have been loaded.
+ keySet();
+ // and retrieve the collection containing all definitions.
+ return nodetypeDefinitions.values();
+ }
+
+ public Object put(Object key, Object value) {
+ return nodetypeDefinitions.put(key, value);
+ }
+
+ public void putAll(Map t) {
+ throw new UnsupportedOperationException("Implementation missing");
+ }
+
+ public Set entrySet() {
+ // make sure all node type definitions have been loaded.
+ keySet();
+ return nodetypeDefinitions.entrySet();
+ }
+
+ public Object get(Object key) {
+ if (!(key instanceof QName)) {
+ throw new IllegalArgumentException();
+ }
+ QNodeTypeDefinition def = (QNodeTypeDefinition) nodetypeDefinitions.get(key);
+ if (def == null) {
+ try {
+ // node type does either not exist or hasn't been loaded yet
+ Iterator it = storage.getDefinitions(new QName[] {(QName) key});
+ updateInternalMap(it);
+ } catch (RepositoryException e) {
+ log.debug(e.getMessage());
+ }
+ }
+ def = (QNodeTypeDefinition) nodetypeDefinitions.get(key);
+ return def;
+ }
+
+ public Object remove(Object key) {
+ return (QNodeTypeDefinition) nodetypeDefinitions.remove(key);
+ }
+
+ //-------------------------------------------------------< Dumpable >---
+ public void dump(PrintStream ps) {
+ Iterator iter = nodetypeDefinitions.values().iterator();
+ while (iter.hasNext()) {
+ QNodeTypeDefinition ntd = (QNodeTypeDefinition) iter.next();
+ ps.println(ntd.getQName());
+ QName[] supertypes = ntd.getSupertypes();
+ ps.println("\tSupertypes");
+ for (int i = 0; i < supertypes.length; i++) {
+ ps.println("\t\t" + supertypes[i]);
+ }
+ ps.println("\tMixin\t" + ntd.isMixin());
+ ps.println("\tOrderableChildNodes\t" + ntd.hasOrderableChildNodes());
+ ps.println("\tPrimaryItemName\t" + (ntd.getPrimaryItemName() == null ? "" : ntd.getPrimaryItemName().toString()));
+ QPropertyDefinition[] pd = ntd.getPropertyDefs();
+ for (int i = 0; i < pd.length; i++) {
+ ps.print("\tPropertyDefinition");
+ ps.println(" (declared in " + pd[i].getDeclaringNodeType() + ") ");
+ ps.println("\t\tName\t\t" + (pd[i].definesResidual() ? "*" : pd[i].getQName().toString()));
+ String type = pd[i].getRequiredType() == 0 ? "null" : PropertyType.nameFromValue(pd[i].getRequiredType());
+ ps.println("\t\tRequiredType\t" + type);
+ String[] vca = pd[i].getValueConstraints();
+ StringBuffer constraints = new StringBuffer();
+ if (vca == null) {
+ constraints.append("");
+ } else {
+ for (int n = 0; n < vca.length; n++) {
+ if (constraints.length() > 0) {
+ constraints.append(", ");
+ }
+ constraints.append(vca[n]);
}
- try {
- defaultValues.append(defVals[n].getString());
- } catch (RepositoryException e) {
- defaultValues.append(defVals[n].toString());
+ }
+ ps.println("\t\tValueConstraints\t" + constraints.toString());
+ QValue[] defVals = pd[i].getDefaultValues();
+ StringBuffer defaultValues = new StringBuffer();
+ if (defVals == null) {
+ defaultValues.append("");
+ } else {
+ for (int n = 0; n < defVals.length; n++) {
+ if (defaultValues.length() > 0) {
+ defaultValues.append(", ");
+ }
+ try {
+ defaultValues.append(defVals[n].getString());
+ } catch (RepositoryException e) {
+ defaultValues.append(defVals[n].toString());
+ }
}
}
+ ps.println("\t\tDefaultValue\t" + defaultValues.toString());
+ ps.println("\t\tAutoCreated\t" + pd[i].isAutoCreated());
+ ps.println("\t\tMandatory\t" + pd[i].isMandatory());
+ ps.println("\t\tOnVersion\t" + OnParentVersionAction.nameFromValue(pd[i].getOnParentVersion()));
+ ps.println("\t\tProtected\t" + pd[i].isProtected());
+ ps.println("\t\tMultiple\t" + pd[i].isMultiple());
}
- ps.println("\t\tDefaultValue\t" + defaultValues.toString());
- ps.println("\t\tAutoCreated\t" + pd[i].isAutoCreated());
- ps.println("\t\tMandatory\t" + pd[i].isMandatory());
- ps.println("\t\tOnVersion\t" + OnParentVersionAction.nameFromValue(pd[i].getOnParentVersion()));
- ps.println("\t\tProtected\t" + pd[i].isProtected());
- ps.println("\t\tMultiple\t" + pd[i].isMultiple());
- }
- QNodeDefinition[] nd = ntd.getChildNodeDefs();
- for (int i = 0; i < nd.length; i++) {
- ps.print("\tNodeDefinition");
- ps.println(" (declared in " + nd[i].getDeclaringNodeType() + ") ");
- ps.println("\t\tName\t\t" + (nd[i].definesResidual() ? "*" : nd[i].getQName().toString()));
- QName[] reqPrimaryTypes = nd[i].getRequiredPrimaryTypes();
- if (reqPrimaryTypes != null && reqPrimaryTypes.length > 0) {
- for (int n = 0; n < reqPrimaryTypes.length; n++) {
- ps.print("\t\tRequiredPrimaryType\t" + reqPrimaryTypes[n]);
+ QNodeDefinition[] nd = ntd.getChildNodeDefs();
+ for (int i = 0; i < nd.length; i++) {
+ ps.print("\tNodeDefinition");
+ ps.println(" (declared in " + nd[i].getDeclaringNodeType() + ") ");
+ ps.println("\t\tName\t\t" + (nd[i].definesResidual() ? "*" : nd[i].getQName().toString()));
+ QName[] reqPrimaryTypes = nd[i].getRequiredPrimaryTypes();
+ if (reqPrimaryTypes != null && reqPrimaryTypes.length > 0) {
+ for (int n = 0; n < reqPrimaryTypes.length; n++) {
+ ps.print("\t\tRequiredPrimaryType\t" + reqPrimaryTypes[n]);
+ }
}
+ QName defPrimaryType = nd[i].getDefaultPrimaryType();
+ if (defPrimaryType != null) {
+ ps.print("\n\t\tDefaultPrimaryType\t" + defPrimaryType);
+ }
+ ps.println("\n\t\tAutoCreated\t" + nd[i].isAutoCreated());
+ ps.println("\t\tMandatory\t" + nd[i].isMandatory());
+ ps.println("\t\tOnVersion\t" + OnParentVersionAction.nameFromValue(nd[i].getOnParentVersion()));
+ ps.println("\t\tProtected\t" + nd[i].isProtected());
+ ps.println("\t\tAllowsSameNameSiblings\t" + nd[i].allowsSameNameSiblings());
}
- QName defPrimaryType = nd[i].getDefaultPrimaryType();
- if (defPrimaryType != null) {
- ps.print("\n\t\tDefaultPrimaryType\t" + defPrimaryType);
- }
- ps.println("\n\t\tAutoCreated\t" + nd[i].isAutoCreated());
- ps.println("\t\tMandatory\t" + nd[i].isMandatory());
- ps.println("\t\tOnVersion\t" + OnParentVersionAction.nameFromValue(nd[i].getOnParentVersion()));
- ps.println("\t\tProtected\t" + nd[i].isProtected());
- ps.println("\t\tAllowsSameNameSiblings\t" + nd[i].allowsSameNameSiblings());
}
}
- ps.println();
-
- entCache.dump(ps);
}
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeStorage.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeStorage.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeStorage.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeStorage.java Wed Jul 11 01:41:30 2007
@@ -21,11 +21,32 @@
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.RepositoryException;
+import java.util.Iterator;
/**
* NodeTypeStorage...
*/
public interface NodeTypeStorage {
+
+ /**
+ * Returns an Iterator over all node type definitions registered.
+ *
+ * @return
+ * @throws RepositoryException
+ */
+ public Iterator getAllDefinitions() throws RepositoryException;
+
+ /**
+ * Returns the QNodeTypeDefinitions for the given node type
+ * names. The implementation is free to return additional definitions e.g.
+ * dependencies.
+ *
+ * @param nodeTypeNames
+ * @return
+ * @throws NoSuchNodeTypeException
+ * @throws RepositoryException
+ */
+ public Iterator getDefinitions(QName[] nodeTypeNames) throws NoSuchNodeTypeException, RepositoryException;
public void registerNodeTypes(QNodeTypeDefinition[] nodeTypeDefs) throws NoSuchNodeTypeException, RepositoryException;
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java Wed Jul 11 01:41:30 2007
@@ -34,16 +34,20 @@
/**
* TransientISFactory...
*/
-public final class TransientISFactory extends AbstractItemStateFactory implements TransientItemStateFactory {
+public final class TransientISFactory extends AbstractItemStateFactory implements TransientItemStateFactory, ItemStateCreationListener {
private static Logger log = LoggerFactory.getLogger(TransientISFactory.class);
private final ItemStateFactory workspaceStateFactory;
private final ItemDefinitionProvider defProvider;
- public TransientISFactory(ItemStateFactory workspaceStateFactory, ItemDefinitionProvider defProvider) {
+ public TransientISFactory(AbstractItemStateFactory workspaceStateFactory, ItemDefinitionProvider defProvider) {
this.workspaceStateFactory = workspaceStateFactory;
this.defProvider = defProvider;
+ // start listening to 'creations' on the workspaceStateFactory (and
+ // consequently skip an extra notification if the has been built by the
+ // workspaceStateFactory.
+ workspaceStateFactory.addCreationListener(this);
}
//------------------------------------------< TransientItemStateFactory >---
@@ -82,8 +86,6 @@
*/
public NodeState createRootState(NodeEntry entry) throws ItemNotFoundException, RepositoryException {
NodeState state = workspaceStateFactory.createRootState(entry);
- notifyCreated(state);
-
return state;
}
@@ -94,8 +96,6 @@
public NodeState createNodeState(NodeId nodeId, NodeEntry entry)
throws ItemNotFoundException, RepositoryException {
NodeState state = workspaceStateFactory.createNodeState(nodeId, entry);
- notifyCreated(state);
-
return state;
}
@@ -106,8 +106,6 @@
public NodeState createDeepNodeState(NodeId nodeId, NodeEntry anyParent)
throws ItemNotFoundException, RepositoryException {
NodeState state = workspaceStateFactory.createDeepNodeState(nodeId, anyParent);
- notifyCreated(state);
-
return state;
}
@@ -118,10 +116,7 @@
public PropertyState createPropertyState(PropertyId propertyId,
PropertyEntry entry)
throws ItemNotFoundException, RepositoryException {
-
PropertyState state = workspaceStateFactory.createPropertyState(propertyId, entry);
- notifyCreated(state);
-
return state;
}
@@ -131,8 +126,6 @@
*/
public PropertyState createDeepPropertyState(PropertyId propertyId, NodeEntry anyParent) throws ItemNotFoundException, RepositoryException {
PropertyState state = workspaceStateFactory.createDeepPropertyState(propertyId, anyParent);
- notifyCreated(state);
-
return state;
}
@@ -153,5 +146,21 @@
return EmptyNodeReferences.getInstance();
}
return workspaceStateFactory.getNodeReferences(nodeState);
+ }
+
+ //------------------------------------------< ItemStateCreationListener >---
+ /**
+ * @see ItemStateCreationListener#created(ItemState)
+ */
+ public void created(ItemState state) {
+ log.debug("ItemState created by WorkspaceItemStateFactory");
+ notifyCreated(state);
+ }
+
+ /**
+ * @see ItemStateCreationListener#statusChanged(ItemState, int)
+ */
+ public void statusChanged(ItemState state, int previousStatus) {
+ // ignore
}
}
Modified: jackrabbit/trunk/contrib/spi/spi-logger/src/main/java/org/apache/jackrabbit/spi/logger/RepositoryServiceLogger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi-logger/src/main/java/org/apache/jackrabbit/spi/logger/RepositoryServiceLogger.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi-logger/src/main/java/org/apache/jackrabbit/spi/logger/RepositoryServiceLogger.java (original)
+++ jackrabbit/trunk/contrib/spi/spi-logger/src/main/java/org/apache/jackrabbit/spi/logger/RepositoryServiceLogger.java Wed Jul 11 01:41:30 2007
@@ -32,7 +32,6 @@
import org.apache.jackrabbit.spi.QueryInfo;
import org.apache.jackrabbit.spi.EventFilter;
import org.apache.jackrabbit.spi.EventBundle;
-import org.apache.jackrabbit.spi.QNodeTypeDefinition;
import org.apache.jackrabbit.name.QName;
import org.apache.jackrabbit.name.Path;
@@ -613,14 +612,14 @@
}, "getQNodeTypeDefinitions(SessionInfo)", new Object[]{});
}
- public QNodeTypeDefinition getQNodeTypeDefinition(
- final SessionInfo sessionInfo,final QName name)
+ public Iterator getQNodeTypeDefinitions(
+ final SessionInfo sessionInfo,final QName[] ntNames)
throws RepositoryException {
- return (QNodeTypeDefinition) execute(new Callable() {
+ return (Iterator) execute(new Callable() {
public Object call() throws RepositoryException {
- return service.getQNodeTypeDefinition(sessionInfo, name);
+ return service.getQNodeTypeDefinitions(sessionInfo, ntNames);
}
- }, "getQNodeTypeDefinition(SessionInfo,QName)", new Object[]{name});
+ }, "getQNodeTypeDefinition(SessionInfo,QName)", new Object[]{ntNames});
}
private Object execute(Callable callable, String methodName, Object[] args)
Modified: jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/client/ClientRepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/client/ClientRepositoryService.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/client/ClientRepositoryService.java (original)
+++ jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/client/ClientRepositoryService.java Wed Jul 11 01:41:30 2007
@@ -742,12 +742,10 @@
/**
* {@inheritDoc}
*/
- public Iterator getQNodeTypeDefinitions(
- SessionInfo sessionInfo) throws RepositoryException {
+ public Iterator getQNodeTypeDefinitions(SessionInfo sessionInfo) throws RepositoryException {
try {
- QNodeTypeDefinition[] ntDefs = remoteService.getQNodeTypeDefinitions(
- getRemoteSessionInfo(sessionInfo));
- return Arrays.asList(ntDefs).iterator();
+ RemoteIterator it = remoteService.getQNodeTypeDefinitions(getRemoteSessionInfo(sessionInfo));
+ return new ClientIterator(it);
} catch (RemoteException e) {
throw new RemoteRepositoryException(e);
}
@@ -756,16 +754,22 @@
/**
* {@inheritDoc}
*/
- public QNodeTypeDefinition getQNodeTypeDefinition(SessionInfo sessionInfo, QName nodetypeName) throws RepositoryException {
+ public Iterator getQNodeTypeDefinitions(SessionInfo sessionInfo, QName[] nodetypeNames) throws RepositoryException {
try {
- return remoteService.getQNodeTypeDefinition(getRemoteSessionInfo(sessionInfo), nodetypeName);
+ RemoteIterator it = remoteService.getQNodeTypeDefinitions(getRemoteSessionInfo(sessionInfo), nodetypeNames);
+ return new ClientIterator(it);
} catch (RemoteException e) {
throw new RemoteRepositoryException(e);
}
}
//------------------------------< internal >--------------------------------
-
+ /**
+ *
+ * @param sessionInfo
+ * @return
+ * @throws RepositoryException
+ */
private RemoteSessionInfo getRemoteSessionInfo(SessionInfo sessionInfo)
throws RepositoryException {
if (sessionInfo instanceof ClientSessionInfo) {
Modified: jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/remote/RemoteRepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/remote/RemoteRepositoryService.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/remote/RemoteRepositoryService.java (original)
+++ jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/remote/RemoteRepositoryService.java Wed Jul 11 01:41:30 2007
@@ -25,7 +25,6 @@
import org.apache.jackrabbit.spi.LockInfo;
import org.apache.jackrabbit.spi.EventFilter;
import org.apache.jackrabbit.spi.EventBundle;
-import org.apache.jackrabbit.spi.QNodeTypeDefinition;
import org.apache.jackrabbit.spi.SessionInfo;
import org.apache.jackrabbit.spi.NodeInfo;
import org.apache.jackrabbit.spi.commons.SerializableBatch;
@@ -671,11 +670,11 @@
* @throws RemoteException if an error occurs.
* @see org.apache.jackrabbit.spi.RepositoryService#getQNodeTypeDefinitions(org.apache.jackrabbit.spi.SessionInfo)
*/
- public QNodeTypeDefinition[] getQNodeTypeDefinitions(RemoteSessionInfo sessionInfo)
+ public RemoteIterator getQNodeTypeDefinitions(RemoteSessionInfo sessionInfo)
throws RepositoryException, RemoteException;
/**
- * Retrieve the QNodeTypeDefinition for the given node type name.
+ * Retrieve the QNodeTypeDefinitions for the given node type names.
*
* @param sessionInfo
* @return
@@ -683,5 +682,5 @@
* @throws RemoteException if an error occurs.
* @see org.apache.jackrabbit.spi.RepositoryService#getQNodeTypeDefinition(org.apache.jackrabbit.spi.SessionInfo, QName)
*/
- public QNodeTypeDefinition getQNodeTypeDefinition(RemoteSessionInfo sessionInfo, QName ntName) throws RepositoryException, RemoteException;
+ public RemoteIterator getQNodeTypeDefinitions(RemoteSessionInfo sessionInfo, QName[] ntNames) throws RepositoryException, RemoteException;
}
Modified: jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/server/ServerRepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/server/ServerRepositoryService.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/server/ServerRepositoryService.java (original)
+++ jackrabbit/trunk/contrib/spi/spi-rmi/src/main/java/org/apache/jackrabbit/spi/rmi/server/ServerRepositoryService.java Wed Jul 11 01:41:30 2007
@@ -820,35 +820,23 @@
/**
* {@inheritDoc}
*/
- public QNodeTypeDefinition[] getQNodeTypeDefinitions(RemoteSessionInfo sessionInfo)
+ public RemoteIterator getQNodeTypeDefinitions(RemoteSessionInfo sessionInfo)
throws RepositoryException, RemoteException {
Iterator it = service.getQNodeTypeDefinitions(getSessionInfo(sessionInfo));
- List nts = new ArrayList();
- while (it.hasNext()) {
- QNodeTypeDefinition nt = (QNodeTypeDefinition) it.next();
- if (nt instanceof Serializable) {
- nts.add(nt);
- } else {
- nts.add(new QNodeTypeDefinitionImpl(nt));
- }
- }
- return (QNodeTypeDefinition[]) nts.toArray(new QNodeTypeDefinition[nts.size()]);
+ return getQNodeTypeDefinitionIterator(it);
}
/**
* {@inheritDoc}
*/
- public QNodeTypeDefinition getQNodeTypeDefinition(RemoteSessionInfo sessionInfo, QName ntName)
+ public RemoteIterator getQNodeTypeDefinitions(RemoteSessionInfo sessionInfo,
+ QName[] ntNames)
throws RepositoryException, RemoteException {
- QNodeTypeDefinition ntDef = service.getQNodeTypeDefinition(getSessionInfo(sessionInfo), ntName);
- if (ntDef instanceof Serializable) {
- return ntDef;
- } else {
- return new QNodeTypeDefinitionImpl(ntDef);
- }
+ Iterator it = service.getQNodeTypeDefinitions(getSessionInfo(sessionInfo), ntNames);
+ return getQNodeTypeDefinitionIterator(it);
}
- //---------------------------< internal >-----------------------------------
+ //---------------------------< internal >-----------------------------------
/**
* Creates a server session info for the given sessionInfo.
*
@@ -920,5 +908,24 @@
}
}
return filters;
+ }
+
+ /**
+ *
+ * @param it
+ * @return
+ * @throws RemoteException
+ */
+ private RemoteIterator getQNodeTypeDefinitionIterator(Iterator it) throws RemoteException {
+ List nts = new ArrayList();
+ while (it.hasNext()) {
+ QNodeTypeDefinition nt = (QNodeTypeDefinition) it.next();
+ if (nt instanceof Serializable) {
+ nts.add(nt);
+ } else {
+ nts.add(new QNodeTypeDefinitionImpl(nt));
+ }
+ }
+ return new ServerIterator(nts.iterator(), DEFAULT_BUFFER_SIZE);
}
}
Modified: jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java (original)
+++ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java Wed Jul 11 01:41:30 2007
@@ -769,10 +769,15 @@
public Iterator getQNodeTypeDefinitions(SessionInfo sessionInfo) throws RepositoryException;
/**
- * Retrieve a specific QNodeTypeDefinition.
+ * Retrieve QNodeTypeDefinitions for the given names. The
+ * implementation is free to return additional definitions which will (probably)
+ * be needed by the caller due to node type inheritance. The caller must be
+ * able to deal with any kind of additional QNodeTypeDefinitions
+ * present in the Iterator irrespective whether they have been
+ * loaded before or not.
*
* @param sessionInfo
- * @param nodetypeName name of node type to retrieve
+ * @param nodetypeNames names of node types to retrieve
* @return {@link QNodeTypeDefinition}
* @throws javax.jcr.RepositoryException
* @see javax.jcr.Workspace#getNodeTypeManager()
@@ -781,5 +786,5 @@
* @see javax.jcr.nodetype.NodeTypeManager#getPrimaryNodeTypes()
* @see javax.jcr.nodetype.NodeTypeManager#getNodeType(String)
*/
- public QNodeTypeDefinition getQNodeTypeDefinition(SessionInfo sessionInfo, QName nodetypeName) throws RepositoryException;
+ public Iterator getQNodeTypeDefinitions(SessionInfo sessionInfo, QName[] nodetypeNames) throws RepositoryException;
}
Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Wed Jul 11 01:41:30 2007
@@ -1822,21 +1822,7 @@
method.checkSuccess();
Document reportDoc = method.getResponseBodyAsDocument();
- ElementIterator it = DomUtil.getChildren(reportDoc.getDocumentElement(), NodeTypeConstants.NODETYPE_ELEMENT, null);
- List ntDefs = new ArrayList();
- NamespaceResolver resolver = new NamespaceResolverImpl(sessionInfo);
- while (it.hasNext()) {
- ntDefs.add(new QNodeTypeDefinitionImpl(it.nextElement(), resolver, getQValueFactory()));
- }
- // refresh node type definitions map
- synchronized (nodeTypeDefinitions) {
- nodeTypeDefinitions.clear();
- for (Iterator defIt = ntDefs.iterator(); defIt.hasNext(); ) {
- QNodeTypeDefinition def = (QNodeTypeDefinition) defIt.next();
- nodeTypeDefinitions.put(def.getQName(), def);
- }
- }
- return ntDefs.iterator();
+ return retrieveQNodeTypeDefinitions(sessionInfo, reportDoc);
} catch (IOException e) {
throw new RepositoryException(e);
} catch (DavException e) {
@@ -1851,16 +1837,18 @@
/**
* {@inheritDoc}
*/
- public QNodeTypeDefinition getQNodeTypeDefinition(SessionInfo sessionInfo, QName nodetypeName) throws RepositoryException {
+ public Iterator getQNodeTypeDefinitions(SessionInfo sessionInfo, QName[] nodetypeNames) throws RepositoryException {
ReportMethod method = null;
try {
NamespaceResolver resolver = new NamespaceResolverImpl(sessionInfo);
ReportInfo info = new ReportInfo(NodeTypesReport.NODETYPES_REPORT, DEPTH_0);
- Element el = DomUtil.createElement(domFactory, NodeTypeConstants.XML_NODETYPE, NodeTypeConstants.NAMESPACE);
- String jcrName = NameFormat.format(nodetypeName, resolver);
- DomUtil.addChildElement(el, NodeTypeConstants.XML_NODETYPENAME, NodeTypeConstants.NAMESPACE, jcrName);
- info.setContentElement(el);
+ for (int i = 0; i < nodetypeNames.length; i++) {
+ Element el = DomUtil.createElement(domFactory, NodeTypeConstants.XML_NODETYPE, NodeTypeConstants.NAMESPACE);
+ String jcrName = NameFormat.format(nodetypeNames[i], resolver);
+ DomUtil.addChildElement(el, NodeTypeConstants.XML_NODETYPENAME, NodeTypeConstants.NAMESPACE, jcrName);
+ info.setContentElement(el);
+ }
String workspaceUri = uriResolver.getWorkspaceUri(sessionInfo.getWorkspaceName());
method = new ReportMethod(workspaceUri, info);
@@ -1868,13 +1856,7 @@
method.checkSuccess();
Document reportDoc = method.getResponseBodyAsDocument();
- Element ntDefEl = DomUtil.getChildElement(reportDoc.getDocumentElement(), NodeTypeConstants.NODETYPE_ELEMENT, null);
- QNodeTypeDefinition def = new QNodeTypeDefinitionImpl(ntDefEl, resolver, getQValueFactory());
- // refresh node type definitions map
- synchronized (nodeTypeDefinitions) {
- nodeTypeDefinitions.put(def.getQName(), def);
- }
- return def;
+ return retrieveQNodeTypeDefinitions(sessionInfo, reportDoc);
} catch (IOException e) {
throw new RepositoryException(e);
} catch (DavException e) {
@@ -1886,6 +1868,31 @@
method.releaseConnection();
}
}
+ }
+
+ /**
+ *
+ * @param sessionInfo
+ * @param reportDoc
+ * @return
+ * @throws RepositoryException
+ */
+ private Iterator retrieveQNodeTypeDefinitions(SessionInfo sessionInfo, Document reportDoc) throws RepositoryException {
+ ElementIterator it = DomUtil.getChildren(reportDoc.getDocumentElement(), NodeTypeConstants.NODETYPE_ELEMENT, null);
+ List ntDefs = new ArrayList();
+ NamespaceResolver resolver = new NamespaceResolverImpl(sessionInfo);
+ while (it.hasNext()) {
+ ntDefs.add(new QNodeTypeDefinitionImpl(it.nextElement(), resolver, getQValueFactory()));
+ }
+ // refresh node type definitions map
+ synchronized (nodeTypeDefinitions) {
+ nodeTypeDefinitions.clear();
+ for (Iterator defIt = ntDefs.iterator(); defIt.hasNext(); ) {
+ QNodeTypeDefinition def = (QNodeTypeDefinition) defIt.next();
+ nodeTypeDefinitions.put(def.getQName(), def);
+ }
+ }
+ return ntDefs.iterator();
}
/**
Modified: jackrabbit/trunk/contrib/spi/spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java?view=diff&rev=555209&r1=555208&r2=555209
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java Wed Jul 11 01:41:30 2007
@@ -23,7 +23,6 @@
import org.apache.jackrabbit.spi.ItemId;
import org.apache.jackrabbit.spi.NodeId;
import org.apache.jackrabbit.spi.QNodeDefinition;
-import org.apache.jackrabbit.spi.QNodeTypeDefinition;
import org.apache.jackrabbit.spi.QPropertyDefinition;
import org.apache.jackrabbit.spi.PropertyId;
import org.apache.jackrabbit.spi.NodeInfo;
@@ -1000,16 +999,26 @@
/**
* {@inheritDoc}
*/
- public QNodeTypeDefinition getQNodeTypeDefinition(SessionInfo sessionInfo, QName nodetypeName) throws RepositoryException {
+ public Iterator getQNodeTypeDefinitions(SessionInfo sessionInfo, QName[] nodetypeNames) throws RepositoryException {
SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
NodeTypeManager ntMgr = sInfo.getSession().getWorkspace().getNodeTypeManager();
- try {
- String ntName = NameFormat.format(nodetypeName, sInfo.getNamespaceResolver());
- NodeType nt = ntMgr.getNodeType(ntName);
- return new QNodeTypeDefinitionImpl(nt, sInfo.getNamespaceResolver(), getQValueFactory());
- } catch (NameException e) {
- throw new RepositoryException(e);
+ List defs = new ArrayList();
+ for (int i = 0; i < nodetypeNames.length; i++) {
+ try {
+ String ntName = NameFormat.format(nodetypeNames[i], sInfo.getNamespaceResolver());
+ NodeType nt = ntMgr.getNodeType(ntName);
+ defs.add(new QNodeTypeDefinitionImpl(nt, sInfo.getNamespaceResolver(), getQValueFactory()));
+
+ // in addition pack all supertypes into the return value
+ NodeType[] supertypes = nt.getSupertypes();
+ for (int st = 0; st < supertypes.length; st++) {
+ defs.add(new QNodeTypeDefinitionImpl(supertypes[i], sInfo.getNamespaceResolver(), getQValueFactory()));
+ }
+ } catch (NameException e) {
+ throw new RepositoryException(e);
+ }
}
+ return defs.iterator();
}
//----------------------------< internal >----------------------------------