package com.datascience.service;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Properties;
import com.datascience.datastoring.adapters.kv.DefaultSafeKVStorage;
import com.datascience.datastoring.adapters.mixed.DBKVsFactory;
import com.datascience.datastoring.backends.db.DBBackendFactory;
import com.datascience.datastoring.jobs.IJobStorage;
import com.datascience.datastoring.jobs.JobFactory;
import com.datascience.datastoring.jobs.JobsManager;
import com.datascience.datastoring.jobs.JobsLocksManager;
import com.datascience.datastoring.storages.*;
import com.datascience.executor.*;
import com.datascience.serialization.ISerializer;
import com.datascience.serialization.json.GSONSerializer;
import com.datascience.utils.IRandomUniqIDGenerator;
import com.datascience.utils.RandomUniqIDGenerators;
import org.apache.log4j.Logger;
/**
*
* @author konrad
*/
public class ServiceComponentsFactory {
private static Logger logger = Logger.getLogger(ServiceComponentsFactory.class);
protected Properties properties;
protected DBBackendFactory dbBackendFactory = new DBBackendFactory();
public ServiceComponentsFactory(Properties properties){
this.properties = properties;
}
public IJobStorage loadJobStorage(String type, ISerializer serializer, ProjectCommandExecutor executor, JobsLocksManager jobsLocksManager)
throws IOException, ClassNotFoundException, SQLException {
logger.info("Loading " + type + " job storage");
int cacheSize = Integer.parseInt(properties.getProperty(Constants.CACHE_SIZE));
int cacheDumpTime = Integer.parseInt(properties.getProperty(Constants.CACHE_DUMP_TIME));
IJobStorage jobStorage = JobStorageFactory.create(type, getConnectionProperties(), properties, serializer);
// IJobStorage jobStorage = new JobStorageUsingExecutor(internalJobStorage, executor, jobsLocksManager);
// jobStorage = new CachedWithRegularDumpJobStorage(jobStorage, cacheSize, cacheDumpTime, TimeUnit.SECONDS);
logger.info("Job Storage loaded: " + jobStorage.toString());
return jobStorage;
}
public JobsManager loadJobManager(IJobStorage jobStorage, ISerializer serializer) {
JobFactory jobFactory = new JobFactory(serializer, jobStorage);
return new JobsManager(jobStorage, jobFactory);
}
public IRandomUniqIDGenerator loadIdGenerator(){
return new RandomUniqIDGenerators.PrefixAdderDecorator("RANDOM__", new RandomUniqIDGenerators.NumberAndDate());
}
public ICommandStatusesContainer loadCommandStatusesContainer(String jobStorageType, ISerializer serializer) throws SQLException, ClassNotFoundException {
if (jobStorageType.toUpperCase().startsWith("DB")){
DBKVsFactory<String> kvFactory = new DBKVsFactory<String>(dbBackendFactory.getDBBackendOnProperties(getConnectionProperties(), properties));
return new KeyValueCommandStatusesContainer(
new RandomUniqIDGenerators.NumberAndDate(),
new DefaultSafeKVStorage(kvFactory.getKV("Statuses"), "StatusesStorage"),
serializer);
}
else {
return new SerializedCachedCommandStatusesContainer(new RandomUniqIDGenerators.Numbers(), serializer,
Integer.valueOf(properties.getProperty(Constants.RESPONSES_CACHE_SIZE)),
Integer.valueOf(properties.getProperty(Constants.RESPONSES_DUMP_TIME)));
}
}
public ProjectCommandExecutor loadProjectCommandExecutor(){
return new ProjectCommandExecutor(Integer.valueOf(properties.getProperty(Constants.EXECUTOR_THREADS_NUM)));
}
public ISerializer loadSerializer() {
// TODO - put in properties what serializer we would like to use as default one
return new GSONSerializer();
}
public ResponseBuilder loadResponser(ISerializer serializer) {
return new ResponseBuilder(serializer);
}
public JobsLocksManager loadJobsManager() {
return new JobsLocksManager();
}
private Properties getConnectionProperties(){
Properties connectionProperties = new Properties();
connectionProperties.put("user", properties.getProperty(Constants.DB_USER));
connectionProperties.put("password", properties.getProperty(Constants.DB_PASSWORD));
return connectionProperties;
}
}