org.apache.jackrabbit.spi.commons.nodetype.QNodeTypeDefinitionBuilder Maven / Gradle / Ivy
/*
* 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.spi.commons.nodetype;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import javax.jcr.nodetype.NodeTypeDefinition;
import org.apache.jackrabbit.spi.QNodeDefinition;
import org.apache.jackrabbit.spi.QPropertyDefinition;
import org.apache.jackrabbit.spi.QNodeTypeDefinition;
import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.commons.name.NameConstants;
import org.apache.jackrabbit.spi.commons.QNodeTypeDefinitionImpl;
/**
* A builder for {@link QNodeTypeDefinition}.
*/
public class QNodeTypeDefinitionBuilder {
private Name name = null;
private List supertypes = new ArrayList();
private boolean isMixin = false;
private boolean isOrderable = false;
private Name primaryItemName = null;
private List propertyDefinitions = new ArrayList();
private List childNodeDefinitions = new ArrayList();
private boolean isAbstract = false;
private boolean isQueryable = true;
private List supportedMixins = null;
/**
* Set the name of the node type definition being built
* @param name the name
* @see NodeTypeDefinition#getName()
*/
public void setName(Name name) {
this.name = name;
}
/**
* @return the name of the node type definition being built or
* null
if not set.
* @see NodeTypeDefinition#getName()
*/
public Name getName() {
return name;
}
/**
* Specifies the supertypes of the node type definition being built
* @param supertypes the supertypes
* @see NodeTypeDefinition#getDeclaredSupertypeNames()
*/
public void setSupertypes(Name[] supertypes) {
this.supertypes.clear();
this.supertypes.addAll(Arrays.asList(supertypes));
}
/**
* Returns an array containing the names of the supertypes of the node
* type definition being built.
*
* @return an array of supertype names
* @see NodeTypeDefinition#getDeclaredSupertypeNames()
*/
public Name[] getSuperTypes() {
if (supertypes.size() > 0
|| isMixin() || NameConstants.NT_BASE.equals(getName())) {
return supertypes.toArray(new Name[supertypes.size()]);
} else {
return new Name[] { NameConstants.NT_BASE };
}
}
/**
* @param isMixin true
if building a mixin node type
* definition; false
otherwise.
* @see NodeTypeDefinition#isMixin()
*/
public void setMixin(boolean isMixin) {
this.isMixin = isMixin;
}
/**
* @return true
if building a mixin node type definition;
* false
otherwise.
* @see NodeTypeDefinition#isMixin()
*/
public boolean isMixin() {
return isMixin;
}
/**
* Sets the names of additional mixin types supported on this node type.
*
* @param names an array of mixin type names, or null
when
* there are no known constraints
*/
public void setSupportedMixinTypes(Name[] names) {
if (names == null) {
supportedMixins = null;
} else {
supportedMixins = new ArrayList(Arrays.asList(names));
}
}
/**
* Returns an array containing the names of additional mixin types supported
* on this node type.
*
* @return an array of mixin type names, or null
when there are
* no known constraints.
*/
public Name[] getSupportedMixinTypes() {
if (supportedMixins == null) {
return null;
} else {
return supportedMixins.toArray(new Name[supportedMixins.size()]);
}
}
/**
* @param isOrderable true
if building a node type having
* orderable child nodes; false
otherwise.
* @see NodeTypeDefinition#hasOrderableChildNodes()
*/
public void setOrderableChildNodes(boolean isOrderable) {
this.isOrderable = isOrderable;
}
/**
* @return true
if building a node type having orderable
* child nodes; false
otherwise.
* @see NodeTypeDefinition#hasOrderableChildNodes()
*/
public boolean hasOrderableChildNodes() {
return isOrderable;
}
/**
* @param primaryItemName the name of the primary item or
* null
if not set.
* @see NodeTypeDefinition#getPrimaryItemName()
*/
public void setPrimaryItemName(Name primaryItemName) {
this.primaryItemName = primaryItemName;
}
/**
* @return the name of the primary item or null
if not set.
* @see NodeTypeDefinition#getPrimaryItemName()
*/
public Name getPrimaryItemName() {
return primaryItemName;
}
/**
* @return true
if the node type is abstract.
* @see NodeTypeDefinition#isAbstract()
*/
public boolean isAbstract() {
return isAbstract;
}
/**
* @param isAbstract true
if building a node type that is abstract.
* @see NodeTypeDefinition#isAbstract()
*/
public void setAbstract(boolean isAbstract) {
this.isAbstract = isAbstract;
}
/**
* @return true
if the node type is queryable
* @see NodeTypeDefinition#isQueryable()
*/
public boolean isQueryable() {
return isQueryable;
}
/**
* @param queryable true
if building a node type that is queryable
* @see NodeTypeDefinition#isQueryable()
*/
public void setQueryable(boolean queryable) {
isQueryable = queryable;
}
/**
* @param propDefs an array containing the property definitions of the node type definition
* being built.
* @see NodeTypeDefinition#getDeclaredPropertyDefinitions()
*/
public void setPropertyDefs(QPropertyDefinition[] propDefs) {
propertyDefinitions.clear();
propertyDefinitions.addAll(Arrays.asList(propDefs));
}
/**
* @return an array containing the property definitions of the node type
* definition being built.
* @see NodeTypeDefinition#getDeclaredPropertyDefinitions()
*/
public QPropertyDefinition[] getPropertyDefs() {
return propertyDefinitions.toArray(new QPropertyDefinition[propertyDefinitions.size()]);
}
/**
* @param childDefs an array containing the child node definitions of the node type
* definition being.
* @see NodeTypeDefinition#getDeclaredChildNodeDefinitions()
*/
public void setChildNodeDefs(QNodeDefinition[] childDefs) {
childNodeDefinitions.clear();
childNodeDefinitions.addAll(Arrays.asList(childDefs));
}
/**
* @return an array containing the child node definitions of the node type
* definition being built.
* @see NodeTypeDefinition#getDeclaredChildNodeDefinitions()
*/
public QNodeDefinition[] getChildNodeDefs() {
return childNodeDefinitions.toArray(new QNodeDefinition[childNodeDefinitions.size()]);
}
/**
* Creates a new {@link QNodeTypeDefinition} instance based on the state of this builder.
*
* @return a new {@link QNodeTypeDefinition} instance.
* @throws IllegalStateException if the instance has not the necessary information to build
* the QNodeTypeDefinition instance.
*/
public QNodeTypeDefinition build() throws IllegalStateException {
return new QNodeTypeDefinitionImpl(getName(), getSuperTypes(),
getSupportedMixinTypes(), isMixin(), isAbstract(),
isQueryable(), hasOrderableChildNodes(), getPrimaryItemName(),
getPropertyDefs(), getChildNodeDefs());
}
}