/* * Copyright 2007-2008 Amazon Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (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/apache2.0 * * 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.addon; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import com.amazonaws.mturk.dataschema.QuestionFormAnswers; import com.amazonaws.mturk.dataschema.QuestionFormAnswersType; import com.amazonaws.mturk.requester.Assignment; import com.amazonaws.mturk.requester.AssignmentStatus; import com.amazonaws.mturk.requester.HIT; import com.amazonaws.mturk.service.axis.RequesterService; import com.amazonaws.mturk.util.ClientConfig; /** * The HITResults class provides a way to hold Assignment results for a particular HIT. */ public class HITResults { public static final String NO_ANSWER = "none"; public static final String EMPTY_ANSWER = "emptyanswer"; public static final String EMPTY = ""; public static final char DELIMITER = '\t'; public static final String MULTI_ANSWER_DELIMITER = "|"; private HIT hit; private Assignment[] assignments; protected ClientConfig config; private static Assignment[] NO_ASSIGNMENTS = new Assignment[] { new Assignment() }; private final String EXCEL_COMPLIANT_DATE_FORMAT = "EEE MMM dd HH:mm:ss zzz yyyy"; private final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat(EXCEL_COMPLIANT_DATE_FORMAT); public HITResults(HIT hit, Assignment[] assignments, ClientConfig config) { this.hit = hit; this.assignments = assignments; this.config = config; } public HIT getHIT() { return this.hit; } public Assignment[] getAssignments() { return this.assignments; } public void writeResults(HITDataOutput writer) throws IOException { Map<String,String> hitResults = this.getHITResults(); Map<String,String> assignmentResults; if (assignments == null || assignments.length == 0) { assignments = NO_ASSIGNMENTS; // Feature 1826272 (output empty assignment data even when HIT has no assignments) } for (Assignment assignment : this.assignments) { assignmentResults = this.getAssignmentResults(assignment); assignmentResults.putAll( hitResults ); writer.writeValues( assignmentResults ); // append } } public Map<String,String> getHITResults() { // Add standard HIT results Map<String,String> results = new HashMap<String,String>( HITTypeResults.HIT_HEADERS.length ); results.put( HITProperties.HITField.HitId.getFieldName(), hit.getHITId()); results.put( HITProperties.HITField.HitTypeId.getFieldName(), hit.getHITTypeId()); results.put( HITProperties.HITField.Title.getFieldName(), hit.getTitle()); results.put( HITProperties.HITField.Description.getFieldName(), hit.getDescription()); results.put( HITProperties.HITField.Keywords.getFieldName(), hit.getKeywords()); results.put( HITProperties.HITField.Reward.getFieldName(), hit.getReward().getFormattedPrice()); String creationTime = DATE_FORMATTER.format(hit.getCreationTime().getTime()); results.put( HITProperties.HITField.CreationTime.getFieldName(), creationTime); results.put( HITProperties.HITField.MaxAssignments.getFieldName(), hit.getMaxAssignments().toString()); results.put( HITProperties.HITField.NumAvailableAssignments.getFieldName(), hit.getNumberOfAssignmentsAvailable().toString()); results.put( HITProperties.HITField.NumPendingAssignments.getFieldName(), hit.getNumberOfAssignmentsPending().toString()); results.put( HITProperties.HITField.NumCompletedAssignments.getFieldName(), hit.getNumberOfAssignmentsCompleted().toString()); String status = hit.getHITStatus() != null ? hit.getHITStatus().getValue() : ""; results.put( HITProperties.HITField.Status.getFieldName(), status); String reviewStatus = hit.getHITReviewStatus() != null ? hit.getHITReviewStatus().getValue() : ""; results.put( HITProperties.HITField.ReviewStatus.getFieldName(), reviewStatus); results.put( HITProperties.HITField.Annotation.getFieldName(), hit.getRequesterAnnotation()); results.put( HITProperties.HITField.AssignmentDuration.getFieldName(), hit.getAssignmentDurationInSeconds().toString()); results.put( HITProperties.HITField.AutoApprovalDelay.getFieldName(), hit.getAutoApprovalDelayInSeconds().toString()); results.put( HITProperties.HITField.Lifetime.getFieldName(), DATE_FORMATTER.format(hit.getExpiration().getTime())); String viewHITUrl = this.config.getRequesterWebsiteURL() + "/mturk/manageHIT?HITId=" + hit.getHITId() ; results.put( HITProperties.HITField.ViewHITUrl.getFieldName(), viewHITUrl); return results; } public Map<String,String> getAssignmentResults(Assignment assignment) { // Add standard Assignment results Map<String,String> results = new LinkedHashMap<String,String>( HITTypeResults.ASSIGNMENT_HEADERS.length ); results.put( HITProperties.AssignmentField.AssignmentId.getFieldName(), assignment.getAssignmentId()); results.put( HITProperties.AssignmentField.WorkerId.getFieldName(), assignment.getWorkerId()); AssignmentStatus status = assignment.getAssignmentStatus(); String statusStr = status != null ? status.getValue() : EMPTY; results.put( HITProperties.AssignmentField.Status.getFieldName(), statusStr); String autoApprovalTime = assignment.getAutoApprovalTime() != null ? DATE_FORMATTER.format(assignment.getAutoApprovalTime().getTime()) : EMPTY; results.put( HITProperties.AssignmentField.AutoApprovalTime.getFieldName(), autoApprovalTime); String acceptTime = assignment.getAcceptTime() != null ? DATE_FORMATTER.format(assignment.getAcceptTime().getTime()) : EMPTY; results.put( HITProperties.AssignmentField.AcceptTime.getFieldName(), acceptTime); String submitTime = assignment.getSubmitTime() != null ? DATE_FORMATTER.format(assignment.getSubmitTime().getTime()) : EMPTY; results.put( HITProperties.AssignmentField.SubmitTime.getFieldName(), submitTime); String approvalTime = assignment.getApprovalTime() != null ? DATE_FORMATTER.format(assignment.getApprovalTime().getTime()) : EMPTY; results.put( HITProperties.AssignmentField.ApprovalTime.getFieldName(), approvalTime); String rejectionTime = assignment.getRejectionTime() != null ? DATE_FORMATTER.format(assignment.getRejectionTime().getTime()) : EMPTY; results.put( HITProperties.AssignmentField.RejectionTime.getFieldName(), rejectionTime); String deadline = assignment.getDeadline() != null ? DATE_FORMATTER.format(assignment.getDeadline().getTime()) : EMPTY; results.put( HITProperties.AssignmentField.Deadline.getFieldName(), deadline); String requesterFeedback = assignment.getRequesterFeedback() != null ? assignment.getRequesterFeedback() : EMPTY; results.put( HITProperties.AssignmentField.RequesterFeedback.getFieldName(), requesterFeedback); String rejectFlag = status != null && status == AssignmentStatus.Rejected ? "y" : EMPTY; results.put( HITProperties.AssignmentField.RejectFlag.getFieldName(), rejectFlag); // Add Assignment-specific answers String answers = this.getAnswers(assignment); results.put( HITProperties.AssignmentField.Answers.getFieldName(), answers); return results; } @SuppressWarnings("unchecked") private String getAnswers(Assignment assignment) { String result = EMPTY; AssignmentStatus status = assignment.getAssignmentStatus(); if (status == null) { return NO_ANSWER; } String answerXML = assignment.getAnswer(); QuestionFormAnswers qfa = RequesterService.parseAnswers(answerXML); List<QuestionFormAnswersType.AnswerType> answers = (List<QuestionFormAnswersType.AnswerType>) qfa.getAnswer(); for (QuestionFormAnswersType.AnswerType answer : answers) { String assignmentId = assignment.getAssignmentId(); String answerValue = RequesterService.getAnswerValue(assignmentId, answer, true); if (answerValue != null) { result += answerValue + DELIMITER; } } return result; } }