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..0135aa2 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,8 +170,13 @@ private SoyFileSet generateSoyFileSet(String suffix) {
final FileSetResolver fileSetResolver = config.getFileSetResolver();
final String searchPath = config.getSearchPath();
- 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.
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);