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