package org.apache.maven.shared.artifact.filter.resolve;

/*
 * 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.
 */

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;

/**
 * Filter based on scope. <strong>Note:</strong> There's no logic for inherited scoped
 * 
 * @author Robert Scholte
 * @since 3.0
 * 
 * @see org.sonatype.aether.util.filter.ScopeDependencyFilter
 * @see org.eclipse.aether.util.filter.ScopeDependencyFilter
 */
public class ScopeFilter implements TransformableFilter
{
    private final Collection<String> excluded;

    private final Collection<String> included;

    /**
     * 
     * @param included specific scopes to include or {@code null} to include all
     * @param excluded specific scopes to exclude or {@code null} to exclude none
     */
    public ScopeFilter( Collection<String> included, Collection<String> excluded )
    {
        this.included = ( included == null ? null : Collections.unmodifiableCollection( included ) );
        this.excluded = ( excluded == null ? null : Collections.unmodifiableCollection( excluded ) );
    }
    
    /**
     * Construct a ScopeFilter based on included scopes  
     * 
     * @param included the scopes to include, may be {@code null}
     * @return the filter, never {@code null}
     */
    public static ScopeFilter including( Collection<String> included ) 
    {
        return new ScopeFilter( included, null );
    }

    /**
     * Construct a ScopeFilter based on included scopes  
     * 
     * @param included the scopes to include, must not be {@code null}
     * @return the filter, never {@code null}
     */
    public static ScopeFilter including( String... included ) 
    {
        return new ScopeFilter( Arrays.asList( included ), null );
    }

    /**
     * Construct a ScopeFilter based on excluded scopes
     * 
     * @param excluded the scopes to exclude, may be {@code null}
     * @return the filter, never {@code null}
     */
    public static ScopeFilter excluding( Collection<String> excluded ) 
    {
        return new ScopeFilter( null, excluded );
    }

    /**
     * Construct a ScopeFilter based on excluded scopes
     * 
     * @param excluded the scopes to exclude, must not be {@code null}
     * @return the filter, never {@code null}
     */
    public static ScopeFilter excluding( String... excluded ) 
    {
        return new ScopeFilter( null, Arrays.asList( excluded ) );
    }

    /**
     * Get the excluded scopes
     * 
     * @return the scopes to exclude, may be {@code null}
     */
    public final Collection<String> getExcluded()
    {
        return excluded;
    }
    
    /**
     * Get the included scopes
     * 
     * @return the scopes to include, may be {@code null}
     */
    public final Collection<String> getIncluded()
    {
        return included;
    }
    
    /**
     * Transform this filter to a tool specific implementation
     * 
     * @param transformer the transformer, must not be {@code null}
     */
    public <T> T transform ( FilterTransformer<T> transformer )
    {
        return transformer.transform( this );
    }
}
