+++ /dev/null
-package org.argeo.cms.script;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.ui.fm.FmUiProvider;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-public class Html {
- private String template;
- private Node context;
-
- private Control control;
-
- public Html(Composite parent, String template, Node context) throws RepositoryException {
- this.template = template;
- this.context = context;
- this.control = new FmUiProvider(this.template).createUi(parent, context);
- }
-
- public Html(Composite parent, String template) throws RepositoryException {
- this(parent, template, null);
- }
-
- public String getTemplate() {
- return template;
- }
-
- public Node getContext() {
- return context;
- }
-
- public Control getControl() {
- return control;
- }
-
-}
+++ /dev/null
-package org.argeo.cms.ui.fm;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.fm.jcr.JcrModel;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import freemarker.template.TemplateExceptionHandler;
-
-public class FmUiProvider implements CmsUiProvider {
- static Configuration cfg;
- static {
- try {
- cfg = new Configuration(Configuration.VERSION_2_3_28);
- cfg.setDirectoryForTemplateLoading(new File(System.getProperty("user.home") + File.separator + "dev"
- + File.separator + "work" + File.separator + "ftl"));
- cfg.setDefaultEncoding("UTF-8");
- cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
- cfg.setLogTemplateExceptions(false);
- cfg.setWrapUncheckedExceptions(true);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- private String template;
-
- public FmUiProvider(String template) {
- this.template = template;
- }
-
- @Override
- public Control createUi(Composite parent, Node context) throws RepositoryException {
- Browser browser = new Browser(parent, SWT.NONE);
- try {
- 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();
- temp.process(root, out);
- browser.setText(out.toString());
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- return browser;
- }
-
-}
+++ /dev/null
-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;
-
-import javax.jcr.Node;
-import javax.jcr.Repository;
-import javax.jcr.Session;
-import javax.security.auth.Subject;
-import javax.security.auth.login.LoginContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.argeo.cms.CmsException;
-import org.argeo.cms.auth.HttpRequestCallbackHandler;
-import org.argeo.fm.jcr.JcrModel;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.node.NodeConstants;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-
-import freemarker.template.Configuration;
-import freemarker.template.SimpleScalar;
-import freemarker.template.Template;
-import freemarker.template.TemplateExceptionHandler;
-
-public class HtmlServlet extends HttpServlet {
- private static final long serialVersionUID = 2083925371199357045L;
- static String base = System.getProperty("user.home") + File.separator + "dev" + File.separator + "work"
- + File.separator + "ftl";
- static Configuration cfg;
- static {
- try {
- cfg = new Configuration(Configuration.VERSION_2_3_28);
- cfg.setDirectoryForTemplateLoading(new File(base));
- cfg.setDefaultEncoding("UTF-8");
- cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
- cfg.setLogTemplateExceptions(false);
- cfg.setWrapUncheckedExceptions(true);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext();
- private ServiceTracker<Repository, Repository> repositorySt;
-
- private Repository repository;
-
- @Override
- public void init() throws ServletException {
- repositorySt = new ServiceTracker<Repository, Repository>(bc, Repository.class, null) {
-
- @Override
- public Repository addingService(ServiceReference<Repository> reference) {
- String cn = reference.getProperty(NodeConstants.CN).toString();
- Repository repo = super.addingService(reference);
- if (NodeConstants.NODE.equals(cn))
- repository = repo;
- return repo;
- }
-
- };
- repositorySt.open();
- }
-
- @Override
- public void destroy() {
- if (repositorySt != null)
- repositorySt.close();
- }
-
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-// 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 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,
- new HttpRequestCallbackHandler(req, resp));
- lc.login();
- session = Subject.doAs(lc.getSubject(), new PrivilegedExceptionAction<Session>() {
-
- @Override
- public Session run() throws Exception {
- Session session = repository.login();
- return session;
- }
- });
-
- Node node = session.getNode(nodePath);
-
- Template t = cfg.getTemplate(template);
- Map<String, Object> root = new HashMap<>();
- root.put("node", new JcrModel(node));
- root.put("basePath", new SimpleScalar(basePath));
-
- t.process(root, resp.getWriter());
-
- resp.setContentType("text/html");
- } catch (Exception e) {
- throw new CmsException("Cannot process template", e);
- } finally {
- JcrUtils.logoutQuietly(session);
- }
- }
-
-}
+++ /dev/null
-package org.argeo.fm;
-
-public class Animal {
- String size;
- int price;
-
- public Animal(String size, int price) {
- super();
- this.size = size;
- this.price = price;
- }
-
- public String getSize() {
- return size;
- }
-
- public void setSize(String size) {
- this.size = size;
- }
-
- public int getPrice() {
- return price;
- }
-
- public void setPrice(int price) {
- this.price = price;
- }
-
-}
\ No newline at end of file
+++ /dev/null
-package org.argeo.fm;
-
-/**
- * Product bean; note that it must be a public class!
- */
-public class Product {
-
- private String url;
- private String name;
-
- // As per the JavaBeans spec., this defines the "url" bean property
- // It must be public!
- public String getUrl() {
- return url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- // As per the JavaBean spec., this defines the "name" bean property
- // It must be public!
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
-}
\ No newline at end of file
+++ /dev/null
-package org.argeo.fm;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Writer;
-import java.util.HashMap;
-import java.util.Map;
-
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import freemarker.template.TemplateExceptionHandler;
-
-public class TestFreeMarker {
- static String base = System.getProperty("user.home") + File.separator + "dev" + File.separator + "work"
- + File.separator + "ftl";
- static Configuration cfg;
- static {
- try {
- cfg = new Configuration(Configuration.VERSION_2_3_28);
- cfg.setDirectoryForTemplateLoading(new File(base));
- cfg.setDefaultEncoding("UTF-8");
- cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
- cfg.setLogTemplateExceptions(false);
- cfg.setWrapUncheckedExceptions(true);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- public static void main(String[] args) {
- if (args.length == 0) {
- System.err.println("Usage: <template name> (in " + base + ")");
- }
- String template = args[0];
- try {
- /* Create a data-model */
- Map<String, Object> root = new HashMap<>();
- root.put("user", "Big Joe");
- Product latest = new Product();
- latest.setUrl("products/greenmouse.html");
- latest.setName("green mouse");
- root.put("latestProduct", latest);
-
- root.put("message", "It's a test");
-
- Map<String, Animal> animals = new HashMap<>();
- animals.put("mouse", new Animal("small", 50));
- animals.put("elephant", new Animal("big", 2000));
- animals.put("dog", new Animal("medium", 150));
- root.put("animals", animals);
-
- /* Get the template (uses cache internally) */
- Template temp = cfg.getTemplate(template);
-
- /* Merge data-model with template */
- String target = base + File.separator + template + ".html";
- Writer out = new FileWriter(target);
- temp.process(root, out);
- out.flush();
- System.out.println("Wrote " + target);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
-}
+++ /dev/null
-package org.argeo.fm.jcr;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.Property;
-import javax.jcr.PropertyIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Value;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateCollectionModel;
-import freemarker.template.TemplateHashModel;
-import freemarker.template.TemplateHashModelEx2;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-import freemarker.template.TemplateModelIterator;
-import freemarker.template.TemplateNodeModel;
-import freemarker.template.TemplateSequenceModel;
-
-public class JcrModel implements TemplateNodeModel, TemplateHashModel {
- private final Node node;
-
- public JcrModel(Node node) {
- this.node = node;
- }
-
- @Override
- public TemplateSequenceModel getChildNodes() throws TemplateModelException {
- try {
- return new NodeIteratorModel(node.getNodes());
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot list children of " + node, e);
- }
- }
-
- @Override
- public String getNodeName() throws TemplateModelException {
- try {
- return node.getName();
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot get name of " + node, e);
- }
- }
-
- @Override
- public String getNodeNamespace() throws TemplateModelException {
- // TODO find out namespace
- return null;
- }
-
- @Override
- public String getNodeType() throws TemplateModelException {
- try {
- return node.getPrimaryNodeType().getName();
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot get node type of " + node, e);
- }
- }
-
- @Override
- public TemplateNodeModel getParentNode() throws TemplateModelException {
- try {
- Node parent = node.getParent();
- if (parent == null)
- return null;
- return new JcrModel(parent);
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot get parent of " + node, e);
- }
- }
-
- // HASH
-
- @Override
- public TemplateModel get(String key) throws TemplateModelException {
- try {
- if ("jcr:path".equals(key))
- return new SimpleScalar(node.getPath());
- if ("jcr:name".equals(key))
- return new SimpleScalar(node.getName());
- if ("jcr:properties".equals(key))
- return new PropertiesModel();
- if ("jcr:parent".equals(key))
- return !"/".equals(node.getPath()) ? new JcrModel(node.getParent()) : null;
-
- Property property = null;
- if (!node.hasProperty(key)) {
- List<Property> props = new ArrayList<>();
- PropertyIterator pit = node.getProperties("*:" + key);
- while (pit.hasNext())
- props.add(pit.nextProperty());
- if (props.size() > 1)
- throw new TemplateModelException(
- "Too many properties match " + key + " (" + props + "), use prefix with \\: escape");
- if (!props.isEmpty())
- property = props.get(0);
- } else
- property = node.getProperty(key);
- if (property != null)
- return propertyValues(property);
-
- Node child = null;
- if (!node.hasNode(key)) {
- List<Node> children = new ArrayList<>();
- NodeIterator nit = node.getNodes("*:" + key);
- while (nit.hasNext())
- children.add(nit.nextNode());
- if (children.size() > 1)
- throw new TemplateModelException(
- "Too many properties match " + key + " (" + children + "), use prefix with \\: escape");
- if (!children.isEmpty())
- child = children.get(0);
- } else
- child = node.getNode(key);
- if (child != null)
- return new JcrModel(child);
- return null;
-
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot get property " + key + " of " + node, e);
- }
- }
-
- @Override
- public boolean isEmpty() throws TemplateModelException {
- return false;
- }
-
- public Node getNode() {
- return node;
- }
-
- protected TemplateModel propertyValues(Property property) throws RepositoryException {
- if (!property.isMultiple())
- return new SimpleScalar(property.getString());
- Value[] values = property.getValues();
- StringBuilder sb = new StringBuilder();
- for (Value value : values) {
- sb.append(value.getString()).append('\n');
- }
- return new SimpleScalar(sb.toString());
- }
-
- class PropertiesModel implements TemplateHashModelEx2 {
- @Override
- public TemplateModel get(String key) throws TemplateModelException {
- return JcrModel.this.get(key);
- }
-
- @Override
- public boolean isEmpty() throws TemplateModelException {
- return false;
- }
-
- @Override
- public TemplateCollectionModel keys() throws TemplateModelException {
- try {
- PropertyIterator pit = node.getProperties();
- return new TemplateCollectionModel() {
-
- @Override
- public TemplateModelIterator iterator() throws TemplateModelException {
- return new TemplateModelIterator() {
-
- @Override
- public TemplateModel next() throws TemplateModelException {
- try {
- return new SimpleScalar(pit.nextProperty().getName());
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot list properties of " + node, e);
- }
- }
-
- @Override
- public boolean hasNext() throws TemplateModelException {
- return pit.hasNext();
- }
- };
- }
- };
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot list properties of " + node, e);
- }
- }
-
- @Override
- public int size() throws TemplateModelException {
- try {
- PropertyIterator pit = node.getProperties();
- return (int) pit.getSize();
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot list properties of " + node, e);
- }
- }
-
- @Override
- public TemplateCollectionModel values() throws TemplateModelException {
- try {
- PropertyIterator pit = node.getProperties();
- return new TemplateCollectionModel() {
-
- @Override
- public TemplateModelIterator iterator() throws TemplateModelException {
- return new TemplateModelIterator() {
-
- @Override
- public TemplateModel next() throws TemplateModelException {
- try {
- return propertyValues(pit.nextProperty());
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot list properties of " + node, e);
- }
- }
-
- @Override
- public boolean hasNext() throws TemplateModelException {
- return pit.hasNext();
- }
- };
- }
- };
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot list properties of " + node, e);
- }
- }
-
- @Override
- public KeyValuePairIterator keyValuePairIterator() throws TemplateModelException {
- try {
- PropertyIterator pit = node.getProperties();
- return new KeyValuePairIterator() {
-
- @Override
- public boolean hasNext() throws TemplateModelException {
- return pit.hasNext();
- }
-
- @Override
- public KeyValuePair next() throws TemplateModelException {
- Property property = pit.nextProperty();
- return new KeyValuePair() {
-
- @Override
- public TemplateModel getValue() throws TemplateModelException {
- try {
- return propertyValues(property);
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot list properties of " + node, e);
- }
- }
-
- @Override
- public TemplateModel getKey() throws TemplateModelException {
- try {
- return new SimpleScalar(property.getName());
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot list properties of " + node, e);
- }
- }
- };
- }
- };
- } catch (RepositoryException e) {
- throw new TemplateModelException("Cannot list properties of " + node, e);
- }
- }
-
- }
-}
+++ /dev/null
-package org.argeo.fm.jcr;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-import freemarker.template.TemplateSequenceModel;
-
-public class NodeIteratorModel implements TemplateSequenceModel {
- private final NodeIterator nodeIterator;
-
- private final List<Node> nodes;
- private int size;
-
- public NodeIteratorModel(NodeIterator nodeIterator) {
- super();
- this.nodeIterator = nodeIterator;
- this.size = (int) nodeIterator.getSize();
- this.nodes = new ArrayList<>(this.size);
- // TODO optimize with lazy loading
- while (this.nodeIterator.hasNext()) {
- Node node = this.nodeIterator.nextNode();
- nodes.add(node);
- }
- this.size = nodes.size();
- }
-
- @Override
- public TemplateModel get(int index) throws TemplateModelException {
- return new JcrModel(nodes.get(index));
- }
-
- @Override
- public int size() throws TemplateModelException {
- return size;
- }
-
-}