/**
*
*/
package nl.ipo.cds.dao.impl;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import nl.idgis.commons.jobexecutor.AbstractJob;
import nl.idgis.commons.jobexecutor.Job;
import nl.idgis.commons.jobexecutor.JobCreator;
import nl.idgis.commons.jobexecutor.JobDao;
import nl.idgis.commons.jobexecutor.JobLogger.LogLevel;
import nl.ipo.cds.dao.ManagerDao;
import nl.ipo.cds.domain.JobLog;
import nl.ipo.cds.utils.DateTimeUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* @author Rob
*
*/
public class JobDaoImpl implements JobDao, JobCreator {
private final ManagerDao managerDao;
private EntityManager entityManager;
private static final Log logger = LogFactory.getLog(JobDaoImpl.class); // developer log
public JobDaoImpl (final ManagerDao managerDao) {
this.managerDao = managerDao;
}
public ManagerDao getManagerDao () {
return managerDao;
}
@PersistenceContext(unitName = "cds")
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public EntityManager getEntityManager () {
return entityManager;
}
@Override
@Transactional (propagation=Propagation.REQUIRED)
public void create (Job job) {
// Set the create time:
job.setCreateTime(DateTimeUtils.now());
logger.debug("\t### before create: job.id: " + job.getId());
managerDao.create (toAbstractJob (job));
logger.debug("\t### after create: job.id: " + job.getId());
}
@Override
public Job getJob (final Long pk) {
return managerDao.getJob (pk);
}
public AbstractJob getJob (Job job) {
return managerDao.getJob (job.getId());
}
@Override
@Transactional (propagation = Propagation.REQUIRED)
public void update (Job job) {
managerDao.update (toAbstractJob (job));
}
@Override
@Transactional (propagation = Propagation.REQUIRED)
public void delete (Job job) {
managerDao.delete (toAbstractJob (job));
}
@Override
@Transactional (propagation = Propagation.REQUIRES_NEW)
// @Transactional (propagation = Propagation.REQUIRED) // hangs when called during psql copy statement
public void putLogItem (Job job, final String msg, final String key, final LogLevel level, final String context) {
JobLog logItem = createLogItem(job, msg, key, level, context);
managerDao.create (logItem);
}
public JobLog createLogItem (Job job, final String msg, final String key, final LogLevel level, final String context) {
final AbstractJob cdsJob = toAbstractJob (getJob(job));
final JobLog logItem = new JobLog ();
logItem.setJob (cdsJob);
logItem.setMessage (msg);
logItem.setKey (key);
logItem.setLogLevel (level);
logItem.setTime (DateTimeUtils.now ());
logItem.setContext (context);
if (context == null || context.isEmpty()) {
logItem.setGmlId(null);
logItem.setX(null);
logItem.setY(null);
} else {
// split the context string in x, y, gmlId values
try {
final ObjectMapper mapper = new ObjectMapper();
final StringReader reader = new StringReader(context);
@SuppressWarnings("unchecked")
final Map<String, Object> contextMap = mapper.readValue(reader,
HashMap.class);
Object gmlId = contextMap.get("GMLID");
if (gmlId==null){
logItem.setGmlId(null);
}else{
logItem.setGmlId(gmlId.toString());
}
logItem.setX((Double) contextMap.get("X"));
logItem.setY((Double) contextMap.get("Y"));
} catch (JsonParseException e1) {
e1.printStackTrace();
} catch (JsonMappingException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
return logItem;
}
private AbstractJob toAbstractJob (final Job job) {
if (job instanceof AbstractJob) {
return (AbstractJob)job;
}
throw new IllegalArgumentException (String.format ("Job "+job.getClass().getCanonicalName()+"must be an instance of %s", AbstractJob.class.getCanonicalName ()));
}
@Override
public void putJob (final Job job) {
create (job);
}
}