/* * 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 site_category; import java.util.Date; import com.amazonaws.mturk.addon.HITDataCSVReader; import com.amazonaws.mturk.addon.HITDataCSVWriter; import com.amazonaws.mturk.addon.HITDataInput; import com.amazonaws.mturk.addon.HITDataOutput; import com.amazonaws.mturk.addon.HITProperties; import com.amazonaws.mturk.addon.HITQuestion; import com.amazonaws.mturk.requester.HIT; import com.amazonaws.mturk.service.axis.RequesterService; import com.amazonaws.mturk.util.PropertiesClientConfig; /** * The Site Category sample application will create 5 HITs asking workers to categorize websites into predefined categories. * * mturk.properties must be found in the current file path. * * The following concepts are covered: * - Bulk load HITs using an input file * - File based HIT loading * */ public class SiteCategory { // Defining the locations of the input files private RequesterService service; private String rootDir = "."; private String inputFile = rootDir + "/site_category.input"; private String propertiesFile = rootDir + "/site_category.properties"; private String questionFile = rootDir + "/site_category.question"; public SiteCategory() { service = new RequesterService(new PropertiesClientConfig("../mturk.properties")); } /** * Check to see if there are sufficient funds. * @return true if there are sufficient funds. False otherwise. */ public boolean hasEnoughFund() { double balance = service.getAccountBalance(); System.out.println("Got account balance: " + RequesterService.formatCurrency(balance)); return balance > 0; } /** * Create the website category HITs. * */ public void createSiteCategoryHITs() { try { //Loading the input file. The input file is a tab delimited file where the first row //defines the fields/variables and the remaining rows contain the values for each HIT. //Each row represents a unique HIT. The SDK uses the Apache Velocity engine to merge //the input values into a templatized QAP file. //Please refer to http://velocity.apache.org for more details on this engine and //how to specify variable names. Apache Velocity is fully supported so there may be //additional functionality you can take advantage of if you know the Velocity syntax. HITDataInput input = new HITDataCSVReader(inputFile); //Loading the question (QAP) file. This QAP file contains Apache Velocity variable names where the values //from the input file are to be inserted. Essentially the QAP becomes a template for the input file. HITQuestion question = new HITQuestion(questionFile); //Loading the HIT properties file. The properties file defines two system qualifications that will //be used for the HIT. The properties file can also be a Velocity template. Currently, only //the "annotation" field is allowed to be a Velocity template variable. This allows the developer //to "tie in" the input value to the results. HITProperties props = new HITProperties(propertiesFile); HIT[] hits = null; // Create multiple HITs using the input, properties, and question files System.out.println("--[Loading HITs]----------"); Date startTime = new Date(); System.out.println(" Start time: " + startTime); //The simpliest way to bulk load a large number of HITs where all details are defined in files. //When using this method, it will automatically create output files of the following type: // - <your input file name>.success - A file containing the HIT IDs and HIT Type IDs of // all HITs that were successfully loaded. This file will // not exist if there are no HITs successfully loaded. // - <your input file name>.failure - A file containing the input rows that failed to load. // This file will not exist if there are no failures. //The .success file can be used in subsequent operations to retrieve the results that workers submitted. HITDataOutput success = new HITDataCSVWriter(inputFile + ".success"); HITDataOutput failure = new HITDataCSVWriter(inputFile + ".failure"); hits = service.createHITs(input, props, question, success, failure); System.out.println("--[End Loading HITs]----------"); Date endTime = new Date(); System.out.println(" End time: " + endTime); System.out.println("--[Done Loading HITs]----------"); System.out.println(" Total load time: " + (endTime.getTime() - startTime.getTime())/1000 + " seconds."); if (hits == null) { throw new Exception("Could not create HITs"); } } catch (Exception e) { System.err.println(e.getLocalizedMessage()); } } /** * @param args */ public static void main(String[] args) { SiteCategory app = new SiteCategory(); if (app.hasEnoughFund()) { app.createSiteCategoryHITs(); } } }