package fr.gouv.finances.dgfip.xemelios.cge.generators;
-import fr.gouv.finances.dgfip.utils.IoUtils;
-import fr.gouv.finances.dgfip.utils.Xslt;
-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.common.config.DocumentModel;
-import fr.gouv.finances.dgfip.xemelios.common.config.ElementModel;
-import fr.gouv.finances.dgfip.xemelios.common.config.EtatModel;
-import fr.gouv.finances.dgfip.xemelios.common.generators.AbstractPdfGenerator;
-import fr.gouv.finances.dgfip.xemelios.common.generators.GeneratingError;
-import fr.gouv.finances.dgfip.xemelios.data.DataLayerManager;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
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.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.Xslt;
+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.common.config.DocumentModel;
+import fr.gouv.finances.dgfip.xemelios.common.config.ElementModel;
+import fr.gouv.finances.dgfip.xemelios.common.config.EtatModel;
+import fr.gouv.finances.dgfip.xemelios.common.generators.AbstractPdfGenerator;
+import fr.gouv.finances.dgfip.xemelios.common.generators.GeneratingError;
+import fr.gouv.finances.dgfip.xemelios.data.DataLayerManager;
+
/**
- *
+ *
* @author cmarchand
*/
public class GenericGenerator extends AbstractPdfGenerator {
- private static final Logger logger = Logger.getLogger(GenericGenerator.class);
- private XPathFactory xpf = null;
+ private static final Logger logger = Logger.getLogger(GenericGenerator.class);
+ private XPathFactory xpf = null;
+
+ public GenericGenerator(final XemeliosUser user, final DocumentModel dm, final EtatModel em, final ElementModel elm, final String coll, final String budg, final String exer) {
+ super(user, dm, elm, em, coll, budg, exer);
+ this.xpf = FactoryProvider.getXPathFactory();
+ }
+
+ @Override
+ public void run(final OutputStream os) throws GeneratingError {
+ final GenerationRequest gr = this.getGenerationRequest();
+ final DocumentModel documentModel = gr.getDocumentModel();
+ final EtatModel etatModel = gr.getEtatModel();
+ final ElementModel elementModel = gr.getElementModel();
+ final String budget = gr.getBudget();
+ final String collectivite = gr.getCollectivite();
+ final String exercice = gr.getExercice();
+ final XemeliosUser user = gr.getUser();
+ final Pair pCollectivite = gr.getpCollectivite();
+ final Pair pBudget = gr.getpBudget();
+ String xpath = etatModel.getImportableElement().getPath().getPath() + "[n:Pied/@NumPage='1']";
- public GenericGenerator(XemeliosUser user, DocumentModel dm, EtatModel em, ElementModel elm, String coll, String budg, String exer) {
- super(user, dm, elm, em, coll, budg, exer);
- xpf = FactoryProvider.getXPathFactory();
- }
+ final XPath xp = this.xpf.newXPath();
+ xp.setNamespaceContext(documentModel.getNamespaces());
+ try {
+ ArrayList<String> documents = DataLayerManager.getImplementation().getDocumentListFromXPath(elementModel, collectivite, budget, exercice, null, null, xpath, user);
+ if (documents.size() == 1) {
+ final Document dom = DataLayerManager.getImplementation().getDocumentAsDom(etatModel, pCollectivite, pBudget, documents.get(0), user);
+ int first = 1;
+ final ITextRenderer renderer = new ITextRenderer();
+ final PdfGeneratorAgentCallback callback = new PdfGeneratorAgentCallback(renderer.getOutputDevice());
+ callback.setSharedContext(renderer.getSharedContext());
+ renderer.getSharedContext().setUserAgentCallback(callback);
+ final StyleReference css = new StyleReference(callback);
+ renderer.getSharedContext().setCss(css);
+ final File xslFile = Xslt.getFile(documentModel, etatModel, elementModel, dom);
+ final InputStream is = IoUtils.getInputStream(xslFile.getPath());
- @Override
- public void run(OutputStream os) throws GeneratingError {
- String xpath=getGenerationRequest().getEtatModel().getImportableElement().getPath().getPath()+"[n:Pied/@NumPage='1']";
- XPath xp = xpf.newXPath();
- xp.setNamespaceContext(getGenerationRequest().getDocumentModel().getNamespaces());
- try {
- ArrayList<String> documents = DataLayerManager.getImplementation().getDocumentListFromXPath(getGenerationRequest().getElementModel(), getGenerationRequest().getCollectivite(), getGenerationRequest().getBudget(), getGenerationRequest().getExercice(), null, null, xpath, getGenerationRequest().getUser());
- if(documents.size()==1) {
- Document dom = DataLayerManager.getImplementation().getDocumentAsDom(getGenerationRequest().getEtatModel(), getGenerationRequest().getpCollectivite(), getGenerationRequest().getpBudget(), documents.get(0), getGenerationRequest().getUser());
- int first = 1;
- ITextRenderer renderer = new ITextRenderer();
- PdfGeneratorAgentCallback callback = new PdfGeneratorAgentCallback(renderer.getOutputDevice());
- callback.setSharedContext(renderer.getSharedContext());
- renderer.getSharedContext().setUserAgentCallback(callback);
- StyleReference css = new StyleReference(callback);
- renderer.getSharedContext().setCss(css);
- File xslFile = Xslt.getFile(getGenerationRequest().getDocumentModel(), getGenerationRequest().getEtatModel(), getGenerationRequest().getElementModel(), dom);
- InputStream is = IoUtils.getInputStream(xslFile.getPath());
+ final TransformerFactory tFactory = FactoryProvider.getTransformerFactory();
+ final AbstractURIResolver uriResolver = documentModel.createUriResolver();
+ AbstractURIResolver.initializationHelper(uriResolver, dom, tFactory.getURIResolver(), xslFile.getParentFile().toURI().toURL().toExternalForm());
+ tFactory.setURIResolver(uriResolver);
- 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", getGenerationRequest().getEtatModel().useExternalBrowser() ? "external" : "internal");
- // on passe la nomenclature en parametre
- // on recupere l'ID de la nomenclature
- String idRepository = null;
- if (getGenerationRequest().getDocumentModel().getReferenceNomenclaturePath() != null && getGenerationRequest().getDocumentModel().getReferenceNomenclaturePath().getCodePath() != null) {
- idRepository = (String) xp.evaluate(getGenerationRequest().getDocumentModel().getReferenceNomenclaturePath().getCodePath().getPath(), dom.getDocumentElement(), XPathConstants.STRING);
- }
- if (idRepository != null && idRepository.length() == 0) {
- idRepository = null;
- }
- Document repository = DataLayerManager.getImplementation().getRepositoryAsDom(getGenerationRequest().getDocumentModel(), getGenerationRequest().getpCollectivite(), idRepository, getGenerationRequest().getUser());
- if (repository != null) {
- tr.setParameter("repository", repository);
- }
- // on passe la config
- tr.setParameter("config", getGenerationRequest().getDocumentModel().getParent().getSmallDOM());
- tr.setParameter("collectivite", getGenerationRequest().getCollectivite());
- tr.setParameter("budget", getGenerationRequest().getBudget());
+ final Transformer tr = tFactory.newTransformer(new StreamSource(is));
+ tr.setParameter("browser-destination", etatModel.useExternalBrowser() ? "external" : "internal");
+ // on passe la nomenclature en parametre
+ // on recupere l'ID de la nomenclature
+ String idRepository = null;
+ if (documentModel.getReferenceNomenclaturePath() != null && documentModel.getReferenceNomenclaturePath().getCodePath() != null) {
+ idRepository = (String) xp.evaluate(documentModel.getReferenceNomenclaturePath().getCodePath().getPath(), dom.getDocumentElement(), XPathConstants.STRING);
+ }
+ if (idRepository != null && idRepository.length() == 0) {
+ idRepository = null;
+ }
+ final Document repository = DataLayerManager.getImplementation().getRepositoryAsDom(documentModel, pCollectivite, idRepository, user);
+ if (repository != null) {
+ tr.setParameter("repository", repository);
+ }
+ // on passe la config
+ tr.setParameter("config", documentModel.getParent().getSmallDOM());
+ tr.setParameter("collectivite", collectivite);
+ tr.setParameter("budget", budget);
- boolean isFirstPage = true;
- while(true) {
- xpath=getGenerationRequest().getElementModel().getPath().getPath()+"[n:Pied/@NumPage='"+first+"']";
- first++;
- documents = DataLayerManager.getImplementation().getDocumentListFromXPath(getGenerationRequest().getElementModel(), getGenerationRequest().getCollectivite(), getGenerationRequest().getBudget(), getGenerationRequest().getExercice(), null, null, xpath, getGenerationRequest().getUser());
- if(documents.isEmpty()) break;
- Document doc = DataLayerManager.getImplementation().getDocumentAsDom(getGenerationRequest().getEtatModel(), getGenerationRequest().getpCollectivite(), getGenerationRequest().getpBudget(), documents.get(0), getGenerationRequest().getUser());
- 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(os, false);
- isFirstPage = false;
- } else {
- renderer.writeNextDocument();
- }
- }
- renderer.finishPDF();
- os.flush(); os.close();
- } else {
- logger.error("ai trouvé "+documents.size()+" page 1");
- throw new GeneratingError("ai trouvé "+documents.size()+" page 1");
- }
- } catch(Exception ex) {
- throw new GeneratingError(ex);
- }
- }
+ boolean isFirstPage = true;
+ while (true) {
+ xpath = elementModel.getPath().getPath() + "[n:Pied/@NumPage='" + first + "']";
+ first++;
+ documents = DataLayerManager.getImplementation().getDocumentListFromXPath(elementModel, collectivite, budget, exercice, null, null, xpath, user);
+ if (documents.isEmpty()) {
+ break;
+ }
+ final Document doc = DataLayerManager.getImplementation().getDocumentAsDom(etatModel, pCollectivite, pBudget, documents.get(0), 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(os, false);
+ isFirstPage = false;
+ } else {
+ renderer.writeNextDocument();
+ }
+ }
+ renderer.finishPDF();
+ os.flush();
+ os.close();
+ } else {
+ GenericGenerator.logger.error("ai trouvé " + documents.size() + " page 1");
+ throw new GeneratingError("ai trouvé " + documents.size() + " page 1");
+ }
+ } catch (final Exception ex) {
+ throw new GeneratingError(ex);
+ }
+ }
}