/*
 * 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.sling.spi.resource.provider;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;

import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.annotation.versioning.ProviderType;

/**
 * The resolve context is passed to most of the methods of the {@link ResourceProvider}
 * to provide additional context information for the provider.
 *
 * If the provider requires authentication, the object returned by {@link ResourceProvider#authenticate(Map)}
 * is returned in {@link #getProviderState()}.
 *
 * @since 1.0.0 (Sling API Bundle 2.11.0)
 */
@ProviderType
public interface ResolveContext<T> {

    /**
     * Get the current resource resolver.
     * @return The resource resolver.
     */
    @Nonnull ResourceResolver getResourceResolver();

    /**
     * This is the object returned by {@link ResourceProvider#authenticate(Map)}
     * @return The data object or {@code null}
     */
    @CheckForNull T getProviderState();

    /**
     * Return a resolve context for the parent resource provider.
     * @return A resolve context or {@code null} if there is no parent.
     * @see #getParentResourceProvider()
     */
    @CheckForNull ResolveContext<?> getParentResolveContext();

    /**
     * Return the parent resource provider.
     * If the parent should be used for resolving, a context created with
     * {@link ResolveContext#getParentResolveContext()} should be passed to that
     * instance.
     * @return The parent provider or {@code null} if there is no parent.
     */
    @CheckForNull ResourceProvider<?> getParentResourceProvider();
}
