From: Mathieu Baudier Date: Thu, 21 Mar 2019 08:49:36 +0000 (+0100) Subject: Improve FreeMarker support X-Git-Tag: argeo-commons-2.1.77~19 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=f8a1ec1e30180672eb9826ef47924ed43b3c6b3d Improve FreeMarker support --- diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/fm/FmUiProvider.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/fm/FmUiProvider.java index a5fc90367..c9d05e15b 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/fm/FmUiProvider.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/fm/FmUiProvider.java @@ -50,6 +50,7 @@ public class FmUiProvider implements CmsUiProvider { Map root = new HashMap<>(); if (context != null) root.put("node", new JcrModel(context)); + root.put("basePath", "./"); Template temp = cfg.getTemplate(template); StringWriter out = new StringWriter(); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/HtmlServlet.java b/org.argeo.cms/src/org/argeo/cms/internal/http/HtmlServlet.java index b4990c3f4..f997c6dec 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/HtmlServlet.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/HtmlServlet.java @@ -2,6 +2,8 @@ package org.argeo.cms.internal.http; import java.io.File; import java.io.IOException; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.security.PrivilegedExceptionAction; import java.util.HashMap; import java.util.Map; @@ -80,16 +82,19 @@ public class HtmlServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - String path = req.getPathInfo(); +// String path = req.getPathInfo(); + String path = URLDecoder.decode(req.getPathInfo(), StandardCharsets.UTF_8.name()); String servletPath = req.getServletPath(); String[] p = path.split("/"); - String basePath =servletPath+'/'+p[1]; + String basePath = servletPath + '/' + p[1]; String template = p[1] + ".ftl"; StringBuilder sb = new StringBuilder(); for (int i = 2; i < p.length; i++) sb.append('/').append(p[i]); - + String nodePath = sb.toString(); + if ("".equals(nodePath.trim())) + nodePath = "/"; // root node Session session = null; try { LoginContext lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, @@ -104,7 +109,7 @@ public class HtmlServlet extends HttpServlet { } }); - Node node = session.getNode(sb.toString()); + Node node = session.getNode(nodePath); Template t = cfg.getTemplate(template); Map root = new HashMap<>(); @@ -115,7 +120,7 @@ public class HtmlServlet extends HttpServlet { resp.setContentType("text/html"); } catch (Exception e) { - throw new CmsException("Cannot log in", e); + throw new CmsException("Cannot process template", e); } finally { JcrUtils.logoutQuietly(session); } diff --git a/org.argeo.core/src/org/argeo/fm/jcr/JcrModel.java b/org.argeo.core/src/org/argeo/fm/jcr/JcrModel.java index 5cae5c1a8..6a834142e 100644 --- a/org.argeo.core/src/org/argeo/fm/jcr/JcrModel.java +++ b/org.argeo.core/src/org/argeo/fm/jcr/JcrModel.java @@ -1,5 +1,8 @@ package org.argeo.fm.jcr; +import java.util.ArrayList; +import java.util.List; + import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.PropertyIterator; @@ -80,12 +83,23 @@ public class JcrModel implements TemplateNodeModel, TemplateHashModel { if ("jcr:properties".equals(key)) return new PropertiesModel(); if ("jcr:parent".equals(key)) - return node.getParent() != null ? new JcrModel(node.getParent()) : null; - - Property property = node.getProperty(key); - if (property == null) - return null; - return new SimpleScalar(property.getString()); + return !"/".equals(node.getPath()) ? new JcrModel(node.getParent()) : null; + + Property property; + if (!node.hasProperty(key)) { + List props = new ArrayList<>(); + PropertyIterator pit = node.getProperties("*:" + key); + while (pit.hasNext()) + props.add(pit.nextProperty()); + if (props.size() == 0) + return null; + if (props.size() > 1) + throw new TemplateModelException( + "Too many properties match " + key + " (" + props + "), use prefix with \\: escape"); + property = props.get(0); + } else + property = node.getProperty(key); + return propertyValues(property); } catch (RepositoryException e) { throw new TemplateModelException("Cannot get property " + key + " of " + node, e); }