/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.app.batch;
import org.gitools.ui.core.commands.tools.ITool;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
public class CommandExecutor {
boolean noErrors;
public boolean checkArguments(String[] args, PrintWriter out) {
if (args.length == 0) {
out.println(errorMsg());
out.flush();
return false;
}
List<String> argsList = new ArrayList<>();
for (String s : args) {
if (s.equals("")) {
continue;
}
argsList.add(s);
}
if (!argsList.get(argsList.size() - 1).equals(";")) {
argsList.add(";");
}
boolean allOk = true;
while (argsList.contains(";")) {
int sepIndex = argsList.indexOf(";");
List<String> sublist = argsList.subList(0, sepIndex);
allOk = checkArguments(sublist, out);
if (!allOk) {
return false;
}
for (int i = 0; i < sepIndex && argsList.size() > 0; i++) {
argsList.remove(0);
}
}
return allOk;
}
public void execute(String[] args, PrintWriter out) {
if (args.length == 0) {
out.println(errorMsg());
return;
}
List<String> argsList = new ArrayList<>();
for (String s : args) {
argsList.add(s);
}
if (!argsList.get(argsList.size() - 1).equals(";")) {
argsList.add(";");
}
// run all comands
noErrors = true;
while (argsList.contains(";") && noErrors) {
if (!noErrors) {
break;
}
int sepIndex = argsList.indexOf(";");
List<String> sublist = argsList.subList(0, sepIndex);
execute(sublist, out);
for (int i = 0; i < sepIndex && argsList.size() > 0; i++) {
argsList.remove(0);
}
}
}
private boolean checkArguments(List<String> args, PrintWriter out) {
String toolName = args.get(0);
args.remove(toolName);
String toolArgs[] = args.toArray(new String[args.size()]);
ITool tool = ToolFactory.get(toolName);
if (tool == null) {
out.println(errorMsg());
out.flush();
return false;
}
return tool.check(toolArgs, out);
}
private void execute(List<String> args, PrintWriter out) {
String toolName = args.get(0);
args.remove(toolName);
String toolArgs[] = args.toArray(new String[args.size()]);
ITool tool = ToolFactory.get(toolName.toLowerCase());
if (tool == null) {
out.println(errorMsg());
out.flush();
return;
}
if (tool.run(toolArgs, out)) {
out.println("OK");
out.flush();
} else {
out.println(tool.getExitMessage());
out.println("NOT OK");
out.flush();
noErrors = false;
}
}
private static String errorMsg() {
StringBuilder msg = new StringBuilder();
msg.append("ERROR | Unknown command. Valid commands: ");
for (String tool : ToolFactory.TOOLS.keySet()) {
msg.append(" ").append(tool);
}
return msg.toString();
}
}