--- /dev/null
+/*
+ * Copyright
+ * 2011 axYus - http://www.axyus.com
+ * 2011 C.Marchand - christophe.marchand@axyus.com
+ *
+ * This file is part of XEMELIOS_NB.
+ *
+ * XEMELIOS_NB is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * XEMELIOS_NB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with XEMELIOS_NB; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+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.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamSource;
+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;
+
+/**
+ *
+ * @author cmarchand
+ */
+public class GenericGenerator extends AbstractPdfGenerator {
+ private static final Logger logger = Logger.getLogger(GenericGenerator.class);
+ private XPathFactory xpf = null;
+
+
+ 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();
+ }
+
+ @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());
+
+ 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());
+
+ 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);
+ }
+ }
+
+}