/*
* Copyright 2016 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.ide.visualstudio.tasks;
import org.gradle.api.Action;
import org.gradle.api.Incubating;
import org.gradle.api.Transformer;
import org.gradle.api.XmlProvider;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.Optional;
import org.gradle.ide.visualstudio.VisualStudioProject;
import org.gradle.ide.visualstudio.internal.DefaultVisualStudioProject;
import org.gradle.ide.visualstudio.internal.VisualStudioProjectConfiguration;
import org.gradle.ide.visualstudio.tasks.internal.RelativeFileNameTransformer;
import org.gradle.ide.visualstudio.tasks.internal.VisualStudioProjectFile;
import org.gradle.plugins.ide.api.XmlGeneratorTask;
import java.io.File;
import java.util.concurrent.Callable;
/**
* Task for generating a project file.
*/
@Incubating
public class GenerateProjectFileTask extends XmlGeneratorTask<VisualStudioProjectFile> {
private DefaultVisualStudioProject visualStudioProject;
private String gradleExe;
private String gradleArgs;
public void initGradleCommand() {
final File gradlew = getProject().getRootProject().file("gradlew.bat");
getConventionMapping().map("gradleExe", new Callable<Object>() {
@Override
public Object call() throws Exception {
final String rootDir = getTransformer().transform(getProject().getRootDir());
String args = "";
if (!rootDir.equals(".")) {
args = " -p \"" + rootDir + "\"";
}
if (gradlew.isFile()) {
return getTransformer().transform(gradlew) + args;
}
return "gradle" + args;
}
});
}
@Internal
public Transformer<String, File> getTransformer() {
return RelativeFileNameTransformer.forFile(getProject().getRootDir(), visualStudioProject.getProjectFile().getLocation());
}
public void setVisualStudioProject(VisualStudioProject vsProject) {
this.visualStudioProject = (DefaultVisualStudioProject) vsProject;
}
@Internal
public VisualStudioProject getVisualStudioProject() {
return visualStudioProject;
}
@Override
public File getInputFile() {
return null;
}
@Override
public File getOutputFile() {
return visualStudioProject.getProjectFile().getLocation();
}
@Override
protected VisualStudioProjectFile create() {
return new VisualStudioProjectFile(getXmlTransformer(), getTransformer());
}
@Override
protected void configure(VisualStudioProjectFile projectFile) {
DefaultVisualStudioProject vsProject = visualStudioProject;
projectFile.setGradleCommand(buildGradleCommand());
projectFile.setProjectUuid(vsProject.getUuid());
for (File sourceFile : vsProject.getSourceFiles()) {
projectFile.addSourceFile(sourceFile);
}
for (File resourceFile : vsProject.getResourceFiles()) {
projectFile.addResource(resourceFile);
}
for (File headerFile : vsProject.getHeaderFiles()) {
projectFile.addHeaderFile(headerFile);
}
for (VisualStudioProjectConfiguration configuration : vsProject.getConfigurations()) {
projectFile.addConfiguration(configuration);
}
for (Action<? super XmlProvider> xmlAction : vsProject.getProjectFile().getXmlActions()) {
getXmlTransformer().addAction(xmlAction);
}
}
private String buildGradleCommand() {
String exe = getGradleExe();
String args = getGradleArgs();
if (args == null || args.trim().length() == 0) {
return exe;
} else {
return exe + " " + args.trim();
}
}
@Input
public String getGradleExe() {
return gradleExe;
}
public void setGradleExe(String gradleExe) {
this.gradleExe = gradleExe;
}
@Input
@Optional
public String getGradleArgs() {
return gradleArgs;
}
public void setGradleArgs(String gradleArgs) {
this.gradleArgs = gradleArgs;
}
}