turk/src/com/amazonaws/mturk/cmd/GenerateResultsSummary.java
/*
* Copyright 2012 Amazon Technologies, Inc.
*
* Licensed under the Amazon Software License (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://aws.amazon.com/asl
*
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and
* limitations under the License.
*/
package com.amazonaws.mturk.cmd;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.lang.StringUtils;
import com.amazonaws.mturk.cmd.summary.ResultsSummarizerFactory;
import com.amazonaws.mturk.cmd.summary.ResultsSummarizer;
import java.util.Map;
import java.util.List;
import java.io.PrintWriter;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.File;
/**
* Base command to generate the summary of the results of a sample.
*/
public class GenerateResultsSummary extends AbstractCmd {
/**
* CommandLine option(s) for specifying the results file to be summarized.
*/
private static final String ARG_RESULTS_FILENAME_OPTION_SHORT = "r";
private static final String ARG_RESULTS_FILENAME_OPTION_LONG = "resultsFile";
/**
* CommandLine option(s) for specifying the file to which the summary is to be written.
*/
private static final String ARG_SUMMARY_FILENAME_OPTION_SHORT = "o";
private static final String ARG_SUMMARY_FILENAME_OPTION_LONG = "outputFile";
/**
* CommandLine option(s) for specifying the name of the sample whose results are to be summarized.
*/
private static final String ARG_SAMPLE_NAME_OPTION_SHORT = "s";
private static final String ARG_SAMPLE_NAME_OPTION_LONG = "sample";
public static void main(String[] args) {
GenerateResultsSummary sr = new GenerateResultsSummary();
sr.run(args);
}
/**
* @see AbstractCmd#initOptions()
*/
protected void initOptions() {
opt.addOption(ARG_RESULTS_FILENAME_OPTION_SHORT,
ARG_RESULTS_FILENAME_OPTION_LONG, true,
"Name of the file containing the results to be summarized");
opt.addOption(ARG_SUMMARY_FILENAME_OPTION_SHORT,
ARG_SUMMARY_FILENAME_OPTION_LONG, true,
"Name of the output file containing the summary of the results");
opt.addOption(ARG_SAMPLE_NAME_OPTION_SHORT,
ARG_SAMPLE_NAME_OPTION_LONG, true,
"Name of the sample program whose results are to be summarized");
}
/**
* @see AbstractCmd#runCommand(CommandLine)
*/
protected void runCommand(CommandLine cmdLine) throws Exception {
String resultsFilename = cmdLine.getOptionValue(ARG_RESULTS_FILENAME_OPTION_LONG);
if(! new File(resultsFilename).exists()){
int separatorIndex = resultsFilename.lastIndexOf('/');
if(separatorIndex < 0){
separatorIndex = resultsFilename.lastIndexOf('\\');
}
log.error("The results file [" + resultsFilename.substring(separatorIndex+1) + "] does not exist. " +
"Please execute getResults before summarizing them.");
System.exit(-1);
}
String sampleName = cmdLine.getOptionValue(ARG_SAMPLE_NAME_OPTION_LONG);
ResultsSummarizer rs = ResultsSummarizerFactory.getSummarizer(sampleName);
List<String> summaryFields = rs.getSummaryFields();
// summary values for each hitId
Map<String, List<String>> summary = rs.getSummary(resultsFilename);
// write the summary to the specified file.
String summaryFilename = cmdLine.getOptionValue(ARG_SUMMARY_FILENAME_OPTION_LONG);
writeSummary(summaryFields, summary, summaryFilename);
int separatorIndex = summaryFilename.lastIndexOf('/');
if(separatorIndex < 0){
separatorIndex = summaryFilename.lastIndexOf('\\');
}
log.info("Results summary written to file " + summaryFilename.substring(separatorIndex + 1));
}
/**
* Writes the given summary to the specified summary file.
* @param summaryFields The summary column names.
* @param summary Summary of a sample's results.
* @param summaryFilename Name of the file to which the summary is to be written.
*/
private void writeSummary(List<String> summaryFields, Map<String, List<String>> summary,
String summaryFilename) {
PrintWriter pw = null;
try {
pw = new PrintWriter(new FileOutputStream(summaryFilename));
// print in tab-delimited format
{
String headerRowCsv = StringUtils.join(summaryFields, "\t");
// add the manageHIT URL as the last column
pw.println(headerRowCsv + "\tManage HIT");
}
for (Map.Entry<String, List<String>> hitSummary : summary.entrySet()) {
String hitId = hitSummary.getKey();
String summaryCsv = StringUtils.join(hitSummary.getValue(), "\t");
// add the manage-hit URL as the last column
String manageHITUrl = getManageHITUrl(hitId);
pw.println(summaryCsv + "\t" + manageHITUrl);
}
} catch (FileNotFoundException e) {
log.error("An error occurred while writing the results summary: " + e.getMessage(), e);
System.exit(-1);
} finally {
if (pw != null) {
pw.close();
}
}
}
/**
* @param hitId Hit ID of interest
* @return
* Returns the URL to the <i>manage-hit</i> page for the given hitId.
*/
private String getManageHITUrl(String hitId) {
return AbstractCmd.config.getRequesterWebsiteURL() + "/mturk/manageHIT?HITId=" + hitId;
}
/**
* @see AbstractCmd#printHelp()
*/
protected void printHelp() {
formatter.printHelp(GenerateResultsSummary.class.getSimpleName()
+ " -" + ARG_RESULTS_FILENAME_OPTION_LONG
+ " [path to results file] "
+ " -" + ARG_SUMMARY_FILENAME_OPTION_LONG
+ " [path to output file] "
+ " -" + ARG_SAMPLE_NAME_OPTION_LONG
+ " [name of the sample] "
+ "", opt);
}
}