1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.freemarker;
35
36 import info.magnolia.freemarker.models.MagnoliaModelFactory;
37 import info.magnolia.freemarker.models.MagnoliaObjectWrapper;
38
39 import java.util.ArrayList;
40 import java.util.HashMap;
41 import java.util.List;
42 import java.util.Map;
43
44 import javax.inject.Singleton;
45
46 import freemarker.cache.ClassTemplateLoader;
47 import freemarker.cache.MultiTemplateLoader;
48 import freemarker.cache.TemplateLoader;
49 import freemarker.core.TemplateClassResolver;
50 import freemarker.template.ObjectWrapper;
51 import freemarker.template.TemplateExceptionHandler;
52 import freemarker.template.TemplateModel;
53 import freemarker.template.TemplateModelException;
54
55
56
57
58
59
60
61
62
63
64
65 @Singleton
66 public class FreemarkerConfig {
67
68
69
70
71 private List<MagnoliaModelFactory> registeredModelFactories = new ArrayList<MagnoliaModelFactory>();
72 private List<TemplateLoader> templateLoaders = new ArrayList<TemplateLoader>();
73 private Map<String, TemplateModel> sharedVariables = new HashMap<String, TemplateModel>();
74 private TemplateExceptionHandler templateExceptionHandler = TemplateExceptionHandler.IGNORE_HANDLER;
75 private TemplateClassResolver templateClassResolver = TemplateClassResolver.SAFER_RESOLVER;
76
77 private ObjectWrapper objectWrapper;
78 private TemplateLoader multiTL;
79
80 public FreemarkerConfig() {
81 }
82
83 public ObjectWrapper getObjectWrapper() {
84 if (objectWrapper == null) {
85 objectWrapper = newObjectWrapper();
86 }
87 return objectWrapper;
88 }
89
90 protected ObjectWrapper newObjectWrapper() {
91 return new MagnoliaObjectWrapper(this);
92 }
93
94 public TemplateLoader getTemplateLoader() {
95
96 if (multiTL == null) {
97
98 final List<TemplateLoader> loaders = getTemplateLoaders();
99
100 if (loaders.isEmpty()) {
101 multiTL = new ClassTemplateLoader(getClass(), "/");
102 } else {
103 final TemplateLoader[] tl = loaders.toArray(new TemplateLoader[loaders.size()]);
104 multiTL = new MultiTemplateLoader(tl);
105 }
106 }
107 return multiTL;
108 }
109
110 public List<MagnoliaModelFactory> getModelFactories() {
111 return registeredModelFactories;
112 }
113
114 public void setModelFactories(List<MagnoliaModelFactory> registeredModelFactories) {
115 this.registeredModelFactories.addAll(registeredModelFactories);
116 }
117
118 public List<TemplateLoader> getTemplateLoaders() {
119 return templateLoaders;
120 }
121
122 public void setTemplateLoaders(List<TemplateLoader> templateLoaders) {
123 this.templateLoaders.addAll(templateLoaders);
124 }
125
126 public Map<String, TemplateModel> getSharedVariables() {
127 return sharedVariables;
128 }
129
130 public void setSharedVariables(Map<String, Object> configuredSharedVariables) throws TemplateModelException {
131 for (Map.Entry<String, Object> sv : configuredSharedVariables.entrySet()) {
132 sharedVariables.put(sv.getKey(), getObjectWrapper().wrap(sv.getValue()));
133 }
134 }
135
136
137 void addSharedVariable(String name, Object value) throws TemplateModelException {
138 sharedVariables.put(name, getObjectWrapper().wrap(value));
139 }
140
141 public TemplateExceptionHandler getTemplateExceptionHandler() {
142 return templateExceptionHandler;
143 }
144
145 public void setTemplateExceptionHandler(TemplateExceptionHandler templateExceptionHandler) {
146 this.templateExceptionHandler = templateExceptionHandler;
147 }
148
149 public TemplateClassResolver getTemplateClassResolver() {
150 return templateClassResolver;
151 }
152
153 public void setTemplateClassResolver(TemplateClassResolver templateClassResolver) {
154 this.templateClassResolver = templateClassResolver;
155 }
156 }