package org.wiztools.restclient.cli;
import com.sampullara.cli.Args;
import com.sampullara.cli.Argument;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.wiztools.commons.FileUtil;
import org.wiztools.restclient.*;
import org.wiztools.restclient.bean.Request;
import org.wiztools.restclient.bean.RequestExecuter;
import org.wiztools.restclient.bean.Response;
import org.wiztools.restclient.bean.TestResult;
import org.wiztools.restclient.util.XMLUtil;
/**
*
* @author subwiz
*/
public class CliMain {
private static int runCount;
private static int failureCount;
private static int errorCount;
private static class CliCommand{
@Argument(value = "output",
alias = "o",
description = "This is the output file",
required = true)
private File outDir;
@Argument(value = "save-response-body",
alias = "b",
description = "Save response body instead of full response",
required = false)
private boolean saveResponseBody = false;
}
private static class CliView implements View{
final File outDir;
final File reqFile;
final boolean saveResponseBody;
CliView(final File outDir, final File reqFile, final boolean saveResponseBody){
this.outDir = outDir;
this.reqFile = reqFile;
this.saveResponseBody = saveResponseBody;
}
@Override
public void doStart(Request request) {
System.out.println("Starting: " + reqFile.getAbsolutePath());
}
@Override
public void doResponse(Response response) {
String reqFileName = reqFile.getName();
final String outFilePrefix = reqFileName.endsWith(".rcq")
? reqFileName.replaceAll(".rcq", ""): reqFileName;
try{
// Generate the response file:
// Add response extension:
final String ext = this.saveResponseBody? ".body": ".rcs";
final File resFile = new NonExistFileGenerator(outDir, outFilePrefix, ext).getFile();
// Test:
TestResult testResult = response.getTestResult();
if(testResult != null){
failureCount += testResult.getFailureCount();
errorCount += testResult.getErrorCount();
runCount += testResult.getRunCount();
}
if(this.saveResponseBody) {
FileUtil.writeBytes(resFile, response.getResponseBody());
}
else {
XMLUtil.writeResponseXML(response, resFile);
}
}
catch(IOException ex){
ex.printStackTrace(System.err);
}
catch(XMLException ex){
ex.printStackTrace(System.err);
}
}
@Override
public void doCancelled() {
// Cannot cancell in cli mode
}
@Override
public void doEnd() {
System.out.println("End: " + reqFile.getAbsolutePath());
}
@Override
public void doError(String error) {
System.err.println("Error:");
System.err.println(error);
}
}
public static void main(String[] arg){
CliCommand command = new CliCommand();
List<String> params = null;
try{
params = Args.parse(command, arg);
}
catch(IllegalArgumentException ex){
System.err.println(ex.getMessage());
Args.usage(command);
System.exit(1);
}
if(params.isEmpty()){
System.err.println("No request(s) given as parameter.");
System.exit(1);
}
File outDir = command.outDir;
List<String> errors = new ArrayList<String>();
if(!outDir.isDirectory()){
errors.add("Out directory is not a directory: " + outDir.getAbsolutePath());
}
else if(!outDir.canWrite()){
errors.add("Cannot write in out dir: " + outDir.getAbsolutePath());
}
else{
for(String param: params){
File f = new File(param);
if(f.canRead()){
try{
Request request = XMLUtil.getRequestFromXMLFile(f);
View view = new CliView(outDir, f, command.saveResponseBody);
// Execute:
RequestExecuter executer = ServiceLocator.getInstance(RequestExecuter.class);
executer.execute(request, view);
}
catch(IOException ex){
ex.printStackTrace(System.err);
}
catch(XMLException ex){
ex.printStackTrace(System.err);
}
}
else{
System.err.println("No read access: " + f.getAbsolutePath());
}
}
// Print summary of tests:
if(runCount > 0){
System.out.println();
System.out.println("Total tests executed: " + runCount);
System.out.println("Total failures: " + failureCount);
System.out.println("Total errors: " + errorCount);
}
}
if(errors.size() > 0){
System.err.println("There were errors: ");
for(String error: errors){
System.err.println("--> " + error);
}
System.exit(2);
}
}
}