Improve FreeMarker support
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 21 Mar 2019 08:49:36 +0000 (09:49 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 21 Mar 2019 08:49:36 +0000 (09:49 +0100)
org.argeo.cms.ui/src/org/argeo/cms/ui/fm/FmUiProvider.java
org.argeo.cms/src/org/argeo/cms/internal/http/HtmlServlet.java
org.argeo.core/src/org/argeo/fm/jcr/JcrModel.java

index a5fc903676ef7380362215fc254b5b6fb55f8ec5..c9d05e15b51d74b6ad6665cdb81a2ed3aafeaa03 100644 (file)
@@ -50,6 +50,7 @@ public class FmUiProvider implements CmsUiProvider {
                        Map<String, Object> root = new HashMap<>();
                        if (context != null)
                                root.put("node", new JcrModel(context));
+                       root.put("basePath", "./");
 
                        Template temp = cfg.getTemplate(template);
                        StringWriter out = new StringWriter();
index b4990c3f429635193804b11c138c2bb3d7171a13..f997c6dec2a60b4989a25d6a8a112f3353aab1b5 100644 (file)
@@ -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<String, Object> 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);
                }
index 5cae5c1a86394737dd9bc6bff2128266fed6af91..6a834142e4b963c7cb18f98a05dd3e1e13a4e9ed 100644 (file)
@@ -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<Property> 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);
                }