import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PushbackInputStream;
+import java.io.Reader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.zip.GZIPInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import org.xml.sax.InputSource;
import fr.gouv.finances.dgfip.utils.xml.FactoryProvider;
import fr.gouv.finances.dgfip.xemelios.common.FileInfo;
import fr.gouv.finances.dgfip.xemelios.data.impl.pool.PoolManager;
import fr.gouv.finances.dgfip.xemelios.importers.AbstractImportPatcherImpl;
+import fr.gouv.finances.dgfip.xemelios.utils.GZipUtils;
/**
*
rs.next();
int rows = rs.getInt(1);
+ logger.debug("Nombre de ligne à patcher" + rows);
+
getImportServiceProvider().endLongWait();
br.close();
rs = con2.createStatement().executeQuery(queryProvider.getQuery("request"));
String collectivite = rs.getString(1);
String budget = rs.getString(2);
String docId = rs.getString(3);
- if (patchDocument(collectivite, budget, docId, conPatch, con3))
+
+ if (patchDocument(collectivite, budget, docId, conPatch, con3)) {
rowPatched++;
+ con3.commit();
+ logger.debug("Commit");
+ }
}
} catch (Exception ex) {
logger.error("run() - indexFile=" + indexFile.getAbsolutePath(), ex);
}
private boolean patchDocument(String collectivite, String budget, String docId, Connection conPatch, Connection con2) throws Exception {
- boolean ret = false;
+ int nbUpdated = 0;
+
PreparedStatement psLiassesLocales = con2.prepareStatement(queryProvider.getQuery("selectLiasseLocale"));
psLiassesLocales.setString(1, collectivite);
psLiassesLocales.setString(2, budget);
ps.setString(3, docId);
rs2 = ps.executeQuery();
if (rs2.next()) {
+ DocumentBuilder builder = domFactory.newDocumentBuilder();
String encoding = rs2.getString(2);
- byte[] buff = new byte[512];
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- InputStream is = rs2.getAsciiStream(1);
- int length = is.read(buff);
- while (length > 0) {
- baos.write(buff, 0, length);
- length = is.read(buff);
+ PushbackInputStream rawInputStream = new PushbackInputStream(rs2.getBinaryStream(1), 2);
+ InputStream edmnDataIs;
+ byte[] edmnDocHead = new byte[2];
+
+ rawInputStream.read(edmnDocHead);
+ rawInputStream.unread(edmnDocHead);
+
+ if(GZipUtils.isGZipped(edmnDocHead)){
+ logger.debug("Read EDMN doc as gzipped");
+ edmnDataIs = new GZIPInputStream(rawInputStream);
+ }else{
+ logger.debug("Read EDMN doc as text stream");
+ edmnDataIs = rawInputStream;
+ }
+
+ Reader reader = new InputStreamReader(edmnDataIs, encoding);
+ InputSource source = new InputSource(reader);
+ Document doc;
+
+ try {
+ doc = builder.parse(source);
+ } finally {
+ reader.close();
+ edmnDataIs.close();
}
- DocumentBuilder builder = domFactory.newDocumentBuilder();
- byte[] byteArray = baos.toByteArray();
- InputStream bis = new ByteArrayInputStream(byteArray);
- Document doc = builder.parse(bis);
Transformer trans = transformerFactory.newTransformer(new StreamSource(this.getClass().getClassLoader().getResourceAsStream("fr/gouv/finances/dgfip/xemelios/edmn/patchers/numLiassePatcher.xsl")));
ByteArrayOutputStream newDoc = new ByteArrayOutputStream();
ps.setString(2, collectivite);
ps.setString(3, budget);
ps.setString(4, docId);
+
byte[] newDocArray = newDoc.toByteArray();
InputStream isNewDoc = new ByteArrayInputStream(newDocArray);
ps.setBinaryStream(1, isNewDoc, newDocArray.length);
- if (ps.executeUpdate() > 0)
- ret = true;
+
+ nbUpdated += ps.executeUpdate();
ps.close();
}
rs2.close();
}
rsLiasses.close();
psLiassesLocales.close();
- return ret;
+
+ logger.debug("patchDocument : Nombre de ligne patchées = " + nbUpdated);
+
+ return (nbUpdated > 0);
}
protected static String fmtNumLiasse(int i) {