/**
* This file is part of pwt.
*
* pwt is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* pwt is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with pwt. If not,
* see <http://www.gnu.org/licenses/>.
*/
package fr.putnami.gwt.gradle.helper;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import org.gradle.internal.jvm.Jvm;
import java.io.File;
import java.nio.charset.Charset;
import java.util.List;
import fr.putnami.gwt.gradle.extension.JavaOption;
public abstract class JavaCommandBuilder {
private final String javaExec;
private final List<String> javaArgs = Lists.newArrayList();
private final List<String> classPaths = Lists.newArrayList();
private String mainClass;
private final List<String> args = Lists.newArrayList();
public JavaCommandBuilder() {
this.javaExec = Jvm.current().getJavaExecutable().getAbsolutePath();
javaArgs.add("-Dfile.encoding=" + Charset.defaultCharset().name());
}
public void setMainClass(String mainClass) {
this.mainClass = mainClass;
}
public JavaCommandBuilder addClassPath(String classPath) {
this.classPaths.add(classPath);
return this;
}
public JavaCommandBuilder addClassPath(Iterable<File> files) {
for (File file : files) {
if (file != null && file.exists()) {
addClassPath(file.getAbsolutePath());
}
}
return this;
}
public JavaCommandBuilder addJavaArgs(String javaArg) {
this.javaArgs.add(javaArg);
return this;
}
public JavaCommandBuilder addArg(String argName) {
this.args.add(argName);
return this;
}
public JavaCommandBuilder addArg(String argName, File value) {
if (value != null) {
this.args.add(argName);
this.args.add(value.getAbsolutePath());
}
return this;
}
public JavaCommandBuilder addArg(String argName, Object value) {
if (value != null) {
this.args.add(argName);
this.args.add(value.toString());
}
return this;
}
public JavaCommandBuilder addArg(String argName, String value) {
if (!Strings.isNullOrEmpty(value)) {
this.args.add(argName);
this.args.add(value);
}
return this;
}
public void addArgIf(Boolean condition, String ifTrue, String ifFalse) {
if (condition != null) {
this.args.add(condition ? ifTrue : ifFalse);
}
}
public void addArgIf(Boolean condition, String value) {
if (Boolean.TRUE.equals(condition)) {
this.args.add(value);
}
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(javaExec);
for (String arg : javaArgs) {
if (!Strings.isNullOrEmpty(arg)) {
sb.append(" ");
sb.append(arg);
}
}
if (classPaths.size() > 0) {
sb.append(" -cp ");
int i = 0;
for (String classPath : classPaths) {
if (!Strings.isNullOrEmpty(classPath.trim())) {
if (i > 0) {
sb.append(System.getProperty("path.separator"));
}
sb.append(classPath.trim());
i++;
}
}
}
sb.append(" ");
sb.append(mainClass);
for (String arg : args) {
if (!Strings.isNullOrEmpty(arg)) {
sb.append(" ");
sb.append(arg);
}
}
return sb.toString();
}
public void configureJavaArgs(JavaOption javaOptions) {
if (!Strings.isNullOrEmpty(javaOptions.getMinHeapSize())) {
addJavaArgs("-Xms" + javaOptions.getMinHeapSize());
}
if (!Strings.isNullOrEmpty(javaOptions.getMaxHeapSize())) {
addJavaArgs("-Xmx" + javaOptions.getMaxHeapSize());
}
if (!Strings.isNullOrEmpty(javaOptions.getMaxPermSize())) {
addJavaArgs("-XX:MaxPermSize=" + javaOptions.getMaxPermSize());
}
if (javaOptions.isDebugJava()) {
StringBuffer sb = new StringBuffer();
sb.append("-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=");
sb.append(javaOptions.getDebugPort());
sb.append(",suspend=");
sb.append(javaOptions.isDebugSuspend() ? "y" : "n");
addJavaArgs(sb.toString());
}
for (String javaArg : javaOptions.getJavaArgs()) {
addJavaArgs(javaArg);
}
}
}