nodetypedef.java
来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 327 行
JAVA
327 行
/* * 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.name.QName;import javax.jcr.PropertyType;import java.util.Arrays;import java.util.Collection;import java.util.HashSet;import java.util.Set;import java.util.Iterator;import java.util.SortedSet;import java.util.TreeSet;/** * A <code>NodeTypeDef</code> holds the definition of a node type. */public class NodeTypeDef implements Cloneable { private QName name; /** * Ordered array of supertype names. Empty if no supertypes have been * specified. Never <code>null</code>. */ private QName[] supertypes; private boolean mixin; private boolean orderableChildNodes; private QName primaryItemName; private HashSet propDefs; private HashSet nodeDefs; private Set dependencies; /** * Default constructor. */ public NodeTypeDef() { dependencies = null; name = null; primaryItemName = null; nodeDefs = new HashSet(); propDefs = new HashSet(); supertypes = QName.EMPTY_ARRAY; mixin = false; orderableChildNodes = false; } /** * Returns a collection of node type <code>QName</code>s that are being * referenced by <i>this</i> node type definition (e.g. as supertypes, as * required/default primary types in child node definitions, as REFERENCE * value constraints in property definitions). * <p/> * Note that self-references (e.g. a child node definition that specifies * the declaring node type as the default primary type) are not considered * dependencies. * * @return a collection of node type <code>QName</code>s */ public Collection getDependencies() { if (dependencies == null) { dependencies = new HashSet(); // supertypes dependencies.addAll(Arrays.asList(supertypes)); // child node definitions for (Iterator iter = nodeDefs.iterator(); iter.hasNext();) { NodeDef nd = (NodeDef) iter.next(); // default primary type QName ntName = nd.getDefaultPrimaryType(); if (ntName != null && !name.equals(ntName)) { dependencies.add(ntName); } // required primary type QName[] ntNames = nd.getRequiredPrimaryTypes(); for (int j = 0; j < ntNames.length; j++) { if (ntNames[j] != null && !name.equals(ntNames[j])) { dependencies.add(ntNames[j]); } } } // property definitions for (Iterator iter = propDefs.iterator(); iter.hasNext();) { PropDef pd = (PropDef) iter.next(); // REFERENCE value constraints if (pd.getRequiredType() == PropertyType.REFERENCE) { ValueConstraint[] ca = pd.getValueConstraints(); if (ca != null) { for (int j = 0; j < ca.length; j++) { ReferenceConstraint rc = (ReferenceConstraint) ca[j]; if (!name.equals(rc.getNodeTypeName())) { dependencies.add(rc.getNodeTypeName()); } } } } } } return dependencies; } private void resetDependencies() { dependencies = null; } //----------------------------------------------------< setters & getters > /** * Sets the name of the node type being defined. * * @param name The name of the node type. */ public void setName(QName name) { this.name = name; } /** * Sets the supertypes. * * @param names the names of the supertypes. */ public void setSupertypes(QName[] names) { resetDependencies(); // Optimize common cases (zero or one supertypes) if (names.length == 0) { supertypes = QName.EMPTY_ARRAY; } else if (names.length == 1) { supertypes = new QName[] { names[0] }; } else { // Sort and remove duplicates SortedSet types = new TreeSet(); types.addAll(Arrays.asList(names)); supertypes = (QName[]) types.toArray(new QName[types.size()]); } } /** * Sets the mixin flag. * * @param mixin flag */ public void setMixin(boolean mixin) { this.mixin = mixin; } /** * Sets the orderableChildNodes flag. * * @param orderableChildNodes flag */ public void setOrderableChildNodes(boolean orderableChildNodes) { this.orderableChildNodes = orderableChildNodes; } /** * 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(QName primaryItemName) { this.primaryItemName = primaryItemName; } /** * Sets the property definitions. * * @param defs An array of <code>PropertyDef</code> objects. */ public void setPropertyDefs(PropDef[] defs) { resetDependencies(); propDefs.clear(); propDefs.addAll(Arrays.asList(defs)); } /** * Sets the child node definitions. * * @param defs An array of <code>NodeDef</code> objects */ public void setChildNodeDefs(NodeDef[] defs) { resetDependencies(); nodeDefs.clear(); nodeDefs.addAll(Arrays.asList(defs)); } /** * Returns the name of the node type being defined or * <code>null</code> if not set. * * @return the name of the node type or <code>null</code> if not set. */ public QName getName() { return name; } /** * Returns an array containing the names of the supertypes. If no * supertypes have been specified, then an empty array is returned * for mixin types and the <code>nt:base</code> primary type and * an array containing just <code>nt:base<code> for other primary types. * <p> * The returned array must not be modified by the application. * * @return a sorted array of supertype names */ public QName[] getSupertypes() { if (supertypes.length > 0 || isMixin() || QName.NT_BASE.equals(getName())) { return supertypes; } else { return new QName[] { QName.NT_BASE }; } } /** * Returns the value of the mixin flag. * * @return true if this is a mixin node type; false otherwise. */ public boolean isMixin() { return mixin; } /** * Returns the value of the orderableChildNodes flag. * * @return true if nodes of this node type can have orderable child nodes; false otherwise. */ public boolean hasOrderableChildNodes() { return orderableChildNodes; } /** * Returns the name of the primary item (one of the child items of the * node's of this node type) or <code>null</code> if not set. * * @return the name of the primary item or <code>null</code> if not set. */ public QName getPrimaryItemName() { return primaryItemName; } /** * Returns an array containing the property definitions or * <code>null</code> if not set. * * @return an array containing the property definitions or * <code>null</code> if not set. */ public PropDef[] getPropertyDefs() { if (propDefs.isEmpty()) { return PropDef.EMPTY_ARRAY; } return (PropDef[]) propDefs.toArray(new PropDef[propDefs.size()]); } /** * Returns an array containing the child node definitions or * <code>null</code> if not set. * * @return an array containing the child node definitions or * <code>null</code> if not set. */ public NodeDef[] getChildNodeDefs() { if (nodeDefs.isEmpty()) { return NodeDef.EMPTY_ARRAY; } return (NodeDef[]) nodeDefs.toArray(new NodeDef[nodeDefs.size()]); } //-------------------------------------------< java.lang.Object overrides > public Object clone() { NodeTypeDef clone = new NodeTypeDef(); clone.name = name; clone.primaryItemName = primaryItemName; clone.supertypes = supertypes; // immutable, thus ok to share clone.mixin = mixin; clone.orderableChildNodes = orderableChildNodes; clone.nodeDefs = (HashSet) nodeDefs.clone(); clone.propDefs = (HashSet) propDefs.clone(); return clone; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof NodeTypeDef) { NodeTypeDef other = (NodeTypeDef) 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()) && mixin == other.mixin && orderableChildNodes == other.orderableChildNodes && propDefs.equals(other.propDefs) && nodeDefs.equals(other.nodeDefs); } 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; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?