
net.fchauvel.trio.ui.Command Maven / Gradle / Ivy
The newest version!
/**
* This file is part of TRIO.
*
* TRIO 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.
*
* TRIO 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 TRIO. If not, see .
*/
/**
* This file is part of TRIO :: Core.
*
* TRIO :: Core 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.
*
* TRIO :: Core 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 TRIO :: Core. If not, see .
*/
/**
* This file is part of TRIO.
*
* TRIO 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.
*
* TRIO 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 TRIO. If not, see .
*/
/**
* ====
* This file is part of TRIO :: Core.
*
* TRIO :: Core 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.
*
* TRIO :: Core 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 TRIO :: Core. If not, see .
* ====
*
* ====
* This file is part of TRIO.
*
* TRIO 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.
*
* TRIO 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 TRIO. If not, see .
* ====
*
*
* This file is part of TRIO.
*
* TRIO 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.
*
* TRIO 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 TRIO. If not, see .
*/
/**
* This file is part of TRIO :: Core.
*
* TRIO :: Core 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.
*
* TRIO :: Core 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 TRIO :: Core. If not, see .
*/
/**
* This file is part of TRIO.
*
* TRIO 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.
*
* TRIO 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 TRIO. If not, see .
*/
/**
*
* This file is part of TRIO.
*
* TRIO 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.
*
* TRIO 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 TRIO. If not, see .
*/
/**
*
* This file is part of TRIO.
*
* TRIO 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.
*
* TRIO 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 TRIO. If not, see .
*/
package net.fchauvel.trio.ui;
import net.fchauvel.trio.simulation.RandomSimulation;
import net.fchauvel.trio.simulation.filter.All;
import net.fchauvel.trio.simulation.filter.Filter;
import net.fchauvel.trio.simulation.filter.TaggedAs;
import net.fchauvel.trio.simulation.Simulation;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* The options which can be passed to trio
*/
public class Command {
public static final String DEFAULT_CONTROL = "*";
public static final String DEFAULT_OBSERVATION = "*";
public static final String DEFAULT_OUTPUT_FILE = "results.csv";
public static final int DEFAULT_RUN_COUNT = 1000;
public static Command from(String[] commandLine) {
return new Command(commandLine);
}
public static Command from(String commandLine) {
return from(commandLine.split("\\s+"));
}
private String observation;
private String control;
private String inputFile;
private String outputFile;
private int runCount;
private Command(String[] commandLine) {
final List parameters = Arrays.asList(commandLine);
outputFile = DEFAULT_OUTPUT_FILE;
runCount = DEFAULT_RUN_COUNT;
observation = DEFAULT_OBSERVATION;
control = DEFAULT_CONTROL;
extractOptions(parameters);
}
private void extractOptions(List parameters) {
final Iterator command = parameters.iterator();
while (command.hasNext()) {
final String parameter = command.next();
if (parameter.matches(".*\\.trio")) {
inputFile = parameter;
break;
} else if (parameter.startsWith("--")) {
parseLongOptions(parameter);
} else if (parameter.startsWith("-")) {
parseShortOptions(command, parameter);
} else {
final String error = String.format("Unknown argument '%s'. Expecting either a path to a TRIO file or an option.", parameter);
throw new IllegalArgumentException(error);
}
}
if (inputFile == null) {
throw new IllegalArgumentException("Missing input TRIO file!");
}
}
private void parseShortOptions(final Iterator command, final String eachParameter) throws IllegalArgumentException {
if (!command.hasNext()) {
final String error = String.format("Missing value after '%s'", eachParameter);
throw new IllegalArgumentException(error);
}
if (eachParameter.equals("-o")) {
observation = command.next();
} else if (eachParameter.equals("-c")) {
control = command.next();
} else if (eachParameter.equals("-t")) {
outputFile = command.next();
} else if (eachParameter.equals("-r")) {
extractRunCountFrom(command.next());
} else {
final String error = String.format("Unknown short option '%s'", eachParameter);
throw new IllegalArgumentException(error);
}
}
private void parseLongOptions(final String eachParameter) throws IllegalArgumentException {
final String parts[] = eachParameter.split("=");
if (parts[0].equals("--trace")) {
outputFile = parts[1];
} else if (parts[0].equals("--observe")) {
observation = parts[1];
} else if (parts[0].equals("--control")) {
control = parts[1];
} else if (parts[0].equals("--runs")) {
extractRunCountFrom(parts[1]);
} else {
final String error = String.format("Unknown long option '%s'! Expecting either '--runs' or '--output'", parts[0]);
throw new IllegalArgumentException(error);
}
}
private void extractRunCountFrom(String text) throws IllegalArgumentException {
try {
runCount = Integer.parseInt(text);
if (runCount < 1) {
final String error = String.format("Run count shall be at least 1! (found %d)", runCount);
throw new IllegalArgumentException(error);
}
} catch (NumberFormatException ex) {
final String error = String.format("Invalid number of runs '%s", text);
throw new IllegalArgumentException(error);
}
}
public String getInput() {
return this.inputFile;
}
public String getObservation() {
return this.observation;
}
public String getControl() {
return this.control;
}
public int getRunCount() {
return this.runCount;
}
public String getTraceFile() {
return this.outputFile;
}
public Simulation getSimulation() {
return new RandomSimulation(observation(), control());
}
private Filter observation() {
return parseTag(observation);
}
private Filter control() {
return parseTag(control);
}
private Filter parseTag(String tag) {
if (tag.contains("*")) {
return All.getInstance();
}
return new TaggedAs(tag);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy