Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java (working copy) @@ -18,7 +18,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Calendar; import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -62,6 +61,9 @@ import org.apache.jackrabbit.core.version.InternalVersionManager; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.Path; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QItemDefinition; +import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException; import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl; @@ -725,7 +727,7 @@ // 4. node type constraints if ((options & CHECK_CONSTRAINTS) == CHECK_CONSTRAINTS) { - NodeDef parentDef = ntReg.getNodeDef(parentState.getDefinitionId()); + QItemDefinition parentDef = ntReg.getNodeDef(parentState.getDefinitionId()); // make sure parent node is not protected if (parentDef.isProtected()) { throw new ConstraintViolationException( @@ -735,7 +737,7 @@ // make sure there's an applicable definition for new child node EffectiveNodeType entParent = getEffectiveNodeType(parentState); entParent.checkAddNodeConstraints(nodeName, nodeTypeName, ntReg); - NodeDef newNodeDef = + QNodeDefinition newNodeDef = findApplicableNodeDefinition(nodeName, nodeTypeName, parentState); @@ -756,7 +758,7 @@ log.debug(msg); throw new RepositoryException(msg, ise); } - NodeDef conflictingTargetDef = + QNodeDefinition conflictingTargetDef = ntReg.getNodeDef(conflictingState.getDefinitionId()); // check same-name sibling setting of both target and existing node if (!conflictingTargetDef.allowsSameNameSiblings() @@ -900,12 +902,12 @@ // 4. node type constraints if ((options & CHECK_CONSTRAINTS) == CHECK_CONSTRAINTS) { - NodeDef parentDef = ntReg.getNodeDef(parentState.getDefinitionId()); + QItemDefinition parentDef = ntReg.getNodeDef(parentState.getDefinitionId()); if (parentDef.isProtected()) { throw new ConstraintViolationException(safeGetJCRPath(parentId) + ": cannot remove child node of protected parent node"); } - NodeDef targetDef = ntReg.getNodeDef(targetState.getDefinitionId()); + QItemDefinition targetDef = ntReg.getNodeDef(targetState.getDefinitionId()); if (targetDef.isMandatory()) { throw new ConstraintViolationException(safeGetJCRPath(targetPath) + ": cannot remove mandatory node"); @@ -1265,7 +1267,7 @@ if (genValues != null) { prop.setValues(genValues); } else if (def.getDefaultValues() != null) { - prop.setValues(def.getDefaultValues()); + prop.setValues(InternalValue.create(def.getDefaultValues())); } // now add new property entry to parent @@ -1442,7 +1444,7 @@ throws PathNotFoundException, ConstraintViolationException, RepositoryException { NodeState node = getNodeState(nodePath); - NodeDef parentDef = ntReg.getNodeDef(node.getDefinitionId()); + QItemDefinition parentDef = ntReg.getNodeDef(node.getDefinitionId()); if (parentDef.isProtected()) { throw new ConstraintViolationException(safeGetJCRPath(nodePath) + ": node is protected"); @@ -1774,7 +1776,7 @@ * todo FIXME delegate to 'node type instance handler' */ PropDefId defId = srcChildState.getDefinitionId(); - PropDef def = ntReg.getPropDef(defId); + QPropertyDefinition def = ntReg.getPropDef(defId); if (def.getDeclaringNodeType().equals(NameConstants.MIX_LOCKABLE)) { // skip properties defined by mix:lockable continue; @@ -1842,7 +1844,7 @@ throws RepositoryException { PropDefId defId = srcState.getDefinitionId(); - PropDef def = ntReg.getPropDef(defId); + QPropertyDefinition def = ntReg.getPropDef(defId); PropertyState newState = stateMgr.createNew(propName, parentId); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (working copy) @@ -48,12 +48,10 @@ import org.apache.jackrabbit.core.id.ItemId; import org.apache.jackrabbit.core.id.NodeId; import org.apache.jackrabbit.core.nodetype.EffectiveNodeType; -import org.apache.jackrabbit.core.nodetype.NodeDef; import org.apache.jackrabbit.core.nodetype.NodeTypeConflictException; import org.apache.jackrabbit.core.nodetype.NodeTypeImpl; import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; -import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.core.nodetype.PropertyDefinitionImpl; import org.apache.jackrabbit.core.security.AccessManager; import org.apache.jackrabbit.core.security.authorization.Permission; @@ -69,6 +67,8 @@ import org.apache.jackrabbit.core.version.InternalVersionManager; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.Path; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QItemDefinition; import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.apache.jackrabbit.util.Text; import org.slf4j.Logger; @@ -444,9 +444,9 @@ } // mandatory child properties - PropDef[] pda = ent.getMandatoryPropDefs(); + QPropertyDefinition[] pda = ent.getMandatoryPropDefs(); for (int i = 0; i < pda.length; i++) { - PropDef pd = pda[i]; + QPropertyDefinition pd = pda[i]; if (pd.getDeclaringNodeType().equals(NameConstants.MIX_VERSIONABLE) || pd.getDeclaringNodeType().equals(NameConstants.MIX_SIMPLE_VERSIONABLE)) { /** @@ -465,9 +465,9 @@ } } // mandatory child nodes - NodeDef[] cnda = ent.getMandatoryNodeDefs(); + QItemDefinition[] cnda = ent.getMandatoryNodeDefs(); for (int i = 0; i < cnda.length; i++) { - NodeDef cnd = cnda[i]; + QItemDefinition cnd = cnda[i]; if (!nodeState.hasChildNodeEntry(cnd.getName())) { String msg = itemMgr.safeGetJCRPath(id) + ": mandatory child node " + cnd.getName() Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemValidator.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemValidator.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemValidator.java (working copy) @@ -43,6 +43,9 @@ import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.Path; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QItemDefinition; +import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.commons.conversion.PathResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -190,7 +193,7 @@ ntReg.getEffectiveNodeType(nodeState.getNodeTypeName()); // effective node type (primary type incl. mixins) EffectiveNodeType entPrimaryAndMixins = getEffectiveNodeType(nodeState); - NodeDef def = ntReg.getNodeDef(nodeState.getDefinitionId()); + QNodeDefinition def = ntReg.getNodeDef(nodeState.getDefinitionId()); // check if primary type satisfies the 'required node types' constraint Name[] requiredPrimaryTypes = def.getRequiredPrimaryTypes(); @@ -204,9 +207,9 @@ } } // mandatory properties - PropDef[] pda = entPrimaryAndMixins.getMandatoryPropDefs(); + QPropertyDefinition[] pda = entPrimaryAndMixins.getMandatoryPropDefs(); for (int i = 0; i < pda.length; i++) { - PropDef pd = pda[i]; + QPropertyDefinition pd = pda[i]; if (!nodeState.hasPropertyName(pd.getName())) { String msg = safeGetJCRPath(nodeState.getNodeId()) + ": mandatory property " + pd.getName() @@ -216,9 +219,9 @@ } } // mandatory child nodes - NodeDef[] cnda = entPrimaryAndMixins.getMandatoryNodeDefs(); + QItemDefinition[] cnda = entPrimaryAndMixins.getMandatoryNodeDefs(); for (int i = 0; i < cnda.length; i++) { - NodeDef cnd = cnda[i]; + QItemDefinition cnd = cnda[i]; if (!nodeState.hasChildNodeEntry(cnd.getName())) { String msg = safeGetJCRPath(nodeState.getNodeId()) + ": mandatory child node " + cnd.getName() @@ -246,7 +249,7 @@ */ public void validate(PropertyState propState) throws ConstraintViolationException, RepositoryException { - PropDef def = ntReg.getPropDef(propState.getDefinitionId()); + QPropertyDefinition def = ntReg.getPropDef(propState.getDefinitionId()); InternalValue[] values = propState.getValues(); int type = PropertyType.UNDEFINED; for (int i = 0; i < values.length; i++) { @@ -515,7 +518,7 @@ * could be found * @throws RepositoryException if another error occurs */ - public PropDef findApplicablePropertyDefinition(Name name, + public QPropertyDefinition findApplicablePropertyDefinition(Name name, int type, NodeState parentState) throws RepositoryException, ConstraintViolationException { Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (working copy) @@ -71,7 +71,6 @@ import org.apache.jackrabbit.core.id.NodeId; import org.apache.jackrabbit.core.id.PropertyId; import org.apache.jackrabbit.core.nodetype.EffectiveNodeType; -import org.apache.jackrabbit.core.nodetype.ItemDef; import org.apache.jackrabbit.core.nodetype.NodeDef; import org.apache.jackrabbit.core.nodetype.NodeDefId; import org.apache.jackrabbit.core.nodetype.NodeDefinitionImpl; @@ -92,6 +91,7 @@ import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.Path; +import org.apache.jackrabbit.spi.QItemDefinition; import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException; import org.apache.jackrabbit.spi.commons.conversion.NameException; import org.apache.jackrabbit.spi.commons.name.NameConstants; @@ -422,7 +422,7 @@ InternalValue[] genValues = session.getNodeTypeInstanceHandler() .computeSystemGeneratedPropertyValues(data.getNodeState(), propDef); if (genValues == null) { - genValues = propDef.getDefaultValues(); + genValues = InternalValue.create(propDef.getDefaultValues()); } if (genValues != null) { propState.setValues(genValues); @@ -3691,12 +3691,12 @@ onRedefine(defId); } - Set oldDefs = new HashSet(Arrays.asList(entOld.getAllItemDefs())); - Set newDefs = new HashSet(Arrays.asList(entNew.getAllItemDefs())); - Set allDefs = new HashSet(Arrays.asList(entAll.getAllItemDefs())); + Set oldDefs = new HashSet(Arrays.asList(entOld.getAllItemDefs())); + Set newDefs = new HashSet(Arrays.asList(entNew.getAllItemDefs())); + Set allDefs = new HashSet(Arrays.asList(entAll.getAllItemDefs())); // added child item definitions - Set addedDefs = new HashSet(newDefs); + Set addedDefs = new HashSet(newDefs); addedDefs.removeAll(oldDefs); // referential integrity check @@ -3832,8 +3832,8 @@ // create items that are defined as auto-created by the new primary node // type and at the same time were not present with the old nt - for (Iterator iter = addedDefs.iterator(); iter.hasNext();) { - ItemDef def = iter.next(); + for (Iterator iter = addedDefs.iterator(); iter.hasNext();) { + QItemDefinition def = iter.next(); if (def.isAutoCreated()) { if (def.definesNode()) { NodeDefinitionImpl ndi = ntMgr.getNodeDefinition(((NodeDef) def).getId()); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java (working copy) @@ -19,6 +19,9 @@ import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QValueConstraint; +import org.apache.jackrabbit.spi.QItemDefinition; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QNodeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,9 +54,9 @@ // (through inheritance) included node types. private final TreeSet allNodeTypes; // map of named item definitions (maps name to list of definitions) - private final HashMap> namedItemDefs; + private final HashMap> namedItemDefs; // list of unnamed item definitions (i.e. residual definitions) - private final ArrayList unnamedItemDefs; + private final ArrayList unnamedItemDefs; // flag indicating whether any included node type supports orderable child nodes private boolean orderableChildNodes; @@ -67,8 +70,8 @@ mergedNodeTypes = new TreeSet(); inheritedNodeTypes = new TreeSet(); allNodeTypes = new TreeSet(); - namedItemDefs = new HashMap>(); - unnamedItemDefs = new ArrayList(); + namedItemDefs = new HashMap>(); + unnamedItemDefs = new ArrayList(); orderableChildNodes = false; primaryItemName = null; } @@ -104,7 +107,7 @@ // map of all item definitions (maps id to definition) // used to effectively detect ambiguous child definitions where // ambiguity is defined in terms of definition identity - HashMap itemDefIds = new HashMap(); + HashMap itemDefIds = new HashMap(); NodeDef[] cnda = ntd.getChildNodeDefs(); for (NodeDef aCnda : cnda) { @@ -130,9 +133,9 @@ } else { // named node definition Name name = aCnda.getName(); - List defs = ent.namedItemDefs.get(name); + List defs = ent.namedItemDefs.get(name); if (defs == null) { - defs = new ArrayList(); + defs = new ArrayList(); ent.namedItemDefs.put(name, defs); } if (defs.size() > 0) { @@ -140,7 +143,7 @@ * there already exists at least one definition with that * name; make sure none of them is auto-create */ - for (ItemDef def : defs) { + for (QItemDefinition def : defs) { if (aCnda.isAutoCreated() || def.isAutoCreated()) { // conflict String msg = "There are more than one 'auto-create' item definitions for '" @@ -177,9 +180,9 @@ } else { // named property definition Name name = aPda.getName(); - List defs = ent.namedItemDefs.get(name); + List defs = ent.namedItemDefs.get(name); if (defs == null) { - defs = new ArrayList(); + defs = new ArrayList(); ent.namedItemDefs.put(name, defs); } if (defs.size() > 0) { @@ -187,7 +190,7 @@ * there already exists at least one definition with that * name; make sure none of them is auto-create */ - for (ItemDef def : defs) { + for (QItemDefinition def : defs) { if (aPda.isAutoCreated() || def.isAutoCreated()) { // conflict String msg = "There are more than one 'auto-create' item definitions for '" @@ -276,52 +279,52 @@ return allNodeTypes.toArray(new Name[allNodeTypes.size()]); } - public ItemDef[] getAllItemDefs() { + public QItemDefinition[] getAllItemDefs() { if (namedItemDefs.size() == 0 && unnamedItemDefs.size() == 0) { - return ItemDef.EMPTY_ARRAY; + return QItemDefinition.EMPTY_ARRAY; } - ArrayList defs = new ArrayList(namedItemDefs.size() + unnamedItemDefs.size()); - for (List itemDefs : namedItemDefs.values()) { + ArrayList defs = new ArrayList(namedItemDefs.size() + unnamedItemDefs.size()); + for (List itemDefs : namedItemDefs.values()) { defs.addAll(itemDefs); } defs.addAll(unnamedItemDefs); if (defs.size() == 0) { - return ItemDef.EMPTY_ARRAY; + return QItemDefinition.EMPTY_ARRAY; } - return defs.toArray(new ItemDef[defs.size()]); + return defs.toArray(new QItemDefinition[defs.size()]); } - public ItemDef[] getNamedItemDefs() { + public QItemDefinition[] getNamedItemDefs() { if (namedItemDefs.size() == 0) { - return ItemDef.EMPTY_ARRAY; + return QItemDefinition.EMPTY_ARRAY; } - ArrayList defs = new ArrayList(namedItemDefs.size()); - for (List itemDefs : namedItemDefs.values()) { + ArrayList defs = new ArrayList(namedItemDefs.size()); + for (List itemDefs : namedItemDefs.values()) { defs.addAll(itemDefs); } if (defs.size() == 0) { - return ItemDef.EMPTY_ARRAY; + return QItemDefinition.EMPTY_ARRAY; } - return defs.toArray(new ItemDef[defs.size()]); + return defs.toArray(new QItemDefinition[defs.size()]); } - public ItemDef[] getUnnamedItemDefs() { + public QItemDefinition[] getUnnamedItemDefs() { if (unnamedItemDefs.size() == 0) { - return ItemDef.EMPTY_ARRAY; + return QItemDefinition.EMPTY_ARRAY; } - return unnamedItemDefs.toArray(new ItemDef[unnamedItemDefs.size()]); + return unnamedItemDefs.toArray(new QItemDefinition[unnamedItemDefs.size()]); } public boolean hasNamedItemDef(Name name) { return namedItemDefs.containsKey(name); } - public ItemDef[] getNamedItemDefs(Name name) { - List defs = namedItemDefs.get(name); + public QItemDefinition[] getNamedItemDefs(Name name) { + List defs = namedItemDefs.get(name); if (defs == null || defs.size() == 0) { - return ItemDef.EMPTY_ARRAY; + return QItemDefinition.EMPTY_ARRAY; } - return defs.toArray(new ItemDef[defs.size()]); + return defs.toArray(new QItemDefinition[defs.size()]); } public NodeDef[] getAllNodeDefs() { @@ -329,13 +332,13 @@ return NodeDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size() + unnamedItemDefs.size()); - for (ItemDef def : unnamedItemDefs) { + for (QItemDefinition def : unnamedItemDefs) { if (def.definesNode()) { defs.add((NodeDef) def); } } - for (List list: namedItemDefs.values()) { - for (ItemDef def : list) { + for (List list: namedItemDefs.values()) { + for (QItemDefinition def : list) { if (def.definesNode()) { defs.add((NodeDef) def); } @@ -347,13 +350,13 @@ return defs.toArray(new NodeDef[defs.size()]); } - public NodeDef[] getNamedNodeDefs() { + public QItemDefinition[] getNamedNodeDefs() { if (namedItemDefs.size() == 0) { return NodeDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size()); - for (List list : namedItemDefs.values()) { - for (ItemDef def : list) { + for (List list : namedItemDefs.values()) { + for (QItemDefinition def : list) { if (def.definesNode()) { defs.add((NodeDef) def); } @@ -365,13 +368,13 @@ return defs.toArray(new NodeDef[defs.size()]); } - public NodeDef[] getNamedNodeDefs(Name name) { - List list = namedItemDefs.get(name); + public QItemDefinition[] getNamedNodeDefs(Name name) { + List list = namedItemDefs.get(name); if (list == null || list.size() == 0) { return NodeDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(list.size()); - for (ItemDef def : list) { + for (QItemDefinition def : list) { if (def.definesNode()) { defs.add((NodeDef) def); } @@ -387,7 +390,7 @@ return NodeDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(unnamedItemDefs.size()); - for (ItemDef def : unnamedItemDefs) { + for (QItemDefinition def : unnamedItemDefs) { if (def.definesNode()) { defs.add((NodeDef) def); } @@ -405,8 +408,8 @@ return NodeDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size()); - for (List list : namedItemDefs.values()) { - for (ItemDef def : list) { + for (List list : namedItemDefs.values()) { + for (QItemDefinition def : list) { if (def.definesNode() && def.isAutoCreated()) { defs.add((NodeDef) def); } @@ -423,13 +426,13 @@ return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size() + unnamedItemDefs.size()); - for (ItemDef def : unnamedItemDefs) { + for (QItemDefinition def : unnamedItemDefs) { if (!def.definesNode()) { defs.add((PropDef) def); } } - for (List list: namedItemDefs.values()) { - for (ItemDef def : list) { + for (List list: namedItemDefs.values()) { + for (QItemDefinition def : list) { if (!def.definesNode()) { defs.add((PropDef) def); } @@ -441,13 +444,13 @@ return defs.toArray(new PropDef[defs.size()]); } - public PropDef[] getNamedPropDefs() { + public QPropertyDefinition[] getNamedPropDefs() { if (namedItemDefs.size() == 0) { return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size()); - for (List list : namedItemDefs.values()) { - for (ItemDef def : list) { + for (List list : namedItemDefs.values()) { + for (QItemDefinition def : list) { if (!def.definesNode()) { defs.add((PropDef) def); } @@ -460,12 +463,12 @@ } public PropDef[] getNamedPropDefs(Name name) { - List list = namedItemDefs.get(name); + List list = namedItemDefs.get(name); if (list == null || list.size() == 0) { return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(list.size()); - for (ItemDef def : list) { + for (QItemDefinition def : list) { if (!def.definesNode()) { defs.add((PropDef) def); } @@ -481,7 +484,7 @@ return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(unnamedItemDefs.size()); - for (ItemDef def : unnamedItemDefs) { + for (QItemDefinition def : unnamedItemDefs) { if (!def.definesNode()) { defs.add((PropDef) def); } @@ -499,8 +502,8 @@ return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size()); - for (List list : namedItemDefs.values()) { - for (ItemDef def : list) { + for (List list : namedItemDefs.values()) { + for (QItemDefinition def : list) { if (!def.definesNode() && def.isAutoCreated()) { defs.add((PropDef) def); } @@ -519,8 +522,8 @@ return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size()); - for (List list : namedItemDefs.values()) { - for (ItemDef def : list) { + for (List list : namedItemDefs.values()) { + for (QItemDefinition def : list) { if (!def.definesNode() && def.isMandatory()) { defs.add((PropDef) def); } @@ -539,8 +542,8 @@ return NodeDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size()); - for (List list : namedItemDefs.values()) { - for (ItemDef def : list) { + for (List list : namedItemDefs.values()) { + for (QItemDefinition def : list) { if (def.definesNode() && def.isMandatory()) { defs.add((NodeDef) def); } @@ -591,7 +594,7 @@ * by the the specified values * @throws RepositoryException if another error occurs */ - public static void checkSetPropertyValueConstraints(PropDef pd, + public static void checkSetPropertyValueConstraints(QPropertyDefinition pd, InternalValue[] values) throws ConstraintViolationException, RepositoryException { // check multi-value flag @@ -661,7 +664,7 @@ throw new ConstraintViolationException(nodeTypeName + " is mixin."); } } - NodeDef nd = getApplicableChildNodeDef(name, nodeTypeName, ntReg); + QItemDefinition nd = getApplicableChildNodeDef(name, nodeTypeName, ntReg); if (nd.isProtected()) { throw new ConstraintViolationException(name + " is protected"); } @@ -694,8 +697,8 @@ } // try named node definitions first - ItemDef[] defs = getNamedItemDefs(name); - for (ItemDef def : defs) { + QItemDefinition[] defs = getNamedItemDefs(name); + for (QItemDefinition def : defs) { if (def.definesNode()) { NodeDef nd = (NodeDef) def; Name[] types = nd.getRequiredPrimaryTypes(); @@ -886,9 +889,9 @@ * as there might be multiple definitions with the same name and we * don't know which one is applicable, we check all of them */ - ItemDef[] defs = getNamedItemDefs(name); + QItemDefinition[] defs = getNamedItemDefs(name); if (defs != null) { - for (ItemDef def : defs) { + for (QItemDefinition def : defs) { if (def.isMandatory()) { throw new ConstraintViolationException("can't remove mandatory item"); } @@ -908,9 +911,9 @@ * as there might be multiple definitions with the same name and we * don't know which one is applicable, we check all of them */ - ItemDef[] defs = getNamedNodeDefs(name); + QItemDefinition[] defs = getNamedNodeDefs(name); if (defs != null) { - for (ItemDef def : defs) { + for (QItemDefinition def : defs) { if (def.isMandatory()) { throw new ConstraintViolationException("can't remove mandatory node"); } @@ -930,9 +933,9 @@ * as there might be multiple definitions with the same name and we * don't know which one is applicable, we check all of them */ - ItemDef[] defs = getNamedPropDefs(name); + QItemDefinition[] defs = getNamedPropDefs(name); if (defs != null) { - for (ItemDef def : defs) { + for (QItemDefinition def : defs) { if (def.isMandatory()) { throw new ConstraintViolationException("can't remove mandatory property"); } @@ -992,18 +995,18 @@ } // named item definitions - ItemDef[] defs = other.getNamedItemDefs(); - for (ItemDef def : defs) { + QItemDefinition[] defs = other.getNamedItemDefs(); + for (QItemDefinition def : defs) { if (includesNodeType(def.getDeclaringNodeType())) { // ignore redundant definitions continue; } Name name = def.getName(); - List existingDefs = namedItemDefs.get(name); + List existingDefs = namedItemDefs.get(name); if (existingDefs != null) { if (existingDefs.size() > 0) { // there already exists at least one definition with that name - for (ItemDef existingDef : existingDefs) { + for (QItemDefinition existingDef : existingDefs) { // make sure none of them is auto-create if (def.isAutoCreated() || existingDef.isAutoCreated()) { // conflict @@ -1020,8 +1023,8 @@ if (def.definesNode() == existingDef.definesNode()) { if (!def.definesNode()) { // property definition - PropDef pd = (PropDef) def; - PropDef epd = (PropDef) existingDef; + QPropertyDefinition pd = (QPropertyDefinition) def; + QPropertyDefinition epd = (QPropertyDefinition) existingDef; // compare type & multiValued flag if (pd.getRequiredType() == epd.getRequiredType() && pd.isMultiple() == epd.isMultiple()) { @@ -1051,7 +1054,7 @@ } } } else { - existingDefs = new ArrayList(); + existingDefs = new ArrayList(); namedItemDefs.put(name, existingDefs); } existingDefs.add(def); @@ -1059,18 +1062,18 @@ // residual item definitions defs = other.getUnnamedItemDefs(); - for (ItemDef def : defs) { + for (QItemDefinition def : defs) { if (includesNodeType(def.getDeclaringNodeType())) { // ignore redundant definitions continue; } - for (ItemDef existing : unnamedItemDefs) { + for (QItemDefinition existing : unnamedItemDefs) { // compare with existing definition if (def.definesNode() == existing.definesNode()) { if (!def.definesNode()) { // property definition - PropDef pd = (PropDef) def; - PropDef epd = (PropDef) existing; + QPropertyDefinition pd = (QPropertyDefinition) def; + QPropertyDefinition epd = (QPropertyDefinition) existing; // compare type & multiValued flag if (pd.getRequiredType() == epd.getRequiredType() && pd.isMultiple() == epd.isMultiple()) { @@ -1085,8 +1088,8 @@ } } else { // child node definition - NodeDef nd = (NodeDef) def; - NodeDef end = (NodeDef) existing; + QNodeDefinition nd = (QNodeDefinition) def; + QNodeDefinition end = (QNodeDefinition) existing; // compare required & default primary types if (Arrays.equals(nd.getRequiredPrimaryTypes(), end.getRequiredPrimaryTypes()) && (nd.getDefaultPrimaryType() == null @@ -1146,8 +1149,8 @@ clone.inheritedNodeTypes.addAll(inheritedNodeTypes); clone.allNodeTypes.addAll(allNodeTypes); for (Name name : namedItemDefs.keySet()) { - List list = namedItemDefs.get(name); - clone.namedItemDefs.put(name, new ArrayList(list)); + List list = namedItemDefs.get(name); + clone.namedItemDefs.put(name, new ArrayList(list)); } clone.unnamedItemDefs.addAll(unnamedItemDefs); clone.orderableChildNodes = orderableChildNodes; Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDef.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDef.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDef.java (working copy) @@ -1,97 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.jackrabbit.core.nodetype; - -import org.apache.jackrabbit.spi.Name; -import org.apache.jackrabbit.spi.commons.name.NameConstants; - -/** - * ItemDef is the internal representation of - * an item definition. It refers to Names only - * and is thus isolated from session-specific namespace mappings. - * - * @see javax.jcr.nodetype.ItemDefinition - */ -public interface ItemDef { - - ItemDef[] EMPTY_ARRAY = new ItemDef[0]; - - /** - * The special wildcard name used as the name of residual item definitions. - */ - Name ANY_NAME = NameConstants.ANY_NAME; - - /** - * Gets the name of the child item. - * - * @return the name of the child item. - */ - Name getName(); - - /** - * Gets the name of the declaring node type. - * - * @return the name of the declaring node type. - */ - Name getDeclaringNodeType(); - - /** - * Determines whether the item is 'autoCreated'. - * - * @return the 'autoCreated' flag. - */ - boolean isAutoCreated(); - - /** - * Gets the 'onParentVersion' attribute of the item. - * - * @return the 'onParentVersion' attribute. - */ - int getOnParentVersion(); - - /** - * Determines whether the item is 'protected'. - * - * @return the 'protected' flag. - */ - boolean isProtected(); - - /** - * Determines whether the item is 'mandatory'. - * - * @return the 'mandatory' flag. - */ - boolean isMandatory(); - - /** - * Determines whether this item definition defines a residual set of - * child items. This is equivalent to calling - * getName().equals(ANY_NAME). - * - * @return true if this definition defines a residual set; - * false otherwise. - */ - boolean definesResidual(); - - /** - * Determines whether this item definition defines a node. - * - * @return true if this is a node definition; - * false otherwise (i.e. it is a property definition). - */ - boolean definesNode(); -} Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefImpl.java (working copy) @@ -1,235 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.jackrabbit.core.nodetype; - -import org.apache.jackrabbit.spi.Name; -import org.apache.jackrabbit.spi.QItemDefinition; - -import javax.jcr.version.OnParentVersionAction; - -/** - * This abstract class implements the ItemDef - * interface and additionally provides setter methods for the - * various item definition attributes. - */ -public abstract class ItemDefImpl implements ItemDef { - - /** - * The name of the child item. - */ - private Name name = ItemDef.ANY_NAME; - - /** - * The name of the declaring node type. - */ - protected Name declaringNodeType = null; - - /** - * The 'autoCreated' flag. - */ - private boolean autoCreated = false; - - /** - * The 'onParentVersion' attribute. - */ - private int onParentVersion = OnParentVersionAction.COPY; - - /** - * The 'protected' flag. - */ - private boolean writeProtected = false; - - /** - * The 'mandatory' flag. - */ - private boolean mandatory = false; - - /** - * Default constructor. - */ - public ItemDefImpl() { - } - - public ItemDefImpl(QItemDefinition def) { - name = def.getName(); - declaringNodeType = def.getDeclaringNodeType(); - autoCreated = def.isAutoCreated(); - onParentVersion = def.getOnParentVersion(); - writeProtected = def.isProtected(); - mandatory = def.isMandatory(); - } - - /** - * Sets the name of declaring node type. - * - * @param declaringNodeType name of the declaring node type (must not be - * null) - */ - public void setDeclaringNodeType(Name declaringNodeType) { - if (declaringNodeType == null) { - throw new IllegalArgumentException("declaringNodeType can not be null"); - } - this.declaringNodeType = declaringNodeType; - } - - /** - * Sets the name of the child item. - * - * @param name name of child item (must not be null) - */ - public void setName(Name name) { - if (name == null) { - throw new IllegalArgumentException("name can not be null"); - } - this.name = name; - } - - /** - * Sets the 'autoCreated' flag. - * - * @param autoCreated a boolean - */ - public void setAutoCreated(boolean autoCreated) { - this.autoCreated = autoCreated; - } - - /** - * Sets the 'onParentVersion' attribute. - * - * @param onParentVersion any of the following constants: - *
    - *
  • OnParentVersionAction.COPY - *
  • OnParentVersionAction.VERSION - *
  • OnParentVersionAction.INITIALIZE - *
  • OnParentVersionAction.COMPUTE - *
  • OnParentVersionAction.IGNORE - *
  • OnParentVersionAction.ABORT - *
