/*
* #%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.core.commands.tools;
import org.gitools.ui.core.Application;
import org.gitools.ui.core.commands.Command;
import org.gitools.ui.platform.progress.JobRunnable;
import org.gitools.ui.platform.progress.JobThread;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import java.io.PrintWriter;
import java.util.concurrent.CountDownLatch;
public abstract class AbstractTool implements ITool {
private int exitStatus = -1;
private String exitMessage = "";
@Override
public boolean check(String[] args, PrintWriter out) {
CmdLineParser parser = new CmdLineParser(this);
try {
parser.parseArgument(args);
} catch (CmdLineException e) {
out.println("\n" + e.getMessage() + "\n");
out.print("USAGE | " + getName() + "\n");
parser.printUsage(out, null);
return false;
} catch (Exception e) {
out.println("ERROR " + e.getMessage());
return false;
}
return true;
}
@Override
public boolean run(String[] args, PrintWriter out) {
CmdLineParser parser = new CmdLineParser(this);
try {
parser.parseArgument(args);
out.print("RUNNING " + this.getName() + "\n");
execute();
//exitStatus = 0;
} catch (CmdLineException e) {
out.print("USAGE | " + getName() + "\n");
parser.printUsage(out, null);
return false;
} catch (Exception e) {
out.println("ERROR | " + e.getMessage());
return false;
}
if (exitStatus != 0) {
return false;
}
return true;
}
void execute() throws InterruptedException {
Command job = newJob();
if (job != null) {
Application mainFrame = Application.get();
// Trick to force window to front, the setAlwaysOnTop works on a Mac, toFront() does nothing.
mainFrame.toFront();
mainFrame.setAlwaysOnTop(true);
mainFrame.setAlwaysOnTop(false);
CountDownLatch latch = new CountDownLatch(1);
JobThread.execute(mainFrame, (JobRunnable) job, latch);
latch.await();
setExitStatus(job.getExitStatus());
setExitMessage(job.getExitMessage());
} else {
throw new RuntimeException("No Job");
}
}
protected void setExitStatus(int exitStatus) {
this.exitStatus = exitStatus;
}
public int getExitStatus() {
return this.exitStatus;
}
protected abstract Command newJob();
public String getExitMessage() {
return exitMessage;
}
public void setExitMessage(String exitMessage) {
this.exitMessage = exitMessage;
}
}