/* * Copyright 2009 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.api.plugins; import groovy.lang.Closure; import org.gradle.api.Action; import org.gradle.api.JavaVersion; import org.gradle.api.internal.file.FileLookup; import org.gradle.api.internal.file.SourceDirectorySetFactory; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.api.internal.tasks.DefaultSourceSetContainer; import org.gradle.api.java.archives.Manifest; import org.gradle.api.java.archives.internal.DefaultManifest; import org.gradle.api.reporting.ReportingExtension; import org.gradle.api.tasks.SourceSetContainer; import org.gradle.internal.Actions; import org.gradle.internal.reflect.Instantiator; import java.io.File; import static org.gradle.util.ConfigureUtil.configure; /** * Is mixed into the project when applying the {@link org.gradle.api.plugins.JavaBasePlugin} or the * {@link org.gradle.api.plugins.JavaPlugin}. */ public class JavaPluginConvention { private ProjectInternal project; private String docsDirName; private String testResultsDirName; private String testReportDirName; private final SourceSetContainer sourceSets; private JavaVersion srcCompat; private JavaVersion targetCompat; public JavaPluginConvention(ProjectInternal project, Instantiator instantiator) { this.project = project; sourceSets = instantiator.newInstance(DefaultSourceSetContainer.class, project.getFileResolver(), project.getTasks(), instantiator, project.getServices().get(SourceDirectorySetFactory.class)); docsDirName = "docs"; testResultsDirName = "test-results"; testReportDirName = "tests"; } /** * Configures the source sets of this project. * * <p>The given closure is executed to configure the {@link SourceSetContainer}. The {@link SourceSetContainer} * is passed to the closure as its delegate. * <p> * See the example below how {@link org.gradle.api.tasks.SourceSet} 'main' is accessed and how the {@link org.gradle.api.file.SourceDirectorySet} 'java' * is configured to exclude some package from compilation. * * <pre autoTested=''> * apply plugin: 'java' * * sourceSets { * main { * java { * exclude 'some/unwanted/package/**' * } * } * } * </pre> * * @param closure The closure to execute. * @return NamedDomainObjectContainer<org.gradle.api.tasks.SourceSet> */ public Object sourceSets(Closure closure) { return sourceSets.configure(closure); } /** * Returns a file pointing to the root directory supposed to be used for all docs. */ public File getDocsDir() { return project.getServices().get(FileLookup.class).getFileResolver(project.getBuildDir()).resolve(docsDirName); } /** * Returns a file pointing to the root directory of the test results. */ public File getTestResultsDir() { return project.getServices().get(FileLookup.class).getFileResolver(project.getBuildDir()).resolve(testResultsDirName); } /** * Returns a file pointing to the root directory to be used for reports. */ public File getTestReportDir() { return project.getServices().get(FileLookup.class).getFileResolver(getReportsDir()).resolve(testReportDirName); } private File getReportsDir() { return project.getExtensions().getByType(ReportingExtension.class).getBaseDir(); } /** * Returns the source compatibility used for compiling Java sources. */ public JavaVersion getSourceCompatibility() { return srcCompat != null ? srcCompat : JavaVersion.current(); } /** * Sets the source compatibility used for compiling Java sources. * * @value The value for the source compatibility as defined by {@link JavaVersion#toVersion(Object)} */ public void setSourceCompatibility(Object value) { setSourceCompatibility(JavaVersion.toVersion(value)); } /** * Sets the source compatibility used for compiling Java sources. * * @value The value for the source compatibility */ public void setSourceCompatibility(JavaVersion value) { srcCompat = value; } /** * Returns the target compatibility used for compiling Java sources. */ public JavaVersion getTargetCompatibility() { return targetCompat != null ? targetCompat : getSourceCompatibility(); } /** * Sets the target compatibility used for compiling Java sources. * * @value The value for the target compatibility as defined by {@link JavaVersion#toVersion(Object)} */ public void setTargetCompatibility(Object value) { setTargetCompatibility(JavaVersion.toVersion(value)); } /** * Sets the target compatibility used for compiling Java sources. * * @value The value for the target compatibility */ public void setTargetCompatibility(JavaVersion value) { targetCompat = value; } /** * Creates a new instance of a {@link Manifest}. */ public Manifest manifest() { return manifest(Actions.<Manifest>doNothing()); } /** * Creates and configures a new instance of a {@link Manifest}. The given closure configures * the new manifest instance before it is returned. * * @param closure The closure to use to configure the manifest. */ public Manifest manifest(Closure closure) { return configure(closure, createManifest()); } /** * Creates and configures a new instance of a {@link Manifest}. * * @param action The action to use to configure the manifest. * @since 3.5 */ public Manifest manifest(Action<? super Manifest> action) { Manifest manifest = createManifest(); action.execute(manifest); return manifest; } private Manifest createManifest() { return new DefaultManifest(project.getFileResolver()); } /** * The name of the docs directory. Can be a name or a path relative to the build dir. */ public String getDocsDirName() { return docsDirName; } public void setDocsDirName(String docsDirName) { this.docsDirName = docsDirName; } /** * The name of the test results directory. Can be a name or a path relative to the build dir. */ public String getTestResultsDirName() { return testResultsDirName; } public void setTestResultsDirName(String testResultsDirName) { this.testResultsDirName = testResultsDirName; } /** * The name of the test reports directory. Can be a name or a path relative to {@link org.gradle.api.reporting.ReportingExtension#getBaseDir}. */ public String getTestReportDirName() { return testReportDirName; } public void setTestReportDirName(String testReportDirName) { this.testReportDirName = testReportDirName; } /** * The source sets container. */ public SourceSetContainer getSourceSets() { return sourceSets; } public ProjectInternal getProject() { return project; } }