- */ - public void setOnParentVersion(int onParentVersion) { - this.onParentVersion = onParentVersion; - } - - /** - * Sets the 'protected' flag. - * - * @param writeProtected a boolean - */ - public void setProtected(boolean writeProtected) { - this.writeProtected = writeProtected; - } - - /** - * Sets the 'mandatory' flag. - * - * @param mandatory a boolean - */ - public void setMandatory(boolean mandatory) { - this.mandatory = mandatory; - } - - //--------------------------------------------------------------< ItemDef > - /** - * {@inheritDoc} - */ - public Name getDeclaringNodeType() { - return declaringNodeType; - } - - /** - * {@inheritDoc} - */ - public Name getName() { - return name; - } - - /** - * {@inheritDoc} - */ - public boolean isAutoCreated() { - return autoCreated; - } - - /** - * {@inheritDoc} - */ - public int getOnParentVersion() { - return onParentVersion; - } - - /** - * {@inheritDoc} - */ - public boolean isProtected() { - return writeProtected; - } - - /** - * {@inheritDoc} - */ - public boolean isMandatory() { - return mandatory; - } - - /** - * {@inheritDoc} - */ - public boolean definesResidual() { - return name.equals(ItemDef.ANY_NAME); - } - - //-------------------------------------------< java.lang.Object overrides > - /** - * Compares two item definitions for equality. Returns true - * if the given object is an item defintion and has the same attributes - * as this item definition. - * - * @param obj the object to compare this item definition with - * @return true if the object is equal to this item definition, - * false otherwise - * @see Object#equals(Object) - */ - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj instanceof ItemDefImpl) { - ItemDefImpl other = (ItemDefImpl) obj; - return (declaringNodeType == null - ? other.declaringNodeType == null - : declaringNodeType.equals(other.declaringNodeType)) - && (name == null ? other.name == null : name.equals(other.name)) - && autoCreated == other.autoCreated - && onParentVersion == other.onParentVersion - && writeProtected == other.writeProtected - && mandatory == other.mandatory; - } - return false; - } - - /** - * Returns zero to satisfy the Object equals/hashCode contract. - * This class is mutable and not meant to be used as a hash key. - * - * @return always zero - * @see Object#hashCode() - */ - public int hashCode() { - return 0; - } - -} Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java (working copy) @@ -18,6 +18,7 @@ import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QItemDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +29,7 @@ /** * This class implements the ItemDefinition interface. - * All method calls are delegated to the wrapped {@link ItemDef}, + * All method calls are delegated to the wrapped {@link QItemDefinition}, * performing the translation from Names to JCR names * (and vice versa) where necessary. */ @@ -58,7 +59,7 @@ /** * The wrapped item definition. */ - protected final ItemDef itemDef; + protected final QItemDefinition itemDef; /** * Package private constructor @@ -67,7 +68,7 @@ * @param ntMgr node type manager * @param resolver name resolver */ - ItemDefinitionImpl(ItemDef itemDef, NodeTypeManagerImpl ntMgr, + ItemDefinitionImpl(QItemDefinition itemDef, NodeTypeManagerImpl ntMgr, NamePathResolver resolver) { this.itemDef = itemDef; this.ntMgr = ntMgr; Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDef.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDef.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDef.java (working copy) @@ -16,7 +16,7 @@ */ package org.apache.jackrabbit.core.nodetype; -import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QNodeDefinition; /** * NodeDef is the internal representation of @@ -25,7 +25,7 @@ * * @see javax.jcr.nodetype.NodeDefinition */ -public interface NodeDef extends ItemDef { +public interface NodeDef extends QNodeDefinition { NodeDef[] EMPTY_ARRAY = new NodeDef[0]; @@ -35,25 +35,4 @@ * @return an identifier for this node definition. */ NodeDefId getId(); - - /** - * Returns the name of the default primary type. - * - * @return the name of the default primary type. - */ - Name getDefaultPrimaryType(); - - /** - * Returns the array of names of the required primary types. - * - * @return the array of names of the required primary types. - */ - Name[] getRequiredPrimaryTypes(); - - /** - * Reports whether this node can have same-name siblings. - * - * @return the 'allowsSameNameSiblings' flag. - */ - boolean allowsSameNameSiblings(); } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefId.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefId.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefId.java (working copy) @@ -17,6 +17,7 @@ package org.apache.jackrabbit.core.nodetype; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QNodeDefinition; import java.io.Serializable; import java.util.Arrays; @@ -45,7 +46,7 @@ * * @param def NodeDef to create identifier for */ - NodeDefId(NodeDef def) { + NodeDefId(QNodeDefinition def) { if (def == null) { throw new IllegalArgumentException("NodeDef argument can not be null"); } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefImpl.java (working copy) @@ -18,35 +18,15 @@ import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QNodeDefinition; -import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.apache.jackrabbit.spi.commons.QNodeDefinitionImpl; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - /** * This class implements the NodeDef interface and additionally * provides setter methods for the various node definition attributes. */ -public class NodeDefImpl extends ItemDefImpl implements NodeDef { +public class NodeDefImpl extends QNodeDefinitionImpl implements NodeDef { /** - * The name of the default primary type. - */ - private Name defaultPrimaryType; - - /** - * The names of the required primary types. - */ - private Set requiredPrimaryTypes; - - /** - * The 'allowsSameNameSiblings' flag. - */ - private boolean allowsSameNameSiblings; - - /** * The identifier of this node definition. The identifier is lazily computed * based on the characteristics of this node definition and reset on every * attribute change. @@ -57,40 +37,16 @@ * Default constructor. */ public NodeDefImpl() { - defaultPrimaryType = null; - requiredPrimaryTypes = new HashSet(); - requiredPrimaryTypes.add(NameConstants.NT_BASE); - allowsSameNameSiblings = false; + super(); id = null; } public NodeDefImpl(QNodeDefinition nd) { super(nd); - defaultPrimaryType = nd.getDefaultPrimaryType(); - requiredPrimaryTypes = new HashSet(Arrays.asList(nd.getRequiredPrimaryTypes())); - allowsSameNameSiblings = nd.allowsSameNameSiblings(); id = null; } /** - * Returns the QNodeDefinition for this NodeDef - * @return the QNodeDefinition - */ - public QNodeDefinition getQNodeDefinition() { - return new QNodeDefinitionImpl( - getName(), - getDeclaringNodeType(), - isAutoCreated(), - isMandatory(), - getOnParentVersion(), - isProtected(), - getDefaultPrimaryType(), - getRequiredPrimaryTypes(), - allowsSameNameSiblings() - ); - } - - /** * Sets the name of default primary type. * * @param defaultNodeType @@ -98,7 +54,7 @@ public void setDefaultPrimaryType(Name defaultNodeType) { // reset id field in order to force lazy recomputation of identifier id = null; - this.defaultPrimaryType = defaultNodeType; + super.setDefaultPrimaryType(defaultNodeType); } /** @@ -107,13 +63,9 @@ * @param requiredPrimaryTypes */ public void setRequiredPrimaryTypes(Name[] requiredPrimaryTypes) { - if (requiredPrimaryTypes == null) { - throw new IllegalArgumentException("requiredPrimaryTypes can not be null"); - } // reset id field in order to force lazy recomputation of identifier id = null; - this.requiredPrimaryTypes.clear(); - this.requiredPrimaryTypes.addAll(Arrays.asList(requiredPrimaryTypes)); + super.setRequiredPrimaryTypes(requiredPrimaryTypes); } /** @@ -124,7 +76,7 @@ public void setAllowsSameNameSiblings(boolean allowsSameNameSiblings) { // reset id field in order to force lazy recomputation of identifier id = null; - this.allowsSameNameSiblings = allowsSameNameSiblings; + super.setAllowsSameNameSiblings(allowsSameNameSiblings); } //------------------------------------------------< ItemDefImpl overrides > @@ -197,77 +149,4 @@ } return id; } - - /** - * {@inheritDoc} - */ - public Name getDefaultPrimaryType() { - return defaultPrimaryType; - } - - /** - * {@inheritDoc} - */ - public Name[] getRequiredPrimaryTypes() { - if (requiredPrimaryTypes.isEmpty()) { - return Name.EMPTY_ARRAY; - } - return requiredPrimaryTypes.toArray( - new Name[requiredPrimaryTypes.size()]); - } - - /** - * {@inheritDoc} - */ - public boolean allowsSameNameSiblings() { - return allowsSameNameSiblings; - } - - /** - * {@inheritDoc} - * - * @return always true - */ - public boolean definesNode() { - return true; - } - - //-------------------------------------------< java.lang.Object overrides > - /** - * Compares two node definitions for equality. Returns true - * if the given object is a node defintion and has the same attributes - * as this node definition. - * - * @param obj the object to compare this node definition with - * @return true if the object is equal to this node definition, - * false otherwise - * @see Object#equals(Object) - */ - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj instanceof NodeDefImpl) { - NodeDefImpl other = (NodeDefImpl) obj; - return super.equals(obj) - && requiredPrimaryTypes.equals(other.requiredPrimaryTypes) - && (defaultPrimaryType == null - ? other.defaultPrimaryType == null - : defaultPrimaryType.equals(other.defaultPrimaryType)) - && allowsSameNameSiblings == other.allowsSameNameSiblings; - } - return false; - } - - /** - * Returns zero to satisfy the Object equals/hashCode contract. - * This class is mutable and not meant to be used as a hash key. - * - * @return always zero - * @see Object#hashCode() - */ - public int hashCode() { - return 0; - } - } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java (working copy) @@ -17,6 +17,8 @@ package org.apache.jackrabbit.core.nodetype; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QItemDefinition; +import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.slf4j.Logger; @@ -47,7 +49,7 @@ * @param ntMgr node type manager * @param resolver name resolver */ - NodeDefinitionImpl(NodeDef nodeDef, NodeTypeManagerImpl ntMgr, + NodeDefinitionImpl(QItemDefinition nodeDef, NodeTypeManagerImpl ntMgr, NamePathResolver resolver) { super(nodeDef, ntMgr, resolver); } @@ -66,7 +68,7 @@ * {@inheritDoc} */ public NodeType getDefaultPrimaryType() { - Name ntName = ((NodeDef) itemDef).getDefaultPrimaryType(); + Name ntName = ((QNodeDefinition) itemDef).getDefaultPrimaryType(); if (ntName == null) { return null; } @@ -89,7 +91,7 @@ if (ntMgr == null) { return null; } - Name[] ntNames = ((NodeDef) itemDef).getRequiredPrimaryTypes(); + Name[] ntNames = ((QNodeDefinition) itemDef).getRequiredPrimaryTypes(); try { if (ntNames == null || ntNames.length == 0) { // return "nt:base" @@ -112,7 +114,7 @@ * {@inheritDoc} */ public boolean allowsSameNameSiblings() { - return ((NodeDef) itemDef).allowsSameNameSiblings(); + return ((QNodeDefinition) itemDef).allowsSameNameSiblings(); } //--------------------------------------------------< new JSR 283 methods > @@ -134,7 +136,7 @@ * @since JCR 2.0 */ public String[] getRequiredPrimaryTypeNames() { - Name[] ntNames = ((NodeDef) itemDef).getRequiredPrimaryTypes(); + Name[] ntNames = ((QNodeDefinition) itemDef).getRequiredPrimaryTypes(); try { if (ntNames == null || ntNames.length == 0) { // return "nt:base" @@ -170,7 +172,7 @@ * @since JCR 2.0 */ public String getDefaultPrimaryTypeName() { - Name ntName = ((NodeDef) itemDef).getDefaultPrimaryType(); + Name ntName = ((QNodeDefinition) itemDef).getDefaultPrimaryType(); if (ntName == null) { return null; } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java (working copy) @@ -101,17 +101,6 @@ * @return the QNodeTypeDefintion */ public QNodeTypeDefinition getQNodeTypeDefinition() { - QNodeDefinition[] qNodeDefs = new QNodeDefinition[nodeDefs.size()]; - int i=0; - for (NodeDef nd: nodeDefs) { - qNodeDefs[i++] = ((NodeDefImpl) nd).getQNodeDefinition(); - } - QPropertyDefinition[] qPropDefs = new QPropertyDefinition[propDefs.size()]; - i=0; - for (PropDef pd: propDefs) { - qPropDefs[i++] = ((PropDefImpl) pd).getQPropertyDefinition(); - } - return new QNodeTypeDefinitionImpl( getName(), getSupertypes(), @@ -121,8 +110,8 @@ isQueryable(), hasOrderableChildNodes(), getPrimaryItemName(), - qPropDefs, - qNodeDefs + propDefs.toArray(new QPropertyDefinition[propDefs.size()]), + nodeDefs.toArray(new QNodeDefinition[nodeDefs.size()]) ); } @@ -144,7 +133,7 @@ // supertypes dependencies.addAll(Arrays.asList(supertypes)); // child node definitions - for (NodeDef nd: nodeDefs) { + for (QNodeDefinition nd: nodeDefs) { // default primary type Name ntName = nd.getDefaultPrimaryType(); if (ntName != null && !name.equals(ntName)) { @@ -159,7 +148,7 @@ } } // property definitions - for (PropDef pd : propDefs) { + for (QPropertyDefinition pd : propDefs) { // [WEAK]REFERENCE value constraints if (pd.getRequiredType() == PropertyType.REFERENCE || pd.getRequiredType() == PropertyType.WEAKREFERENCE) { Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDefDiff.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDefDiff.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDefDiff.java (working copy) @@ -27,6 +27,9 @@ import javax.jcr.PropertyType; import org.apache.jackrabbit.spi.QValueConstraint; +import org.apache.jackrabbit.spi.QItemDefinition; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QNodeDefinition; /** * A NodeTypeDefDiff represents the result of the comparison of @@ -269,8 +272,8 @@ while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); PropDefId id = (PropDefId) entry.getKey(); - PropDef def1 = (PropDef) entry.getValue(); - PropDef def2 = (PropDef) defs2.get(id); + QPropertyDefinition def1 = (QPropertyDefinition) entry.getValue(); + QPropertyDefinition def2 = (QPropertyDefinition) defs2.get(id); PropDefDiff diff = new PropDefDiff(def1, def2); if (diff.getType() > maxType) { maxType = diff.getType(); @@ -287,7 +290,7 @@ while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); PropDefId id = (PropDefId) entry.getKey(); - PropDef def = (PropDef) entry.getValue(); + QPropertyDefinition def = (QPropertyDefinition) entry.getValue(); PropDefDiff diff = new PropDefDiff(null, def); if (diff.getType() > maxType) { maxType = diff.getType(); @@ -328,8 +331,8 @@ while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); NodeDefId id = (NodeDefId) entry.getKey(); - NodeDef def1 = (NodeDef) entry.getValue(); - NodeDef def2 = (NodeDef) defs2.get(id); + QItemDefinition def1 = (QItemDefinition) entry.getValue(); + QItemDefinition def2 = (QItemDefinition) defs2.get(id); ChildNodeDefDiff diff = new ChildNodeDefDiff(def1, def2); if (diff.getType() > maxType) { maxType = diff.getType(); @@ -346,7 +349,7 @@ while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); NodeDefId id = (NodeDefId) entry.getKey(); - NodeDef def = (NodeDef) entry.getValue(); + QItemDefinition def = (QItemDefinition) entry.getValue(); ChildNodeDefDiff diff = new ChildNodeDefDiff(null, def); if (diff.getType() > maxType) { maxType = diff.getType(); @@ -408,11 +411,11 @@ //--------------------------------------------------------< inner classes > abstract class ChildItemDefDiff { - protected final ItemDef oldDef; - protected final ItemDef newDef; + protected final QItemDefinition oldDef; + protected final QItemDefinition newDef; protected int type; - ChildItemDefDiff(ItemDef oldDef, ItemDef newDef) { + ChildItemDefDiff(QItemDefinition oldDef, QItemDefinition newDef) { this.oldDef = oldDef; this.newDef = newDef; init(); @@ -495,7 +498,7 @@ operationString = "NONE"; } - ItemDef itemDefinition = (oldDef != null) ? oldDef : newDef; + QItemDefinition itemDefinition = (oldDef != null) ? oldDef : newDef; return getClass().getName() + "[itemName=" + itemDefinition.getName() + ", type=" + typeString @@ -506,16 +509,16 @@ public class PropDefDiff extends ChildItemDefDiff { - PropDefDiff(PropDef oldDef, PropDef newDef) { + PropDefDiff(QPropertyDefinition oldDef, QPropertyDefinition newDef) { super(oldDef, newDef); } - public PropDef getOldDef() { - return (PropDef) oldDef; + public QPropertyDefinition getOldDef() { + return (QPropertyDefinition) oldDef; } - public PropDef getNewDef() { - return (PropDef) newDef; + public QPropertyDefinition getNewDef() { + return (QPropertyDefinition) newDef; } protected void init() { @@ -584,16 +587,16 @@ public class ChildNodeDefDiff extends ChildItemDefDiff { - ChildNodeDefDiff(NodeDef oldDef, NodeDef newDef) { + ChildNodeDefDiff(QItemDefinition oldDef, QItemDefinition newDef) { super(oldDef, newDef); } - public NodeDef getOldDef() { - return (NodeDef) oldDef; + public QNodeDefinition getOldDef() { + return (QNodeDefinition) oldDef; } - public NodeDef getNewDef() { - return (NodeDef) newDef; + public QNodeDefinition getNewDef() { + return (QNodeDefinition) newDef; } protected void init() { Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDefinitionImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDefinitionImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDefinitionImpl.java (working copy) @@ -18,6 +18,8 @@ import javax.jcr.nodetype.NodeTypeDefinition; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QItemDefinition; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -163,7 +165,7 @@ * {@inheritDoc} */ public NodeDefinition[] getDeclaredChildNodeDefinitions() { - NodeDef[] cnda = ntd.getChildNodeDefs(); + QItemDefinition[] cnda = ntd.getChildNodeDefs(); NodeDefinition[] nodeDefs = new NodeDefinition[cnda.length]; for (int i = 0; i < cnda.length; i++) { nodeDefs[i] = new NodeDefinitionImpl(cnda[i], null, resolver); @@ -175,7 +177,7 @@ * {@inheritDoc} */ public PropertyDefinition[] getDeclaredPropertyDefinitions() { - PropDef[] pda = ntd.getPropertyDefs(); + QPropertyDefinition[] pda = ntd.getPropertyDefs(); PropertyDefinition[] propDefs = new PropertyDefinition[pda.length]; for (int i = 0; i < pda.length; i++) { propDefs[i] = new PropertyDefinitionImpl(pda[i], null, resolver, valueFactory); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java (working copy) @@ -34,6 +34,7 @@ import org.apache.jackrabbit.core.data.DataStore; import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.commons.conversion.NameException; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.apache.jackrabbit.spi.commons.nodetype.AbstractNodeType; @@ -427,7 +428,7 @@ } try { Name name = resolver.getQName(propertyName); - PropDef def; + QPropertyDefinition def; try { // try to get definition that matches the given value type def = ent.getApplicablePropertyDef(name, value.getType(), false); @@ -498,7 +499,7 @@ return false; } } - PropDef def; + QPropertyDefinition def; try { // try to get definition that matches the given value type def = ent.getApplicablePropertyDef(name, type, true); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java (working copy) @@ -59,6 +59,8 @@ import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QNodeTypeDefinition; import org.apache.jackrabbit.spi.QValueConstraint; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QItemDefinition; import org.apache.jackrabbit.spi.commons.conversion.NameException; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.apache.jackrabbit.spi.commons.namespace.NamespaceMapping; @@ -67,6 +69,7 @@ import org.apache.jackrabbit.spi.commons.nodetype.compact.CompactNodeTypeDefReader; import org.apache.jackrabbit.spi.commons.nodetype.compact.ParseException; import org.apache.jackrabbit.spi.commons.nodetype.constraint.ValueConstraint; +import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -161,7 +164,7 @@ synchronized (ndCache) { NodeDefinitionImpl ndi = ndCache.get(id); if (ndi == null) { - NodeDef nd = ntReg.getNodeDef(id); + QItemDefinition nd = ntReg.getNodeDef(id); if (nd != null) { ndi = new NodeDefinitionImpl(nd, this, session); ndCache.put(id, ndi); @@ -179,7 +182,7 @@ synchronized (pdCache) { PropertyDefinitionImpl pdi = pdCache.get(id); if (pdi == null) { - PropDef pd = ntReg.getPropDef(id); + QPropertyDefinition pd = ntReg.getPropDef(id); if (pd != null) { pdi = new PropertyDefinitionImpl(pd, this, session, valueFactory); pdCache.put(id, pdi); @@ -700,7 +703,7 @@ name = ndefs[i].getName(); if (name != null) { if (name.equals("*")) { - qndef.setName(ItemDef.ANY_NAME); + qndef.setName(NameConstants.ANY_NAME); } else { try { qndef.setName(session.getQName(name)); @@ -760,7 +763,7 @@ name = pdefs[i].getName(); if (name != null) { if (name.equals("*")) { - qpdef.setName(ItemDef.ANY_NAME); + qpdef.setName(NameConstants.ANY_NAME); } else { try { qpdef.setName(session.getQName(name)); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java (working copy) @@ -47,9 +47,11 @@ import org.apache.jackrabbit.core.fs.FileSystemException; import org.apache.jackrabbit.core.fs.FileSystemResource; import org.apache.jackrabbit.core.util.Dumpable; -import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QValueConstraint; +import org.apache.jackrabbit.spi.QValue; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl; import org.slf4j.Logger; @@ -69,8 +71,6 @@ private static final String CUSTOM_NODETYPES_RESOURCE_NAME = "custom_nodetypes.xml"; - // file system where node type registrations are persisted - private final FileSystem ntStore; /** * resource holding custom node type definitions which are represented as * nodes in the repository; it is needed in order to make the registrations @@ -561,7 +561,7 @@ * @param id node def id * @return the node definition for the given id. */ - public NodeDef getNodeDef(NodeDefId id) { + public QNodeDefinition getNodeDef(NodeDefId id) { return nodeDefs.get(id); } @@ -633,12 +633,12 @@ } } ps.println("\t\tValueConstraints\t" + constraints.toString()); - InternalValue[] defVals = aPd.getDefaultValues(); + QValue[] defVals = aPd.getDefaultValues(); StringBuffer defaultValues = new StringBuffer(); if (defVals == null) { defaultValues.append(""); } else { - for (InternalValue defVal : defVals) { + for (QValue defVal : defVals) { if (defaultValues.length() > 0) { defaultValues.append(", "); } @@ -721,9 +721,8 @@ protected NodeTypeRegistry(NamespaceRegistry nsReg, FileSystem ntStore) throws RepositoryException { this.nsReg = nsReg; - this.ntStore = ntStore; customNodeTypesResource = - new FileSystemResource(this.ntStore, CUSTOM_NODETYPES_RESOURCE_NAME); + new FileSystemResource(ntStore, CUSTOM_NODETYPES_RESOURCE_NAME); try { // make sure path to resource exists if (!customNodeTypesResource.exists()) { @@ -1183,8 +1182,8 @@ } } - NodeDef[] nodeDefs = childNodeENT.getAutoCreateNodeDefs(); - for (NodeDef nodeDef : nodeDefs) { + QNodeDefinition[] nodeDefs = childNodeENT.getAutoCreateNodeDefs(); + for (QNodeDefinition nodeDef : nodeDefs) { Name dnt = nodeDef.getDefaultPrimaryType(); Name definingNT = nodeDef.getDeclaringNodeType(); try { @@ -1525,8 +1524,8 @@ checkNamespace(ntd.getPrimaryItemName(), nsReg); // validate property definitions - PropDef[] pda = ntd.getPropertyDefs(); - for (PropDef pd : pda) { + QPropertyDefinition[] pda = ntd.getPropertyDefs(); + for (QPropertyDefinition pd : pda) { /** * sanity check: * make sure declaring node type matches name of node type definition @@ -1557,10 +1556,10 @@ * check default values: * make sure type of value is consistent with required property type */ - InternalValue[] defVals = pd.getDefaultValues(); + QValue[] defVals = pd.getDefaultValues(); if (defVals != null && defVals.length != 0) { int reqType = pd.getRequiredType(); - for (InternalValue defVal : defVals) { + for (QValue defVal : defVals) { if (reqType == PropertyType.UNDEFINED) { reqType = defVal.getType(); } else { @@ -1590,7 +1589,7 @@ if (constraints != null && constraints.length > 0) { if (defVals != null && defVals.length > 0) { // check value constraints on every value - for (InternalValue defVal : defVals) { + for (QValue defVal : defVals) { // constraints are OR-ed together boolean satisfied = false; ConstraintViolationException cve = null; @@ -1638,8 +1637,8 @@ } // validate child-node definitions - NodeDef[] cnda = ntd.getChildNodeDefs(); - for (NodeDef cnd : cnda) { + QNodeDefinition[] cnda = ntd.getChildNodeDefs(); + for (QNodeDefinition cnd : cnda) { /** * sanity check: * make sure declaring node type matches name of node type definition Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropDef.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropDef.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropDef.java (working copy) @@ -16,8 +16,7 @@ */ package org.apache.jackrabbit.core.nodetype; -import org.apache.jackrabbit.core.value.InternalValue; -import org.apache.jackrabbit.spi.QValueConstraint; +import org.apache.jackrabbit.spi.QPropertyDefinition; /** * PropDef is the internal representation of @@ -26,7 +25,7 @@ * * @see javax.jcr.nodetype.PropertyDefinition */ -public interface PropDef extends ItemDef { +public interface PropDef extends QPropertyDefinition { PropDef[] EMPTY_ARRAY = new PropDef[0]; @@ -36,54 +35,4 @@ * @return an identifier for this property definition. */ PropDefId getId(); - - /** - * Returns the required type. - * - * @return the required type. - */ - int getRequiredType(); - - /** - * Returns the array of value constraints. - * - * @return the array of value constraints. - */ - QValueConstraint[] getValueConstraints(); - - /** - * Returns the array of default values. - * - * @return the array of default values. - */ - InternalValue[] getDefaultValues(); - - /** - * Reports whether this property can have multiple values. - * - * @return the 'multiple' flag. - */ - boolean isMultiple(); - - /** - * Returns the array of available query operators. - * - * @return the array of query operators. - */ - String[] getAvailableQueryOperators(); - - /** - * Reports whether this property is full-text searchable. - * - * @return the 'fullTextSearchable' flag. - */ - boolean isFullTextSearchable(); - - /** - * Reports whether this property is query-orderable. - * - * @return the 'queryOrderable' flag. - */ - boolean isQueryOrderable(); - } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropDefId.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropDefId.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropDefId.java (working copy) @@ -18,6 +18,8 @@ import java.io.Serializable; +import org.apache.jackrabbit.spi.QPropertyDefinition; + /** * PropDefId serves as identifier for a given PropDef. * @@ -45,7 +47,7 @@ * * @param def PropDef to create identifier for */ - PropDefId(PropDef def) { + PropDefId(QPropertyDefinition def) { if (def == null) { throw new IllegalArgumentException("PropDef argument can not be null"); } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropDefImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropDefImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropDefImpl.java (working copy) @@ -20,114 +20,33 @@ import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.QValueConstraint; -import org.apache.jackrabbit.spi.QValue; -import org.apache.jackrabbit.spi.commons.query.qom.Operator; import org.apache.jackrabbit.spi.commons.QPropertyDefinitionImpl; -import javax.jcr.PropertyType; -import javax.jcr.RepositoryException; - -import java.util.Arrays; - /** * This class implements the PropDef interface and additionally * provides setter methods for the various property definition attributes. */ -public class PropDefImpl extends ItemDefImpl implements PropDef { +public class PropDefImpl extends QPropertyDefinitionImpl implements PropDef { /** - * The required type. - */ - private int requiredType = PropertyType.UNDEFINED; - - /** - * The value constraints. - */ - private QValueConstraint[] valueConstraints = QValueConstraint.EMPTY_ARRAY; - - /** - * The default values. - */ - private InternalValue[] defaultValues = InternalValue.EMPTY_ARRAY; - - /** - * The 'multiple' flag - */ - private boolean multiple = false; - - /** * The identifier of this property definition. The identifier is lazily * computed based on the characteristics of this property definition and * reset on every attribute change. */ private PropDefId id = null; - /* - * The 'fulltext searchable' flag. - */ - private boolean fullTextSearchable = true; - - /* - * The 'query orderable' flag. - */ - private boolean queryOrderable = true; - - /* - * The 'query operators. - */ - private String[] queryOperators = Operator.getAllQueryOperators(); - - /** * Default constructor. */ public PropDefImpl() { + super(); } public PropDefImpl(QPropertyDefinition pd) { super(pd); - requiredType = pd.getRequiredType(); - valueConstraints = pd.getValueConstraints(); - QValue[] vs = pd.getDefaultValues(); - if (vs != null) { - defaultValues = new InternalValue[vs.length]; - for (int i=0; i @@ -286,103 +193,4 @@ } return id; } - - /** - * {@inheritDoc} - */ - public int getRequiredType() { - return requiredType; - } - - /** - * {@inheritDoc} - */ - public QValueConstraint[] getValueConstraints() { - return valueConstraints; - } - - /** - * {@inheritDoc} - */ - public InternalValue[] getDefaultValues() { - return defaultValues; - } - - /** - * {@inheritDoc} - */ - public boolean isMultiple() { - return multiple; - } - - /** - * {@inheritDoc} - * - * @return always false - */ - public boolean definesNode() { - return false; - } - - /** - * {@inheritDoc} - */ - public String[] getAvailableQueryOperators() { - return queryOperators; - } - - /** - * {@inheritDoc} - */ - public boolean isFullTextSearchable() { - return fullTextSearchable; - } - - /** - * {@inheritDoc} - */ - public boolean isQueryOrderable() { - return queryOrderable; - } - - //-------------------------------------------< java.lang.Object overrides > - /** - * Compares two property definitions for equality. Returns true - * if the given object is a property defintion and has the same attributes - * as this property definition. - * - * @param obj the object to compare this property definition with - * @return true if the object is equal to this property definition, - * false otherwise - * @see Object#equals(Object) - */ - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj instanceof PropDefImpl) { - PropDefImpl other = (PropDefImpl) obj; - return super.equals(obj) - && requiredType == other.requiredType - && Arrays.equals(valueConstraints, other.valueConstraints) - && Arrays.equals(defaultValues, other.defaultValues) - && multiple == other.multiple - && Arrays.equals(queryOperators, other.queryOperators) - && queryOrderable == other.queryOrderable - && fullTextSearchable == other.fullTextSearchable; - } - return false; - } - - /** - * Returns zero to satisfy the Object equals/hashCode contract. - * This class is mutable and not meant to be used as a hash key. - * - * @return always zero - * @see Object#hashCode() - */ - public int hashCode() { - return 0; - } - } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropertyDefinitionImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropertyDefinitionImpl.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/PropertyDefinitionImpl.java (working copy) @@ -21,8 +21,9 @@ import javax.jcr.ValueFactory; import javax.jcr.nodetype.PropertyDefinition; -import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.spi.QValueConstraint; +import org.apache.jackrabbit.spi.QValue; +import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.apache.jackrabbit.spi.commons.value.ValueFormat; import org.apache.jackrabbit.spi.commons.nodetype.constraint.ValueConstraint; @@ -54,7 +55,7 @@ * @param resolver name resolver * @param valueFactory the value factory */ - PropertyDefinitionImpl(PropDef propDef, NodeTypeManagerImpl ntMgr, + PropertyDefinitionImpl(QPropertyDefinition propDef, NodeTypeManagerImpl ntMgr, NamePathResolver resolver, ValueFactory valueFactory) { super(propDef, ntMgr, resolver); this.valueFactory = valueFactory; @@ -74,7 +75,7 @@ * {@inheritDoc} */ public Value[] getDefaultValues() { - InternalValue[] defVals = ((PropDef) itemDef).getDefaultValues(); + QValue[] defVals = ((QPropertyDefinition) itemDef).getDefaultValues(); if (defVals == null) { return null; } @@ -98,21 +99,21 @@ * {@inheritDoc} */ public int getRequiredType() { - return ((PropDef) itemDef).getRequiredType(); + return ((QPropertyDefinition) itemDef).getRequiredType(); } /** * {@inheritDoc} */ public String[] getValueConstraints() { - QValueConstraint[] constraints = ((PropDef) itemDef).getValueConstraints(); + QValueConstraint[] constraints = ((QPropertyDefinition) itemDef).getValueConstraints(); if (constraints == null || constraints.length == 0) { return new String[0]; } String[] vca = new String[constraints.length]; for (int i = 0; i < constraints.length; i++) { try { - ValueConstraint vc = ValueConstraint.create(((PropDef) itemDef).getRequiredType(), constraints[i].getString()); + ValueConstraint vc = ValueConstraint.create(((QPropertyDefinition) itemDef).getRequiredType(), constraints[i].getString()); vca[i] = vc.getDefinition(resolver); } catch (InvalidConstraintException e) { log.warn("Error during conversion of value constraint.", e); @@ -126,27 +127,27 @@ * {@inheritDoc} */ public boolean isMultiple() { - return ((PropDef) itemDef).isMultiple(); + return ((QPropertyDefinition) itemDef).isMultiple(); } /** * {@inheritDoc} */ public String[] getAvailableQueryOperators() { - return ((PropDef) itemDef).getAvailableQueryOperators(); + return ((QPropertyDefinition) itemDef).getAvailableQueryOperators(); } /** * {@inheritDoc} */ public boolean isFullTextSearchable() { - return ((PropDef) itemDef).isFullTextSearchable(); + return ((QPropertyDefinition) itemDef).isFullTextSearchable(); } /** * {@inheritDoc} */ public boolean isQueryOrderable() { - return ((PropDef) itemDef).isQueryOrderable(); + return ((QPropertyDefinition) itemDef).isQueryOrderable(); } } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateProvider.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateProvider.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateProvider.java (working copy) @@ -25,11 +25,9 @@ import javax.jcr.version.OnParentVersionAction; import org.apache.jackrabbit.core.id.NodeId; -import org.apache.jackrabbit.core.nodetype.NodeDef; import org.apache.jackrabbit.core.nodetype.NodeDefId; import org.apache.jackrabbit.core.nodetype.NodeTypeDef; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; -import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.core.state.ChangeLog; import org.apache.jackrabbit.core.state.ItemStateException; import org.apache.jackrabbit.core.state.NoSuchItemStateException; @@ -38,6 +36,8 @@ import org.apache.jackrabbit.core.virtual.VirtualNodeState; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QValueConstraint; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.commons.name.NameConstants; /** @@ -168,7 +168,7 @@ } // add property defs - PropDef[] propDefs = ntDef.getPropertyDefs(); + QPropertyDefinition[] propDefs = ntDef.getPropertyDefs(); for (int i = 0; i < propDefs.length; i++) { VirtualNodeState pdState = createPropertyDefState(ntState, propDefs[i], ntDef, i); ntState.addChildNodeEntry(NameConstants.JCR_PROPERTYDEFINITION, pdState.getNodeId()); @@ -177,7 +177,7 @@ } // add child node defs - NodeDef[] cnDefs = ntDef.getChildNodeDefs(); + QNodeDefinition[] cnDefs = ntDef.getChildNodeDefs(); for (int i = 0; i < cnDefs.length; i++) { VirtualNodeState cnState = createChildNodeDefState(ntState, cnDefs[i], ntDef, i); ntState.addChildNodeEntry(NameConstants.JCR_CHILDNODEDEFINITION, cnState.getNodeId()); @@ -197,7 +197,7 @@ * @throws RepositoryException */ private VirtualNodeState createPropertyDefState(VirtualNodeState parent, - PropDef propDef, + QPropertyDefinition propDef, NodeTypeDef ntDef, int n) throws RepositoryException { NodeId id = calculateStableId( @@ -218,7 +218,7 @@ pState.setPropertyValue( NameConstants.JCR_REQUIREDTYPE, InternalValue.create(PropertyType.nameFromValue(propDef.getRequiredType()).toUpperCase())); - InternalValue[] defVals = propDef.getDefaultValues(); + InternalValue[] defVals = InternalValue.create(propDef.getDefaultValues()); // retrieve the property type from the first default value present with // the property definition. in case no default values are defined, // fallback to PropertyType.STRING in order to avoid creating a property @@ -227,7 +227,9 @@ if (defVals != null && defVals.length > 0) { defValsType = defVals[0].getType(); } - pState.setPropertyValues(NameConstants.JCR_DEFAULTVALUES, defValsType, defVals); + if (defVals != null) { + pState.setPropertyValues(NameConstants.JCR_DEFAULTVALUES, defValsType, defVals); + } QValueConstraint[] vc = propDef.getValueConstraints(); InternalValue[] vals = new InternalValue[vc.length]; for (int i = 0; i < vc.length; i++) { @@ -246,7 +248,7 @@ * @throws RepositoryException */ private VirtualNodeState createChildNodeDefState(VirtualNodeState parent, - NodeDef cnDef, + QNodeDefinition cnDef, NodeTypeDef ntDef, int n) throws RepositoryException { NodeId id = calculateStableId( Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeReader.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeReader.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeReader.java (working copy) @@ -17,7 +17,6 @@ package org.apache.jackrabbit.core.nodetype.xml; import org.apache.jackrabbit.core.nodetype.InvalidNodeTypeDefException; -import org.apache.jackrabbit.core.nodetype.ItemDef; import org.apache.jackrabbit.core.nodetype.NodeDef; import org.apache.jackrabbit.core.nodetype.NodeDefImpl; import org.apache.jackrabbit.core.nodetype.NodeTypeDef; @@ -34,6 +33,7 @@ import org.apache.jackrabbit.spi.commons.value.ValueFormat; import org.apache.jackrabbit.spi.commons.nodetype.constraint.ValueConstraint; import org.apache.jackrabbit.spi.commons.nodetype.InvalidConstraintException; +import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QValueFactory; import org.apache.jackrabbit.spi.QValueConstraint; @@ -217,7 +217,7 @@ PropDefImpl def = new PropDefImpl(); String name = walker.getAttribute(Constants.NAME_ATTRIBUTE); if (name.equals("*")) { - def.setName(ItemDef.ANY_NAME); + def.setName(NameConstants.ANY_NAME); } else { def.setName(resolver.getQName(name)); } @@ -324,7 +324,7 @@ NodeDefImpl def = new NodeDefImpl(); String name = walker.getAttribute(Constants.NAME_ATTRIBUTE); if (name.equals("*")) { - def.setName(ItemDef.ANY_NAME); + def.setName(NameConstants.ANY_NAME); } else { def.setName(resolver.getQName(name)); } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java (working copy) @@ -16,11 +16,8 @@ */ package org.apache.jackrabbit.core.nodetype.xml; -import org.apache.jackrabbit.core.nodetype.NodeDef; import org.apache.jackrabbit.core.nodetype.NodeTypeDef; -import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.core.util.DOMBuilder; -import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.core.value.InternalValueFactory; import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; @@ -30,6 +27,9 @@ import org.apache.jackrabbit.spi.commons.nodetype.constraint.ValueConstraint; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QValueConstraint; +import org.apache.jackrabbit.spi.QValue; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QNodeDefinition; import javax.jcr.NamespaceRegistry; import javax.jcr.PropertyType; @@ -165,14 +165,14 @@ } // property definitions - PropDef[] properties = def.getPropertyDefs(); - for (PropDef property : properties) { + QPropertyDefinition[] properties = def.getPropertyDefs(); + for (QPropertyDefinition property : properties) { addPropDef(property); } // child node definitions - NodeDef[] nodes = def.getChildNodeDefs(); - for (NodeDef node : nodes) { + QNodeDefinition[] nodes = def.getChildNodeDefs(); + for (QNodeDefinition node : nodes) { addChildNodeDef(node); } @@ -188,7 +188,7 @@ * @throws NamespaceException if the property definition contains * invalid namespace references */ - private void addPropDef(PropDef def) + private void addPropDef(QPropertyDefinition def) throws NamespaceException, RepositoryException { builder.startElement(Constants.PROPERTYDEFINITION_ELEMENT); @@ -261,10 +261,10 @@ } // default values - InternalValue[] defaults = def.getDefaultValues(); + QValue[] defaults = def.getDefaultValues(); if (defaults != null && defaults.length > 0) { builder.startElement(Constants.DEFAULTVALUES_ELEMENT); - for (InternalValue v : defaults) { + for (QValue v : defaults) { builder.addContentElement( Constants.DEFAULTVALUE_ELEMENT, factory.createValue(v).getString()); @@ -282,7 +282,7 @@ * @throws NamespaceException if the child node definition contains * invalid namespace references */ - private void addChildNodeDef(NodeDef def) + private void addChildNodeDef(QNodeDefinition def) throws NamespaceException { builder.startElement(Constants.CHILDNODEDEFINITION_ELEMENT); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java (working copy) @@ -19,10 +19,10 @@ import java.util.Calendar; import java.util.Set; -import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.core.state.NodeState; import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.commons.name.NameConstants; /** @@ -60,7 +60,7 @@ * @return the computed values */ public InternalValue[] computeSystemGeneratedPropertyValues(NodeState parent, - PropDef def) { + QPropertyDefinition def) { InternalValue[] genValues = null; Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/PropertyTypeRegistry.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/PropertyTypeRegistry.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/PropertyTypeRegistry.java (working copy) @@ -19,8 +19,8 @@ import org.apache.jackrabbit.core.nodetype.NodeTypeDef; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistryListener; -import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QPropertyDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,9 +87,9 @@ public void nodeTypeRegistered(Name ntName) { try { NodeTypeDef def = registry.getNodeTypeDef(ntName); - PropDef[] propDefs = def.getPropertyDefs(); + QPropertyDefinition[] propDefs = def.getPropertyDefs(); synchronized (typeMapping) { - for (PropDef propDef : propDefs) { + for (QPropertyDefinition propDef : propDefs) { int type = propDef.getRequiredType(); if (!propDef.definesResidual() && type != PropertyType.UNDEFINED) { Name name = propDef.getName(); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java (working copy) @@ -35,10 +35,10 @@ import org.apache.jackrabbit.core.id.ItemId; import org.apache.jackrabbit.core.id.NodeId; import org.apache.jackrabbit.core.id.PropertyId; -import org.apache.jackrabbit.core.nodetype.NodeDef; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; import org.apache.jackrabbit.core.util.Dumpable; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QNodeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -867,7 +867,7 @@ } catch (ItemStateException e) { return false; } - NodeDef def = ntReg.getNodeDef(ns.getDefinitionId()); + QNodeDefinition def = ntReg.getNodeDef(ns.getDefinitionId()); return def != null ? def.allowsSameNameSiblings() : false; } }; Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (working copy) @@ -33,7 +33,6 @@ import org.apache.jackrabbit.core.id.NodeId; import org.apache.jackrabbit.core.id.PropertyId; import org.apache.jackrabbit.core.nodetype.EffectiveNodeType; -import org.apache.jackrabbit.core.nodetype.NodeDef; import org.apache.jackrabbit.core.nodetype.NodeDefId; import org.apache.jackrabbit.core.nodetype.NodeTypeConflictException; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; @@ -47,6 +46,7 @@ import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -631,7 +631,7 @@ } catch (ItemStateException e) { return false; } - NodeDef def = ntReg.getNodeDef(ns.getDefinitionId()); + QNodeDefinition def = ntReg.getNodeDef(ns.getDefinitionId()); return def != null ? def.allowsSameNameSiblings() : false; } }; Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java (working copy) @@ -242,6 +242,18 @@ } } + public static InternalValue[] create(QValue[] values) + throws RepositoryException { + if (values == null) { + return null; + } + InternalValue[] tmp = new InternalValue[values.length]; + for (int i = 0; i < values.length; i++) { + tmp[i] = InternalValue.create(values[i]); + } + return tmp; + } + static InternalValue getInternalValue(DataIdentifier identifier, DataStore store) throws DataStoreException { // access the record to ensure it is not garbage collected if (store.getRecordIfStored(identifier) != null) { Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/NodeStateEx.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/NodeStateEx.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/NodeStateEx.java (working copy) @@ -42,6 +42,8 @@ import org.apache.jackrabbit.core.state.UpdatableItemStateManager; import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QItemDefinition; import org.apache.jackrabbit.spi.commons.name.NameConstants; /** @@ -826,7 +828,7 @@ * Returns the NodeDef for this state * @return the node def */ - public NodeDef getDefinition() { + public QItemDefinition getDefinition() { return ntReg.getNodeDef(nodeState.getDefinitionId()); } @@ -835,7 +837,7 @@ * @param prop the property state * @return the prop def */ - public PropDef getDefinition(PropertyState prop) { + public QPropertyDefinition getDefinition(PropertyState prop) { return ntReg.getPropDef(prop.getDefinitionId()); } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java (working copy) @@ -34,7 +34,6 @@ import org.apache.jackrabbit.core.ItemValidator; import org.apache.jackrabbit.core.SessionImpl; import org.apache.jackrabbit.core.id.NodeId; -import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.core.security.authorization.Permission; import org.apache.jackrabbit.core.state.ChildNodeEntry; import org.apache.jackrabbit.core.state.ItemStateException; @@ -43,6 +42,7 @@ import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.Path; +import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -428,7 +428,7 @@ } // add 'auto-create' properties that do not exist yet - for (PropDef def: state.getEffectiveNodeType().getAutoCreatePropDefs()) { + for (QPropertyDefinition def: state.getEffectiveNodeType().getAutoCreatePropDefs()) { if (!state.hasProperty(def.getName())) { InternalValue[] values = computeAutoValues(state, def, true); if (values != null) { @@ -644,14 +644,16 @@ * @param def property definition * @param useDefaultValues if true the default values are respected * @return the values or null + * @throws RepositoryException if the values cannot be computed. */ - private InternalValue[] computeAutoValues(NodeStateEx state, PropDef def, - boolean useDefaultValues) { + private InternalValue[] computeAutoValues(NodeStateEx state, QPropertyDefinition def, + boolean useDefaultValues) + throws RepositoryException { // compute system generated values if necessary InternalValue[] values = session.getNodeTypeInstanceHandler(). computeSystemGeneratedPropertyValues(state.getState(), def); if (values == null && useDefaultValues) { - values = def.getDefaultValues(); + values = InternalValue.create(def.getDefaultValues()); } // avoid empty value array for single value property if (values != null && values.length == 0 && !def.isMultiple()) { Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/DefaultProtectedPropertyImporter.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/DefaultProtectedPropertyImporter.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/DefaultProtectedPropertyImporter.java (working copy) @@ -20,9 +20,9 @@ import org.apache.jackrabbit.core.NodeImpl; import org.apache.jackrabbit.core.state.NodeState; -import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.api.JackrabbitSession; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; +import org.apache.jackrabbit.spi.QPropertyDefinition; /** * Default implementation that isn't able to handle any protected properties. @@ -46,18 +46,18 @@ /** * Always returns false. * - * @see ProtectedPropertyImporter#handlePropInfo(org.apache.jackrabbit.core.NodeImpl, PropInfo, org.apache.jackrabbit.core.nodetype.PropDef) + * @see ProtectedPropertyImporter#handlePropInfo(org.apache.jackrabbit.core.NodeImpl, PropInfo, QPropertyDefinition) */ - public boolean handlePropInfo(NodeImpl parent, PropInfo protectedPropInfo, PropDef def) { + public boolean handlePropInfo(NodeImpl parent, PropInfo protectedPropInfo, QPropertyDefinition def) { return false; } /** * Always returns false. * - * @see ProtectedPropertyImporter#handlePropInfo(org.apache.jackrabbit.core.state.NodeState, PropInfo, PropDef) + * @see ProtectedPropertyImporter#handlePropInfo(org.apache.jackrabbit.core.state.NodeState, PropInfo, QPropertyDefinition) */ - public boolean handlePropInfo(NodeState parent, PropInfo protectedPropInfo, PropDef def) throws RepositoryException { + public boolean handlePropInfo(NodeState parent, PropInfo protectedPropInfo, QPropertyDefinition def) throws RepositoryException { return false; } } \ No newline at end of file Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/PropInfo.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/PropInfo.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/PropInfo.java (working copy) @@ -26,9 +26,8 @@ import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.core.state.NodeState; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Information about a property being imported. This class is used @@ -79,7 +78,7 @@ } } - public int getTargetType(PropDef def) { + public int getTargetType(QPropertyDefinition def) { int target = def.getRequiredType(); if (target != PropertyType.UNDEFINED) { return target; Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/ProtectedPropertyImporter.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/ProtectedPropertyImporter.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/ProtectedPropertyImporter.java (working copy) @@ -19,8 +19,8 @@ import javax.jcr.RepositoryException; import org.apache.jackrabbit.core.NodeImpl; -import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.core.state.NodeState; +import org.apache.jackrabbit.spi.QPropertyDefinition; /** * ProtectedPropertyImporter is in charge of importing single @@ -42,7 +42,7 @@ * false otherwise. * @throws RepositoryException If an error occurs. */ - boolean handlePropInfo(NodeImpl parent, PropInfo protectedPropInfo, PropDef def) + boolean handlePropInfo(NodeImpl parent, PropInfo protectedPropInfo, QPropertyDefinition def) throws RepositoryException; /** @@ -56,7 +56,7 @@ * false otherwise. * @throws RepositoryException If an error occurs. */ - boolean handlePropInfo(NodeState parent, PropInfo protectedPropInfo, PropDef def) + boolean handlePropInfo(NodeState parent, PropInfo protectedPropInfo, QPropertyDefinition def) throws RepositoryException; Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SessionImporter.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SessionImporter.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SessionImporter.java (working copy) @@ -35,10 +35,10 @@ import org.apache.jackrabbit.core.NodeImpl; import org.apache.jackrabbit.core.SessionImpl; import org.apache.jackrabbit.core.id.NodeId; -import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.core.security.authorization.Permission; import org.apache.jackrabbit.core.util.ReferenceChangeTracker; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -153,7 +153,7 @@ } - protected void createProperty(NodeImpl node, PropInfo pInfo, PropDef def) throws RepositoryException { + protected void createProperty(NodeImpl node, PropInfo pInfo, QPropertyDefinition def) throws RepositoryException { // convert serialized values to Value objects Value[] va = pInfo.getValues(pInfo.getTargetType(def), session); @@ -369,7 +369,7 @@ for (PropInfo pi : propInfos) { // find applicable definition - PropDef def = pi.getApplicablePropertyDef(node.getEffectiveNodeType()); + QPropertyDefinition def = pi.getApplicablePropertyDef(node.getEffectiveNodeType()); if (def.isProtected()) { // skip protected property log.debug("Skipping protected property " + pi.getName()); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java (revision 812157) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java (working copy) @@ -50,6 +50,7 @@ import org.apache.jackrabbit.core.version.VersionHistoryInfo; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.Path; +import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException; import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.slf4j.Logger; @@ -492,7 +493,7 @@ parent.getChildNodeEntry(nodeName, 1); NodeId idExisting = entry.getId(); NodeState existing = (NodeState) itemOps.getItemState(idExisting); - NodeDef def = ntReg.getNodeDef(existing.getDefinitionId()); + QNodeDefinition def = ntReg.getNodeDef(existing.getDefinitionId()); if (!def.allowsSameNameSiblings()) { // existing doesn't allow same-name siblings, Index: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/nodetype/CyclicNodeTypeRegistrationTest.java =================================================================== --- jackrabbit-core/src/test/java/org/apache/jackrabbit/core/nodetype/CyclicNodeTypeRegistrationTest.java (revision 812157) +++ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/nodetype/CyclicNodeTypeRegistrationTest.java (working copy) @@ -21,6 +21,7 @@ import org.apache.jackrabbit.test.AbstractJCRTest; import org.apache.jackrabbit.spi.NameFactory; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.QPropertyDefinition; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; Index: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/nodetype/xml/TestAll.java =================================================================== --- jackrabbit-core/src/test/java/org/apache/jackrabbit/core/nodetype/xml/TestAll.java (revision 812157) +++ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/nodetype/xml/TestAll.java (working copy) @@ -20,17 +20,18 @@ import org.apache.jackrabbit.api.JackrabbitNodeTypeManager; import org.apache.jackrabbit.core.nodetype.InvalidNodeTypeDefException; -import org.apache.jackrabbit.core.nodetype.NodeDef; import org.apache.jackrabbit.core.nodetype.NodeTypeDef; -import org.apache.jackrabbit.core.nodetype.PropDef; -import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.core.value.InternalValueFactory; import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.NameFactory; +import org.apache.jackrabbit.spi.QValue; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl; +import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.apache.jackrabbit.spi.commons.value.ValueFactoryQImpl; import org.apache.jackrabbit.test.AbstractJCRTest; @@ -126,16 +127,16 @@ * @param propertyName property name, or null * @return property definition */ - private PropDef getPropDef(String typeName, String propertyName) { + private QPropertyDefinition getPropDef(String typeName, String propertyName) { Name name; if (propertyName != null) { name = FACTORY.create(TEST_NAMESPACE, propertyName); } else { - name = PropDef.ANY_NAME; + name = NameConstants.ANY_NAME; } NodeTypeDef def = getNodeType(typeName); - PropDef[] defs = def.getPropertyDefs(); + QPropertyDefinition[] defs = def.getPropertyDefs(); for (int i = 0; i < defs.length; i++) { if (name.equals(defs[i].getName())) { return defs[i]; @@ -153,9 +154,9 @@ * @param index default value index * @return default value */ - private String getDefaultValue(PropDef def, int index) { + private String getDefaultValue(QPropertyDefinition def, int index) { try { - InternalValue[] values = def.getDefaultValues(); + QValue[] values = def.getDefaultValues(); NamespaceResolver nsResolver = new AdditionalNamespaceResolver(registry); NamePathResolver resolver = new DefaultNamePathResolver(nsResolver); ValueFactoryQImpl factory = new ValueFactoryQImpl(InternalValueFactory.getInstance(), resolver); @@ -174,11 +175,11 @@ * @param nodeName child node name * @return child node definition */ - private NodeDef getChildNode(String typeName, String nodeName) { + private QNodeDefinition getChildNode(String typeName, String nodeName) { Name name = FACTORY.create(TEST_NAMESPACE, nodeName); NodeTypeDef def = getNodeType(typeName); - NodeDef[] defs = def.getChildNodeDefs(); + QNodeDefinition[] defs = def.getChildNodeDefs(); for (int i = 0; i < defs.length; i++) { if (name.equals(defs[i].getName())) { return defs[i]; @@ -236,7 +237,7 @@ def.getPrimaryItemName()); assertEquals("itemNodeType propertyDefs", 10, def.getPropertyDefs().length); - PropDef pdef = getPropDef("itemNodeType", null); + QPropertyDefinition pdef = getPropDef("itemNodeType", null); assertTrue("itemNodeType wildcard property", pdef.definesResidual()); } @@ -317,7 +318,7 @@ /** Test for the empty item definition. */ public void testEmptyItem() { - PropDef def = getPropDef("itemNodeType", "emptyItem"); + QPropertyDefinition def = getPropDef("itemNodeType", "emptyItem"); assertEquals("emptyItem autoCreate", false, def.isAutoCreated()); assertEquals("emptyItem mandatory", @@ -330,56 +331,56 @@ /** Test for the autoCreated item definition attribute. */ public void testAutoCreateItem() { - PropDef def = getPropDef("itemNodeType", "autoCreatedItem"); + QPropertyDefinition def = getPropDef("itemNodeType", "autoCreatedItem"); assertEquals("autoCreatedItem autoCreated", true, def.isAutoCreated()); } /** Test for the mandatory item definition attribute. */ public void testMandatoryItem() { - PropDef def = getPropDef("itemNodeType", "mandatoryItem"); + QPropertyDefinition def = getPropDef("itemNodeType", "mandatoryItem"); assertEquals("mandatoryItem mandatory", true, def.isMandatory()); } /** Test for the copy parent version action. */ public void testCopyItem() { - PropDef def = getPropDef("itemNodeType", "copyItem"); + QPropertyDefinition def = getPropDef("itemNodeType", "copyItem"); assertEquals("copyItem onParentVersion", OnParentVersionAction.COPY, def.getOnParentVersion()); } /** Test for the version parent version action. */ public void testVersionItem() { - PropDef def = getPropDef("itemNodeType", "versionItem"); + QPropertyDefinition def = getPropDef("itemNodeType", "versionItem"); assertEquals("versionItem onParentVersion", OnParentVersionAction.VERSION, def.getOnParentVersion()); } /** Test for the initialize parent version action. */ public void testInitializeItem() { - PropDef def = getPropDef("itemNodeType", "initializeItem"); + QPropertyDefinition def = getPropDef("itemNodeType", "initializeItem"); assertEquals("initializeItem onParentVersion", OnParentVersionAction.INITIALIZE, def.getOnParentVersion()); } /** Test for the compute parent version action. */ public void testComputeItem() { - PropDef def = getPropDef("itemNodeType", "computeItem"); + QPropertyDefinition def = getPropDef("itemNodeType", "computeItem"); assertEquals("computeItem onParentVersion", OnParentVersionAction.COMPUTE, def.getOnParentVersion()); } /** Test for the abort parent version action. */ public void testAbortItem() { - PropDef def = getPropDef("itemNodeType", "abortItem"); + QPropertyDefinition def = getPropDef("itemNodeType", "abortItem"); assertEquals("abortItem onParentVersion", OnParentVersionAction.ABORT, def.getOnParentVersion()); } /** Test for the protected item definition attribute. */ public void testProtectedItem() { - PropDef def = getPropDef("itemNodeType", "protectedItem"); + QPropertyDefinition def = getPropDef("itemNodeType", "protectedItem"); assertEquals("protectedItem protected", true, def.isProtected()); } @@ -393,7 +394,7 @@ /** Test for the empty property definition. */ public void testEmptyProperty() { - PropDef def = getPropDef("propertyNodeType", "emptyProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "emptyProperty"); assertEquals("emptyProperty requiredType", PropertyType.UNDEFINED, def.getRequiredType()); assertEquals("emptyProperty multiple", @@ -406,7 +407,7 @@ /** Test for the binary property definition type. */ public void testBinaryProperty() { - PropDef def = getPropDef("propertyNodeType", "binaryProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "binaryProperty"); assertEquals("binaryProperty requiredType", PropertyType.BINARY, def.getRequiredType()); assertEquals("binaryProperty valueConstraints", @@ -419,7 +420,7 @@ /** Test for the boolean property definition type. */ public void testBooleanProperty() { - PropDef def = getPropDef("propertyNodeType", "booleanProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "booleanProperty"); assertEquals("booleanProperty requiredType", PropertyType.BOOLEAN, def.getRequiredType()); assertEquals("booleanProperty valueConstraints", @@ -436,7 +437,7 @@ /** Test for the date property definition type. */ public void testDateProperty() { - PropDef def = getPropDef("propertyNodeType", "dateProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "dateProperty"); assertEquals("dateProperty requiredType", PropertyType.DATE, def.getRequiredType()); assertEquals("dateProperty valueConstraints", @@ -452,7 +453,7 @@ /** Test for the double property definition type. */ public void testDoubleProperty() { - PropDef def = getPropDef("propertyNodeType", "doubleProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "doubleProperty"); assertEquals("doubleProperty requiredType", PropertyType.DOUBLE, def.getRequiredType()); assertEquals("doubleProperty valueConstraints", @@ -471,7 +472,7 @@ /** Test for the long property definition type. */ public void testLongProperty() { - PropDef def = getPropDef("propertyNodeType", "longProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "longProperty"); assertEquals("longProperty requiredType", PropertyType.LONG, def.getRequiredType()); assertEquals("longProperty valueConstraints", @@ -490,7 +491,7 @@ /** Test for the name property definition type. */ public void testNameProperty() { - PropDef def = getPropDef("propertyNodeType", "nameProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "nameProperty"); assertEquals("nameProperty requiredType", PropertyType.NAME, def.getRequiredType()); assertEquals("nameProperty valueConstraints", @@ -506,7 +507,7 @@ /** Test for the path property definition type. */ public void testPathProperty() { - PropDef def = getPropDef("propertyNodeType", "pathProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "pathProperty"); assertEquals("pathProperty requiredType", PropertyType.PATH, def.getRequiredType()); assertEquals("pathProperty valueConstraints", @@ -520,7 +521,7 @@ /** Test for the path property definition type. */ public void testPathProperty1() { - PropDef def = getPropDef("propertyNodeType", "pathProperty1"); + QPropertyDefinition def = getPropDef("propertyNodeType", "pathProperty1"); assertEquals("pathProperty requiredType", PropertyType.PATH, def.getRequiredType()); assertEquals("pathProperty valueConstraints", @@ -534,7 +535,7 @@ /** Test for the path property definition type. */ public void testPathProperty2() { - PropDef def = getPropDef("propertyNodeType", "pathProperty2"); + QPropertyDefinition def = getPropDef("propertyNodeType", "pathProperty2"); assertEquals("pathProperty requiredType", PropertyType.PATH, def.getRequiredType()); assertEquals("pathProperty valueConstraints", @@ -548,7 +549,7 @@ /** Test for the reference property definition type. */ public void testReferenceProperty() { - PropDef def = getPropDef("propertyNodeType", "referenceProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "referenceProperty"); assertEquals("referenceProperty requiredType", PropertyType.REFERENCE, def.getRequiredType()); assertEquals("referenceProperty valueConstraints", @@ -562,7 +563,7 @@ /** Test for the string property definition type. */ public void testStringProperty() { - PropDef def = getPropDef("propertyNodeType", "stringProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "stringProperty"); assertEquals("stringProperty requiredType", PropertyType.STRING, def.getRequiredType()); assertEquals("stringProperty valueConstraints", @@ -580,7 +581,7 @@ /** Test for the multiple property definition attribute. */ public void testMultipleProperty() { - PropDef def = getPropDef("propertyNodeType", "multipleProperty"); + QPropertyDefinition def = getPropDef("propertyNodeType", "multipleProperty"); assertEquals("multipleProperty multiple", true, def.isMultiple()); } @@ -594,7 +595,7 @@ /** Test for the empty child node definition. */ public void testEmptyNode() { - NodeDef def = getChildNode("childNodeType", "emptyNode"); + QNodeDefinition def = getChildNode("childNodeType", "emptyNode"); assertEquals("emptyNode allowsSameNameSiblings", false, def.allowsSameNameSiblings()); assertEquals("emptyNode defaultPrimaryType", @@ -603,14 +604,14 @@ /** Test for the allowsSameNameSiblings child node attribute. */ public void testSiblingNode() { - NodeDef def = getChildNode("childNodeType", "siblingNode"); + QNodeDefinition def = getChildNode("childNodeType", "siblingNode"); assertEquals("siblingNode allowsSameNameSiblings", true, def.allowsSameNameSiblings()); } /** Test for the defaultPrimaryType child node attribute. */ public void testDefaultTypeNode() { - NodeDef def = getChildNode("childNodeType", "defaultTypeNode"); + QNodeDefinition def = getChildNode("childNodeType", "defaultTypeNode"); assertEquals("defaultTypeNode defaultPrimaryType", FACTORY.create(Name.NS_NT_URI, "base"), def.getDefaultPrimaryType()); @@ -618,7 +619,7 @@ /** Test for the requiredPrimaryTypes child node attributes. */ public void testRequiredTypeNode() { - NodeDef def = getChildNode("childNodeType", "requiredTypeNode"); + QNodeDefinition def = getChildNode("childNodeType", "requiredTypeNode"); assertEquals("requiredTypeNode requiredPrimaryTypes", 2, def.getRequiredPrimaryTypes().length); Name[] types = def.getRequiredPrimaryTypes(); Index: jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QItemDefinitionImpl.java =================================================================== --- jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QItemDefinitionImpl.java (revision 812157) +++ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QItemDefinitionImpl.java (working copy) @@ -20,10 +20,12 @@ import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.Name; -import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl; +import org.apache.jackrabbit.spi.commons.name.NameConstants; import java.io.Serializable; +import javax.jcr.version.OnParentVersionAction; + /** * This abstract class implements the QItemDefinition * interface and additionally provides setter methods for the @@ -32,40 +34,34 @@ public abstract class QItemDefinitionImpl implements QItemDefinition, Serializable { /** - * The special wildcard name used as the name of residual item definitions. - * TODO don't rely on specific factory impl - */ - public static final Name ANY_NAME = NameFactoryImpl.getInstance().create("", "*"); - - /** * The name of the child item. */ - private final Name name; + private Name name; /** * The name of the declaring node type. */ - private final Name declaringNodeType; + private Name declaringNodeType; /** * The 'autoCreated' flag. */ - private final boolean autoCreated; + private boolean autoCreated; /** * The 'onParentVersion' attribute. */ - private final int onParentVersion; + private int onParentVersion; /** * The 'protected' flag. */ - private final boolean writeProtected; + private boolean writeProtected; /** * The 'mandatory' flag. */ - private final boolean mandatory; + private boolean mandatory; /** * HashCode of this object @@ -73,6 +69,14 @@ protected transient int hashCode = 0; /** + * Default constructor. + */ + public QItemDefinitionImpl() { + this(NameConstants.ANY_NAME, null, false, false, + OnParentVersionAction.COPY, false); + } + + /** * Creates a new QItemDefinitionImpl. * * @param name the name of the child item. @@ -82,7 +86,7 @@ * @param onParentVersion the on parent version behaviour. * @param isProtected if this item is protected. */ - QItemDefinitionImpl(Name name, Name declaringNodeType, + public QItemDefinitionImpl(Name name, Name declaringNodeType, boolean isAutoCreated, boolean isMandatory, int onParentVersion, boolean isProtected) { this.name = name; @@ -93,6 +97,75 @@ this.writeProtected = isProtected; } + /** + * Sets the name of declaring node type. + * + * @param declaringNodeType name of the declaring node type (must not be + * null) + */ + public void setDeclaringNodeType(Name declaringNodeType) { + if (declaringNodeType == null) { + throw new IllegalArgumentException("declaringNodeType can not be null"); + } + this.declaringNodeType = declaringNodeType; + } + + /** + * Sets the name of the child item. + * + * @param name name of child item (must not be null) + */ + public void setName(Name name) { + if (name == null) { + throw new IllegalArgumentException("name can not be null"); + } + this.name = name; + } + + /** + * Sets the 'autoCreated' flag. + * + * @param autoCreated a boolean + */ + public void setAutoCreated(boolean autoCreated) { + this.autoCreated = autoCreated; + } + + /** + * Sets the 'onParentVersion' attribute. + * + * @param onParentVersion any of the following constants: + *
    + *
  • OnParentVersionAction.COPY + *
  • OnParentVersionAction.VERSION + *
  • OnParentVersionAction.INITIALIZE + *
  • OnParentVersionAction.COMPUTE + *
  • OnParentVersionAction.IGNORE + *
  • OnParentVersionAction.ABORT + *
