blob: 6a1278820cbb076fe020149eccde7d57e55a1523 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. 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.session.nodetype;
import java.util.HashSet;
import java.util.Set;
import javax.jcr.nodetype.NodeDefinition;
import javax.jcr.nodetype.NodeType;
import org.apache.jackrabbit.session.SessionHelper;
import org.apache.jackrabbit.name.QName;
import org.apache.jackrabbit.state.nodetype.NodeDefinitionState;
/**
* Immutable and session-bound node definition frontend. An instance
* of this class presents the underlying node definition state using
* the JCR NodeDef interface.
* <p>
* By not exposing the setter methods of the underlying state instance,
* this class intentionally makes it impossible for a JCR client to modify
* node definition information.
*/
final class SessionNodeDefinition extends SessionItemDefinition
implements NodeDefinition {
/** Helper for accessing the current session. */
private final SessionHelper helper;
/** The underlying node definition state. */
private final NodeDefinitionState state;
/**
* Creates a node definition frontend that is bound to the
* given node type, session, and underlying node definition state.
*
* @param helper helper for accessing the current session
* @param type declaring node type
* @param state underlying node definition state
*/
public SessionNodeDefinition(
SessionHelper helper, NodeType type, NodeDefinitionState state) {
super(helper, type, state);
this.helper = helper;
this.state = state;
}
/**
* Returns the default primary type of the defined node. The returned
* node type is retrieved from the node type manager of the current
* session using the node type name stored in the underlying state.
*
* @return default primary type
* @see NodeDefinition#getDefaultPrimaryType()
*/
public NodeType getDefaultPrimaryType() {
return helper.getNodeType(state.getDefaultPrimaryTypeName());
}
/**
* Returns the required primary types of the defined node. The returned
* node types are retrieved from the node type manager of the current
* session using the node type names stored in the underlying state.
* <p>
* The returned array is freshly instantiated and not a part of the
* underlying state, so it can be freely modified.
*
* @return required primary types
* @see NodeDefinition#getRequiredPrimaryTypes()
*/
public NodeType[] getRequiredPrimaryTypes() {
Set types = new HashSet();
QName[] names = state.getRequiredPrimaryTypeNames();
for (int i = 0; i < names.length; i++) {
types.add(helper.getNodeType(names[i]));
}
return (NodeType[]) types.toArray(new NodeType[types.size()]);
}
/**
* Returns the value of the AllowsSameNameSiblings node definition property.
* The returned value is retrieved from the underlying node definition
* state.
*
* @return AllowsSameNameSiblings property value
* @see NodeDefinition#allowsSameNameSiblings()
*/
public boolean allowsSameNameSiblings() {
return state.allowsSameNameSiblings();
}
}