From bbc2890dcc4e1c499d2d993162ba6c56c9b06cdd Mon Sep 17 00:00:00 2001 From: arlo Date: Tue, 13 Jan 2015 09:47:18 -0600 Subject: [PATCH 1/2] Adding support for guice modules to add custom functions to soy templates --- .gitignore | 2 ++ README.md | 2 ++ pom.xml | 2 +- src/main/java/com/papercut/silken/Config.java | 13 +++++++-- .../com/papercut/silken/ModuleProvider.java | 19 ++++++++++++ .../com/papercut/silken/NamespaceSet.java | 16 ++++++---- .../com/papercut/silken/SilkenServlet.java | 29 +++++++++++++------ 7 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/papercut/silken/ModuleProvider.java diff --git a/.gitignore b/.gitignore index 0e3ca6f..a3735a6 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ /target /bin /.gradle +/.idea +/silken.iml /build diff --git a/README.md b/README.md index 98b2d5f..2e6d08d 100644 --- a/README.md +++ b/README.md @@ -590,6 +590,8 @@ pre-compile. contain/reference ``$CLASSPATH`` and ``$WEBROOT``. **Default**: *$CLASSPATH:$WEBROOT/templates:$WEBROOT/WEB-INF/templates* +```moduleProvider``` - Provide a custom iterable of Guice modules used in generation. ***Default***: *none* + ##Injecting Configuration and Resolvers at Runtime (Advanced) In addition to using Servlet Init Parameters, configuration can be modified in diff --git a/pom.xml b/pom.xml index f581fd4..3c305ec 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.papercut.silken silken jar - 2013-03-05 + 2015-01-13 silken https://github.com/codedance/silken Silken - a nicer tasting Soy Tofu (Google Closure Templates) diff --git a/src/main/java/com/papercut/silken/Config.java b/src/main/java/com/papercut/silken/Config.java index 9f1b71b..d0b5e9a 100644 --- a/src/main/java/com/papercut/silken/Config.java +++ b/src/main/java/com/papercut/silken/Config.java @@ -1,9 +1,9 @@ package com.papercut.silken; -import java.util.List; - import com.google.common.collect.ImmutableList; +import java.util.List; + /** * This config class holds various global configuration. Multiple layers have a reference to this configuration * store/POJO. @@ -36,6 +36,8 @@ public class Config { private boolean showStackTracesInErrors; + private ModuleProvider moduleProvider; + public Config() { sharedNameSpaces = ImmutableList.of("shared"); disableCaching = false; @@ -136,4 +138,11 @@ public synchronized void setShowStackTracesInErrors(boolean showStackTracesInErr this.showStackTracesInErrors = showStackTracesInErrors; } + public synchronized ModuleProvider getModuleProvider() { + return moduleProvider; + } + + public synchronized void setModuleProvider(final ModuleProvider moduleProvider) { + this.moduleProvider = moduleProvider; + } } diff --git a/src/main/java/com/papercut/silken/ModuleProvider.java b/src/main/java/com/papercut/silken/ModuleProvider.java new file mode 100644 index 0000000..0e5aed2 --- /dev/null +++ b/src/main/java/com/papercut/silken/ModuleProvider.java @@ -0,0 +1,19 @@ +package com.papercut.silken; + +import com.google.inject.Module; + +import java.util.Map; + +/** + * Implement this interface to provide custom modules for soy generation. + * + * @author arlo + */ +public interface ModuleProvider { + + /** + * @return Return an iterable of modules + */ + Iterable getModules(); + +} diff --git a/src/main/java/com/papercut/silken/NamespaceSet.java b/src/main/java/com/papercut/silken/NamespaceSet.java index 993070b..84bb490 100644 --- a/src/main/java/com/papercut/silken/NamespaceSet.java +++ b/src/main/java/com/papercut/silken/NamespaceSet.java @@ -1,15 +1,11 @@ package com.papercut.silken; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.Lists; +import com.google.inject.Guice; +import com.google.inject.Injector; import com.google.template.soy.SoyFileSet; import com.google.template.soy.data.SoyMapData; import com.google.template.soy.jssrc.SoyJsSrcOptions; @@ -19,6 +15,12 @@ import com.google.template.soy.tofu.SoyTofu.Renderer; import com.google.template.soy.xliffmsgplugin.XliffMsgPlugin; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + /** * Stores fileset and cached tofu for a given namespace. * @@ -168,6 +170,8 @@ private SoyFileSet generateSoyFileSet(String suffix) { final FileSetResolver fileSetResolver = config.getFileSetResolver(); final String searchPath = config.getSearchPath(); + final Injector injector = Guice.createInjector(); + SoyFileSet.Builder builder = new SoyFileSet.Builder(); boolean hasSetGlobals = false; diff --git a/src/main/java/com/papercut/silken/SilkenServlet.java b/src/main/java/com/papercut/silken/SilkenServlet.java index 227713a..35e9348 100644 --- a/src/main/java/com/papercut/silken/SilkenServlet.java +++ b/src/main/java/com/papercut/silken/SilkenServlet.java @@ -19,20 +19,19 @@ */ package com.papercut.silken; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Arrays; -import java.util.Locale; +import com.google.common.base.Strings; +import com.google.template.soy.data.SoyMapData; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - -import com.google.common.base.Strings; -import com.google.template.soy.data.SoyMapData; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Arrays; +import java.util.Locale; /** * The main Silken servlet class. This is designed to be put on a url path like /soy. Requests supported include: @@ -81,7 +80,9 @@ * searchPath - Advanced: Modify the default search path used to locate *.soy and associated files. Value is a semicolon * separated path that may contain/reference $CLASSPATH and $WEBROOT. * Default: $CLASSPATH:$WEBROOT/templates:$WEBROOT/WEB-INF/templates - * + * + * moduleProvider - Provide a custom iterable of Guice modules used in generation. Default: none + * * @author chris */ public class SilkenServlet extends HttpServlet { @@ -185,6 +186,16 @@ public void init(ServletConfig servletConfig) throws ServletException { config.setSearchPath(searchPath); } + final String moduleProvider = servletConfig.getInitParameter("moduleProvider"); + if (moduleProvider != null) { + try { + Object provider = Class.forName(moduleProvider).newInstance(); + config.setModuleProvider((ModuleProvider) provider); + } catch (Exception e) { + throw new ServletException("Unable to create moduleProvider", e); + } + } + // Store a reference config in our context so external code can modify. getServletContext().setAttribute("silken.config", config); From 2068fc3dd4b7cd16a577e4810e329b8e0923396a Mon Sep 17 00:00:00 2001 From: arlo Date: Tue, 13 Jan 2015 10:01:22 -0600 Subject: [PATCH 2/2] Adding missing changes to namespace set --- src/main/java/com/papercut/silken/NamespaceSet.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/papercut/silken/NamespaceSet.java b/src/main/java/com/papercut/silken/NamespaceSet.java index 84bb490..0135aa2 100644 --- a/src/main/java/com/papercut/silken/NamespaceSet.java +++ b/src/main/java/com/papercut/silken/NamespaceSet.java @@ -170,10 +170,13 @@ private SoyFileSet generateSoyFileSet(String suffix) { final FileSetResolver fileSetResolver = config.getFileSetResolver(); final String searchPath = config.getSearchPath(); - final Injector injector = Guice.createInjector(); - - SoyFileSet.Builder builder = new SoyFileSet.Builder(); - + final SoyFileSet.Builder builder; + if (config.getModuleProvider() != null) { + final Injector injector = Guice.createInjector(config.getModuleProvider().getModules()); + builder = injector.getInstance(SoyFileSet.Builder.class); + } else { + builder = new SoyFileSet.Builder(); + } boolean hasSetGlobals = false; // Use global compile time provider if set.