/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed 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 com.android.build.gradle.internal;

import com.android.annotations.NonNull;
import com.android.builder.model.SourceProvider;
import org.gradle.api.tasks.SourceSet;

import java.io.File;
import java.util.Collection;
import java.util.Collections;

/**
 * An implementation of SourceProvider that's wrapper around a Java SourceSet.
 * This is useful for the case where we store SourceProviders but don't want to
 * query the content of the SourceSet at the moment the SourceProvider is created.
 */
public class SourceSetSourceProviderWrapper implements SourceProvider {

    @NonNull
    private final SourceSet sourceSet;

    public SourceSetSourceProviderWrapper(@NonNull SourceSet sourceSet) {

        this.sourceSet = sourceSet;
    }

    @NonNull
    @Override
    public String getName() {
        return sourceSet.getName();
    }

    @NonNull
    @Override
    public File getManifestFile() {
        throw new IllegalAccessError("Shouldn't access manifest from SourceSetSourceProviderWrapper");
    }

    @NonNull
    @Override
    public Collection<File> getJavaDirectories() {
        return sourceSet.getJava().getSrcDirs();
    }

    @NonNull
    @Override
    public Collection<File> getResourcesDirectories() {
        return sourceSet.getResources().getSrcDirs();
    }

    @NonNull
    @Override
    public Collection<File> getAidlDirectories() {
        return Collections.emptyList();
    }

    @NonNull
    @Override
    public Collection<File> getRenderscriptDirectories() {
        return Collections.emptyList();
    }

    @NonNull
    @Override
    public Collection<File> getCDirectories() {
        return Collections.emptyList();
    }

    @NonNull
    @Override
    public Collection<File> getCppDirectories() {
        return Collections.emptyList();
    }

    @NonNull
    @Override
    public Collection<File> getResDirectories() {
        return Collections.emptyList();
    }

    @NonNull
    @Override
    public Collection<File> getAssetsDirectories() {
        return Collections.emptyList();
    }

    @NonNull
    @Override
    public Collection<File> getJniLibsDirectories() {
        return Collections.emptyList();
    }
}
