import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
+import java.io.SequenceInputStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
+import net.sf.saxon.dom.DocumentBuilderFactoryImpl;
+
import org.apache.commons.io.output.NullOutputStream;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
+import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
// auto-flush
this.importTimingOS.println("fichier XML;fichier decoupe;action;date debut;date fin");
} catch (final Exception ex) {
+ logger.error(ex, ex);
}
}
if (this.importTimingOS == null) {
// ---------------------------------------------------
- final List<File> dataFiles = xs.getDataFiles();
- final String header = FileUtils.readTextFile(fHeader, fileEncoding);
- final String footer = FileUtils.readTextFile(fFooter, fileEncoding);
- final String ref = FileUtils.readTextFile(fRef, fileEncoding);
-
int docCount = 1;
final DocumentBuilderFactory dbf = FactoryProvider.getDocumentBuilderFactory();
dbf.setNamespaceAware(true);
}
} catch (final DataAccessException daEx) {
DefaultImporter.logger.error("DataAccessException while removing:", daEx.getCause());
- daEx.getCause().printStackTrace();
throw daEx;
} catch (final DataConfigurationException dcEx) {
DefaultImporter.logger.error("DataConfigurationException while removing:", dcEx.getCause());
- dcEx.getCause().printStackTrace();
} catch (final Exception ex) {
// si exception ici, l'utilisateur veut annuler
- DefaultImporter.logger.error(ex);
- ex.printStackTrace();
+ DefaultImporter.logger.error(ex, ex);
this.removeTempDir();
return null;
}
this.importTimingOS.append(f.getName()).append(";;SK;").append(Long.toString(startBC)).append(";").append(Long.toString(System.currentTimeMillis()));
this.importTimingOS.println();
+ final List<File> dataFiles = xs.getDataFiles();
+
final boolean shouldDelete = !"true".equals(this.applicationProperties.getProperty(Constants.SYS_PROP_IMPORT_AVOID_DELETE));
int fileCount = 0;
- for (final File df : dataFiles) {
- long startFile = System.currentTimeMillis();
- fileCount++;
+ final String xmlHeader = "<?xml version=\"" + xmlVersion + "\" encoding=\"" + fileEncoding + "\"?>";
- if (this.isCancelled()) {
- break;
- }
+ try {
+ Document doc = null;
+ for (final File df : dataFiles) {
+ long startFile = System.currentTimeMillis();
+ fileCount++;
- final int progress = (int) (((fileCount + 1) * 100.0) / dataFiles.size());
- this.getImpSvcProvider().pushCurrentProgress(progress);
- final String data = FileUtils.readTextFile(df, fileEncoding);
- final StringBuffer fullText = new StringBuffer();
- fullText.append("<?xml version=\"").append(xmlVersion).append("\" encoding=\"").append(fileEncoding).append("\"?>");
- fullText.append(header).append(data).append(footer);
- final String sFullText = fullText.toString();
- byte[] bData = sFullText.getBytes(fileEncoding);
-
- final Document doc = db.parse(new ByteArrayInputStream(bData));
-
- // il faut retrouver de quel etat est ce document
- // on cherche si la balise root contient un
- // dm.getEtatxxx().getBalise()
- EtatModel currentEtat = null;
- for (final EtatModel em : this.dm.getEtats()) {
- final String balise = em.getBalise();
- NodeList nl = doc.getElementsByTagName(balise);
- if (nl.getLength() > 0) {
- currentEtat = em;
+ if (this.isCancelled()) {
break;
- } else {
- nl = doc.getElementsByTagNameNS(em.getBaliseNamespace(), balise);
+ }
+
+ final InputStream is = new SequenceInputStream(Collections.enumeration(Arrays.asList(new ByteArrayInputStream(xmlHeader.getBytes()), new FileInputStream(fHeader), new FileInputStream(df), new FileInputStream(fFooter))));
+ try {
+ doc = db.parse(is);
+ } finally {
+ is.close();
+ }
+
+ final int progress = (int) (((fileCount + 1) * 100.0) / dataFiles.size());
+ this.getImpSvcProvider().pushCurrentProgress(progress);
+
+ // il faut retrouver de quel etat est ce document
+ // on cherche si la balise root contient un
+ // dm.getEtatxxx().getBalise()
+ EtatModel currentEtat = null;
+ for (final EtatModel em : this.dm.getEtats()) {
+ final String balise = em.getBalise();
+ NodeList nl = doc.getElementsByTagName(balise);
if (nl.getLength() > 0) {
currentEtat = em;
break;
} else {
- // troisième tentative, on cherche avec le XPath de
- // l'element importable, mais ce code n'est pas utilisé
- // à ce jour
- final XPathFactory xpf = FactoryProvider.getXPathFactory();
- final XPath xp = xpf.newXPath();
- xp.setNamespaceContext(this.dm.getNamespaces());
- final Object ret = xp.evaluate(em.getImportableElement().getPath().getPath(), doc, XPathConstants.NODESET);
- if (ret != null) {
- if (ret instanceof NodeList) {
- nl = (NodeList) ret;
- if (nl.getLength() > 0) {
- currentEtat = em;
+ nl = doc.getElementsByTagNameNS(em.getBaliseNamespace(), balise);
+ if (nl.getLength() > 0) {
+ currentEtat = em;
+ break;
+ } else {
+ // troisième tentative, on cherche avec le XPath de
+ // l'element importable, mais ce code n'est pas utilisé
+ // à ce jour
+ final XPathFactory xpf = FactoryProvider.getXPathFactory();
+ final XPath xp = xpf.newXPath();
+ xp.setNamespaceContext(this.dm.getNamespaces());
+ final Object ret = xp.evaluate(em.getImportableElement().getPath().getPath(), doc, XPathConstants.NODESET);
+ if (ret != null) {
+ if (ret instanceof NodeList) {
+ nl = (NodeList) ret;
+ if (nl.getLength() > 0) {
+ currentEtat = em;
+ }
}
}
}
}
}
- }
- // traitement d'erreur, on n'arrive pas à identifier l'etat
- if (currentEtat == null) {
- final StringWriter sw = new StringWriter();
- sw.append("Impossible de déterminer l'état de ce document :\n");
- final TransformerFactory errorTransFactory = FactoryProvider.getTransformerFactory();
- final Transformer errorTransformer = errorTransFactory.newTransformer();
- errorTransformer.transform(new DOMSource(doc), new StreamResult(sw));
- sw.flush();
- sw.close();
- DefaultImporter.logger.error(sw.getBuffer().toString());
- continue;
- }
- // apply before-import xslt
- if (pc.getEtat(currentEtat.getId()).getImportXsltFile() != null) {
- /**
- * Un etat peut avoir un attribut indiquant que l'on doit appeler une classe Java afin de transformer une partie du flux. Par exemple, la classe
- * qui prends en compte les PJ du PES_ALLER.
- */
- if (currentEtat.getTransformClass() != null) {
- final Class clazz = Class.forName(currentEtat.getTransformClass());
- final Object o = clazz.newInstance();
- final EtatTransformeur et = (EtatTransformeur) o;
- et.setArchiveName(this.getArchiveName());
- et.transform(collectivite, codeBudget, fileEncoding, xmlVersion, this.dm.getBaseDirectory(), sFullText, this.user);
- if (et.getReturnCode() != EtatTransformeur.RETURN_CODE_OK) {
- throw new Exception("Erreur lors de la transformation du flux");
+
+ // traitement d'erreur, on n'arrive pas à identifier l'etat
+ if (currentEtat == null) {
+ final StringWriter sw = new StringWriter();
+ sw.append("Impossible de déterminer l'état de ce document :\n");
+ final TransformerFactory errorTransFactory = FactoryProvider.getTransformerFactory();
+ final Transformer errorTransformer = errorTransFactory.newTransformer();
+ errorTransformer.transform(new DOMSource(doc), new StreamResult(sw));
+ sw.flush();
+ sw.close();
+ DefaultImporter.logger.error(sw.getBuffer().toString());
+ } else {
+ byte[] docData = null;
+
+ final String xsltFile = pc.getEtat(currentEtat.getId()).getImportXsltFile();
+
+ if (xsltFile == null) {
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ final TransformerFactory transFactory = FactoryProvider.getTransformerFactory();
+ final Transformer identitiyTransformer = transFactory.newTransformer();
+ identitiyTransformer.transform(new DOMSource(doc), new StreamResult(baos));
+ docData = baos.toByteArray();
+ } else {
+ /**
+ * Un etat peut avoir un attribut indiquant que l'on doit appeler une classe Java afin de transformer une partie du flux. Par exemple,
+ * la classe qui prends en compte les PJ du PES_ALLER.
+ */
+ if (currentEtat.getTransformClass() != null) {
+ final Class clazz = Class.forName(currentEtat.getTransformClass());
+ final Object o = clazz.newInstance();
+ final EtatTransformeur et = (EtatTransformeur) o;
+ et.setArchiveName(this.getArchiveName());
+ et.transform(collectivite, codeBudget, this.dm.getBaseDirectory(), doc, this.user);
+ if (et.getReturnCode() != EtatTransformeur.RETURN_CODE_OK) {
+ throw new Exception("Erreur lors de la transformation du flux");
+ }
+ }
+
+ Transformer trans = this.importXsltCache.get(pc.getEtat(currentEtat.getId()).getImportXsltFile());
+ if (trans == null) {
+ final TransformerFactory tf = FactoryProvider.getTransformerFactory();
+ final File directory = new File(currentEtat.getParent().getBaseDirectory());
+ final File xslFile = new File(directory, pc.getEtat(currentEtat.getId()).getImportXsltFile());
+ trans = tf.newTransformer(new StreamSource(xslFile));
+ this.importXsltCache.put(pc.getEtat(currentEtat.getId()).getImportXsltFile(), trans);
+ }
+ // important, maintenant que c'est mis en cache !
+ trans.reset();
+ if (codeBudget != null) {
+ trans.setParameter("CodeBudget", codeBudget.key);
+ trans.setParameter("LibelleBudget", codeBudget.libelle);
+ }
+ if (collectivite != null) {
+ trans.setParameter("CodeCollectivite", collectivite.key);
+ trans.setParameter("LibelleCollectivite", collectivite.libelle);
+ }
+ if (this.getManifeste() != null) {
+ trans.setParameter("manifeste", new DOMSource(this.getManifeste()));
+ }
+ // on passe en parametre le nom du fichier
+ trans.setParameter("file.name", f.getName());
+
+ trans.setOutputProperty(OutputKeys.ENCODING, fileEncoding);
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ trans.transform(new DOMSource(doc), new StreamResult(baos));
+ docData = baos.toByteArray();
}
- }
+ this.importTimingOS.append(f.getName()).append(";").append(df.toURI().toURL().toExternalForm()).append(";XSL;").append(Long.toString(startFile)).append(";").append(Long.toString(startFile = System.currentTimeMillis()));
+ this.importTimingOS.println();
- Transformer trans = this.importXsltCache.get(pc.getEtat(currentEtat.getId()).getImportXsltFile());
- if (trans == null) {
- final TransformerFactory tf = FactoryProvider.getTransformerFactory();
- final File directory = new File(currentEtat.getParent().getBaseDirectory());
- final File xslFile = new File(directory, pc.getEtat(currentEtat.getId()).getImportXsltFile());
- trans = tf.newTransformer(new StreamSource(xslFile));
- this.importXsltCache.put(pc.getEtat(currentEtat.getId()).getImportXsltFile(), trans);
- }
- // important, maintenant que c'est mis en cache !
- trans.reset();
- if (codeBudget != null) {
- trans.setParameter("CodeBudget", codeBudget.key);
- trans.setParameter("LibelleBudget", codeBudget.libelle);
- }
- if (collectivite != null) {
- trans.setParameter("CodeCollectivite", collectivite.key);
- trans.setParameter("LibelleCollectivite", collectivite.libelle);
- }
- if (this.getManifeste() != null) {
- trans.setParameter("manifeste", new DOMSource(this.getManifeste()));
+ final String docName = StringUtilities.removeFileNameSuffix(f.getName()) + "-" + docCount + "." + this.dm.getExtension();
+ if (!this.isCancelled()) {
+ try {
+ if (!DataLayerManager.getImplementation().importElement(this.dm, currentEtat, codeBudget, collectivite, f.getName(), docName, docData, fileEncoding, this.getArchiveName(), this.user)) {
+ DefaultImporter.logger.warn(DataLayerManager.getImplementation().getWarnings());
+ this.warningCount++;
+ }
+ } catch (final DataAccessException daEx) {
+ DefaultImporter.logger.error("importing element:", daEx);
+ throw daEx;
+ } catch (final DataConfigurationException dcEx) {
+ DefaultImporter.logger.error("importing element:", dcEx);
+ throw (Exception) dcEx.getCause();
+ }
+ }
+ if (shouldDelete) {
+ df.delete();
+ }
+ docCount++;
+ this.importTimingOS.append(f.getName()).append(";").append(df.toURI().toURL().toExternalForm()).append(";IDX;").append(Long.toString(startFile)).append(";").append(Long.toString(startFile = System.currentTimeMillis()));
+ this.importTimingOS.println();
}
- // on passe en parametre le nom du fichier
- trans.setParameter("file.name", f.getName());
-
- trans.setOutputProperty(OutputKeys.ENCODING, fileEncoding);
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- trans.transform(new StreamSource(new ByteArrayInputStream(sFullText.getBytes(fileEncoding))), new StreamResult(baos));
- bData = baos.toByteArray();
}
- this.importTimingOS.append(f.getName()).append(";").append(df.toURI().toURL().toExternalForm()).append(";XSL;").append(Long.toString(startFile)).append(";").append(Long.toString(startFile = System.currentTimeMillis()));
- this.importTimingOS.println();
- final String docName = StringUtilities.removeFileNameSuffix(f.getName()) + "-" + docCount + "." + this.dm.getExtension();
- if (!this.isCancelled()) {
- try {
- if (!DataLayerManager.getImplementation().importElement(this.dm, currentEtat, codeBudget, collectivite, f.getName(), docName, bData, fileEncoding, /*
- * f
- * .
- * getName
- * (
- * )
- * ,
- */this.getArchiveName(), this.user)) {
- DefaultImporter.logger.warn(DataLayerManager.getImplementation().getWarnings());
- this.warningCount++;
+ if (!this.isCancelled() && (doc != null)) {
+ if ((pc.getRepositoryImportXsltFile() != null) && (pc.getRepositoryImportXsltFile().length() > 0)) {
+ Document doc2 = null;
+ final File xslNomencl = new File(new File(this.dm.getBaseDirectory()), pc.getRepositoryImportXsltFile());
+ final TransformerFactory tf = FactoryProvider.getTransformerFactory();
+ final Transformer trans = tf.newTransformer(new StreamSource(xslNomencl));
+ final DOMResult result = new DOMResult();
+ final InputStream is = new SequenceInputStream(Collections.enumeration(Arrays.asList(new ByteArrayInputStream(xmlHeader.getBytes()), new FileInputStream(fHeader), new FileInputStream(fRef), new FileInputStream(fFooter))));
+ trans.transform(new StreamSource(is), result);
+ doc2 = (Document) result.getNode();
+ if (doc2 != null) {
+ doc = doc2;
}
- } catch (final DataAccessException daEx) {
- DefaultImporter.logger.error("importing element:", daEx);
- throw daEx;
- } catch (final DataConfigurationException dcEx) {
- DefaultImporter.logger.error("importing element:", dcEx);
- throw (Exception) dcEx.getCause();
}
+ DataLayerManager.getImplementation().saveRepository(this.dm, collectivite, doc, xs.getReferenceNomenclature(), this.user);
+ } else {
+ DefaultImporter.logger.debug("cancelled");
}
- if (shouldDelete) {
- df.delete();
- }
- docCount++;
- this.importTimingOS.append(f.getName()).append(";").append(df.toURI().toURL().toExternalForm()).append(";IDX;").append(Long.toString(startFile)).append(";").append(Long.toString(startFile = System.currentTimeMillis()));
+ this.importTimingOS.append(f.getName()).append(";;REF;;").append(Long.toString(System.currentTimeMillis()));
this.importTimingOS.println();
- }
- if (!this.isCancelled()) {
- final StringBuffer fullText = new StringBuffer();
- fullText.append("<?xml version=\"").append(xmlVersion).append("\" encoding=\"").append(fileEncoding).append("\" ?>");
- fullText.append(header).append(ref).append(footer);
- Document doc = db.parse(new ByteArrayInputStream(fullText.toString().getBytes(fileEncoding)));
- if ((pc.getRepositoryImportXsltFile() != null) && (pc.getRepositoryImportXsltFile().length() > 0)) {
- Document doc2 = null;
- final File xslNomencl = new File(new File(this.dm.getBaseDirectory()), pc.getRepositoryImportXsltFile());
- final TransformerFactory tf = FactoryProvider.getTransformerFactory();
- final Transformer trans = tf.newTransformer(new StreamSource(xslNomencl));
- final DOMResult result = new DOMResult();
- final DOMSource source = new DOMSource(doc);
- trans.transform(source, result);
- doc2 = (Document) result.getNode();
- if (doc2 != null) {
- doc = doc2;
- }
+ } finally {
+ if (shouldDelete) {
+ fHeader.delete();
+ fRef.delete();
+ fFooter.delete();
+ this.removeTempDir();
}
- DataLayerManager.getImplementation().saveRepository(this.dm, collectivite, doc, xs.getReferenceNomenclature(), this.user);
- } else {
- DefaultImporter.logger.debug("cancelled");
- }
- this.importTimingOS.append(f.getName()).append(";;REF;;").append(Long.toString(System.currentTimeMillis()));
- this.importTimingOS.println();
- if (shouldDelete) {
- fHeader.delete();
- fRef.delete();
- fFooter.delete();
- this.removeTempDir();
}
+
return xs.getFileInfo();
}
- protected XmlSplitter splitFile(final File fHeader, final File fRef, final File fFooter, final File tmpDir, final File fToImport, final String fileEncoding) throws FileNotFoundException, UnsupportedEncodingException, SAXException,
- ParserConfigurationException {
+ protected XmlSplitter splitFile(final File fHeader, final File fRef, final File fFooter, final File tmpDir, final File fToImport, final String fileEncoding) throws FileNotFoundException, UnsupportedEncodingException, SAXException, ParserConfigurationException {
final FileOutputStream fisHeader = new FileOutputStream(fHeader);
final FileOutputStream fisRef = new FileOutputStream(fRef);
final FileOutputStream fisFooter = new FileOutputStream(fFooter);
try {
fisHeader.flush();
fisHeader.close();
- } catch (final Throwable t) {
+ } catch (final Exception ex) {
+ logger.error(ex, ex);
}
}
if (fisRef != null) {
try {
fisRef.flush();
fisRef.close();
- } catch (final Throwable t) {
+ } catch (final Exception ex) {
+ logger.error(ex, ex);
}
}
if (fisFooter != null) {
try {
fisFooter.flush();
fisFooter.close();
- } catch (final Throwable t) {
+ } catch (final Exception ex) {
+ logger.error(ex, ex);
}
}
}