package fr.gouv.finances.dgfip.xemelios.batch.pdf;
-import fr.gouv.finances.dgfip.utils.IoUtils;
-import fr.gouv.finances.dgfip.utils.Pair;
-import fr.gouv.finances.dgfip.utils.xml.FactoryProvider;
-import fr.gouv.finances.dgfip.utils.xml.transform.CustomURIResolver;
-import fr.gouv.finances.dgfip.xemelios.auth.XemeliosUser;
-import fr.gouv.finances.dgfip.xemelios.batch.BatchRunner;
-import fr.gouv.finances.dgfip.xemelios.common.PJRef;
-import fr.gouv.finances.dgfip.xemelios.common.config.EtatModel;
-import fr.gouv.finances.dgfip.xemelios.data.DataLayerManager;
-import fr.gouv.finances.dgfip.xemelios.data.impl.pool.PoolManager;
-import fr.gouv.finances.dgfip.xemelios.utils.FileUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
+
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
+
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xhtmlrenderer.context.StyleReference;
import org.xhtmlrenderer.pdf.ITextRenderer;
+import fr.gouv.finances.dgfip.utils.IoUtils;
+import fr.gouv.finances.dgfip.utils.Pair;
+import fr.gouv.finances.dgfip.utils.xml.FactoryProvider;
+import fr.gouv.finances.dgfip.utils.xml.transform.AbstractURIResolver;
+import fr.gouv.finances.dgfip.xemelios.auth.XemeliosUser;
+import fr.gouv.finances.dgfip.xemelios.batch.BatchRunner;
+import fr.gouv.finances.dgfip.xemelios.common.PJRef;
+import fr.gouv.finances.dgfip.xemelios.common.config.EtatModel;
+import fr.gouv.finances.dgfip.xemelios.data.DataLayerManager;
+import fr.gouv.finances.dgfip.xemelios.data.impl.pool.PoolManager;
+import fr.gouv.finances.dgfip.xemelios.utils.FileUtils;
+
/**
- *
+ *
* @author cmarchand
*/
public class PdfCreatorCgEtatBalance {
- private EtatModel em;
- private String collectivite;
- private String budget;
- private int exercice;
- private Pair pColl, pBudg;
- private XemeliosUser user;
- private Logger logger = null;
- XPathFactory xpf = FactoryProvider.getXPathFactory();
-
- public PdfCreatorCgEtatBalance(EtatModel em, String collectivite, String budget, int exercice, XemeliosUser user) {
- super();
- this.em=em;
- this.collectivite=collectivite;
- this.budget=budget;
- this.exercice=exercice;
- this.pColl=new Pair(collectivite, collectivite);
- this.pBudg = new Pair(budget, budget);
- this.user=user;
- logger = Logger.getLogger(PdfCreatorCgEtatBalance.class.getName()+"<"+collectivite+","+budget+","+exercice+">");
- }
-
- public void run() {
- if(flagRowStart(null)!=1) {
- logger.warn("cancelling "+collectivite+"-"+budget+"-"+exercice);
- return;
- }
- String xpath=em.getImportableElement().getPath().getPath()+"[n:Pied/@NumPage='1']";
- XPath xp = xpf.newXPath();
- xp.setNamespaceContext(em.getParent().getNamespaces());
- try {
- ArrayList<String> documents = DataLayerManager.getImplementation().getDocumentListFromXPath(em.getImportableElement(), collectivite, budget, Integer.toString(exercice), null, null, xpath, user);
- if(documents.size()==1) {
- Document dom = DataLayerManager.getImplementation().getDocumentAsDom(em, pColl, pBudg, documents.get(0), user);
- String firstPage = "1";
- String lastPage=null;
- // on va chercher les numéros de page
- Element ligneSommaire = (Element)xp.evaluate("/n:CompteGestionEtat/n:Entete/n:Infos/n:Sommaire/n:LigneSommaire[1]", dom, XPathConstants.NODE);
- if(ligneSommaire!=null) {
- firstPage = ligneSommaire.getAttribute("FirstPage");
- lastPage = ligneSommaire.getAttribute("LastPage");
- } else {
- lastPage = xp.evaluate("/n:CompteGestionEtat/n:BalanceGenerale/n:PageBalanceGenerale/@added:LastPage", dom);
- }
- int first = Integer.parseInt(firstPage);
- int last = Integer.parseInt(lastPage);
- ITextRenderer renderer = new ITextRenderer();
- BatchUserAgentCallback callback = new BatchUserAgentCallback(renderer.getOutputDevice());
- callback.setSharedContext(renderer.getSharedContext());
- renderer.getSharedContext().setUserAgentCallback(callback);
- StyleReference css = new StyleReference(callback);
- renderer.getSharedContext().setCss(css);
- File xslFile = new File(new File(new File(System.getProperty("user.home")),"xemelios/documents-def-ovrrd"),em.getXslt());
- if(!xslFile.exists()) xslFile = new File(new File(em.getParent().getBaseDirectory()),em.getXslt());
- InputStream is = IoUtils.getInputStream(xslFile.getPath());
-
- File tmp = File.createTempFile("CGE_Bal_"+collectivite+"_"+budget+"_"+exercice, ".pdf", FileUtils.getTempDir());
-
- OutputStream output = new FileOutputStream(tmp);
- TransformerFactory tFactory = FactoryProvider.getTransformerFactory();
- tFactory.setURIResolver(new CustomURIResolver(tFactory.getURIResolver(),xslFile.getParentFile().toURI().toURL().toExternalForm()));
- Transformer tr = tFactory.newTransformer(new StreamSource(is));
- tr.setParameter("browser-destination", em.useExternalBrowser() ? "external" : "internal");
- // on passe la nomenclature en parametre
- // on recupere l'ID de la nomenclature
- String idRepository = null;
- if (em.getParent().getReferenceNomenclaturePath() != null && em.getParent().getReferenceNomenclaturePath().getCodePath() != null) {
- idRepository = (String) xp.evaluate(em.getParent().getReferenceNomenclaturePath().getCodePath().getPath(), dom.getDocumentElement(), XPathConstants.STRING);
- }
- if (idRepository != null && idRepository.length() == 0) {
- idRepository = null;
- }
- Document repository = DataLayerManager.getImplementation().getRepositoryAsDom(em.getParent(), pColl, idRepository, user);
- if (repository != null) {
- tr.setParameter("repository", repository);
- }
- // on passe la config
- tr.setParameter("config", BatchRunner.getInstance().getDocuments().getSmallDOM());
- tr.setParameter("collectivite", pColl.key);
- tr.setParameter("budget", budget);
-
- boolean isFirstPage = true;
- for(int i=first; i<=last; i++) {
- xpath=em.getImportableElement().getPath().getPath()+"[n:Pied/@NumPage='"+i+"']";
- documents = DataLayerManager.getImplementation().getDocumentListFromXPath(em.getImportableElement(), collectivite, budget, Integer.toString(exercice), null, null, xpath, user);
- Document doc = DataLayerManager.getImplementation().getDocumentAsDom(em, pColl, pBudg, documents.get(0), user);
- DOMResult result = new DOMResult();
- tr.transform(new DOMSource(doc), result);
- Document xhtml = (Document) result.getNode();
- renderer.setDocument(xhtml, "doc.xhtml");
- renderer.layout();
- if (isFirstPage) {
- renderer.createPDF(output, false);
- isFirstPage = false;
- } else {
- renderer.writeNextDocument();
- }
- }
- renderer.finishPDF();
- output.flush(); output.close();
-
- // attachement de la PJ
- PJRef pjRef = new PJRef();
- pjRef.setCollectivite(collectivite);
- pjRef.setFileName("CompteGestionEtat-BalanceGenerale-"+collectivite+"-"+budget+"-"+exercice+".pdf");
- pjRef.setPjName(pjRef.getFileName());
- FileInputStream fis = new FileInputStream(tmp);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] buffer = new byte[2048];
- int read = fis.read(buffer);
- do {
- baos.write(buffer, 0, read);
- read = fis.read(buffer);
- } while(read > 0);
- fis.close();
- pjRef.setData(baos.toByteArray());
- DataLayerManager.getImplementation().importPj(pjRef, null, user);
- tmp.delete();
- flagRowSuccess(1);
- } else {
- logger.error("ai trouvé "+documents.size()+" page 1");
- }
- } catch(Exception ex) {
- flagRowError(-1);
- logger.error("",ex);
- }
- }
-
- protected int flagRowStart(Integer value) {
- return flagRow(1, value);
- }
- protected int flagRowError(Integer value) {
- return flagRow(2,value);
- }
- protected int flagRowSuccess(Integer value) {
- return flagRow(3, value);
- }
- protected int flagRow(int status, Integer value) {
- Connection con = null;
- try {
- con = PoolManager.getInstance().getConnection();
- String sql = "UPDATE PDF_CREATION SET CREATION_STATUS=? WHERE DOCUMENT_ID='compteGestionEtat' AND ETAT_ID='BalanceGenerale' AND COLLECTIVITE=? AND BUDGET=? AND EXERCICE=?";
- if(value==null) sql = sql.concat(" AND CREATION_STATUS IS NULL");
- else if(value!= -1) sql = sql.concat(" AND CREATION_STATUS=?");
-logger.info(status+"/"+value+" : "+sql);
- PreparedStatement ps = con.prepareStatement(sql);
- ps.setInt(1,status);
- ps.setString(2, collectivite);
- ps.setString(3, budget);
- ps.setInt(4, exercice);
- if(value!=null && value!= -1) ps.setInt(5,value.intValue());
- return ps.executeUpdate();
- } catch(Exception ex) {
- logger.error("flagRow",ex);
- return 0;
- } finally {
- if(con!=null) {
- PoolManager.getInstance().releaseConnection(con);
- con = null;
- }
- }
- }
+ private final EtatModel em;
+ private final String collectivite;
+ private final String budget;
+ private final int exercice;
+ private final Pair pColl, pBudg;
+ private final XemeliosUser user;
+ private Logger logger = null;
+ XPathFactory xpf = FactoryProvider.getXPathFactory();
+
+ public PdfCreatorCgEtatBalance(final EtatModel em, final String collectivite, final String budget, final int exercice, final XemeliosUser user) {
+ super();
+ this.em = em;
+ this.collectivite = collectivite;
+ this.budget = budget;
+ this.exercice = exercice;
+ this.pColl = new Pair(collectivite, collectivite);
+ this.pBudg = new Pair(budget, budget);
+ this.user = user;
+ this.logger = Logger.getLogger(PdfCreatorCgEtatBalance.class.getName() + "<" + collectivite + "," + budget + "," + exercice + ">");
+ }
+
+ public void run() {
+ if (this.flagRowStart(null) != 1) {
+ this.logger.warn("cancelling " + this.collectivite + "-" + this.budget + "-" + this.exercice);
+ return;
+ }
+ String xpath = this.em.getImportableElement().getPath().getPath() + "[n:Pied/@NumPage='1']";
+ final XPath xp = this.xpf.newXPath();
+ xp.setNamespaceContext(this.em.getParent().getNamespaces());
+ try {
+ ArrayList<String> documents = DataLayerManager.getImplementation().getDocumentListFromXPath(this.em.getImportableElement(), this.collectivite, this.budget, Integer.toString(this.exercice), null, null, xpath, this.user);
+ if (documents.size() == 1) {
+ final Document dom = DataLayerManager.getImplementation().getDocumentAsDom(this.em, this.pColl, this.pBudg, documents.get(0), this.user);
+ String firstPage = "1";
+ String lastPage = null;
+ // on va chercher les numéros de page
+ final Element ligneSommaire = (Element) xp.evaluate("/n:CompteGestionEtat/n:Entete/n:Infos/n:Sommaire/n:LigneSommaire[1]", dom, XPathConstants.NODE);
+ if (ligneSommaire != null) {
+ firstPage = ligneSommaire.getAttribute("FirstPage");
+ lastPage = ligneSommaire.getAttribute("LastPage");
+ } else {
+ lastPage = xp.evaluate("/n:CompteGestionEtat/n:BalanceGenerale/n:PageBalanceGenerale/@added:LastPage", dom);
+ }
+ final int first = Integer.parseInt(firstPage);
+ final int last = Integer.parseInt(lastPage);
+ final ITextRenderer renderer = new ITextRenderer();
+ final BatchUserAgentCallback callback = new BatchUserAgentCallback(renderer.getOutputDevice());
+ callback.setSharedContext(renderer.getSharedContext());
+ renderer.getSharedContext().setUserAgentCallback(callback);
+ final StyleReference css = new StyleReference(callback);
+ renderer.getSharedContext().setCss(css);
+ File xslFile = new File(new File(new File(System.getProperty("user.home")), "xemelios/documents-def-ovrrd"), this.em.getXslt());
+ if (!xslFile.exists()) {
+ xslFile = new File(new File(this.em.getParent().getBaseDirectory()), this.em.getXslt());
+ }
+ final InputStream is = IoUtils.getInputStream(xslFile.getPath());
+
+ final File tmp = File.createTempFile("CGE_Bal_" + this.collectivite + "_" + this.budget + "_" + this.exercice, ".pdf", FileUtils.getTempDir());
+
+ final OutputStream output = new FileOutputStream(tmp);
+ final TransformerFactory tFactory = FactoryProvider.getTransformerFactory();
+ final AbstractURIResolver uriResolver = this.em.getParent().createUriResolver();
+ AbstractURIResolver.initializationHelper(uriResolver, dom, tFactory.getURIResolver(), xslFile.getParentFile().toURI().toURL().toExternalForm());
+
+ tFactory.setURIResolver(uriResolver);
+
+ final Transformer tr = tFactory.newTransformer(new StreamSource(is));
+ tr.setParameter("browser-destination", this.em.useExternalBrowser() ? "external" : "internal");
+ // on passe la nomenclature en parametre
+ // on recupere l'ID de la nomenclature
+ String idRepository = null;
+ if (this.em.getParent().getReferenceNomenclaturePath() != null && this.em.getParent().getReferenceNomenclaturePath().getCodePath() != null) {
+ idRepository = (String) xp.evaluate(this.em.getParent().getReferenceNomenclaturePath().getCodePath().getPath(), dom.getDocumentElement(), XPathConstants.STRING);
+ }
+ if (idRepository != null && idRepository.length() == 0) {
+ idRepository = null;
+ }
+ final Document repository = DataLayerManager.getImplementation().getRepositoryAsDom(this.em.getParent(), this.pColl, idRepository, this.user);
+ if (repository != null) {
+ tr.setParameter("repository", repository);
+ }
+ // on passe la config
+ tr.setParameter("config", BatchRunner.getInstance().getDocuments().getSmallDOM());
+ tr.setParameter("collectivite", this.pColl.key);
+ tr.setParameter("budget", this.budget);
+
+ boolean isFirstPage = true;
+ for (int i = first; i <= last; i++) {
+ xpath = this.em.getImportableElement().getPath().getPath() + "[n:Pied/@NumPage='" + i + "']";
+ documents = DataLayerManager.getImplementation().getDocumentListFromXPath(this.em.getImportableElement(), this.collectivite, this.budget, Integer.toString(this.exercice), null, null, xpath, this.user);
+ final Document doc = DataLayerManager.getImplementation().getDocumentAsDom(this.em, this.pColl, this.pBudg, documents.get(0), this.user);
+ final DOMResult result = new DOMResult();
+ tr.transform(new DOMSource(doc), result);
+ final Document xhtml = (Document) result.getNode();
+ renderer.setDocument(xhtml, "doc.xhtml");
+ renderer.layout();
+ if (isFirstPage) {
+ renderer.createPDF(output, false);
+ isFirstPage = false;
+ } else {
+ renderer.writeNextDocument();
+ }
+ }
+ renderer.finishPDF();
+ output.flush();
+ output.close();
+
+ // attachement de la PJ
+ final PJRef pjRef = new PJRef();
+ pjRef.setCollectivite(this.collectivite);
+ pjRef.setFileName("CompteGestionEtat-BalanceGenerale-" + this.collectivite + "-" + this.budget + "-" + this.exercice + ".pdf");
+ pjRef.setPjName(pjRef.getFileName());
+ final FileInputStream fis = new FileInputStream(tmp);
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ final byte[] buffer = new byte[2048];
+ int read = fis.read(buffer);
+ do {
+ baos.write(buffer, 0, read);
+ read = fis.read(buffer);
+ } while (read > 0);
+ fis.close();
+ pjRef.setData(baos.toByteArray());
+ DataLayerManager.getImplementation().importPj(pjRef, null, this.user);
+ tmp.delete();
+ this.flagRowSuccess(1);
+ } else {
+ this.logger.error("ai trouvé " + documents.size() + " page 1");
+ }
+ } catch (final Exception ex) {
+ this.flagRowError(-1);
+ this.logger.error("", ex);
+ }
+ }
+
+ protected int flagRowStart(final Integer value) {
+ return this.flagRow(1, value);
+ }
+
+ protected int flagRowError(final Integer value) {
+ return this.flagRow(2, value);
+ }
+
+ protected int flagRowSuccess(final Integer value) {
+ return this.flagRow(3, value);
+ }
+
+ protected int flagRow(final int status, final Integer value) {
+ Connection con = null;
+ try {
+ con = PoolManager.getInstance().getConnection();
+ String sql = "UPDATE PDF_CREATION SET CREATION_STATUS=? WHERE DOCUMENT_ID='compteGestionEtat' AND ETAT_ID='BalanceGenerale' AND COLLECTIVITE=? AND BUDGET=? AND EXERCICE=?";
+ if (value == null) {
+ sql = sql.concat(" AND CREATION_STATUS IS NULL");
+ } else if (value != -1) {
+ sql = sql.concat(" AND CREATION_STATUS=?");
+ }
+ this.logger.info(status + "/" + value + " : " + sql);
+ final PreparedStatement ps = con.prepareStatement(sql);
+ ps.setInt(1, status);
+ ps.setString(2, this.collectivite);
+ ps.setString(3, this.budget);
+ ps.setInt(4, this.exercice);
+ if (value != null && value != -1) {
+ ps.setInt(5, value.intValue());
+ }
+ return ps.executeUpdate();
+ } catch (final Exception ex) {
+ this.logger.error("flagRow", ex);
+ return 0;
+ } finally {
+ if (con != null) {
+ PoolManager.getInstance().releaseConnection(con);
+ con = null;
+ }
+ }
+ }
}