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