package fr.gouv.finances.dgfip.xemelios.batch.chaineimport.repartiteur;
-import de.schlichtherle.io.ArchiveDetector;
-import de.schlichtherle.io.DefaultArchiveDetector;
-import de.schlichtherle.io.archive.zip.Zip32Driver;
-import fr.gouv.finances.dgfip.xemelios.batch.Batch;
-import fr.gouv.finances.dgfip.xemelios.batch.chaineimport.importeur.Importer;
-import fr.gouv.finances.dgfip.xemelios.batch.suivi.Message;
-import fr.gouv.finances.dgfip.xemelios.batch.suivi.Traitement;
-import fr.gouv.finances.dgfip.xemelios.data.ArchiveLocator;
-import fr.gouv.finances.dgfip.xemelios.data.BasicArchiveLocator;
-import fr.gouv.finances.dgfip.xemelios.data.DataLayerManager;
-import fr.gouv.finances.dgfip.xemelios.importers.archives.ArchiveImporter;
import java.io.File;
import java.io.FilenameFilter;
import java.io.InputStream;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+
import nu.xom.Attribute;
import nu.xom.Builder;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Nodes;
+
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
+import de.schlichtherle.io.ArchiveDetector;
+import de.schlichtherle.io.DefaultArchiveDetector;
+import de.schlichtherle.io.archive.zip.Zip32Driver;
+import fr.gouv.finances.dgfip.xemelios.batch.Batch;
+import fr.gouv.finances.dgfip.xemelios.batch.chaineimport.importeur.Importer;
+import fr.gouv.finances.dgfip.xemelios.batch.suivi.Message;
+import fr.gouv.finances.dgfip.xemelios.batch.suivi.Traitement;
+import fr.gouv.finances.dgfip.xemelios.data.ArchiveLocator;
+import fr.gouv.finances.dgfip.xemelios.data.BasicArchiveLocator;
+import fr.gouv.finances.dgfip.xemelios.data.DataLayerManager;
+import fr.gouv.finances.dgfip.xemelios.importers.archives.ArchiveImporter;
+
/**
- *
+ *
* @author cmarchand
*/
public class RepartitorEtat extends Batch {
- private static Logger logger = Logger.getLogger(RepartitorEtat.class);
- public static final transient String BATCH_NAME = "xar.repartitor.etat";
-
- // pour s'assurer qu'on a qu'une seule instance à la fois
- private final static Object locker = new Object();
- private static int instanceCount = 0;
- private static Object instance = null;
-
- private ArchiveLocator archiveLocator;
- private File inputDir;
- private ExecutorService pool;
- // l'utilisateur qui va faire la demande d'import
- private String importUser;
- // le fichier de regle à appliquer à l'import
- private String importScheme;
-
- public RepartitorEtat(String[] args) {
- super(args);
- }
-
- @Override
- protected void initialize() throws Exception {
- super.initialize();
-
- if (!StringUtils.isEmpty(getProps().getProperty("archive.locator"))) {
- String archiveLocatorClassName = getProps().getProperty("archive.locator");
- Class clazz = Class.forName(archiveLocatorClassName);
- archiveLocator = (ArchiveLocator)clazz.newInstance();
- } else if (!StringUtils.isEmpty(getProps().getProperty("xar.storage"))) {
- String xarStoragePath = getProps().getProperty("xar.storage");
- archiveLocator = new BasicArchiveLocator(xarStoragePath);
- }else {
+ private static Logger logger = Logger.getLogger(RepartitorEtat.class);
+ public static final transient String BATCH_NAME = "xar.repartitor.etat";
+
+ // pour s'assurer qu'on a qu'une seule instance à la fois
+ private final static Object locker = new Object();
+ private static int instanceCount = 0;
+ private static Object instance = null;
+
+ private ArchiveLocator archiveLocator;
+ private File inputDir;
+ private ExecutorService pool;
+ // l'utilisateur qui va faire la demande d'import
+ private String importUser;
+ // le fichier de regle à appliquer à l'import
+ private String importScheme;
+
+ public RepartitorEtat(final String[] args) {
+ super(args);
+ }
+
+ @Override
+ protected void initialize() throws Exception {
+ super.initialize();
+
+ if (!StringUtils.isEmpty(this.getProps().getProperty("archive.locator"))) {
+ final String archiveLocatorClassName = this.getProps().getProperty("archive.locator");
+ final Class clazz = Class.forName(archiveLocatorClassName);
+ this.archiveLocator = (ArchiveLocator) clazz.newInstance();
+ } else if (!StringUtils.isEmpty(this.getProps().getProperty("xar.storage"))) {
+ final String xarStoragePath = this.getProps().getProperty("xar.storage");
+ this.archiveLocator = new BasicArchiveLocator(xarStoragePath);
+ } else {
throw new Exception("le paramètre 'archive.locator' ou 'xar.storage' doit être renseigné");
}
-
- archiveLocator.initialize();
-
-
- String inputFileName = getProps().getProperty("xar.dir");
- inputDir = new File(inputFileName);
- if(!inputDir.exists()) {
- logger.error(inputFileName+" n'existe pas !");
- throw new IllegalArgumentException(inputFileName+" n'existe pas !");
- }
- importUser = getProps().getProperty("import.user");
- importScheme = getProps().getProperty("initial.import.scheme");
-
- logger.debug("Répartiteur état initialisé");
- }
-
- @Override
- protected void doProcess() throws Exception {
- Traitement traitement = new Traitement(RepartitorEtat.class, BATCH_NAME);
- if(checkNotRunning()) {
- try {
- File[] xarFiles = inputDir.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.endsWith(".xar");
- }
- });
-
- logger.debug(xarFiles.length + " archives trouvées");
-
- pool = Executors.newSingleThreadExecutor();
- for(File f:xarFiles) {
- RepartitorEtatImpl ri = new RepartitorEtatImpl(f, archiveLocator, traitement);
- pool.submit(ri);
- }
- Runnable terminator = new Terminator(traitement);
- pool.submit(terminator);
- pool.shutdown();
- pool.awaitTermination(100, TimeUnit.DAYS);
- } catch(Exception ex) {
- logger.error("Repartitor.doProcess()",ex);
- } finally {
- clearLock();
- }
- } else {
- logger.warn("Répartitieur déjà en cours d'execution");
- traitement.setResume("Dejà en cours d'execution");
- traitement.setEnd(System.currentTimeMillis());
- }
- }
-
- @Override
- public String getResumeTraitement() {
- return "En cours";
- }
-
- @Override
- public String typeTraitementRefCode() {
- return BATCH_NAME;
- }
-
- @Override
- public String getInformations() {
- return "";
- }
-
- @Override
- protected String getBatchVersion() {
- return "1.0";
- }
- private synchronized boolean checkNotRunning() {
- synchronized(locker) {
- if(instanceCount==0) {
- instanceCount++;
- instance = this;
- return true;
- }
- return false;
- }
- }
- private synchronized void clearLock() {
- synchronized(locker) {
- // on ne peut pas supprimer un lock qu'on a pas posé
- if(instance==this) {
- instanceCount--;
- instance=null;
- }
- }
- }
- private class RepartitorEtatImpl extends RunnableBatch {
- private File volume1;
- private ArchiveLocator locator;
- private Traitement traitement;
- public RepartitorEtatImpl(File volume1, ArchiveLocator locator, Traitement traitement) {
- super();
- this.volume1 = volume1;
- this.locator = locator;
- this.traitement = traitement;
- }
-
- @Override
- public String getInformations() {
- StringBuilder sb = new StringBuilder();
- sb.append("RepartitorEtatImpl<").append(volume1.getName()).append("> ").append("en cours");
- return sb.toString();
- }
-
- @Override
- public void run() {
- Builder builder = new Builder();
- if(!volume1.exists()) {
- logger.info(volume1.getName()+" déjà traité");
- return;
- }
-
- logger.debug("traitement de "+volume1.getName());
- Message msg = traitement.addMessage(Traitement.SEVERITY_INFO, "traitement de "+volume1.getName());
-
- ArchiveDetector archiveDetector = new DefaultArchiveDetector(ArchiveDetector.NULL, "xar", new Zip32Driver());
- try {
- de.schlichtherle.io.File zipVolume1 = new de.schlichtherle.io.File(volume1, archiveDetector);
- de.schlichtherle.io.File manifesteEntry = new de.schlichtherle.io.File(zipVolume1, ArchiveImporter.MANIFESTE_FILE_NAME, archiveDetector);
- InputStream isManifeste = null;
- Document manifeste = null;
- try {
- logger.debug("Lecture du manifeste");
- isManifeste = new de.schlichtherle.io.FileInputStream(manifesteEntry);
- manifeste = builder.build(isManifeste);
- } finally {
- if(isManifeste!=null) isManifeste.close();
- de.schlichtherle.io.File.umount(zipVolume1);
- zipVolume1 = null;
- manifesteEntry = null;
- }
-
- String exercice = manifeste.getRootElement().getAttributeValue("exercice");
- if(exercice==null) {
- // on essaie de l'extraire depuis le nom de fichier
- logger.debug("Récupération de l'exercice depuis le nom du fichier");
-
- String fileName = FilenameUtils.getBaseName(volume1.getName());
- Pattern pattern = Pattern.compile("-[0-9][0-9][0-9][0-9]-");
- Matcher matcher = pattern.matcher(fileName);
-
- if(matcher.find()) {
- String sTmp = matcher.group();
- exercice = sTmp.substring(1, 5);
- } else {
- Pattern p2 = Pattern.compile("_[0-9][0-9][0-9][0-9]-");
- Matcher m2 = p2.matcher(fileName);
- if(m2.find()) {
- String sTmp = m2.group();
- exercice = sTmp.substring(1,5);
- } else {
- logger.error("impossible de détermnier l'année dans "+fileName);
- msg.setInfoCompl(msg.getInfoCompl()+"\nimpossible de déterminer l'année");
- msg.setSeverity(Traitement.SEVERITY_ERROR);
- }
- }
- }
-
- if(exercice==null) return;
-
- Nodes volumes = manifeste.query("/manifeste/volumes/volume");
- boolean allVolumesAvailable = true;
- ArrayList<File> volumesFiles = new ArrayList<File>();
- for(int i=0;i<volumes.size();i++) {
- Element volume = (Element)volumes.get(i);
- String volFileName = volume.getAttributeValue("fichier");
- File volFile = new File(volume1.getParentFile(), volFileName);
- if(!volFile.exists()) {
- allVolumesAvailable = false;
- msg.setInfoCompl(msg.getInfoCompl()+" | "+volFileName+" est introuvable");
- logger.debug(volFileName+" est introuvable");
- }
- else volumesFiles.add(volFile);
- }
-
-
- String archiveName = ArchiveImporter.getArchiveName(volume1);
-
- if(allVolumesAvailable) {
- // on indique le lien entre le budget principal et le nom de l'archive
- if(Importer.doesOpennedTaskExistsForArchive(archiveName, exercice)) {
- msg.setInfoCompl("Il existe des tâches d'import en attente ou en cours de traitement pour "+archiveName+", l'import est repoussé");
- logger.debug("Il existe des tâches d'import en attente ou en cours de traitement pour "+archiveName+", l'import est repoussé");
- } else {
- String baseArchiveDest = DataLayerManager.getImplementation().getParameterValue("pj.archive.base.path");
- if(baseArchiveDest==null) {
- msg.setInfoCompl("Le paramètre pj.archive.base.path n'est pas défini");
- logger.warn("Le paramètre pj.archive.base.path n'est pas défini");
- msg.setSeverity(Traitement.SEVERITY_ERROR);
- traitement.addMessage(Traitement.SEVERITY_ERROR, "Le paramètre pj.archive.base.path n'est pas défini");
- } else {
- File archiveMoved = locator.getArchiveLocation(archiveName);
- File archiveDir = archiveMoved.getParentFile();
-
- logger.debug("Archive path=" + archiveDir.getAbsolutePath());
-
- // ici, tout est bon, donc on contrôle la présence de chacun des fichiers référencés dans le manifeste
- // dans les volumes, on parse les fichiers pour vérifier qu'ils sont lisibles
- // et on met à jour le manifeste
- // seulement quand tout ceci est fait, on déplace les archives
- boolean tousFichiersPresents = true;
- boolean tousFichiersLisibles = true;
- manifeste.getRootElement().addAttribute(new Attribute("tous-presents", Boolean.toString(tousFichiersPresents)));
- manifeste.getRootElement().addAttribute(new Attribute("tous-lisibles", Boolean.toString(tousFichiersLisibles)));
-
-
- // mettre à jour la manifeste du premier volume de l'archive
- // on déplace les archives...
- for(int i=0;i<volumesFiles.size();i++) {
- File f = volumesFiles.get(i);
- // il faut qu'on puisse écrire dedans
- f.setWritable(true,false);
-
- if(i==0) {
- // on réécrit le manifeste
- logger.debug(archiveName+" - réécriture du manifeste");
- try {
- de.schlichtherle.io.File zipFile = new de.schlichtherle.io.File(f, archiveDetector);
- de.schlichtherle.io.File tfManifesteEntry = new de.schlichtherle.io.File(zipFile,ArchiveImporter.MANIFESTE_FILE_NAME,archiveDetector);
- de.schlichtherle.io.FileOutputStream tfOs = new de.schlichtherle.io.FileOutputStream(tfManifesteEntry, false);
- try {
- tfOs.write(manifeste.toXML().getBytes("UTF-8"));
- tfOs.flush();
- } finally {
- tfOs.close();
- de.schlichtherle.io.File.umount(zipFile);
- }
- } catch(Exception ex) {
- logger.error(archiveName+" - réécriture du manifeste dans le premier volume",ex);
- }
- }
- File dest = new File(archiveDir, f.getName());
- // on essaye de renommer
- try {
- logger.debug("Déplacement de l'archive");
-
- if(dest.exists()) {
- FileUtils.forceDelete(dest);
- }
- FileUtils.moveFile(f, dest);
- } catch(Exception ex) {
- logger.error(archiveName+" - lors du déplacement", ex);
- }
- }
- Importer.createImportJob(archiveName, exercice, importScheme, importUser);
- msg.setInfoCompl(archiveName+" déplacé vers "+archiveDir.getAbsolutePath());
- }
- }
- } else {
- logger.info(archiveName+" incomplète");
- msg.setInfoCompl(archiveName+" incomplète");
- }
- } catch(Exception ex) {
- logger.error("RepartitorImpl.run()", ex);
- }
- }
- }
-
- private class Terminator implements Runnable {
- private final Traitement traitement;
- public Terminator(Traitement traitement) {
- super();
- this.traitement=traitement;
- }
-
- @Override
- public void run() {
- traitement.setEnd(System.currentTimeMillis());
- }
- }
+
+ this.archiveLocator.initialize();
+
+ final String inputFileName = this.getProps().getProperty("xar.dir");
+ this.inputDir = new File(inputFileName);
+ if (!this.inputDir.exists()) {
+ logger.error(inputFileName + " n'existe pas !");
+ throw new IllegalArgumentException(inputFileName + " n'existe pas !");
+ }
+ this.importUser = this.getProps().getProperty("import.user");
+ this.importScheme = this.getProps().getProperty("initial.import.scheme");
+
+ logger.debug("Répartiteur état initialisé");
+ }
+
+ @Override
+ protected void doProcess() throws Exception {
+ final Traitement traitement = new Traitement(RepartitorEtat.class, BATCH_NAME);
+ if (this.checkNotRunning()) {
+ try {
+ final File[] xarFiles = this.inputDir.listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(final File dir, final String name) {
+ return name.endsWith(".xar");
+ }
+ });
+
+ logger.debug(xarFiles.length + " archives trouvées");
+
+ this.pool = Executors.newSingleThreadExecutor();
+ for (final File f : xarFiles) {
+ final RepartitorEtatImpl ri = new RepartitorEtatImpl(f, this.archiveLocator, traitement);
+ this.pool.submit(ri);
+ }
+ final Runnable terminator = new Terminator(traitement);
+ this.pool.submit(terminator);
+ this.pool.shutdown();
+ this.pool.awaitTermination(100, TimeUnit.DAYS);
+ } catch (final Exception ex) {
+ logger.error("Repartitor.doProcess()", ex);
+ } finally {
+ this.clearLock();
+ }
+ } else {
+ logger.warn("Répartitieur déjà en cours d'execution");
+ traitement.setResume("Dejà en cours d'execution");
+ traitement.setEnd(System.currentTimeMillis());
+ }
+ }
+
+ @Override
+ public String getResumeTraitement() {
+ return "En cours";
+ }
+
+ @Override
+ public String typeTraitementRefCode() {
+ return BATCH_NAME;
+ }
+
+ @Override
+ public String getInformations() {
+ return "";
+ }
+
+ @Override
+ protected String getBatchVersion() {
+ return "1.0";
+ }
+
+ private synchronized boolean checkNotRunning() {
+ synchronized (locker) {
+ if (instanceCount == 0) {
+ instanceCount++;
+ instance = this;
+ return true;
+ }
+ return false;
+ }
+ }
+
+ private synchronized void clearLock() {
+ synchronized (locker) {
+ // on ne peut pas supprimer un lock qu'on a pas posé
+ if (instance == this) {
+ instanceCount--;
+ instance = null;
+ }
+ }
+ }
+
+ private class RepartitorEtatImpl extends RunnableBatch {
+ private final File volume1;
+ private final ArchiveLocator locator;
+ private final Traitement traitement;
+
+ public RepartitorEtatImpl(final File volume1, final ArchiveLocator locator, final Traitement traitement) {
+ super();
+ this.volume1 = volume1;
+ this.locator = locator;
+ this.traitement = traitement;
+ }
+
+ @Override
+ public String getInformations() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("RepartitorEtatImpl<").append(this.volume1.getName()).append("> ").append("en cours");
+ return sb.toString();
+ }
+
+ @Override
+ public void run() {
+ final Builder builder = new Builder();
+ if (!this.volume1.exists()) {
+ logger.info(this.volume1.getName() + " déjà traité");
+ return;
+ }
+
+ logger.debug("traitement de " + this.volume1.getName());
+ final Message msg = this.traitement.addMessage(Traitement.SEVERITY_INFO, "traitement de " + this.volume1.getName());
+
+ final ArchiveDetector archiveDetector = new DefaultArchiveDetector(ArchiveDetector.NULL, "xar", new Zip32Driver());
+ try {
+ de.schlichtherle.io.File zipVolume1 = new de.schlichtherle.io.File(this.volume1, archiveDetector);
+ de.schlichtherle.io.File manifesteEntry = new de.schlichtherle.io.File(zipVolume1, ArchiveImporter.MANIFESTE_FILE_NAME, archiveDetector);
+ InputStream isManifeste = null;
+ Document manifeste = null;
+ try {
+ logger.debug("Lecture du manifeste");
+ isManifeste = new de.schlichtherle.io.FileInputStream(manifesteEntry);
+ manifeste = builder.build(isManifeste);
+ } finally {
+ if (isManifeste != null) {
+ isManifeste.close();
+ }
+ de.schlichtherle.io.File.umount(zipVolume1);
+ zipVolume1 = null;
+ manifesteEntry = null;
+ }
+
+ String exercice = manifeste.getRootElement().getAttributeValue("exercice");
+ if (exercice == null) {
+ // on essaie de l'extraire depuis le nom de fichier
+ logger.debug("Récupération de l'exercice depuis le nom du fichier");
+
+ final String fileName = FilenameUtils.getBaseName(this.volume1.getName());
+ final Pattern pattern = Pattern.compile("-[0-9][0-9][0-9][0-9]-");
+ final Matcher matcher = pattern.matcher(fileName);
+
+ if (matcher.find()) {
+ final String sTmp = matcher.group();
+ exercice = sTmp.substring(1, 5);
+ } else {
+ final Pattern p2 = Pattern.compile("_[0-9][0-9][0-9][0-9]-");
+ final Matcher m2 = p2.matcher(fileName);
+ if (m2.find()) {
+ final String sTmp = m2.group();
+ exercice = sTmp.substring(1, 5);
+ } else {
+ logger.error("impossible de détermnier l'année dans " + fileName);
+ msg.setInfoCompl(msg.getInfoCompl() + "\nimpossible de déterminer l'année");
+ msg.setSeverity(Traitement.SEVERITY_ERROR);
+ }
+ }
+ }
+
+ if (exercice == null) {
+ return;
+ }
+
+ final Nodes volumes = manifeste.query("/manifeste/volumes/volume");
+ boolean allVolumesAvailable = true;
+ final ArrayList<File> volumesFiles = new ArrayList<File>();
+ for (int i = 0; i < volumes.size(); i++) {
+ final Element volume = (Element) volumes.get(i);
+ final String volFileName = volume.getAttributeValue("fichier");
+ final File volFile = new File(this.volume1.getParentFile(), volFileName);
+ if (!volFile.exists()) {
+ allVolumesAvailable = false;
+ msg.setInfoCompl(msg.getInfoCompl() + " | " + volFileName + " est introuvable");
+ logger.debug(volFileName + " est introuvable");
+ } else {
+ volumesFiles.add(volFile);
+ }
+ }
+
+ final String archiveName = ArchiveImporter.getArchiveName(this.volume1);
+
+ if (allVolumesAvailable) {
+ // on indique le lien entre le budget principal et le nom de l'archive
+ if (Importer.doesOpennedTaskExistsForArchive(archiveName, exercice)) {
+ msg.setInfoCompl("Il existe des tâches d'import en attente ou en cours de traitement pour " + archiveName + ", l'import est repoussé");
+ logger.debug("Il existe des tâches d'import en attente ou en cours de traitement pour " + archiveName + ", l'import est repoussé");
+ } else {
+ final String baseArchiveDest = DataLayerManager.getImplementation().getParameterValue("pj.archive.base.path");
+ if (baseArchiveDest == null) {
+ msg.setInfoCompl("Le paramètre pj.archive.base.path n'est pas défini");
+ logger.warn("Le paramètre pj.archive.base.path n'est pas défini");
+ msg.setSeverity(Traitement.SEVERITY_ERROR);
+ this.traitement.addMessage(Traitement.SEVERITY_ERROR, "Le paramètre pj.archive.base.path n'est pas défini");
+ } else {
+ final File archiveMoved = this.locator.getArchiveLocation(archiveName);
+ final File archiveDir = archiveMoved.getParentFile();
+
+ logger.debug("Archive path=" + archiveDir.getAbsolutePath());
+
+ // ici, tout est bon, donc on contrôle la présence de chacun des fichiers référencés dans le manifeste
+ // dans les volumes, on parse les fichiers pour vérifier qu'ils sont lisibles
+ // et on met à jour le manifeste
+ // seulement quand tout ceci est fait, on déplace les archives
+ final boolean tousFichiersPresents = true;
+ final boolean tousFichiersLisibles = true;
+ manifeste.getRootElement().addAttribute(new Attribute("tous-presents", Boolean.toString(tousFichiersPresents)));
+ manifeste.getRootElement().addAttribute(new Attribute("tous-lisibles", Boolean.toString(tousFichiersLisibles)));
+
+ // mettre à jour la manifeste du premier volume de l'archive
+ // on déplace les archives...
+ for (int i = 0; i < volumesFiles.size(); i++) {
+ final File f = volumesFiles.get(i);
+ // il faut qu'on puisse écrire dedans
+ f.setWritable(true, false);
+
+ if (i == 0) {
+ // on réécrit le manifeste
+ logger.debug(archiveName + " - réécriture du manifeste");
+ try {
+ final de.schlichtherle.io.File zipFile = new de.schlichtherle.io.File(f, archiveDetector);
+ final de.schlichtherle.io.File tfManifesteEntry = new de.schlichtherle.io.File(zipFile, ArchiveImporter.MANIFESTE_FILE_NAME, archiveDetector);
+ final de.schlichtherle.io.FileOutputStream tfOs = new de.schlichtherle.io.FileOutputStream(tfManifesteEntry, false);
+ try {
+ tfOs.write(manifeste.toXML().getBytes("UTF-8"));
+ tfOs.flush();
+ } finally {
+ tfOs.close();
+ de.schlichtherle.io.File.umount(zipFile);
+ }
+ } catch (final Exception ex) {
+ logger.error(archiveName + " - réécriture du manifeste dans le premier volume", ex);
+ }
+ }
+ final File dest = new File(archiveDir, f.getName());
+ // on essaye de renommer
+ try {
+ logger.debug("Déplacement de l'archive");
+
+ if (dest.exists()) {
+ FileUtils.forceDelete(dest);
+ }
+ FileUtils.moveFile(f, dest);
+ } catch (final Exception ex) {
+ logger.error(archiveName + " - lors du déplacement", ex);
+ }
+ }
+ Importer.createImportJob(archiveName, exercice, RepartitorEtat.this.importScheme, RepartitorEtat.this.importUser);
+ msg.setInfoCompl(archiveName + " déplacé vers " + archiveDir.getAbsolutePath());
+ }
+ }
+ } else {
+ logger.info(archiveName + " incomplète");
+ msg.setInfoCompl(archiveName + " incomplète");
+ }
+ } catch (final Exception ex) {
+ logger.error("RepartitorImpl.run()", ex);
+ }
+ }
+ }
+
+ private class Terminator implements Runnable {
+ private final Traitement traitement;
+
+ public Terminator(final Traitement traitement) {
+ super();
+ this.traitement = traitement;
+ }
+
+ @Override
+ public void run() {
+ this.traitement.setEnd(System.currentTimeMillis());
+ }
+ }
}