import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.output.StringBuilderWriter;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
@Override
public void transform(final Pair collectivite, final Pair budget, final String fileEncoding, final String xmlVersion, final String baseDirectory, final String buff, final XemeliosUser user) {
-
try {
- final PJRef pjref = new PJRef();
-
final DocumentBuilderFactory dbf = FactoryProvider.getDocumentBuilderFactory();
dbf.setNamespaceAware(true);
final DocumentBuilder db = dbf.newDocumentBuilder();
final Document doc = db.parse(new ByteArrayInputStream(buff.getBytes(fileEncoding)));
- // la collectivité
- pjref.setCollectivite(collectivite.key);
+ this.transform(collectivite, budget, baseDirectory, doc, user);
+ } catch (final Exception e) {
+ PesFacturePiXslHrefTransformer.logger.error("import PJ", e);
+ this.return_code = EtatTransformeur.RETURN_CODE_ERR;
+ } catch (final OutOfMemoryError oome) {
+ PesFacturePiXslHrefTransformer.logger.error("import PJ", oome);
+ this.return_code = EtatTransformeur.RETURN_CODE_ERR;
+ }
+ }
- // PJ_NAME : IdUnique
- NodeList tmpNL = doc.getElementsByTagName("IdUnique");
- if (tmpNL.getLength() == 1) {
- final Node n = tmpNL.item(0);
- pjref.setPjName(n.getAttributes().item(0).getNodeValue());
- }
+ @Override
+ public void transform(final Pair collectivite, final Pair budget, final String baseDirectory, final Document doc, final XemeliosUser user) throws Exception {
+ final PJRef pjref = new PJRef();
- // FILe_NAME : NomPJ
- tmpNL = doc.getElementsByTagName("NomPJ");
- if (tmpNL.getLength() == 1) {
- final Node n = tmpNL.item(0);
- pjref.setFileName(n.getAttributes().item(0).getNodeValue());
- }
+ // la collectivité
+ pjref.setCollectivite(collectivite.key);
- // RefCompta : recupération des references comptables
- this.traiterRefsCompta(doc, collectivite, budget, pjref, user);
-
- byte[] data = null;
- // PES/Contenu/Fichier ou PES/Contenu/PES_Facture
- // le contenu n'est pas obligatoire. Si on n'a pas de contenu, on ne fait rien
- final boolean hasContenu = (doc.getElementsByTagName("Contenu").getLength() > 0);
- final boolean isFICHIER = (doc.getElementsByTagName("Fichier").getLength() > 0);
- if (hasContenu) {
- final boolean lengthContenuPositif = doc.getElementsByTagName("Contenu").item(0).getTextContent().trim().length() > 0;
- if (lengthContenuPositif) {
- if (isFICHIER) {
- // lecture en base64 puis d�compression GZip
- tmpNL = doc.getElementsByTagName("Fichier");
- if (tmpNL.getLength() == 1) {
- final Node n = tmpNL.item(0);
- final String encoded = n.getTextContent();
-
- final GZIPInputStream gzi = new GZIPInputStream(new ByteArrayInputStream(Base64.decode(encoded)));
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- final byte[] bTmp = new byte[2048];
- int read = 0;
- do {
- read = gzi.read(bTmp);
- if (read > 0) {
- baos.write(bTmp, 0, read);
- }
- } while (read > 0);
-
- baos.flush();
- baos.close();
- gzi.close();
+ // PJ_NAME : IdUnique
+ NodeList tmpNL = doc.getElementsByTagName("IdUnique");
+ if (tmpNL.getLength() == 1) {
+ final Node n = tmpNL.item(0);
+ pjref.setPjName(n.getAttributes().item(0).getNodeValue());
+ }
- data = baos.toByteArray();
- }
- } else {
- // application d'une xsl sur le PES_FACTURE pour référencer la XSL d'affichage qui va bien
- final File xslFile = new File(new File(baseDirectory), this.xsl_PJPESFACTURE_TO_XMLPESFACTURE);
- final HashMap<String, Object> parameters = new HashMap<String, Object>();
- final TransformerFactory tFactory = FactoryProvider.getTransformerFactory();
+ // FILe_NAME : NomPJ
+ tmpNL = doc.getElementsByTagName("NomPJ");
+ if (tmpNL.getLength() == 1) {
+ final Node n = tmpNL.item(0);
+ pjref.setFileName(n.getAttributes().item(0).getNodeValue());
+ }
- final DefaultUriResolver uriResolver = new DefaultUriResolver();
- AbstractURIResolver.initializationHelper(uriResolver, doc, tFactory.getURIResolver(), xslFile.toURI().toURL().toExternalForm());
- tFactory.setURIResolver(uriResolver);
+ // RefCompta : recupération des references comptables
+ this.traiterRefsCompta(doc, collectivite, budget, pjref, user);
+
+ byte[] data = null;
+ // PES/Contenu/Fichier ou PES/Contenu/PES_Facture
+ // le contenu n'est pas obligatoire. Si on n'a pas de contenu, on ne fait rien
+ final boolean hasContenu = (doc.getElementsByTagName("Contenu").getLength() > 0);
+ final boolean isFICHIER = (doc.getElementsByTagName("Fichier").getLength() > 0);
+ if (hasContenu) {
+ final boolean lengthContenuPositif = doc.getElementsByTagName("Contenu").item(0).getTextContent().trim().length() > 0;
+ if (lengthContenuPositif) {
+ if (isFICHIER) {
+ // lecture en base64 puis d�compression GZip
+ tmpNL = doc.getElementsByTagName("Fichier");
+ if (tmpNL.getLength() == 1) {
+ final Node n = tmpNL.item(0);
+ final String encoded = n.getTextContent();
- final Transformer t = tFactory.newTransformer(new StreamSource(new FileInputStream(xslFile)));
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- t.transform(new StreamSource(new ByteArrayInputStream(buff.getBytes(fileEncoding))), new StreamResult(baos));
- final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
- final StringBuffer newText = new StringBuffer();
- int len = 0;
- final byte[] b = new byte[1024];
- do {
- len = bais.read(b);
- if (len > 0) {
- newText.append(new String(b, 0, len));
- }
- } while (len > 0);
-
- data = newText.toString().getBytes();
+ final GZIPInputStream gzi = new GZIPInputStream(new ByteArrayInputStream(Base64.decode(encoded)));
+ try {
+ IOUtils.copyLarge(gzi, baos);
+ } finally {
+ gzi.close();
+ }
+
+ data = baos.toByteArray();
}
- pjref.setData(data);
- pjref.setUncompressedSize(data.length);
} else {
- PesFacturePiXslHrefTransformer.logger.warn("La balise contenu de la PJ " + (pjref != null ? pjref.getPjName() : "") + " est vide ");
+ // application d'une xsl sur le PES_FACTURE pour référencer la XSL d'affichage qui va bien
+ final File xslFile = new File(new File(baseDirectory), this.xsl_PJPESFACTURE_TO_XMLPESFACTURE);
+ final HashMap<String, Object> parameters = new HashMap<String, Object>();
+ final TransformerFactory tFactory = FactoryProvider.getTransformerFactory();
+
+ final DefaultUriResolver uriResolver = new DefaultUriResolver();
+ AbstractURIResolver.initializationHelper(uriResolver, doc, tFactory.getURIResolver(), xslFile.toURI().toURL().toExternalForm());
+ tFactory.setURIResolver(uriResolver);
+
+ final StringBuilder pjData = new StringBuilder();
+ final Transformer t = tFactory.newTransformer(new StreamSource(new FileInputStream(xslFile)));
+ t.transform(new DOMSource(doc), new StreamResult(new StringBuilderWriter(pjData)));
+
+ data = pjData.toString().getBytes();
}
+ pjref.setData(data);
+ pjref.setUncompressedSize(data.length);
+ } else {
+ PesFacturePiXslHrefTransformer.logger.warn("La balise contenu de la PJ " + (pjref != null ? pjref.getPjName() : "") + " est vide ");
}
- DataLayerManager.getImplementation().importPj(pjref, this.getArchiveName(), user);
- this.return_code = EtatTransformeur.RETURN_CODE_OK;
- } catch (final Exception e) {
- PesFacturePiXslHrefTransformer.logger.error("import PJ", e);
- this.return_code = EtatTransformeur.RETURN_CODE_ERR;
- } catch (final OutOfMemoryError oome) {
- PesFacturePiXslHrefTransformer.logger.error("import PJ", oome);
- this.return_code = EtatTransformeur.RETURN_CODE_ERR;
}
+ DataLayerManager.getImplementation().importPj(pjref, this.getArchiveName(), user);
+ this.return_code = EtatTransformeur.RETURN_CODE_OK;
}
@Override
boolean ret = false;
PreparedStatement ps = null;
try {
- ps = con.prepareStatement("INSERT INTO " + (String) infosDoc.get("TABLE_NAME_ALL_PJ") + " (COLLECTIVITE," + "BUDGET," + "DOC_ID," + "NODE_ID," + "SUPPORT_PJ," + "ID_UNIQUE_PJ," + "NOM_PJ," + "INITIAL_DOC_NAME," + "ARCHIVE_NAME) "
- + "VALUES (?,?,?,?,?,?,?,?,?)");
+ ps = con.prepareStatement("INSERT INTO " + (String) infosDoc.get("TABLE_NAME_ALL_PJ") + " (COLLECTIVITE," + "BUDGET," + "DOC_ID," + "NODE_ID," + "SUPPORT_PJ," + "ID_UNIQUE_PJ," + "NOM_PJ," + "INITIAL_DOC_NAME," + "ARCHIVE_NAME) " + "VALUES (?,?,?,?,?,?,?,?,?)");
final String initialDocName = DataLayerManager.getImplementation().getInitialDocNameFromDocId((EtatModel) infosDoc.get("ETAT_MODEL"), collectivite, budget, (String) infosDoc.get("DOC_ID"), con, user);
}
private String getPathPieceFromDomaine(final String domaine) {
- if (domaine != null && domaine.equals("01")) {
+ if ((domaine != null) && domaine.equals("01")) {
return "n:BlocPiece/n:InfoPce/";
- } else if (domaine != null && domaine.equals("01")) {
+ } else if ((domaine != null) && domaine.equals("01")) {
return "n:BlocPiece/";
}
return "";
}
- public Document getPieceFromRefCompta(final Pair collectivite, final Pair budget, final String domaine, final String type_bordereau, final String id_piece, final DocumentModel dm, final HashMap<String, Object> infosDoc, final XemeliosUser user)
- throws DataConfigurationException, DataAccessException, UnauthorizedException, IOException, ParserConfigurationException, SAXException, InvalidParameterException {
+ public Document getPieceFromRefCompta(final Pair collectivite, final Pair budget, final String domaine, final String type_bordereau, final String id_piece, final DocumentModel dm, final HashMap<String, Object> infosDoc, final XemeliosUser user) throws DataConfigurationException,
+ DataAccessException, UnauthorizedException, IOException, ParserConfigurationException, SAXException, InvalidParameterException {
if (!user.hasRole(XemeliosUser.ROLE_SEARCH)) {
throw new UnauthorizedException("Vous n'êtes pas autorisé à faire des recherches");
}
String xpath = "";
final DataImpl dataLayer = DataLayerManager.getImplementation();
- if (domaine != null && domaine.equals("01")) {
+ if ((domaine != null) && domaine.equals("01")) {
// TODO Code dégueux => pas le choix c'est Xemelios (mieux vaut ne pas intégrer postgres ;-) !!!
if ("oracle".equals(dataLayer.getLayerName())) {
infosDoc.put("TABLE_NAME", "PES_ALLER_D_DOCS");
em = dm.getEtatById("PES_DepenseAller");
infosDoc.put("ETAT_MODEL", em);
xpath = "[../n:BlocBordereau/n:TypBord/@V='" + type_bordereau + "'][n:BlocPiece/n:InfoPce/n:IdPce/@V='" + id_piece + "']";
- } else if (domaine != null && domaine.equals("02")) {
+ } else if ((domaine != null) && domaine.equals("02")) {
// TODO Code dégueux => pas le choix c'est Xemelios (mieux vaut ne pas intégrer postgres ;-) !!!
if ("oracle".equals(dataLayer.getLayerName())) {
infosDoc.put("TABLE_NAME", "PES_ALLER_R_DOCS");