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 freemarker.cache.ClassTemplateLoader;
37 import freemarker.cache.MultiTemplateLoader;
38 import freemarker.cache.TemplateLoader;
39 import freemarker.template.ObjectWrapper;
40 import freemarker.template.TemplateExceptionHandler;
41 import freemarker.template.TemplateModel;
42 import freemarker.template.TemplateModelException;
43
44 import info.magnolia.freemarker.models.MagnoliaModelFactory;
45 import info.magnolia.freemarker.models.MagnoliaObjectWrapper;
46 import info.magnolia.objectfactory.Components;
47
48 import java.util.ArrayList;
49 import java.util.HashMap;
50 import java.util.List;
51 import java.util.Map;
52
53
54
55
56
57
58
59
60
61
62
63 public class FreemarkerConfig {
64
65
66
67
68
69 public static FreemarkerConfig getInstance() {
70 return Components.getSingleton(FreemarkerConfig.class);
71 }
72
73
74
75
76 private List<MagnoliaModelFactory> registeredModelFactories = new ArrayList<MagnoliaModelFactory>();
77 private List<TemplateLoader> templateLoaders = new ArrayList<TemplateLoader>();
78 private Map<String, TemplateModel> sharedVariables = new HashMap<String, TemplateModel>();
79 private TemplateExceptionHandler templateExceptionHandler = TemplateExceptionHandler.IGNORE_HANDLER;
80
81 private ObjectWrapper objectWrapper;
82 private TemplateLoader multiTL;
83
84 public FreemarkerConfig() {
85 }
86
87 public ObjectWrapper getObjectWrapper() {
88 if (objectWrapper == null) {
89 objectWrapper = newObjectWrapper();
90 }
91 return objectWrapper;
92 }
93
94 protected ObjectWrapper newObjectWrapper() {
95 return new MagnoliaObjectWrapper(this);
96 }
97
98 public TemplateLoader getTemplateLoader() {
99 if (multiTL == null) {
100
101 final List<TemplateLoader> loaders = getTemplateLoaders();
102 final int s = loaders.size();
103
104 final TemplateLoader[] tl = loaders.toArray(new TemplateLoader[s + 1]);
105 tl[s] = new ClassTemplateLoader(getClass(), "/");
106 multiTL = new MultiTemplateLoader(tl);
107 }
108 return multiTL;
109 }
110
111 public List<MagnoliaModelFactory> getModelFactories() {
112 return registeredModelFactories;
113 }
114
115 public void setModelFactories(List<MagnoliaModelFactory> registeredModelFactories) {
116 this.registeredModelFactories.addAll(registeredModelFactories);
117 }
118
119 public void addModelFactory(MagnoliaModelFactory modelFactory) {
120 this.registeredModelFactories.add(modelFactory);
121 }
122
123 public List<TemplateLoader> getTemplateLoaders() {
124 return templateLoaders;
125 }
126
127 public void setTemplateLoaders(List<TemplateLoader> templateLoaders) {
128 this.templateLoaders.addAll(templateLoaders);
129 }
130
131 public void addTemplateLoader(TemplateLoader templateLoader) {
132 this.templateLoaders.add(templateLoader);
133 }
134
135 public Map<String, TemplateModel> getSharedVariables() {
136 return sharedVariables;
137 }
138
139 public void setSharedVariables(Map<String, Object> configuredSharedVariables) throws TemplateModelException {
140 for (Map.Entry<String, Object> sv : configuredSharedVariables.entrySet()) {
141 sharedVariables.put(sv.getKey(), getObjectWrapper().wrap(sv.getValue()));
142 }
143 }
144
145 public void addSharedVariable(String name, Object value) throws TemplateModelException {
146 sharedVariables.put(name, getObjectWrapper().wrap(value));
147 }
148
149 public TemplateExceptionHandler getTemplateExceptionHandler() {
150 return templateExceptionHandler;
151 }
152
153 public void setTemplateExceptionHandler(TemplateExceptionHandler templateExceptionHandler) {
154 this.templateExceptionHandler = templateExceptionHandler;
155 }
156 }