*/
package fr.gouv.finances.dgfip.xemelios.web2.navigate;
-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.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.io.InputStream;
import java.util.ArrayList;
-import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
+
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 net.sf.saxon.xpath.XPathFactoryImpl;
+
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.w3c.dom.Document;
+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.CustomURIResolver;
+import fr.gouv.finances.dgfip.xemelios.auth.UnauthorizedException;
+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 NavigateAction extends StdDispatchAction {
- private static final Logger logger = Logger.getLogger(NavigateAction.class);
+ private static final Logger logger = Logger.getLogger(NavigateAction.class);
+
+ @Override
+ public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
+ logger.debug(request.getContextPath() + request.getQueryString());
+ HttpSession session = request.getSession();
+ // StringBuilder sb = new StringBuilder();
+ // sb.append("session is ").append(session.isNew()?"":"not ").append("new\n");
+ // sb.append("sesssion contains :\n");
+ // for(Enumeration<String> enumer = session.getAttributeNames();enumer.hasMoreElements();) {
+ // String key = enumer.nextElement();
+ // sb.append("\t").append(key).append("=").append(session.getAttribute(key).toString()).append("\n");
+ // }
+ // logger.debug(sb.toString());
+ XemeliosUser user = AttributeHelper.getUser(session);
+ XPathFactory xpf = new XPathFactoryImpl();
+
+ String docId = request.getParameter("docId");
+ String etatId = request.getParameter("etatId");
+ String elementId = request.getParameter("elementId");
+ String collectivite = request.getParameter("collectivite");
+ String budget = request.getParameter("budget");
+ String path = request.getParameter("path");
+ String sp1 = request.getParameter("sp1");
+ String sp2 = request.getParameter("sp2");
+ String sp3 = request.getParameter("sp3");
+ String[] xslParamsArray = request.getParameterValues("xsl:param");
+
+ if (docId == null || docId.length() == 0)
+ throw new IllegalArgumentException("parameter docId is not specified");
+
+ DocumentModel documentModel = XemeliosHelper.getDocumentModel(docId);
+ if (documentModel == null)
+ throw new IllegalArgumentException(docId + " is not a valid document ID");
+
+ if (etatId == null || etatId.length() == 0)
+ throw new IllegalArgumentException("parameter etatId is not specified");
+
+ EtatModel etatModel = documentModel.getEtatById(etatId);
+ if (etatModel == null)
+ throw new IllegalArgumentException(etatId + " is not a valid etat ID within " + documentModel.getTitre());
+
+ ElementModel elementModel = null;
+ if (elementId == null || elementId.length() == 0) {
+ elementModel = etatModel.getBrowsableElement();
+ if (elementModel == null)
+ throw new IllegalArgumentException("parameter elementId is not specified and " + documentModel.getId() + "." + etatModel.getId() + " does not define a browsable element");
+ } else {
+ elementModel = etatModel.getElementById(elementId);
+ }
+
+ if (elementModel == null)
+ throw new IllegalArgumentException(elementId + " is not a valid element ID within " + documentModel.getTitre() + " / " + etatModel.getTitre());
+ if (collectivite == null || collectivite.length() == 0)
+ throw new IllegalArgumentException("parameter collectivite is not specified");
+
+
+ // TODO: mettre la hierarchie des collectivites
+ // TODO: creer une getCollectiviteByCode
+ Vector<Pair> collectivites = DataLayerManager.getImplementation().getCollectivites(documentModel, null, user);
+ Pair coll = null;
+ for (Pair p : collectivites) {
+ if (p.key.equals(collectivite)) {
+ coll = p;
+ break;
+ }
+ }
+ if (coll == null)
+ throw new UnauthorizedException("La collectivité " + collectivite + " n'est pas dans votre périmètre d'autorisation");
+
+ if (budget == null || budget.length() == 0)
+ throw new IllegalArgumentException("parameter budget is no specified");
+
+ Vector<Pair> budgets = DataLayerManager.getImplementation().getBudgets(documentModel, coll, user);
+ Pair budg = null;
+ for (Pair p : budgets) {
+ if (p.key.equals(budget)) {
+ budg = p;
+ break;
+ }
+ }
+ if (budg == null)
+ throw new IllegalArgumentException(budget + " is not a valid budget ID within collectivite " + collectivite);
+ String documentId = null;
+ String errorMessage = null;
+ if (path == null) {
+ ArrayList<String> documents = DataLayerManager.getImplementation().getDocumentListFromSpecialKeys(elementModel, coll.key, budg.key, sp1, sp2, null, user);
+ if (documents.size() == 0) {
+ errorMessage = "Le document est introuvable";
+ } else if (documents.size() > 1 && !etatModel.isMultiPage()) {
+ errorMessage = "Plusieurs documents répondant à ces critères ont été trouvés.";
+ } else {
+ documentId = documents.get(0);
+ }
+ } else {
+ // config XPath
+ String _path = new String(path);
+ int pos = _path.indexOf('%');
+ while (pos >= 0) {
+ int closing = _path.indexOf('%', pos + 1);
+ if (closing < 0)
+ throw new RuntimeException("a '%' is not closed! : " + _path);
+ String paramName = _path.substring(pos + 1, closing);
+ if (request.getParameter(paramName) != null && request.getParameter(paramName).length() > 0) {
+ String begin = _path.substring(0, pos);
+ String end = _path.substring(closing + 1);
+ String replacedValue = request.getParameter(paramName);
+ _path = begin.concat(replacedValue).concat(end);
+ pos = _path.indexOf('%', pos);
+ } else {
+ pos = _path.indexOf('%', closing);
+ }
+ }
+ path = _path;
- @Override
- public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
- logger.debug(request.getContextPath()+request.getQueryString());
- HttpSession session = request.getSession();
-//StringBuilder sb = new StringBuilder();
-//sb.append("session is ").append(session.isNew()?"":"not ").append("new\n");
-//sb.append("sesssion contains :\n");
-//for(Enumeration<String> enumer = session.getAttributeNames();enumer.hasMoreElements();) {
-// String key = enumer.nextElement();
-// sb.append("\t").append(key).append("=").append(session.getAttribute(key).toString()).append("\n");
-//}
-//logger.debug(sb.toString());
- XemeliosUser user = AttributeHelper.getUser(session);
- XPathFactory xpf = new XPathFactoryImpl();
+ if (path != null && path.startsWith("[")) {
+ path = elementModel.getPath().getFormattedPath() + path;
+ }
+ ArrayList<String> documents = DataLayerManager.getImplementation().getDocumentListFromXPath(elementModel, coll.key, budg.key, sp1, sp2, null, path, user);
+ if (documents.size() == 0) {
+ // errorMessage = "Le document est introuvable";
+ errorMessage = "Aucun " + documentModel.getEtatById(etatId).getTitre() + " trouvé";
+ } else if (documents.size() > 1 && !etatModel.isMultiPage()) {
+ errorMessage = "Plusieurs documents répondant à ces critères ont été trouvés.";
+ } else {
+ documentId = documents.get(0);
+ }
+ }
+ if (documentId != null) {
+ // logger.debug("found "+documentId);
+ Document doc = DataLayerManager.getImplementation().getDocumentAsDom(etatModel, coll, budg, documentId, user);
+ File f = Xslt.getFile(documentModel, etatModel, elementModel, doc);
+ InputStream is = IoUtils.getInputStream(f.getPath());
+ Hashtable<String, Object> parameters = new Hashtable<String, Object>();
+ if (xslParamsArray != null) {
+ for (String xslParam : xslParamsArray) {
+ int virg = xslParam.indexOf(',');
+ String pName = xslParam.substring(1, virg);
+ String pValue = xslParam.substring(virg + 1, xslParam.length() - 1);
- String docId = request.getParameter("docId");
- String etatId = request.getParameter("etatId");
- String elementId = request.getParameter("elementId");
- String collectivite = request.getParameter("collectivite");
- String budget = request.getParameter("budget");
- String path = request.getParameter("path");
- String sp1 = request.getParameter("sp1");
- String sp2 = request.getParameter("sp2");
- String sp3 = request.getParameter("sp3");
- String[] xslParamsArray = request.getParameterValues("xsl:param");
-
- if(docId==null || docId.length()==0) throw new IllegalArgumentException("parameter docId is not specified");
- DocumentModel documentModel = XemeliosHelper.getDocumentModel(docId);
- if(documentModel==null) throw new IllegalArgumentException(docId+" is not a valid document ID");
- if(etatId==null || etatId.length()==0) throw new IllegalArgumentException("parameter etatId is not specified");
- EtatModel etatModel = documentModel.getEtatById(etatId);
- if(etatModel==null) throw new IllegalArgumentException(etatId+" is not a valid etat ID within "+documentModel.getTitre());
- ElementModel elementModel = null;
- if(elementId==null || elementId.length()==0) {
- elementModel = etatModel.getBrowsableElement();
- if(elementModel==null)
- throw new IllegalArgumentException("parameter elementId is not specified and "+documentModel.getId()+"."+etatModel.getId()+" does not define a browsable element");
- } else {
- elementModel = etatModel.getElementById(elementId);
- }
- if(elementModel==null) throw new IllegalArgumentException(elementId+" is not a valid element ID within "+documentModel.getTitre()+" / "+etatModel.getTitre());
- if(collectivite==null || collectivite.length()==0) throw new IllegalArgumentException("parameter collectivite is not specified");
- // TODO: mettre la hierarchie des collectivites
- // TODO: creer une getCollectiviteByCode
- Vector<Pair> collectivites = DataLayerManager.getImplementation().getCollectivites(documentModel, null, user);
- Pair coll = null;
- for(Pair p:collectivites) {
- if(p.key.equals(collectivite)) {
- coll=p;
- break;
- }
- }
- if(coll==null) throw new IllegalArgumentException(collectivite+" is not a valid collectivite ID for "+documentModel.getId());
- if(budget==null || budget.length()==0) throw new IllegalArgumentException("parameter budget is no specified");
- Vector<Pair> budgets = DataLayerManager.getImplementation().getBudgets(documentModel, coll, user);
- Pair budg = null;
- for(Pair p:budgets) {
- if(p.key.equals(budget)) {
- budg = p;
- break;
- }
- }
- if(budg==null) throw new IllegalArgumentException(budget+" is not a valid budget ID within collectivite "+collectivite);
- String documentId = null;
- String errorMessage = null;
- if(path==null) {
- ArrayList<String> documents = DataLayerManager.getImplementation().getDocumentListFromSpecialKeys(elementModel,coll.key,budg.key,sp1,sp2,null,user);
- if(documents.size()==0) {
- errorMessage = "Le document est introuvable";
- } else if(documents.size()>1 && !etatModel.isMultiPage()) {
- errorMessage = "Plusieurs documents répondant à ces critères ont été trouvés.";
- } else {
- documentId = documents.get(0);
- }
- } else {
-// config XPath
- String _path = new String(path);
- int pos = _path.indexOf('%');
- while(pos>=0) {
- int closing = _path.indexOf('%', pos+1);
- if(closing<0) throw new RuntimeException("a '%' is not closed! : "+_path);
- String paramName = _path.substring(pos+1, closing);
- if(request.getParameter(paramName)!=null && request.getParameter(paramName).length()>0) {
- String begin = _path.substring(0,pos);
- String end = _path.substring(closing+1);
- String replacedValue = request.getParameter(paramName);
- _path = begin.concat(replacedValue).concat(end);
- pos = _path.indexOf('%', pos);
- } else {
- pos = _path.indexOf('%', closing);
- }
- }
- path = _path;
+ int pos2 = pValue.indexOf('%'); // interprétation des xsl:param avec valeurs de formulaires
+ while (pos2 >= 0) {
+ int closing = pValue.indexOf('%', pos2 + 1);
+ if (closing < 0)
+ throw new RuntimeException("a '%' is not closed! : " + pValue);
+ String paramNam = pValue.substring(pos2 + 1, closing);
+ if (request.getParameter(paramNam) != null) {
+ String begin = pValue.substring(0, pos2);
+ String end = pValue.substring(closing + 1);
+ String replacedValue = request.getParameter(paramNam);
+ pValue = begin.concat(replacedValue).concat(end);
+ pos2 = pValue.indexOf('%', pos2);
+ } else {
+ pos2 = pValue.indexOf('%', closing);
+ }
+ }
+ parameters.put(pName, pValue);
+ logger.debug("Adding xsl:param(" + pName + "," + pValue + ")");
+ }
+ }
+ parameters.put("browser-destination", "internal"); // il faut une destination "internal" pour avoir les liens.
+ XPath xp = xpf.newXPath();
+ xp.setNamespaceContext(documentModel.getNamespaces());
+ 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, coll, idRepository, user);
+ if (repository != null)
+ parameters.put("repository", repository);
+ // on passe la config
+ parameters.put("config", XemeliosHelper.getDocumentsModel().getSmallDOM());
+ parameters.put("collectivite", collectivite);
+ parameters.put("budget", budget);
+ TransformerFactory tFactory = FactoryProvider.getTransformerFactory();
+ tFactory.setURIResolver(new CustomURIResolver(tFactory.getURIResolver(), f.getParentFile().toURI().toURL().toExternalForm()));
+ Transformer transformer = tFactory.newTransformer(new StreamSource(f));
+ for (String pName : parameters.keySet()) {
+ logger.info("passing xsl param: (" + pName + "," + parameters.get(pName) + ")");
+ transformer.setParameter(pName, parameters.get(pName));
+ }
+ /* Ajout d'un paramètre pour l'impression */
+ // transformer.setParameter("is.web", "1");
+ transformer.setParameter("context.path", request.getContextPath());
- if(path!=null && path.startsWith("[")) {
- path = elementModel.getPath().getFormattedPath()+path;
- }
- ArrayList<String> documents = DataLayerManager.getImplementation().getDocumentListFromXPath(elementModel,coll.key,budg.key,sp1,sp2,null,path, user);
- if(documents.size()==0) {
- //errorMessage = "Le document est introuvable";
- errorMessage = "Aucun "+documentModel.getEtatById(etatId).getTitre()+" trouvé";
- } else if(documents.size()>1 && !etatModel.isMultiPage()) {
- errorMessage = "Plusieurs documents répondant à ces critères ont été trouvés.";
- } else {
- documentId = documents.get(0);
- }
- }
- if(documentId!=null) {
-//logger.debug("found "+documentId);
- Document doc = DataLayerManager.getImplementation().getDocumentAsDom(etatModel,coll,budg,documentId, user);
- File f = Xslt.getFile(documentModel, etatModel, elementModel, doc);
- InputStream is = IoUtils.getInputStream(f.getPath());
- Hashtable<String,Object> parameters = new Hashtable<String,Object>();
- if(xslParamsArray!=null) {
- for(String xslParam:xslParamsArray) {
- int virg = xslParam.indexOf(',');
- String pName = xslParam.substring(1,virg);
- String pValue = xslParam.substring(virg+1,xslParam.length()-1);
-
- int pos2 = pValue.indexOf('%'); // interprétation des xsl:param avec valeurs de formulaires
- while(pos2>=0) {
- int closing = pValue.indexOf('%', pos2+1);
- if(closing<0) throw new RuntimeException("a '%' is not closed! : "+pValue);
- String paramNam = pValue.substring(pos2+1, closing);
- if(request.getParameter(paramNam)!=null) {
- String begin = pValue.substring(0,pos2);
- String end = pValue.substring(closing+1);
- String replacedValue = request.getParameter(paramNam);
- pValue = begin.concat(replacedValue).concat(end);
- pos2 = pValue.indexOf('%', pos2);
- } else {
- pos2 = pValue.indexOf('%', closing);
- }
- }
- parameters.put(pName,pValue);
- logger.debug("Adding xsl:param("+pName+","+pValue+")");
- }
- }
- parameters.put("browser-destination", "internal"); // il faut une destination "internal" pour avoir les liens.
- XPath xp = xpf.newXPath();
- xp.setNamespaceContext(documentModel.getNamespaces());
- 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, coll,idRepository,user);
- if(repository!=null)
- parameters.put("repository", repository);
- // on passe la config
- parameters.put("config",XemeliosHelper.getDocumentsModel().getSmallDOM());
- parameters.put("collectivite",collectivite);
- parameters.put("budget",budget);
- TransformerFactory tFactory = FactoryProvider.getTransformerFactory();
- tFactory.setURIResolver(new CustomURIResolver(tFactory.getURIResolver(), f.getParentFile().toURI().toURL().toExternalForm()));
- Transformer transformer = tFactory.newTransformer(new StreamSource(f));
- for(String pName:parameters.keySet()) {
- logger.info("passing xsl param: ("+pName+","+parameters.get(pName)+")");
- transformer.setParameter(pName, parameters.get(pName));
- }
- /* Ajout d'un paramètre pour l'impression*/
-// transformer.setParameter("is.web", "1");
- transformer.setParameter("context.path", request.getContextPath());
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- transformer.transform(new DOMSource(doc), new StreamResult(baos));
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ transformer.transform(new DOMSource(doc), new StreamResult(baos));
- File xslFile = new File(getServlet().getServletContext().getRealPath("/utils/href-converter.xsl"));
+ File xslFile = new File(getServlet().getServletContext().getRealPath("/utils/href-converter.xsl"));
- tFactory = FactoryProvider.getTransformerFactory();
- Transformer secondTransformer = tFactory.newTransformer(new StreamSource(xslFile));
- secondTransformer.setParameter("server",request.getServerName());
- secondTransformer.setParameter("context",request.getContextPath());
- secondTransformer.setParameter("port",request.getServerPort());
- secondTransformer.setParameter("navigationId", request.getParameter("navigationId"));
- ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
- AttributeHelper.setPreviousView(session, request.getParameter("navigationId"), request.getServletPath()+"?"+request.getQueryString());
- secondTransformer.transform(new StreamSource(bais), new StreamResult(response.getOutputStream()));
- } else {
- String url = AttributeHelper.getPreviousView(session,request.getParameter("navigationId")).concat("&xsl:param=(error.message,").concat(StringEscapeUtils.escapeJavaScript(errorMessage)).concat(")");
- return new ActionForward(url, true);
- }
- return null;
- }
+ tFactory = FactoryProvider.getTransformerFactory();
+ Transformer secondTransformer = tFactory.newTransformer(new StreamSource(xslFile));
+ secondTransformer.setParameter("server", request.getServerName());
+ secondTransformer.setParameter("context", request.getContextPath());
+ secondTransformer.setParameter("port", request.getServerPort());
+ secondTransformer.setParameter("navigationId", request.getParameter("navigationId"));
+ ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+ AttributeHelper.setPreviousView(session, request.getParameter("navigationId"), request.getServletPath() + "?" + request.getQueryString());
+ secondTransformer.transform(new StreamSource(bais), new StreamResult(response.getOutputStream()));
+ } else {
+ String url = AttributeHelper.getPreviousView(session, request.getParameter("navigationId")).concat("&xsl:param=(error.message,").concat(StringEscapeUtils.escapeJavaScript(errorMessage)).concat(")");
+ return new ActionForward(url, true);
+ }
+ return null;
+ }
}