/*
 * 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.oak.plugins.tree;

import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
import org.jetbrains.annotations.NotNull;

/**
 * {@code TreeContext} represents item related information in relation to a
 * dedicated module.
 * This information allows to determine if a given {@code Tree} or {@link PropertyState}
 * is defined by or related to the model provided by a given setup.
 */
public interface TreeContext {

    /**
     * Reveals if the specified {@code PropertyState} is defined by the
     * module that exposes this instance.
     *
     * @param parent The parent tree of the property state.
     * @param property The {@code PropertyState} to be tested.
     * @return {@code true} if the specified property state is related to or
     * defined by the security module.
     */
    boolean definesProperty(@NotNull Tree parent, @NotNull PropertyState property);

    /**
     * Reveals if the specified {@code Tree} is the root of a subtree defined by
     * the module that exposes this instance. Note,
     * that in contrast to {@link #definesTree(Tree)}
     * this method will return {@code false} for any tree located in the
     * subtree.
     *
     * @param tree The tree to be tested.
     * @return {@code true} if the specified tree is the root of a subtree of items
     * that are defined by the security module.
     */
    boolean definesContextRoot(@NotNull Tree tree);

    /**
     * Reveals if the specified {@code Tree} is defined by the
     * module that exposes this instance.
     *
     * @param tree The tree to be tested.
     * @return {@code true} if the specified tree is related to or defined by the
     * security module.
     */
    boolean definesTree(@NotNull Tree tree);

    /**
     * Reveals if the specified {@code TreeLocation} is defined by the
     * module that exposes this instance.
     *
     * @param location The tree location to be tested.
     * @return {@code true} if the specified tree location is related to or
     * defined by the security module.
     */
    boolean definesLocation(@NotNull TreeLocation location);

    /**
     * Reveals if the specified {@code Tree} defines repository internal information,
     * which is not hidden by default.
     *
     * @param tree The tree to be tested.
     * @return {@code true} if the specified tree defines repository internal information.
     * @see org.apache.jackrabbit.oak.spi.state.NodeStateUtils#isHidden(String)
     * @see org.apache.jackrabbit.oak.spi.state.NodeStateUtils#isHiddenPath(String)
     */
    boolean definesInternal(@NotNull Tree tree);
}
