*/
package fr.gouv.finances.dgfip.xemelios.web2.navigate;
-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.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.data.DataLayerManager;
-import fr.gouv.finances.dgfip.xemelios.web2.app.XemeliosHelper;
-import fr.gouv.finances.dgfip.xemelios.web2.utils.AttributeHelper;
-import fr.gouv.finances.dgfip.xemelios.web2.utils.StdDispatchAction;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
+
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
+
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.w3c.dom.Document;
+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.data.DataLayerManager;
+import fr.gouv.finances.dgfip.xemelios.web2.app.XemeliosHelper;
+import fr.gouv.finances.dgfip.xemelios.web2.utils.AttributeHelper;
+import fr.gouv.finances.dgfip.xemelios.web2.utils.StdDispatchAction;
+
public class DisplayDocumentAction extends StdDispatchAction {
- private static final Logger logger = Logger.getLogger(DisplayDocumentAction.class);
-
- @Override
- public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
- logger.debug(request.getQueryString());
- Hashtable<String,Object> parameters = new Hashtable<String,Object>();
- String documentId=null, etatId=null, elementId = null, docId = null;
- String collectiviteCode=null, budgetCode=null, collectiviteLib=null, budgetLib=null;
- String sk1=null, sk2=null;
- HttpSession session = request.getSession();
- XemeliosUser user = AttributeHelper.getUser(session);
-
- for(Enumeration<String> names=request.getParameterNames();names.hasMoreElements();) {
- String paramName = names.nextElement();
- if(paramName.startsWith("xsl-param:")) {
- String xslParamName = paramName.substring("xsl-param:".length());
- String paramValue = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- parameters.put(xslParamName,paramValue);
- } else if(paramName.equals("xsl:param")) {
- // ignore it here
- } else if("elementId".equals(paramName)) {
- elementId = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- } else if("etatId".equals(paramName)) {
- etatId = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- } else if("documentId".equals(paramName)) {
- documentId = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- } else if("docId".equals(paramName)) {
- docId = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- } else if("collectivite".equals(paramName)) {
- collectiviteCode = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- } else if("budget".equals(paramName)) {
- budgetCode = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- } else if("coll-lib".equals(paramName)) {
- collectiviteLib = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- } else if("budg-lib".equals(paramName)) {
- budgetLib = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- } else if("sp1".equals(paramName)) {
- sk1 = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- } else if("sp2".equals(paramName)) {
- sk2 = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
- }
- }
- String[] xslParamsArray = request.getParameterValues("xsl:param");
- if(xslParamsArray!=null) {
- for(String xslParam:xslParamsArray) {
- int virg = xslParam.indexOf(',');
- String pName = xslParam.substring(1,virg);
- String pValue = URLDecoder.decode(xslParam,"UTF-8").substring(virg+1,xslParam.length()-1);
- parameters.put(pName,pValue);
- }
- }
-
- Pair collectivite = new Pair(collectiviteCode,collectiviteLib);
- Pair budget = new Pair(budgetCode,budgetLib);
-
- if(docId!=null && etatId!=null && elementId!=null) {
- DocumentModel documentModel = XemeliosHelper.getDocumentModel(docId);
- if(documentModel==null) throw new IllegalArgumentException("docId parameter ("+docId+") does not correspond to an existing document id.");
- EtatModel etatModel = documentModel.getEtatById(etatId);
- if(etatModel==null) throw new IllegalArgumentException("etatId parameter ("+etatId+") does not correspond to an existing etat id within "+documentId+" document.");
- ElementModel elementModel = etatModel.getElementById(elementId);
- if(elementModel==null) throw new IllegalArgumentException("elementId parameter ("+elementId+") does not correspond to an existing element id within "+documentId+" document / "+etatId+" etat.");
-
- XPath xp = XPathFactory.newInstance().newXPath();
- xp.setNamespaceContext(documentModel.getNamespaces());
- Document doc = null;
- if(sk1==null && sk2==null)
- doc = DataLayerManager.getImplementation().getDocumentAsDom(etatModel, collectivite, budget, documentId, user);
- else {
- ArrayList<String> docs = DataLayerManager.getImplementation().getDocumentListFromSpecialKeys(elementModel, collectivite.key, budget.key, sk1, sk2, null, user);
- if(docs.size()==1) {
- doc = DataLayerManager.getImplementation().getDocumentAsDom(etatModel, collectivite, budget, docs.get(0), user);
- } else if(docs.size()==0) {
- throw new Exception("Document introuvable");
- } else {
- throw new Exception("Plusieurs documents répondent à ces critères");
- }
- }
- if(doc==null) throw new Exception("Document introuvable: "+docId);
- String idRepository = null;
- if(documentModel.getReferenceNomenclaturePath()!=null && documentModel.getReferenceNomenclaturePath().getCodePath()!=null) {
- idRepository = (String)xp.evaluate(documentModel.getReferenceNomenclaturePath().getCodePath().getPath(),doc.getDocumentElement(),XPathConstants.STRING);
- }
- if(idRepository!=null && !(idRepository.length()>0)){
- idRepository=null;
- }
-
- Document repository = DataLayerManager.getImplementation().getRepositoryAsDom(documentModel,collectivite,idRepository,user);
- if(repository!=null)
- parameters.put("repository",repository);
- parameters.put("config",XemeliosHelper.getDocumentsModel().getSmallDOM());
- parameters.put("collectivite",collectiviteCode);
- parameters.put("budget",budgetCode);
- if(collectivite.libelle!=null)
- parameters.put("collectivite-lib",collectivite.libelle);
- if(budget.libelle!=null)
- parameters.put("budget-lib",budget.libelle);
- parameters.put("browser-destination", "internal"); // il faut une destination "internal" pour avoir les liens.
- File f = Xslt.getFile(documentModel, etatModel, elementModel, doc);
- InputStream is = new FileInputStream(f);
- TransformerFactory tFactory = FactoryProvider.getTransformerFactory();
- tFactory.setURIResolver(new CustomURIResolver(tFactory.getURIResolver(), f.getParentFile().toURI().toURL().toExternalForm()));
- Transformer firstTrans = tFactory.newTransformer(new StreamSource(is));
- logger.debug("firstTrans="+firstTrans);
- for(String key:parameters.keySet()) {
- if(key!=null) {
- if(parameters.get(key)!=null) {
- logger.debug("passing xsl param: "+key+","+parameters.get(key));
- firstTrans.setParameter(key, parameters.get(key));
- }
- }
- }
- firstTrans.setParameter("config", XemeliosHelper.getDocumentsModel().getSmallDOM());
- firstTrans.setParameter("displayedDocId", docId);
- /* Ajout d'un paramètre pour l'impression*/
-// firstTrans.setParameter("is.web", "1");
- firstTrans.setParameter("context.path", request.getContextPath());
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- firstTrans.transform(new DOMSource(doc), new StreamResult(baos));
- is.close();
-
- File xslFile = new File(getServlet().getServletContext().getRealPath("/utils/href-converter.xsl"));
-
- tFactory = FactoryProvider.getTransformerFactory();
- Transformer transformer = tFactory.newTransformer(new StreamSource(xslFile));
- transformer.setParameter("server",request.getServerName());
- transformer.setParameter("context",request.getContextPath());
- transformer.setParameter("port",request.getServerPort());
- transformer.setParameter("navigationId", request.getParameter("navigationId"));
- ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
- AttributeHelper.setPreviousView(session,request.getParameter("navigationId"), request.getServletPath()+"?"+request.getQueryString());
- transformer.transform(new StreamSource(bais), new StreamResult(response.getOutputStream()));
- }
- return null;
- }
+ private static final Logger logger = Logger.getLogger(DisplayDocumentAction.class);
+
+ @Override
+ public ActionForward unspecified(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
+ DisplayDocumentAction.logger.debug(request.getQueryString());
+ final Hashtable<String, Object> parameters = new Hashtable<String, Object>();
+ String documentId = null, etatId = null, elementId = null, docId = null;
+ String collectiviteCode = null, budgetCode = null, collectiviteLib = null, budgetLib = null;
+ String sk1 = null, sk2 = null;
+ final HttpSession session = request.getSession();
+ final XemeliosUser user = AttributeHelper.getUser(session);
+
+ for (final Enumeration<String> names = request.getParameterNames(); names.hasMoreElements();) {
+ final String paramName = names.nextElement();
+ if (paramName.startsWith("xsl-param:")) {
+ final String xslParamName = paramName.substring("xsl-param:".length());
+ final String paramValue = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ parameters.put(xslParamName, paramValue);
+ } else if (paramName.equals("xsl:param")) {
+ // ignore it here
+ } else if ("elementId".equals(paramName)) {
+ elementId = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ } else if ("etatId".equals(paramName)) {
+ etatId = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ } else if ("documentId".equals(paramName)) {
+ documentId = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ } else if ("docId".equals(paramName)) {
+ docId = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ } else if ("collectivite".equals(paramName)) {
+ collectiviteCode = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ } else if ("budget".equals(paramName)) {
+ budgetCode = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ } else if ("coll-lib".equals(paramName)) {
+ collectiviteLib = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ } else if ("budg-lib".equals(paramName)) {
+ budgetLib = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ } else if ("sp1".equals(paramName)) {
+ sk1 = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ } else if ("sp2".equals(paramName)) {
+ sk2 = URLDecoder.decode(request.getParameter(paramName), "UTF-8").trim();
+ }
+ }
+ final String[] xslParamsArray = request.getParameterValues("xsl:param");
+ if (xslParamsArray != null) {
+ for (final String xslParam : xslParamsArray) {
+ final int virg = xslParam.indexOf(',');
+ final String pName = xslParam.substring(1, virg);
+ final String pValue = URLDecoder.decode(xslParam, "UTF-8").substring(virg + 1, xslParam.length() - 1);
+ parameters.put(pName, pValue);
+ }
+ }
+
+ final Pair collectivite = new Pair(collectiviteCode, collectiviteLib);
+ final Pair budget = new Pair(budgetCode, budgetLib);
+
+ if ((docId != null) && (etatId != null) && (elementId != null)) {
+ final DocumentModel documentModel = XemeliosHelper.getDocumentModel(docId);
+ if (documentModel == null) {
+ throw new IllegalArgumentException("docId parameter (" + docId + ") does not correspond to an existing document id.");
+ }
+ final EtatModel etatModel = documentModel.getEtatById(etatId);
+ if (etatModel == null) {
+ throw new IllegalArgumentException("etatId parameter (" + etatId + ") does not correspond to an existing etat id within " + documentId + " document.");
+ }
+ final ElementModel elementModel = etatModel.getElementById(elementId);
+ if (elementModel == null) {
+ throw new IllegalArgumentException("elementId parameter (" + elementId + ") does not correspond to an existing element id within " + documentId + " document / " + etatId + " etat.");
+ }
+
+ final XPath xp = XPathFactory.newInstance().newXPath();
+ xp.setNamespaceContext(documentModel.getNamespaces());
+ Document doc = null;
+ if ((sk1 == null) && (sk2 == null)) {
+ doc = DataLayerManager.getImplementation().getDocumentAsDom(etatModel, collectivite, budget, documentId, user);
+ } else {
+ final ArrayList<String> docs = DataLayerManager.getImplementation().getDocumentListFromSpecialKeys(elementModel, collectivite.key, budget.key, sk1, sk2, null, user);
+ if (docs.size() == 1) {
+ doc = DataLayerManager.getImplementation().getDocumentAsDom(etatModel, collectivite, budget, docs.get(0), user);
+ } else if (docs.size() == 0) {
+ throw new Exception("Document introuvable");
+ } else {
+ throw new Exception("Plusieurs documents répondent à ces critères");
+ }
+ }
+ if (doc == null) {
+ throw new Exception("Document introuvable: " + docId);
+ }
+ String idRepository = null;
+ if ((documentModel.getReferenceNomenclaturePath() != null) && (documentModel.getReferenceNomenclaturePath().getCodePath() != null)) {
+ idRepository = (String) xp.evaluate(documentModel.getReferenceNomenclaturePath().getCodePath().getPath(), doc.getDocumentElement(), XPathConstants.STRING);
+ }
+ if ((idRepository != null) && !(idRepository.length() > 0)) {
+ idRepository = null;
+ }
+
+ final Document repository = DataLayerManager.getImplementation().getRepositoryAsDom(documentModel, collectivite, idRepository, user);
+ if (repository != null) {
+ parameters.put("repository", repository);
+ }
+ parameters.put("config", XemeliosHelper.getDocumentsModel().getSmallDOM());
+ parameters.put("collectivite", collectiviteCode);
+ parameters.put("budget", budgetCode);
+ if (collectivite.libelle != null) {
+ parameters.put("collectivite-lib", collectivite.libelle);
+ }
+ if (budget.libelle != null) {
+ parameters.put("budget-lib", budget.libelle);
+ }
+ parameters.put("browser-destination", "internal"); // il faut une destination "internal" pour avoir les liens.
+ final File f = Xslt.getFile(documentModel, etatModel, elementModel, doc);
+ final InputStream is = new FileInputStream(f);
+
+ TransformerFactory tFactory = FactoryProvider.getTransformerFactory();
+ final AbstractURIResolver uriResolver = documentModel.createUriResolver();
+ AbstractURIResolver.initializationHelper(uriResolver, doc, tFactory.getURIResolver(), f.getParentFile().toURI().toURL().toExternalForm());
+ tFactory.setURIResolver(uriResolver);
+
+ final Transformer firstTrans = tFactory.newTransformer(new StreamSource(is));
+ DisplayDocumentAction.logger.debug("firstTrans=" + firstTrans);
+ for (final String key : parameters.keySet()) {
+ if (key != null) {
+ if (parameters.get(key) != null) {
+ DisplayDocumentAction.logger.debug("passing xsl param: " + key + "," + parameters.get(key));
+ firstTrans.setParameter(key, parameters.get(key));
+ }
+ }
+ }
+ firstTrans.setParameter("config", XemeliosHelper.getDocumentsModel().getSmallDOM());
+ firstTrans.setParameter("displayedDocId", docId);
+ /* Ajout d'un paramètre pour l'impression */
+ // firstTrans.setParameter("is.web", "1");
+ firstTrans.setParameter("context.path", request.getContextPath());
+
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ firstTrans.transform(new DOMSource(doc), new StreamResult(baos));
+ is.close();
+
+ final File xslFile = new File(this.getServlet().getServletContext().getRealPath("/utils/href-converter.xsl"));
+
+ tFactory = FactoryProvider.getTransformerFactory();
+ final Transformer transformer = tFactory.newTransformer(new StreamSource(xslFile));
+ transformer.setParameter("server", request.getServerName());
+ transformer.setParameter("context", request.getContextPath());
+ transformer.setParameter("port", request.getServerPort());
+ transformer.setParameter("navigationId", request.getParameter("navigationId"));
+ final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+ AttributeHelper.setPreviousView(session, request.getParameter("navigationId"), request.getServletPath() + "?" + request.getQueryString());
+ transformer.transform(new StreamSource(bais), new StreamResult(response.getOutputStream()));
+ }
+ return null;
+ }
}