package com.liferay.ide.gradle.core.parser;
import com.liferay.ide.core.util.CoreUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.codehaus.groovy.ast.ASTNode;
import org.codehaus.groovy.ast.GroovyCodeVisitor;
import org.codehaus.groovy.ast.builder.AstBuilder;
import org.codehaus.groovy.control.MultipleCompilationErrorsException;
/**
* @author Lovett Li
*/
public class GradleDependencyUpdater
{
private List<ASTNode> nodes;
private File file;
private List<String> gradleFileContents;
public GradleDependencyUpdater( File inputfile ) throws MultipleCompilationErrorsException, IOException
{
this( IOUtils.toString( new FileInputStream( inputfile ), "UTF-8" ) );
this.file = inputfile;
}
public GradleDependencyUpdater( String scriptContents ) throws MultipleCompilationErrorsException
{
AstBuilder builder = new AstBuilder();
nodes = builder.buildFromString( scriptContents );
}
public FindDependenciesVisitor insertDependency( GradleDependency gradleDependency ) throws IOException
{
String dependency = "compile group: \"" + gradleDependency.getGroup() + "\", name:\"" +
gradleDependency.getName() + "\", version:\"" + gradleDependency.getVersion() + "\"";
return insertDependency( dependency );
}
public FindDependenciesVisitor insertDependency( String dependency ) throws IOException
{
FindDependenciesVisitor visitor = new FindDependenciesVisitor();
walkScript( visitor );
gradleFileContents = FileUtils.readLines( file );
if( !dependency.startsWith( "\t" ) )
{
dependency = "\t" + dependency;;
}
if( visitor.getDependenceLineNum() == -1 )
{
gradleFileContents.add( "" );
gradleFileContents.add( "dependencies {" );
gradleFileContents.add( dependency );
gradleFileContents.add( "}" );
}
else
{
if( visitor.getColumnNum() != -1 )
{
gradleFileContents = Files.readAllLines( Paths.get( file.toURI() ), StandardCharsets.UTF_8 );
StringBuilder builder =
new StringBuilder( gradleFileContents.get( visitor.getDependenceLineNum() - 1 ) );
builder.insert( visitor.getColumnNum() - 2, "\n" + dependency + "\n" );
String dep = builder.toString();
if( CoreUtil.isWindows() )
{
dep.replace( "\n", "\r\n" );
}
else if( CoreUtil.isMac() )
{
dep.replace( "\n", "\r" );
}
gradleFileContents.remove( visitor.getDependenceLineNum() - 1 );
gradleFileContents.add( visitor.getDependenceLineNum() - 1, dep );
}
else
{
gradleFileContents.add( visitor.getDependenceLineNum() - 1, dependency );
}
}
return visitor;
}
public List<GradleDependency> getAllDependencies()
{
FindDependenciesVisitor visitor = new FindDependenciesVisitor();
walkScript( visitor );
return visitor.getDependencies();
}
public void walkScript( GroovyCodeVisitor visitor )
{
for( ASTNode node : nodes )
{
node.visit( visitor );
}
}
public List<String> getGradleFileContents()
{
return gradleFileContents;
}
}