/*
* Copyright 2014 the original author or authors.
*
* 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 org.gradle.play.plugins;
import com.google.common.collect.ImmutableSet;
import org.gradle.api.Incubating;
import org.gradle.api.artifacts.*;
import org.gradle.api.artifacts.component.ProjectComponentIdentifier;
import org.gradle.api.artifacts.dsl.DependencyHandler;
import org.gradle.api.file.FileCollection;
import org.gradle.api.internal.file.FileCollectionInternal;
import org.gradle.api.internal.file.collections.LazilyInitializedFileCollection;
import org.gradle.api.internal.file.collections.SimpleFileCollection;
import org.gradle.api.internal.tasks.TaskDependencyResolveContext;
import java.io.File;
/**
* Conventional locations and names for play plugins.
*/
@Incubating
public class PlayPluginConfigurations {
public static final String PLATFORM_CONFIGURATION = "playPlatform";
public static final String COMPILE_CONFIGURATION = "play";
public static final String RUN_CONFIGURATION = "playRun";
public static final String TEST_COMPILE_CONFIGURATION = "playTest";
private final ConfigurationContainer configurations;
private final DependencyHandler dependencyHandler;
public PlayPluginConfigurations(ConfigurationContainer configurations, DependencyHandler dependencyHandler) {
this.configurations = configurations;
this.dependencyHandler = dependencyHandler;
Configuration playPlatform = configurations.create(PLATFORM_CONFIGURATION);
Configuration playCompile = configurations.create(COMPILE_CONFIGURATION);
playCompile.extendsFrom(playPlatform);
Configuration playRun = configurations.create(RUN_CONFIGURATION);
playRun.extendsFrom(playCompile);
Configuration playTestCompile = configurations.create(TEST_COMPILE_CONFIGURATION);
playTestCompile.extendsFrom(playCompile);
configurations.maybeCreate(Dependency.DEFAULT_CONFIGURATION).extendsFrom(playCompile);
}
public PlayConfiguration getPlayPlatform() {
return new PlayConfiguration(PLATFORM_CONFIGURATION);
}
public PlayConfiguration getPlay() {
return new PlayConfiguration(COMPILE_CONFIGURATION);
}
public PlayConfiguration getPlayRun() {
return new PlayConfiguration(RUN_CONFIGURATION);
}
public PlayConfiguration getPlayTest() {
return new PlayConfiguration(TEST_COMPILE_CONFIGURATION);
}
/**
* Wrapper around a Configuration instance used by the PlayApplicationPlugin.
*/
class PlayConfiguration {
private final String name;
PlayConfiguration(String name) {
this.name = name;
}
Configuration getConfiguration() {
return configurations.getByName(name);
}
FileCollection getAllArtifacts() {
return getConfiguration();
}
FileCollection getChangingArtifacts() {
return new FilterByProjectComponentTypeFileCollection(getConfiguration(), true);
}
FileCollection getNonChangingArtifacts() {
return new FilterByProjectComponentTypeFileCollection(getConfiguration(), false);
}
void addDependency(Object notation) {
dependencyHandler.add(name, notation);
}
void addArtifact(PublishArtifact artifact) {
configurations.getByName(name).getArtifacts().add(artifact);
}
}
private static class FilterByProjectComponentTypeFileCollection extends LazilyInitializedFileCollection {
private final Configuration configuration;
private final boolean matchProjectComponents;
private FilterByProjectComponentTypeFileCollection(Configuration configuration, boolean matchProjectComponents) {
this.configuration = configuration;
this.matchProjectComponents = matchProjectComponents;
}
@Override
public String getDisplayName() {
return configuration.toString();
}
@Override
public FileCollectionInternal createDelegate() {
ImmutableSet.Builder<File> files = ImmutableSet.builder();
for (ResolvedArtifact artifact : configuration.getResolvedConfiguration().getResolvedArtifacts()) {
if ((artifact.getId().getComponentIdentifier() instanceof ProjectComponentIdentifier) == matchProjectComponents) {
files.add(artifact.getFile());
}
}
return new SimpleFileCollection(files.build());
}
@Override
public void visitDependencies(TaskDependencyResolveContext context) {
context.add(configuration);
}
}
}