package fr.gouv.finances.dgfip.xemelios.batch.exports;
-import fr.gouv.finances.dgfip.xemelios.batch.Batch;
-import fr.gouv.finances.dgfip.xemelios.data.DataLayerManager;
-import fr.gouv.finances.dgfip.xemelios.data.impl.pool.PoolManager;
-import fr.gouv.finances.dgfip.xemelios.export.ExportJob;
-import fr.gouv.finances.dgfip.xemelios.utils.FileUtils;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
+
import org.apache.log4j.Logger;
+import fr.gouv.finances.dgfip.xemelios.batch.Batch;
+import fr.gouv.finances.dgfip.xemelios.data.DataLayerManager;
+import fr.gouv.finances.dgfip.xemelios.data.impl.pool.PoolManager;
+import fr.gouv.finances.dgfip.xemelios.export.ExportJob;
+import fr.gouv.finances.dgfip.xemelios.utils.FileUtils;
+
/**
- *
+ *
* @author Christophe Marchand <christophe.marchand@axyus.com>
*/
public class ExportCleaner extends Batch {
- private static final Logger logger = Logger.getLogger(ExportCleaner.class);
-
- public static final String PROP_MAX_CONCURRENT_THREADS = "max.concurrent.threads";
- public static final String PROP_CLEAN_DELAY = "clean.delay";
- private int maxConcurrentThreads = 1;
- private int cleanDelay = 14;
-
- private ThreadPool<ExportCleanerImpl> pool = null;
-
- public ExportCleaner(String[] args) {
- super(args);
- }
-
- @Override
- protected void initialize() throws Exception {
- super.initialize();
- String sTmp = getProps().getProperty(PROP_MAX_CONCURRENT_THREADS);
- if(sTmp!=null && sTmp.length()>0) {
- try {
- maxConcurrentThreads = Integer.parseInt(sTmp);
- } catch(Throwable t) {}
- }
- sTmp = getProps().getProperty(PROP_CLEAN_DELAY);
- if(sTmp!=null && sTmp.length()>0) {
- try {
- cleanDelay = Integer.parseInt(sTmp);
- } catch(Throwable t) {}
- }
- }
-
- @Override
- protected void doProcess() throws Exception {
- Connection con = null;
- try {
- con = PoolManager.getInstance().getConnection();
- ArrayList<ExportCleanerImpl> threads = new ArrayList<ExportCleanerImpl>();
- if("mysql".equals(DataLayerManager.getImplementation().getLayerName())) {
- StringBuffer sql = new StringBuffer("SELECT EXPORT_ID, UTI_LOGIN FROM EXPORT_JOBS WHERE STATUS IN (");
- sql.append(ExportJob.STATUS_DOWNLOADED).append(",").append(ExportJob.STATUS_ERROR).append(",").append(ExportJob.STATUS_TERMINATED);
- sql.append(") AND TO_DAYS(NOW()) - TO_DAYS(SUBMIT_DATE) > ").append(cleanDelay).append(" AND CLEANED IS NULL");
- ResultSet rs = con.createStatement().executeQuery(sql.toString());
- while(rs.next()) {
- long exportId = rs.getLong(1);
- String user = rs.getString(2);
- threads.add(new ExportCleanerImpl(exportId,user));
- }
- } else if("oracle".equals(DataLayerManager.getImplementation().getLayerName())) {
- StringBuffer sql = new StringBuffer("SELECT EXPORT_ID, UTI_LOGIN FROM EXPORT_JOBS WHERE EXPORT_STATUS IN (");
- sql.append(ExportJob.STATUS_DOWNLOADED).append(",").append(ExportJob.STATUS_ERROR).append(",").append(ExportJob.STATUS_TERMINATED);
- sql.append(") AND trunc(SYSDATE) - trunc(SUBMIT_DATE) > ").append(cleanDelay).append(" AND CLEANED IS NULL");
- ResultSet rs = con.createStatement().executeQuery(sql.toString());
- while(rs.next()) {
- long exportId = rs.getLong(1);
- String user = rs.getString(2);
- threads.add(new ExportCleanerImpl(exportId,user));
- }
- }
- PoolManager.getInstance().releaseConnection(con); con=null;
- pool = new ThreadPool<ExportCleanerImpl>(threads);
- pool.start(maxConcurrentThreads);
- } catch(Exception ex) {
- logger.error("doProcess(): ",ex);
- } finally {
- if(con!=null) {
- PoolManager.getInstance().releaseConnection(con);
- }
- }
- }
-
- @Override
- public String getResumeTraitement() {
- return "export.cleaner.resume";
- }
-
- @Override
- public String typeTraitementRefCode() {
- return "export.cleaner";
- }
-
- @Override
- public String getInformations() {
- StringBuilder sb = new StringBuilder();
- if(isStarted()) {
- sb.append(typeTraitementRefCode()).append(" - ").append(pool.getRunningThreadCount()).append(" running thread(s)\n");
- for(RunnableBatch rb: pool.getThreads()) {
- sb.append("\t").append(rb.getName()).append(": ").append(rb.isAlive()?"running":"idle").append("\n");
- if(rb.isAlive()) sb.append(rb.getInformations());
- }
- } else {
- sb.append(typeTraitementRefCode()).append(" - not started\n");
- }
- return sb.toString();
- }
-
- @Override
- protected String getBatchVersion() {
- return "1.0";
- }
-
-
- protected class ExportCleanerImpl extends RunnableBatch {
- private Long exportId;
- private String user;
-
- public ExportCleanerImpl(Long exportId, String user) {
- super();
- this.exportId=exportId;
- this.user=user;
- setName("ExportCleanerImpl<"+exportId+","+user+">");
- }
-
- @Override
- public void run() {
- logger.debug("cleaning export "+exportId+" from "+user);
- Connection con = null;
- try {
- con = PoolManager.getInstance().getConnection();
- PreparedStatement ps = con.prepareStatement("SELECT GENERATED_FILE_NAME FROM EXPORT_JOBS WHERE EXPORT_ID=? AND UTI_LOGIN=?");
- ps.setLong(1,exportId);
- ps.setString(2,user);
- ResultSet rs= ps.executeQuery();
- if(rs.next()) {
- String generatedFileName = rs.getString(1);
- if(rs.wasNull()) generatedFileName = null;
- clean(generatedFileName);
- ps = con.prepareStatement("UPDATE EXPORT_JOBS SET CLEANED=1 WHERE EXPORT_ID=? AND UTI_LOGIN=?");
- ps.setLong(1,exportId);
- ps.setString(2,user);
- ps.executeUpdate();
- } else {
- logger.warn("export to clean not found !");
- }
- } catch(Exception ex) {
- logger.error("ExportCleanerImpl.run(): ",ex);
- } finally {
- if(con!=null) {
- PoolManager.getInstance().releaseConnection(con);
- }
- getNotifier().notifyThreadStop(this);
- }
- }
- protected void clean(String fileName) {
- if(fileName==null) return;
- File f = new File(fileName);
- if(f.exists()) {
- File dir = f.getParentFile();
- try {
- FileUtils.dropRecursiveDirectory(dir);
- } catch(Exception ex) {}
- }
- }
-
- @Override
- public String getInformations() {
- if(isAlive()) return "\t".concat(getName()).concat(": running\n");
- else return "\t".concat(getName()).concat(": idle\n");
- }
-
- }
+ private static final Logger logger = Logger.getLogger(ExportCleaner.class);
+
+ public static final String PROP_MAX_CONCURRENT_THREADS = "max.concurrent.threads";
+ public static final String PROP_CLEAN_DELAY = "clean.delay";
+ private int maxConcurrentThreads = 1;
+ private int cleanDelay = 14;
+
+ private ThreadPool<ExportCleanerImpl> pool = null;
+
+ public ExportCleaner(final String[] args) {
+ super(args);
+ }
+
+ @Override
+ protected void initialize() throws Exception {
+ super.initialize();
+ String sTmp = this.getProps().getProperty(PROP_MAX_CONCURRENT_THREADS);
+ if (sTmp != null && sTmp.length() > 0) {
+ try {
+ this.maxConcurrentThreads = Integer.parseInt(sTmp);
+ } catch (final Throwable t) {
+ }
+ }
+ sTmp = this.getProps().getProperty(PROP_CLEAN_DELAY);
+ if (sTmp != null && sTmp.length() > 0) {
+ try {
+ this.cleanDelay = Integer.parseInt(sTmp);
+ } catch (final Throwable t) {
+ }
+ }
+ }
+
+ @Override
+ protected void doProcess() throws Exception {
+ Connection con = null;
+ try {
+ con = PoolManager.getInstance().getConnection();
+ final ArrayList<ExportCleanerImpl> threads = new ArrayList<ExportCleanerImpl>();
+ if ("mysql".equals(DataLayerManager.getImplementation().getLayerName())) {
+ final StringBuffer sql = new StringBuffer("SELECT EXPORT_ID, UTI_LOGIN FROM EXPORT_JOBS WHERE STATUS IN (");
+ sql.append(ExportJob.STATUS_DOWNLOADED).append(",").append(ExportJob.STATUS_ERROR).append(",").append(ExportJob.STATUS_TERMINATED);
+ sql.append(") AND TO_DAYS(NOW()) - TO_DAYS(SUBMIT_DATE) > ").append(this.cleanDelay).append(" AND CLEANED IS NULL");
+ final ResultSet rs = con.createStatement().executeQuery(sql.toString());
+ while (rs.next()) {
+ final long exportId = rs.getLong(1);
+ final String user = rs.getString(2);
+ threads.add(new ExportCleanerImpl(exportId, user));
+ }
+ } else if ("oracle".equals(DataLayerManager.getImplementation().getLayerName())) {
+ final StringBuffer sql = new StringBuffer("SELECT EXPORT_ID, UTI_LOGIN FROM EXPORT_JOBS WHERE EXPORT_STATUS IN (");
+ sql.append(ExportJob.STATUS_DOWNLOADED).append(",").append(ExportJob.STATUS_ERROR).append(",").append(ExportJob.STATUS_TERMINATED);
+ sql.append(") AND trunc(SYSDATE) - trunc(SUBMIT_DATE) > ").append(this.cleanDelay).append(" AND CLEANED IS NULL");
+ final ResultSet rs = con.createStatement().executeQuery(sql.toString());
+ while (rs.next()) {
+ final long exportId = rs.getLong(1);
+ final String user = rs.getString(2);
+ threads.add(new ExportCleanerImpl(exportId, user));
+ }
+ }
+ PoolManager.getInstance().releaseConnection(con);
+ con = null;
+ this.pool = new ThreadPool<ExportCleanerImpl>(threads);
+ this.pool.start(this.maxConcurrentThreads);
+ } catch (final Exception ex) {
+ logger.error("doProcess(): ", ex);
+ } finally {
+ if (con != null) {
+ PoolManager.getInstance().releaseConnection(con);
+ }
+ }
+ }
+
+ @Override
+ public String getResumeTraitement() {
+ return "export.cleaner.resume";
+ }
+
+ @Override
+ public String typeTraitementRefCode() {
+ return "export.cleaner";
+ }
+
+ @Override
+ public String getInformations() {
+ final StringBuilder sb = new StringBuilder();
+ if (this.isStarted()) {
+ sb.append(this.typeTraitementRefCode()).append(" - ").append(this.pool.getRunningThreadCount()).append(" running thread(s)\n");
+ for (final RunnableBatch rb : this.pool.getThreads()) {
+ sb.append("\t").append(rb.getName()).append(": ").append(rb.isAlive() ? "running" : "idle").append("\n");
+ if (rb.isAlive()) {
+ sb.append(rb.getInformations());
+ }
+ }
+ } else {
+ sb.append(this.typeTraitementRefCode()).append(" - not started\n");
+ }
+ return sb.toString();
+ }
+
+ @Override
+ protected String getBatchVersion() {
+ return "1.0";
+ }
+
+ protected class ExportCleanerImpl extends RunnableBatch {
+ private final Long exportId;
+ private final String user;
+
+ public ExportCleanerImpl(final Long exportId, final String user) {
+ super();
+ this.exportId = exportId;
+ this.user = user;
+ this.setName("ExportCleanerImpl<" + exportId + "," + user + ">");
+ }
+
+ @Override
+ public void run() {
+ logger.debug("cleaning export " + this.exportId + " from " + this.user);
+ Connection con = null;
+ try {
+ con = PoolManager.getInstance().getConnection();
+ PreparedStatement ps = con.prepareStatement("SELECT GENERATED_FILE_NAME FROM EXPORT_JOBS WHERE EXPORT_ID=? AND UTI_LOGIN=?");
+ ps.setLong(1, this.exportId);
+ ps.setString(2, this.user);
+ final ResultSet rs = ps.executeQuery();
+ if (rs.next()) {
+ String generatedFileName = rs.getString(1);
+ if (rs.wasNull()) {
+ generatedFileName = null;
+ }
+ this.clean(generatedFileName);
+ ps = con.prepareStatement("UPDATE EXPORT_JOBS SET CLEANED=1 WHERE EXPORT_ID=? AND UTI_LOGIN=?");
+ ps.setLong(1, this.exportId);
+ ps.setString(2, this.user);
+ ps.executeUpdate();
+ } else {
+ logger.warn("export to clean not found !");
+ }
+ } catch (final Exception ex) {
+ logger.error("ExportCleanerImpl.run(): ", ex);
+ } finally {
+ if (con != null) {
+ PoolManager.getInstance().releaseConnection(con);
+ }
+ this.getNotifier().notifyThreadStop(this);
+ }
+ }
+
+ protected void clean(final String fileName) {
+ if (fileName == null) {
+ return;
+ }
+ final File f = new File(fileName);
+ if (f.exists()) {
+ final File dir = f.getParentFile();
+ try {
+ FileUtils.dropRecursiveDirectory(dir);
+ } catch (final Exception ex) {
+ }
+ }
+ }
+
+ @Override
+ public String getInformations() {
+ if (this.isAlive()) {
+ return "\t".concat(this.getName()).concat(": running\n");
+ } else {
+ return "\t".concat(this.getName()).concat(": idle\n");
+ }
+ }
+
+ }
}