org.apache.jackrabbit.spi.commons.nodetype.NodeTypeTemplateImpl 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 org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.QNodeTypeDefinition;
import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.LinkedList;
import java.util.List;
import javax.jcr.nodetype.NodeDefinition;
import javax.jcr.nodetype.NodeDefinitionTemplate;
import javax.jcr.nodetype.NodeTypeTemplate;
import javax.jcr.nodetype.PropertyDefinition;
import javax.jcr.nodetype.PropertyDefinitionTemplate;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NodeTypeDefinition;
import javax.jcr.NamespaceException;
import javax.jcr.RepositoryException;
/**
* A NodeTypeTemplateImpl
...
*/
public class NodeTypeTemplateImpl implements NodeTypeTemplate {
private static final Logger log = LoggerFactory.getLogger(NodeTypeTemplateImpl.class);
private Name name;
private Name[] superTypeNames;
private Name primaryItemName;
private boolean abstractStatus;
private boolean queryable;
private boolean mixin;
private boolean orderableChildNodes;
private List nodeDefinitionTemplates;
private List propertyDefinitionTemplates;
private final NamePathResolver resolver;
/**
* Package private constructor
*
* @param resolver
*/
NodeTypeTemplateImpl(NamePathResolver resolver) {
// TODO: see https://jsr-283.dev.java.net/issues/show_bug.cgi?id=798
queryable = true;
// TODO see https://jsr-283.dev.java.net/issues/show_bug.cgi?id=797
superTypeNames = Name.EMPTY_ARRAY;
this.resolver = resolver;
}
/**
* Package private constructor
*
* @param def
* @param resolver
*/
NodeTypeTemplateImpl(NodeTypeDefinition def, NamePathResolver resolver) throws RepositoryException {
this.resolver = resolver;
if (def instanceof NodeTypeDefinitionImpl) {
QNodeTypeDefinition qDef = ((NodeTypeDefinitionImpl) def).ntd;
name = qDef.getName();
superTypeNames = qDef.getSupertypes();
primaryItemName = qDef.getPrimaryItemName();
} else {
setName(def.getName());
setDeclaredSuperTypeNames(def.getDeclaredSupertypeNames());
setPrimaryItemName(def.getPrimaryItemName());
}
abstractStatus = def.isAbstract();
mixin = def.isMixin();
queryable = def.isQueryable();
orderableChildNodes = def.hasOrderableChildNodes();
NodeDefinition[] nodeDefs = def.getDeclaredChildNodeDefinitions();
if (nodeDefs != null) {
List list = getNodeDefinitionTemplates();
for (NodeDefinition nodeDef : nodeDefs) {
list.add(new NodeDefinitionTemplateImpl(nodeDef, resolver));
}
}
PropertyDefinition[] propDefs = def.getDeclaredPropertyDefinitions();
if (propDefs != null) {
List list = getPropertyDefinitionTemplates();
for (PropertyDefinition propDef : propDefs) {
list.add(new PropertyDefinitionTemplateImpl(propDef, resolver));
}
}
}
//-----------------------------------------------------< NodeTypeTemplate >
/**
* {@inheritDoc}
*/
public void setName(String name) throws ConstraintViolationException {
try {
this.name = resolver.getQName(name);
} catch (RepositoryException e) {
throw new ConstraintViolationException(e);
}
}
/**
* {@inheritDoc}
*/
public void setDeclaredSuperTypeNames(String[] names) throws ConstraintViolationException {
// TODO see https://jsr-283.dev.java.net/issues/show_bug.cgi?id=797
if (names == null) {
throw new ConstraintViolationException("null isn't a valid array of JCR names.");
} else {
superTypeNames = new Name[names.length];
for (int i = 0; i < names.length; i++) {
try {
superTypeNames[i] = resolver.getQName(names[i]);
} catch (RepositoryException e) {
throw new ConstraintViolationException(e);
}
}
}
}
/**
* {@inheritDoc}
*/
public void setAbstract(boolean abstractStatus) {
this.abstractStatus = abstractStatus;
}
/**
* {@inheritDoc}
*/
public void setMixin(boolean mixin) {
this.mixin = mixin;
}
/**
* {@inheritDoc}
*/
public void setOrderableChildNodes(boolean orderable) {
orderableChildNodes = orderable;
}
/**
* {@inheritDoc}
*/
public void setPrimaryItemName(String name) throws ConstraintViolationException {
if (name == null) {
primaryItemName = null;
} else {
try {
primaryItemName = resolver.getQName(name);
} catch (RepositoryException e) {
throw new ConstraintViolationException(e);
}
}
}
/**
* {@inheritDoc}
*/
public List getPropertyDefinitionTemplates() {
if (propertyDefinitionTemplates == null) {
propertyDefinitionTemplates = new LinkedList();
}
return propertyDefinitionTemplates;
}
/**
* {@inheritDoc}
*/
public List getNodeDefinitionTemplates() {
if (nodeDefinitionTemplates == null) {
nodeDefinitionTemplates = new LinkedList();
}
return nodeDefinitionTemplates;
}
/**
* {@inheritDoc}
*/
public void setQueryable(boolean queryable) {
this.queryable = queryable;
}
//---------------------------------------------------< NodeTypeDefinition >
/**
* {@inheritDoc}
*/
public String getName() {
if (name == null) {
return null;
} else {
try {
return resolver.getJCRName(name);
} catch (NamespaceException e) {
// should never get here
log.error("encountered unregistered namespace in node type name", e);
return name.toString();
}
}
}
/**
* {@inheritDoc}
*/
public String[] getDeclaredSupertypeNames() {
String[] names = new String[superTypeNames.length];
for (int i = 0; i < superTypeNames.length; i++) {
try {
names[i] = resolver.getJCRName(superTypeNames[i]);
} catch (NamespaceException e) {
// should never get here
log.error("encountered unregistered namespace in super type name", e);
names[i] = superTypeNames[i].toString();
}
}
return names;
}
/**
* {@inheritDoc}
*/
public boolean isAbstract() {
return abstractStatus;
}
/**
* {@inheritDoc}
*/
public boolean isMixin() {
return mixin;
}
public boolean isQueryable() {
return queryable;
}
/**
* {@inheritDoc}
*/
public boolean hasOrderableChildNodes() {
return orderableChildNodes;
}
/**
* {@inheritDoc}
*/
public String getPrimaryItemName() {
if (primaryItemName == null) {
return null;
} else {
try {
return resolver.getJCRName(primaryItemName);
} catch (NamespaceException e) {
// should never get here
log.error("encountered unregistered namespace in primary type name", e);
return primaryItemName.toString();
}
}
}
/**
* {@inheritDoc}
*/
public PropertyDefinition[] getDeclaredPropertyDefinitions() {
if (propertyDefinitionTemplates == null) {
return null;
} else {
return propertyDefinitionTemplates.toArray(
new PropertyDefinition[propertyDefinitionTemplates.size()]);
}
}
/**
* {@inheritDoc}
*/
public NodeDefinition[] getDeclaredChildNodeDefinitions() {
if (nodeDefinitionTemplates == null) {
return null;
} else {
return nodeDefinitionTemplates.toArray(
new NodeDefinition[nodeDefinitionTemplates.size()]);
}
}
}