+ */ + public void setOnParentVersion(int onParentVersion) { + this.onParentVersion = onParentVersion; + } + + /** + * Sets the 'protected' flag. + * + * @param writeProtected a boolean + */ + public void setProtected(boolean writeProtected) { + this.writeProtected = writeProtected; + } + + /** + * Sets the 'mandatory' flag. + * + * @param mandatory a boolean + */ + public void setMandatory(boolean mandatory) { + this.mandatory = mandatory; + } + //--------------------------------------------------------------< QItemDefinition > /** * {@inheritDoc} Index: jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeDefinitionImpl.java =================================================================== --- jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeDefinitionImpl.java (revision 812157) +++ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeDefinitionImpl.java (working copy) @@ -18,9 +18,12 @@ import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.commons.name.NameConstants; import java.util.Arrays; import java.util.TreeSet; +import java.util.Set; +import java.util.HashSet; /** * QNodeDefinitionImpl implements a QNodeDefinition. @@ -30,19 +33,27 @@ /** * The name of the default primary type. */ - private final Name defaultPrimaryType; + private Name defaultPrimaryType; /** * The names of the required primary types. */ - private final Name[] requiredPrimaryTypes; + private final Set requiredPrimaryTypes = new HashSet(); /** * The 'allowsSameNameSiblings' flag. */ - private final boolean allowsSameNameSiblings; + private boolean allowsSameNameSiblings; /** + * Default constructor. + */ + public QNodeDefinitionImpl() { + super(); + requiredPrimaryTypes.add(NameConstants.NT_BASE); + } + + /** * Copy constructor. * * @param nodeDef some other node definition. @@ -77,11 +88,43 @@ super(name, declaringNodeType, isAutoCreated, isMandatory, onParentVersion, isProtected); this.defaultPrimaryType = defaultPrimaryType; - this.requiredPrimaryTypes = requiredPrimaryTypes; + this.requiredPrimaryTypes.addAll(Arrays.asList(requiredPrimaryTypes)); this.allowsSameNameSiblings = allowsSameNameSiblings; } + /** + * Sets the name of default primary type. + * + * @param defaultNodeType the name of the default primary type. + */ + public void setDefaultPrimaryType(Name defaultNodeType) { + this.defaultPrimaryType = defaultNodeType; + } + + /** + * Sets the names of the required primary types. + * + * @param requiredPrimaryTypes the names of the required primary types. + */ + public void setRequiredPrimaryTypes(Name[] requiredPrimaryTypes) { + if (requiredPrimaryTypes == null) { + throw new IllegalArgumentException("requiredPrimaryTypes can not be null"); + } + this.requiredPrimaryTypes.clear(); + this.requiredPrimaryTypes.addAll(Arrays.asList(requiredPrimaryTypes)); + } + + /** + * Sets the 'allowsSameNameSiblings' flag. + * + * @param allowsSameNameSiblings whether to allow same named siblings. + */ + public void setAllowsSameNameSiblings(boolean allowsSameNameSiblings) { + this.allowsSameNameSiblings = allowsSameNameSiblings; + } + //-------------------------------------------------------< QNodeDefinition > + /** * {@inheritDoc} */ @@ -93,7 +136,7 @@ * {@inheritDoc} */ public Name[] getRequiredPrimaryTypes() { - return requiredPrimaryTypes; + return requiredPrimaryTypes.toArray(new Name[requiredPrimaryTypes.size()]); } /** @@ -130,7 +173,8 @@ if (obj instanceof QNodeDefinition) { QNodeDefinition other = (QNodeDefinition) obj; return super.equals(obj) - && Arrays.equals(requiredPrimaryTypes, other.getRequiredPrimaryTypes()) + && requiredPrimaryTypes.equals(new HashSet( + Arrays.asList(other.getRequiredPrimaryTypes()))) && (defaultPrimaryType == null ? other.getDefaultPrimaryType() == null : defaultPrimaryType.equals(other.getDefaultPrimaryType())) Index: jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java =================================================================== --- jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java (revision 812157) +++ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java (working copy) @@ -25,6 +25,7 @@ import org.apache.jackrabbit.spi.QValueFactory; import org.apache.jackrabbit.spi.QValueConstraint; import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl; +import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.apache.jackrabbit.spi.commons.conversion.IllegalNameException; import org.apache.jackrabbit.spi.commons.value.ValueFormat; @@ -40,23 +41,26 @@ import java.util.HashSet; import java.util.Collections; import java.util.Arrays; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.Set; import java.io.Serializable; /** * QNodeTypeDefinitionImpl implements a serializable SPI node * type definition. */ -public class QNodeTypeDefinitionImpl implements QNodeTypeDefinition, Serializable { +public class QNodeTypeDefinitionImpl implements QNodeTypeDefinition, Serializable, Cloneable { /** * The name of the node definition. */ - private final Name name; + private Name name; /** * The names of the declared super types of this node type definition. */ - private final Name[] supertypes; + private Name[] supertypes; /** * The names of the supported mixins on this node type (or null) @@ -66,37 +70,37 @@ /** * Indicates whether this is a mixin node type definition. */ - private final boolean isMixin; + private boolean isMixin; /** * Indicates whether this is an abstract node type definition. */ - private final boolean isAbstract; + private boolean isAbstract; /** * Indicates whether this is a queryable node type definition. */ - private final boolean isQueryable; + private boolean isQueryable; /** * Indicates whether this node type definition has orderable child nodes. */ - private final boolean hasOrderableChildNodes; + private boolean hasOrderableChildNodes; /** * The name of the primary item or null if none is defined. */ - private final Name primaryItemName; + private Name primaryItemName; /** - * The list of property definitions. + * The list of child node definitions. */ - private final QPropertyDefinition[] propertyDefs; + private final Set propertyDefs; /** - * The list of child node definitions. + * The list of property definitions. */ - private final QNodeDefinition[] childNodeDefs; + private final Set childNodeDefs; /** * Unmodifiable collection of dependent node type Names. @@ -105,6 +109,14 @@ private transient Collection dependencies; /** + * Default constructor. + */ + public QNodeTypeDefinitionImpl() { + this(null, Name.EMPTY_ARRAY, null, false, false, true, false, null, + QPropertyDefinition.EMPTY_ARRAY, QNodeDefinition.EMPTY_ARRAY); + } + + /** * Copy constructor. * * @param nt the node type definition. @@ -143,7 +155,6 @@ QPropertyDefinition[] declaredPropDefs, QNodeDefinition[] declaredNodeDefs) { this.name = name; - this.supertypes = supertypes; this.supportedMixins = supportedMixins; this.isMixin = isMixin; this.isAbstract = isAbstract; @@ -152,6 +163,7 @@ this.primaryItemName = primaryItemName; this.propertyDefs = getSerializablePropertyDefs(declaredPropDefs); this.childNodeDefs = getSerializableNodeDefs(declaredNodeDefs); + setSupertypes(supertypes); // make sure supertypes are sorted } /** @@ -194,7 +206,105 @@ createQNodeDefinitions(name, def.getDeclaredChildNodeDefinitions(), resolver)); } + /** + * Sets the name of the node type being defined. + * + * @param name The name of the node type. + */ + public void setName(Name name) { + this.name = name; + } + + /** + * Sets the supertypes. + * + * @param names the names of the supertypes. + */ + public void setSupertypes(Name[] names) { + resetDependencies(); + // Optimize common cases (zero or one supertypes) + if (names.length == 0) { + supertypes = Name.EMPTY_ARRAY; + } else if (names.length == 1) { + supertypes = new Name[] { names[0] }; + } else { + // Sort and remove duplicates + SortedSet types = new TreeSet(); + types.addAll(Arrays.asList(names)); + supertypes = types.toArray(new Name[types.size()]); + } + } + + /** + * Sets the mixin flag. + * + * @param mixin flag + */ + public void setMixin(boolean mixin) { + this.isMixin = mixin; + } + + /** + * Sets the orderableChildNodes flag. + * + * @param orderableChildNodes flag + */ + public void setOrderableChildNodes(boolean orderableChildNodes) { + this.hasOrderableChildNodes = orderableChildNodes; + } + + /** + * Sets the 'abstract' flag. + * + * @param abstractStatus flag + */ + public void setAbstract(boolean abstractStatus) { + this.isAbstract = abstractStatus; + } + + /** + * Sets the 'queryable' flag. + * + * @param queryable flag + */ + public void setQueryable(boolean queryable) { + this.isQueryable = queryable; + } + + /** + * Sets the name of the primary item (one of the child items of the node's + * of this node type) + * + * @param primaryItemName The name of the primary item. + */ + public void setPrimaryItemName(Name primaryItemName) { + this.primaryItemName = primaryItemName; + } + + /** + * Sets the property definitions. + * + * @param defs An array of QPropertyDefinition objects. + */ + public void setPropertyDefs(QPropertyDefinition[] defs) { + resetDependencies(); + propertyDefs.clear(); + propertyDefs.addAll(Arrays.asList(defs)); + } + + /** + * Sets the child node definitions. + * + * @param defs An array of QNodeDefinition objects + */ + public void setChildNodeDefs(QNodeDefinition[] defs) { + resetDependencies(); + childNodeDefs.clear(); + childNodeDefs.addAll(Arrays.asList(defs)); + } + //------------------------------------------------< QNodeTypeDefinition >--- + /** * {@inheritDoc} */ @@ -206,9 +316,12 @@ * {@inheritDoc} */ public Name[] getSupertypes() { - Name[] sTypes = new Name[supertypes.length]; - System.arraycopy(supertypes, 0, sTypes, 0, supertypes.length); - return sTypes; + if (supertypes.length > 0 + || isMixin() || NameConstants.NT_BASE.equals(getName())) { + return supertypes; + } else { + return new Name[] { NameConstants.NT_BASE }; + } } /** @@ -250,24 +363,20 @@ * {@inheritDoc} */ public QPropertyDefinition[] getPropertyDefs() { - QPropertyDefinition[] pDefs = new QPropertyDefinition[propertyDefs.length]; - System.arraycopy(propertyDefs, 0, pDefs, 0, propertyDefs.length); - return pDefs; + return propertyDefs.toArray(new QPropertyDefinition[propertyDefs.size()]); } /** * {@inheritDoc} */ public QNodeDefinition[] getChildNodeDefs() { - QNodeDefinition[] cnDefs = new QNodeDefinition[childNodeDefs.length]; - System.arraycopy(childNodeDefs, 0, cnDefs, 0, childNodeDefs.length); - return cnDefs; + return childNodeDefs.toArray(new QNodeDefinition[childNodeDefs.size()]); } /** * {@inheritDoc} */ - public Collection getDependencies() { + public Collection getDependencies() { if (dependencies == null) { Collection deps = new HashSet(); // supertypes @@ -320,46 +429,92 @@ } } + //-------------------------------------------< java.lang.Object overrides > + + public QNodeTypeDefinitionImpl clone() { + try { + // todo: itemdefs should be cloned as well, since mutable + return (QNodeTypeDefinitionImpl) super.clone(); + } catch (CloneNotSupportedException e) { + // does not happen, this class is cloneable + throw new InternalError(); + } + } + + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof QNodeTypeDefinitionImpl) { + QNodeTypeDefinitionImpl other = (QNodeTypeDefinitionImpl) obj; + return (name == null ? other.name == null : name.equals(other.name)) + && (primaryItemName == null ? other.primaryItemName == null : primaryItemName.equals(other.primaryItemName)) + && Arrays.equals(getSupertypes(), other.getSupertypes()) + && isMixin == other.isMixin + && hasOrderableChildNodes == other.hasOrderableChildNodes + && isAbstract == other.isAbstract + && isQueryable == other.isQueryable + && propertyDefs.equals(other.propertyDefs) + && childNodeDefs.equals(other.childNodeDefs); + } + return false; + } + + /** + * Returns zero to satisfy the Object equals/hashCode contract. + * This class is mutable and not meant to be used as a hash key. + * + * @return always zero + * @see Object#hashCode() + */ + public int hashCode() { + return 0; + } + //-------------------------------< internal >------------------------------- + private void resetDependencies() { + dependencies = null; + } + /** - * Returns an array of serializable property definitions for + * Returns a set of serializable property definitions for * propDefs. * * @param propDefs the SPI property definitions. - * @return an array of serializable property definitions. + * @return a set of serializable property definitions. */ - private static QPropertyDefinition[] getSerializablePropertyDefs( + private static Set getSerializablePropertyDefs( QPropertyDefinition[] propDefs) { - QPropertyDefinition[] serDefs = new QPropertyDefinition[propDefs.length]; - for (int i = 0; i < propDefs.length; i++) { - if (propDefs[i] instanceof Serializable) { - serDefs[i] = propDefs[i]; + Set defs = new HashSet(); + for (QPropertyDefinition pd : propDefs) { + if (pd instanceof Serializable) { + defs.add(pd); } else { - serDefs[i] = new QPropertyDefinitionImpl(propDefs[i]); + defs.add(new QPropertyDefinitionImpl(pd)); } } - return serDefs; + return defs; } /** - * Returns an array of serializable node definitions for + * Returns a set of serializable node definitions for * nodeDefs. * * @param nodeDefs the node definitions. - * @return an array of serializable node definitions. + * @return a set of serializable node definitions. */ - private static QNodeDefinition[] getSerializableNodeDefs( + private static Set getSerializableNodeDefs( QNodeDefinition[] nodeDefs) { - QNodeDefinition[] serDefs = new QNodeDefinition[nodeDefs.length]; - for (int i = 0; i < nodeDefs.length; i++) { - if (nodeDefs[i] instanceof Serializable) { - serDefs[i] = nodeDefs[i]; + Set defs = new HashSet(); + for (QNodeDefinition nd : nodeDefs) { + if (nd instanceof Serializable) { + defs.add(nd); } else { - serDefs[i] = new QNodeDefinitionImpl(nodeDefs[i]); + defs.add(new QNodeDefinitionImpl(nd)); } } - return serDefs; + return defs; } private static Name[] getNames(String[] jcrNames, NamePathResolver resolver) throws NamespaceException, IllegalNameException { @@ -381,8 +536,8 @@ QPropertyDefinition[] declaredPropDefs = new QPropertyDefinition[pds.length]; for (int i = 0; i < pds.length; i++) { PropertyDefinition propDef = pds[i]; - Name name = propDef.getName().equals(QItemDefinitionImpl.ANY_NAME.getLocalName()) - ? QItemDefinitionImpl.ANY_NAME + Name name = propDef.getName().equals(NameConstants.ANY_NAME.getLocalName()) + ? NameConstants.ANY_NAME : resolver.getQName(propDef.getName()); // check if propDef provides declaring node type and if it matches 'this' one. if (propDef.getDeclaringNodeType() != null) { @@ -429,8 +584,8 @@ QNodeDefinition[] declaredNodeDefs = new QNodeDefinition[nds.length]; for (int i = 0; i < nds.length; i++) { NodeDefinition nodeDef = nds[i]; - Name name = nodeDef.getName().equals(QItemDefinitionImpl.ANY_NAME.getLocalName()) - ? QItemDefinitionImpl.ANY_NAME + Name name = nodeDef.getName().equals(NameConstants.ANY_NAME.getLocalName()) + ? NameConstants.ANY_NAME : resolver.getQName(nodeDef.getName()); // check if propDef provides declaring node type and if it matches 'this' one. if (nodeDef.getDeclaringNodeType() != null) { Index: jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QPropertyDefinitionImpl.java =================================================================== --- jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QPropertyDefinitionImpl.java (revision 812157) +++ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QPropertyDefinitionImpl.java (working copy) @@ -20,11 +20,14 @@ import org.apache.jackrabbit.spi.QValue; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QValueConstraint; +import org.apache.jackrabbit.spi.commons.query.qom.Operator; import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import javax.jcr.PropertyType; + /** * QPropertyDefinitionImpl implements SPI property * definition interface. @@ -35,39 +38,46 @@ /** * The required type. */ - private final int requiredType; + private int requiredType = PropertyType.UNDEFINED; /** * The value constraints. */ - private final QValueConstraint[] valueConstraints; + private QValueConstraint[] valueConstraints = QValueConstraint.EMPTY_ARRAY; /** * The default values. */ - private final QValue[] defaultValues; + private QValue[] defaultValues = QValue.EMPTY_ARRAY; /** * The 'multiple' flag */ - private final boolean multiple; + private boolean multiple = false; /** * The available query operators */ - private final String[] availableQueryOperators; + private String[] availableQueryOperators = Operator.getAllQueryOperators(); /** * The 'fullTextSearcheable' flag */ - private final boolean fullTextSearchable; + private boolean fullTextSearchable = true; /** * The 'queryOrderable' flag */ - private final boolean queryOrderable; + private boolean queryOrderable = true; /** + * Default constructor. + */ + public QPropertyDefinitionImpl() { + super(); + } + + /** * Copy constructor. * * @param propDef some other property definition. @@ -128,6 +138,81 @@ this.queryOrderable = isQueryOrderable; } + /** + * Sets the required type + * + * @param requiredType the required type. + */ + public void setRequiredType(int requiredType) { + this.requiredType = requiredType; + } + + /** + * Sets the value constraints. + * + * @param valueConstraints the value constraints. + */ + public void setValueConstraints(QValueConstraint[] valueConstraints) { + if (valueConstraints != null) { + this.valueConstraints = valueConstraints; + } else { + this.valueConstraints = QValueConstraint.EMPTY_ARRAY; + } + } + + /** + * Sets the default values. + * + * @param defaultValues the default values. + */ + public void setDefaultValues(QValue[] defaultValues) { + if (defaultValues != null) { + this.defaultValues = defaultValues; + } else { + this.defaultValues = QValue.EMPTY_ARRAY; + } + } + + /** + * Sets the 'multiple' flag. + * + * @param multiple whether the property is multi-valued. + */ + public void setMultiple(boolean multiple) { + this.multiple = multiple; + } + + /** + * Sets the 'fulltext searchable' flag. + * + * @param fullTextSearchable whether the property is fulltext searchable. + */ + public void setFullTextSearchable(boolean fullTextSearchable) { + this.fullTextSearchable = fullTextSearchable; + } + + /** + * Sets the 'query orderable' flag. + * + * @param queryOrderable whether the property is orderable. + */ + public void setQueryOrderable(boolean queryOrderable) { + this.queryOrderable = queryOrderable; + } + + /** + * Sets the 'available' query operators. + * + * @param queryOperators the available query operators. + */ + public void setAvailableQueryOperators(String[] queryOperators) { + if (queryOperators != null) { + this.availableQueryOperators = queryOperators; + } else { + this.availableQueryOperators = new String[0]; + } + } + //------------------------------------------------< QPropertyDefinition >--- /** * {@inheritDoc} Index: jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QNodeDefinitionImpl.java =================================================================== --- jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QNodeDefinitionImpl.java (revision 812157) +++ jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QNodeDefinitionImpl.java (working copy) @@ -18,6 +18,7 @@ import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.apache.jackrabbit.spi.commons.conversion.NameException; +import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.apache.jackrabbit.spi.Name; import javax.jcr.nodetype.NodeDefinition; @@ -44,7 +45,7 @@ QNodeDefinitionImpl(NodeDefinition nodeDef, NamePathResolver resolver) throws NameException, NamespaceException { - super(nodeDef.getName().equals(ANY_NAME.getLocalName()) ? ANY_NAME : resolver.getQName(nodeDef.getName()), + super(nodeDef.getName().equals(NameConstants.ANY_NAME.getLocalName()) ? NameConstants.ANY_NAME : resolver.getQName(nodeDef.getName()), nodeDef.getDeclaringNodeType() != null ? resolver.getQName(nodeDef.getDeclaringNodeType().getName()) : null, nodeDef.isAutoCreated(), nodeDef.isMandatory(), nodeDef.getOnParentVersion(), nodeDef.isProtected(), Index: jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QPropertyDefinitionImpl.java =================================================================== --- jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QPropertyDefinitionImpl.java (revision 812157) +++ jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QPropertyDefinitionImpl.java (working copy) @@ -19,17 +19,16 @@ import org.apache.jackrabbit.spi.QValue; import org.apache.jackrabbit.spi.QValueFactory; import org.apache.jackrabbit.spi.Name; -import org.apache.jackrabbit.spi.QValueConstraint; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.apache.jackrabbit.spi.commons.conversion.NameException; import org.apache.jackrabbit.spi.commons.conversion.IllegalNameException; import org.apache.jackrabbit.spi.commons.value.ValueFormat; import org.apache.jackrabbit.spi.commons.nodetype.constraint.ValueConstraint; +import org.apache.jackrabbit.spi.commons.name.NameConstants; import javax.jcr.nodetype.PropertyDefinition; import javax.jcr.RepositoryException; import javax.jcr.Value; -import javax.jcr.PropertyType; import javax.jcr.NamespaceException; /** @@ -53,7 +52,7 @@ NamePathResolver resolver, QValueFactory qValueFactory) throws RepositoryException, NameException { - super(propDef.getName().equals(ANY_NAME.getLocalName()) ? ANY_NAME : resolver.getQName(propDef.getName()), + super(propDef.getName().equals(NameConstants.ANY_NAME.getLocalName()) ? NameConstants.ANY_NAME : resolver.getQName(propDef.getName()), resolver.getQName(propDef.getDeclaringNodeType().getName()), propDef.isAutoCreated(), propDef.isMandatory(),