package eu.europeana.cloud.service.dps.service.cassandra;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Statement;
import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import eu.europeana.cloud.cassandra.CassandraConnectionProvider;
import eu.europeana.cloud.cassandra.CassandraConnectionProviderSingleton;
import eu.europeana.cloud.service.dps.TaskExecutionReportService;
import eu.europeana.cloud.service.dps.exception.AccessDeniedOrObjectDoesNotExistException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
/**
* Report service powered by Cassandra.
*
* @author Pavel Kefurt <Pavel.Kefurt@gmail.com>
*/
public class CassandraReportService implements TaskExecutionReportService {
CassandraConnectionProvider cassandra;
/**
* Constructor of Cassandra report service.
*
* @param hosts Cassandra hosts separated by comma (e.g. localhost,192.168.47.129)
* @param port Cassandra port
* @param keyspaceName Cassandra keyspace name
* @param userName Cassandra username
* @param password Cassandra password
*/
public CassandraReportService(String hosts, int port, String keyspaceName, String userName, String password) {
cassandra = CassandraConnectionProviderSingleton.getCassandraConnectionProvider(hosts, port, keyspaceName, userName, password);
}
@Override
public String getTaskProgress(String taskId) throws AccessDeniedOrObjectDoesNotExistException {
long taskId_ = Long.valueOf(taskId);
JsonObject res = new JsonObject();
res.addProperty("taskId", taskId_);
//read basic informations from Cassandra
Statement selectFromBasicInfo = QueryBuilder.select().all()
.from(CassandraTablesAndColumnsNames.BASIC_INFO_TABLE)
.where(QueryBuilder.eq(CassandraTablesAndColumnsNames.BASIC_TASK_ID, taskId_));
Row basicInfo = cassandra.getSession().execute(selectFromBasicInfo).one();
//basicInfo == null means: task has been dropped or task is still running and calcutalion of expected size is in progress
if (basicInfo != null) {
int expectedSize = basicInfo.getInt(CassandraTablesAndColumnsNames.BASIC_EXPECTED_SIZE);
res.addProperty("topologyName", basicInfo.getString(CassandraTablesAndColumnsNames.BASIC_TOPOLOGY_NAME));
res.addProperty("totalSize", expectedSize);
res.addProperty("processed", basicInfo.getInt(CassandraTablesAndColumnsNames.PROCESSED_FILES_COUNT));
res.addProperty("state", basicInfo.getString(CassandraTablesAndColumnsNames.STATE));
res.addProperty("info", basicInfo.getString(CassandraTablesAndColumnsNames.INFO));
res.addProperty("sent_time", prepareDate(basicInfo.getDate(CassandraTablesAndColumnsNames.SENT_TIME)));
res.addProperty("start_time", prepareDate(basicInfo.getDate(CassandraTablesAndColumnsNames.START_TIME)));
res.addProperty("finish_time", prepareDate(basicInfo.getDate(CassandraTablesAndColumnsNames.FINISH_TIME)));
} else {
res.addProperty("topologyName", "");
res.addProperty("totalSize", "?");
res.addProperty("processed", "0");
res.addProperty("state", "");
res.addProperty("info", "");
res.addProperty("sent_time", "");
res.addProperty("start_time", "");
res.addProperty("finish_time", "");
}
return new Gson().toJson(res);
}
private String prepareDate(Date date) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss", Locale.ENGLISH);
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("CET"));
return date == null ? "" : simpleDateFormat.format(date);
}
@Override
public String getTaskNotificationChuncks(String taskId, int from, int to) {
Statement selectFromNotification = QueryBuilder.select()
.from(CassandraTablesAndColumnsNames.NOTIFICATIONS_TABLE)
.where(QueryBuilder.eq(CassandraTablesAndColumnsNames.NOTIFICATION_TASK_ID, Long.valueOf(taskId))).and(QueryBuilder.gte(CassandraTablesAndColumnsNames.NOTIFICATION_RESOURCE_NUM, from)).and(QueryBuilder.lte(CassandraTablesAndColumnsNames.NOTIFICATION_RESOURCE_NUM, to));
ResultSet notifications = cassandra.getSession().execute(selectFromNotification);
return new Gson().toJson(notificationResultsetToJsonObject(notifications));
}
@Override
public void incrTaskProgress(String taskId) {
throw new UnsupportedOperationException("Not supported yet.");
}
private JsonArray notificationResultsetToJsonObject(ResultSet data) {
JsonArray res = new JsonArray();
for (Row row : data) {
JsonObject line = new JsonObject();
line.addProperty(CassandraTablesAndColumnsNames.NOTIFICATION_TASK_ID,
row.getLong(CassandraTablesAndColumnsNames.NOTIFICATION_TASK_ID));
line.addProperty(CassandraTablesAndColumnsNames.NOTIFICATION_RESOURCE_NUM,
row.getInt(CassandraTablesAndColumnsNames.NOTIFICATION_RESOURCE_NUM));
line.addProperty(CassandraTablesAndColumnsNames.NOTIFICATION_TOPOLOGY_NAME,
row.getString(CassandraTablesAndColumnsNames.NOTIFICATION_TOPOLOGY_NAME));
line.addProperty(CassandraTablesAndColumnsNames.NOTIFICATION_RESOURCE,
row.getString(CassandraTablesAndColumnsNames.NOTIFICATION_RESOURCE));
line.addProperty(CassandraTablesAndColumnsNames.NOTIFICATION_STATE,
row.getString(CassandraTablesAndColumnsNames.NOTIFICATION_STATE));
line.addProperty(CassandraTablesAndColumnsNames.NOTIFICATION_INFO_TEXT,
row.getString(CassandraTablesAndColumnsNames.NOTIFICATION_INFO_TEXT));
line.addProperty(CassandraTablesAndColumnsNames.NOTIFICATION_ADDITIONAL_INFORMATIONS,
row.getString(CassandraTablesAndColumnsNames.NOTIFICATION_ADDITIONAL_INFORMATIONS));
line.addProperty(CassandraTablesAndColumnsNames.NOTIFICATION_RESULT_RESOURCE,
row.getString(CassandraTablesAndColumnsNames.NOTIFICATION_RESULT_RESOURCE));
res.add(line);
}
return res;
}
}