/*
 * 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.resourceresolver.impl.mapping;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.resource.path.Path;

/**
 * Internal interface representing the additional methods
 * MapEntries needs from the ResourceResolverFactory.
 *
 * Exists primarily to facilitate mocking of the ResourceResolverFactory
 * when testing MapEntries.
 */
public interface MapConfigurationProvider extends ResourceResolverFactory {

    String getMapRoot();

    boolean isMapConfiguration(String path);

    Path[] getObservationPaths();

    Map<String, String> getVirtualURLMap();

    Mapping[] getMappings();

    int getDefaultVanityPathRedirectStatus();

    boolean isVanityPathEnabled();

    long getMaxCachedVanityPathEntries();

    boolean isVanityPathCacheInitInBackground();

    boolean isMaxCachedVanityPathEntriesStartup();

    int getVanityBloomFilterMaxBytes();

    boolean isOptimizeAliasResolutionEnabled();

    boolean hasVanityPathPrecedence();

    Map<String, Object> getServiceUserAuthenticationInfo(final String subServiceName) throws LoginException;
    
    public class VanityPathConfig implements Comparable<VanityPathConfig> {
        public final boolean isExclude;
        public final String prefix;

        public VanityPathConfig(final String prefix, final boolean isExclude) {
            this.prefix = prefix;
            this.isExclude = isExclude;
        }

        @Override
        public int compareTo(VanityPathConfig o2) {
            return Integer.valueOf(o2.prefix.length()).compareTo(this.prefix.length());
        }
    }

    /**
     * A list of allow and deny list prefixes all ending with a slash.
     * If <code>null</code> is returned, all paths are allowed.
     */
    List<VanityPathConfig> getVanityPathConfig();

    /**
     * A set of allow prefixes all ending with a slash.
     * If empty set is returned, all paths are allowed.
     * @return
     */
    Set<String> getAllowedAliasLocations();
}
