package org.aksw.service_framework.core;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.aksw.commons.util.slf4j.LoggerCount;
import org.aksw.jena_sparql_api.core.QueryExecutionFactory;
import org.aksw.service_framework.jpa.core.ServiceProvider;
import org.aksw.service_framework.jpa.core.ServiceProviderJpaRdbRdf;
import org.aksw.service_framework.utils.LogUtils;
import org.aksw.sparqlify.admin.model.JdbcDataSource;
import org.aksw.sparqlify.admin.model.LogMessage;
import org.aksw.sparqlify.admin.model.Rdb2RdfConfig;
import org.aksw.sparqlify.admin.model.Rdb2RdfExecution;
import org.aksw.sparqlify.admin.web.common.ContextStateFlags;
import org.aksw.sparqlify.admin.web.common.LoggerMem;
import org.aksw.sparqlify.admin.web.common.ServiceProviderRdb2Rdf;
import org.aksw.sparqlify.backend.postgres.DatatypeToStringPostgres;
import org.aksw.sparqlify.config.syntax.Config;
import org.aksw.sparqlify.core.algorithms.DatatypeToString;
import org.aksw.sparqlify.core.sql.common.serialization.SqlEscaper;
import org.aksw.sparqlify.core.sql.common.serialization.SqlEscaperDoubleQuote;
import org.aksw.sparqlify.util.SparqlifyUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
import com.jolbox.bonecp.BoneCPConfig;
import com.jolbox.bonecp.BoneCPDataSource;
public class ServiceLauncherRdb2Rdf
implements ServiceLauncher<Rdb2RdfConfig, Rdb2RdfExecution, SparqlService>
{
private static final Logger logger = LoggerFactory.getLogger(ServiceLauncherRdb2Rdf.class);
@Override
//public ServiceExecution<QueryExecutionFactory> launch(EntityManagerFactory emf, Rdb2RdfConfig serviceConfig, Rdb2RdfExecution context, boolean isRestart) {
public ServiceProvider<SparqlService> launch(EntityManagerFactory emf, Rdb2RdfConfig serviceConfig, Rdb2RdfExecution context, boolean isRestart) {
// String serviceName = serviceConfig.getContextPath();
// ServiceExecution<?> serviceExecution = nameToExecution.get(serviceName);
// if(serviceExecution != null) {
// throw new RuntimeException("A service with the name " + serviceName + " is already executing");
// }
String serviceName = "foobar";
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Object configId = emf.getPersistenceUnitUtil().getIdentifier(serviceConfig);
Object executionContextId = emf.getPersistenceUnitUtil().getIdentifier(context);
serviceConfig = em.find(Rdb2RdfConfig.class, configId);
context = em.find(Rdb2RdfExecution.class, executionContextId);
// em.merge(context);
// em.merge(serviceConfig);
//Rdb2RdfExecution serviceState = context.getEntity();
//serviceState.setName(serviceName);
context.setStatus(ContextStateFlags.STARTING);
context.getLogMessages().clear();
context.getLogMessages().add(new LogMessage("info", "Starting service " + serviceName));
context.setConfig(serviceConfig);
em.getTransaction().commit();
em.getTransaction().begin();
//context.commit();
//context.openSession();
ServiceProvider<SparqlService> result = null;
try {
//
JdbcDataSource dsConfig = serviceConfig.getJdbcDataSource();
//LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
//LoggerFactory.getLogger(this.getClass()).
BoneCPConfig c = new BoneCPConfig();
c.setUsername(dsConfig.getUsername());
c.setPassword(dsConfig.getPassword());
c.setJdbcUrl(dsConfig.getJdbcUrl());
BoneCPDataSource dataSource = new BoneCPDataSource(c);
LoggerMem loggerMem = new LoggerMem(logger);
LoggerCount loggerCount = new LoggerCount(loggerMem);
String smlConfigStr = serviceConfig.getTextResource().getData();
Config smlConfig = SparqlifyUtils.parseSmlConfig(smlConfigStr, loggerCount);
List<LogMessage> lm = Lists.transform(loggerMem.getLogEvents(), LogUtils.convertLog);
if(loggerCount.getErrorCount() != 0) {
context.getLogMessages().addAll(lm);
throw new RuntimeException("Errors encountered during parsing of the mapping");
}
Integer maxResultSetRows = serviceConfig.getMaxResultSetRows();
Integer maxExecutionTimeInSeconds = serviceConfig.getMaxExecutionTimeInSeconds();
if(maxResultSetRows == null || maxResultSetRows <= 0) {
maxResultSetRows = 1000;
}
if(maxExecutionTimeInSeconds == null || maxExecutionTimeInSeconds <= 0) {
maxExecutionTimeInSeconds = 30;
}
SqlEscaper sqlEscaper = new SqlEscaperDoubleQuote();
DatatypeToString typeSerializer = new DatatypeToStringPostgres();
QueryExecutionFactory qef = SparqlifyUtils.createDefaultSparqlifyEngine(dataSource, smlConfig, typeSerializer, sqlEscaper, maxResultSetRows.longValue(), maxExecutionTimeInSeconds);
// A Test Query
qef.createQueryExecution("Prefix ex: <http://example.org/> Ask { ?s ex:b ex:c }");
SparqlService sparqlService = new SparqlServiceImpl<Config>(smlConfig, qef);
result = new ServiceProviderRdb2Rdf(serviceName, dataSource, sparqlService);
result = new ServiceProviderJpaRdbRdf<SparqlService>(result, emf, context);
//nameToExecution.put(serviceName, sparqlServiceExecution);
context.setStatus(ContextStateFlags.RUNNING);
context.getLogMessages().add(new LogMessage("info", "Service successfully started."));
} catch(Exception e) {
context.setStatus(ContextStateFlags.STOPPED);
context.getLogMessages().add(new LogMessage("error", ExceptionUtils.getFullStackTrace(e)));
context.getLogMessages().add(new LogMessage("info", "Service failed to start."));
}
finally {
em.getTransaction().commit();
em.close();
//context.commit();
}
return result;
}
}