/*
 * 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();
    }

}
