package net.rrm.ehour.backup.service.restore;
import net.rrm.ehour.backup.common.BackupConfig;
import net.rrm.ehour.backup.domain.ImportException;
import net.rrm.ehour.backup.domain.ParseSession;
import net.rrm.ehour.backup.service.DatabaseTruncater;
import net.rrm.ehour.config.EhourConfig;
import net.rrm.ehour.persistence.config.dao.ConfigurationDao;
import net.rrm.ehour.persistence.hibernate.HibernateCache;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.xml.stream.XMLEventReader;
/**
* @author thies (Thies Edeling - thies@te-con.nl)
* Created on: Nov 13, 2010 - 5:34:24 PM
*/
@Service("importService")
public class RestoreServiceImpl implements RestoreService {
private static final Logger LOG = Logger.getLogger(RestoreServiceImpl.class);
private ConfigurationDao configurationDao;
private ConfigurationParserDao configurationParserDao;
private EntityParserDao entityParserDao;
private DatabaseTruncater databaseTruncater;
private BackupConfig backupConfig;
private TaskExecutor taskExecutor;
private EhourConfig ehourConfig;
@Autowired
public RestoreServiceImpl(ConfigurationDao configurationDao,
ConfigurationParserDao configurationParserDao,
EntityParserDao entityParserDao,
DatabaseTruncater databaseTruncater,
EhourConfig ehourConfig,
BackupConfig backupConfig,
TaskExecutor taskExecutor) {
this.configurationDao = configurationDao;
this.configurationParserDao = configurationParserDao;
this.entityParserDao = entityParserDao;
this.databaseTruncater = databaseTruncater;
this.ehourConfig = ehourConfig;
this.backupConfig = backupConfig;
this.taskExecutor = taskExecutor;
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = ImportException.class)
public void importDatabase(ParseSession session) throws ImportException {
try {
if (!ehourConfig.isInDemoMode()) {
session.start();
databaseTruncater.truncateDatabase();
XMLEventReader xmlEventReader = BackupFileUtil.createXmlReaderFromFile(session.getFilename());
XmlParser parser = new XmlParserBuilder()
.setConfigurationDao(configurationDao)
.setConfigurationParserDao(configurationParserDao)
.setEntityParserDao(entityParserDao)
.setXmlReader(xmlEventReader)
.setSkipValidation(true)
.setBackupConfig(backupConfig)
.build();
parser.parseXml(session, xmlEventReader);
}
} catch (Exception e) {
session.setGlobalError(true);
session.setGlobalErrorMessage(e.getMessage());
LOG.error(e.getMessage(), e);
throw new ImportException(e.getMessage(), e);
} finally {
session.deleteFile();
session.setImported(true);
session.finish();
}
}
public void setConfigurationDao(ConfigurationDao configurationDao) {
this.configurationDao = configurationDao;
}
public void setDatabaseTruncater(DatabaseTruncater databaseTruncater) {
this.databaseTruncater = databaseTruncater;
}
}