package edu.harvard.econcs.turkserver.config;
import java.io.File;
import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import com.amazonaws.mturk.util.ClientConfig;
import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
public class TSConfig {
/* ****************************************************
* Default values
******************************************************/
public static final String TURKSERVER_CONFIG = "turkserver.properties";
/**
* port that the server runs on. +1 is also used.
*/
public static final String SERVER_HTTPPORT = "server.httpport";
public static final String SERVER_DEBUGMODE = "server.debugmode";
/**
* Maximum number of assigned, non-completed HITs that a worker can have (usually 1).
*/
public static final String CONCURRENCY_LIMIT = "session.concurrent.limit";
public static final String MTURK_ASSIGNMENT_DURATION = "mturk.assignmentDurationInSeconds";
public static final String MTURK_AUTO_APPROVAL_DELAY = "mturk.autoApprovalDelayInSeconds";
public static final String MTURK_HIT_LIFETIME = "mturk.lifetimeInSeconds";
/* ****************************************************
* Data dependencies
******************************************************/
public static final String AWS_ACCESSKEYID = "aws.accessKeyID";
public static final String AWS_SECRETACCESSKEY = "aws.secretAccessKey";
public static final String AWS_SANDBOX = "aws.sandbox";
public static final String MYSQL_HOST = "mysql.host";
public static final String MYSQL_DATABASE = "mysql.database";
public static final String MYSQL_USER = "mysql.username";
public static final String MYSQL_PASSWORD = "mysql.password";
/* ****************************************************
* Other things that will need to be set
******************************************************/
public static final String EXP_CONFIGURATOR = "experiment.configurator";
public static final String EXP_CLASS = "experiment.class";
public static final String EXP_SETID = "experiment.setid";
public static final String EXP_INPUT_LIST = "experiment.inputdata";
/**
* Maximum number of HITs a single worker can complete in this set
*/
public static final String EXP_REPEAT_LIMIT = "experiment.set.limit";
public static final String MTURK_HIT_TITLE = "mturk.hit.title";
public static final String MTURK_HIT_DESCRIPTION = "mturk.hit.description";
public static final String MTURK_HIT_KEYWORDS = "mturk.hit.keywords";
public static final String MTURK_HIT_BASE_REWARD = "mturk.hit.reward";
public static final String MTURK_HIT_FRAME_HEIGHT = "mturk.hit.frameheight";
public static final String MTURK_HIT_EXTERNAL_URL = "mturk.hit.external.url";
public static final String SERVER_RESOURCES = "server.resources";
/**
* Number of HITs to be completed before server initiates shutdown
*/
public static final String SERVER_HITGOAL = "server.hitgoal";
public static final String SERVER_LOBBY_DEFAULT = "server.lobby.default";
public static final String SERVER_USERNAME = "server.usernames";
/**
* Minimum number of milliseconds between creating HITs
*/
public static final String HITS_MIN_DELAY = "server.hit.mindelay";
/**
* Maximum amount of millis between creating HITs (keeps at top of list)
*/
public static final String HITS_MAX_DELAY = "server.hit.maxdelay";
/**
* Overhead, percentage wise, of HITs that should be created (0 < x < 1)
*/
public static final String HITS_OVERHEAD_PERCENT = "server.hit.overheadpct";
/**
* Minimum number of extra HITs that should be available
*/
public static final String HITS_MIN_OVERHEAD = "server.hit.minoverhead";
/**
* Maximum number of extra HITs that should be created
*/
public static final String HITS_MAX_OVERHEAD = "server.hit.maxoverhead";
// Optional parameters
public static final String EXP_SPECIAL_WORKERS = "experiment.special.workers";
public static final String SERVER_EXTRA_SERVLETS = "server.extra.servlets";
public static final String SERVER_CUSTOM_HANDLERS = "server.custom.handlers";
public static Configuration getDefault() {
Configuration conf = null;
try {
conf = new PropertiesConfiguration(TURKSERVER_CONFIG);
System.out.printf("Found and loaded %s\n", TURKSERVER_CONFIG);
} catch (ConfigurationException e) {
System.out.printf("Unable to load %s. Proceeding with default settings...\n", TURKSERVER_CONFIG);
conf = new PropertiesConfiguration();
}
// Sensible default values to fall back on
conf.setProperty(SERVER_HTTPPORT, 9876);
conf.setProperty(CONCURRENCY_LIMIT, 1);
conf.setProperty(MTURK_ASSIGNMENT_DURATION, 86400);
conf.setProperty(MTURK_AUTO_APPROVAL_DELAY, 604800);
conf.setProperty(MTURK_HIT_LIFETIME, 604800);
// TODO: remove this
conf.setProperty(SERVER_DEBUGMODE, false);
conf.setProperty(SERVER_LOBBY_DEFAULT, true);
conf.setProperty(SERVER_USERNAME, false);
// Sensible defaults for creating HITs
conf.setProperty(HITS_MIN_DELAY, 1000);
conf.setProperty(HITS_MAX_DELAY, 300 * 1000); // posts at most every 5 minutes
conf.setProperty(HITS_OVERHEAD_PERCENT, 0.1);
conf.setProperty(HITS_MIN_OVERHEAD, 10);
conf.setProperty(HITS_MAX_OVERHEAD, 50);
return conf;
}
public static Configuration getCustom(File file) throws ConfigurationException {
Configuration defaults = getDefault();
Configuration experiment = new PropertiesConfiguration(file);
CompositeConfiguration cc = new CompositeConfiguration();
cc.addConfiguration(experiment);
cc.addConfiguration(defaults);
return cc;
}
public static MysqlConnectionPoolDataSource getMysqlCPDS(Configuration conf) {
MysqlConnectionPoolDataSource ds = new MysqlConnectionPoolDataSource();
ds.setDatabaseName(conf.getString(MYSQL_DATABASE));
if( conf.containsKey(MYSQL_HOST))
ds.setServerName(conf.getString(MYSQL_HOST));
if( conf.containsKey(MYSQL_USER))
ds.setUser(conf.getString(MYSQL_USER));
if( conf.containsKey(MYSQL_PASSWORD))
ds.setPassword(conf.getString(MYSQL_PASSWORD));
// To avoid unexpected lost data
ds.setStrictUpdates(false);
return ds;
}
public static ClientConfig getClientConfig(Configuration conf) {
String accessKeyID = conf.getString(AWS_ACCESSKEYID);
String secretAccessKey = conf.getString(AWS_SECRETACCESSKEY);
boolean sandbox = conf.getBoolean(AWS_SANDBOX, true);
ClientConfig config = new ClientConfig();
config.setAccessKeyId(accessKeyID);
config.setSecretAccessKey(secretAccessKey);
config.setServiceURL(sandbox ? ClientConfig.SANDBOX_SERVICE_URL : ClientConfig.PRODUCTION_SERVICE_URL);
return config;
}
}