From 6ea0d249c8ad01b0d6a84e5fb893bdf248391c21 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 20 Mar 2019 12:21:20 +0100 Subject: [PATCH] Start using FreeMarker --- .../src/org/argeo/cms/script/Html.java | 38 ++++++++ .../src/org/argeo/cms/ui/fm/FmUiProvider.java | 66 ++++++++++++++ org.argeo.core/bnd.bnd | 2 + org.argeo.core/src/org/argeo/fm/Product.java | 31 +++++++ .../src/org/argeo/fm/TestFreeMarker.java | 60 +++++++++++++ .../src/org/argeo/fm/jcr/JcrModel.java | 86 +++++++++++++++++++ .../org/argeo/fm/jcr/NodeIteratorModel.java | 42 +++++++++ 7 files changed, 325 insertions(+) create mode 100644 org.argeo.cms.ui/src/org/argeo/cms/script/Html.java create mode 100644 org.argeo.cms.ui/src/org/argeo/cms/ui/fm/FmUiProvider.java create mode 100644 org.argeo.core/src/org/argeo/fm/Product.java create mode 100644 org.argeo.core/src/org/argeo/fm/TestFreeMarker.java create mode 100644 org.argeo.core/src/org/argeo/fm/jcr/JcrModel.java create mode 100644 org.argeo.core/src/org/argeo/fm/jcr/NodeIteratorModel.java diff --git a/org.argeo.cms.ui/src/org/argeo/cms/script/Html.java b/org.argeo.cms.ui/src/org/argeo/cms/script/Html.java new file mode 100644 index 000000000..e9f4f6967 --- /dev/null +++ b/org.argeo.cms.ui/src/org/argeo/cms/script/Html.java @@ -0,0 +1,38 @@ +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; + } + +} 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 new file mode 100644 index 000000000..a5fc90367 --- /dev/null +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/fm/FmUiProvider.java @@ -0,0 +1,66 @@ +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 root = new HashMap<>(); + if (context != null) + root.put("node", new JcrModel(context)); + + 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; + } + +} diff --git a/org.argeo.core/bnd.bnd b/org.argeo.core/bnd.bnd index 8f0929c34..2df657c82 100644 --- a/org.argeo.core/bnd.bnd +++ b/org.argeo.core/bnd.bnd @@ -1 +1,3 @@ #Main-Class: org.argeo.sync.cli.Sync + +Import-Package: *;resolution:=optional \ No newline at end of file diff --git a/org.argeo.core/src/org/argeo/fm/Product.java b/org.argeo.core/src/org/argeo/fm/Product.java new file mode 100644 index 000000000..a57ae0d26 --- /dev/null +++ b/org.argeo.core/src/org/argeo/fm/Product.java @@ -0,0 +1,31 @@ +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 diff --git a/org.argeo.core/src/org/argeo/fm/TestFreeMarker.java b/org.argeo.core/src/org/argeo/fm/TestFreeMarker.java new file mode 100644 index 000000000..a0c1c48e9 --- /dev/null +++ b/org.argeo.core/src/org/argeo/fm/TestFreeMarker.java @@ -0,0 +1,60 @@ +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: