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 List<MagnoliaModelFactory> registeredModelFactories = new ArrayList<MagnoliaModelFactory>();
76 private List<TemplateLoader> templateLoaders = new ArrayList<TemplateLoader>();
77 private Map<String, TemplateModel> sharedVariables = new HashMap<String, TemplateModel>();
78 private TemplateExceptionHandler templateExceptionHandler = TemplateExceptionHandler.IGNORE_HANDLER;
79
80 private ObjectWrapper objectWrapper;
81 private TemplateLoader multiTL;
82
83 public FreemarkerConfig() {
84 }
85
86 public ObjectWrapper getObjectWrapper() {
87 if (objectWrapper == null) {
88 objectWrapper = newObjectWrapper();
89 }
90 return objectWrapper;
91 }
92
93 protected ObjectWrapper newObjectWrapper() {
94 return new MagnoliaObjectWrapper(this);
95 }
96
97 public TemplateLoader getTemplateLoader() {
98 if (multiTL == null) {
99
100 final List<TemplateLoader> loaders = getTemplateLoaders();
101 final int s = loaders.size();
102
103 final TemplateLoader[] tl = loaders.toArray(new TemplateLoader[s + 1]);
104 tl[s] = new ClassTemplateLoader(getClass(), "/");
105 multiTL = new MultiTemplateLoader(tl);
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 void addModelFactory(MagnoliaModelFactory modelFactory) {
119 this.registeredModelFactories.add(modelFactory);
120 }
121
122 public List<TemplateLoader> getTemplateLoaders() {
123 return templateLoaders;
124 }
125
126 public void setTemplateLoaders(List<TemplateLoader> templateLoaders) {
127 this.templateLoaders.addAll(templateLoaders);
128 }
129
130 public void addTemplateLoader(TemplateLoader templateLoader) {
131 this.templateLoaders.add(templateLoader);
132 }
133
134 public Map<String, TemplateModel> getSharedVariables() {
135 return sharedVariables;
136 }
137
138 public void setSharedVariables(Map<String, TemplateModel> sharedVariables) {
139 this.sharedVariables.putAll(sharedVariables);
140 }
141
142 public void addSharedVariable(String name, Object value) throws TemplateModelException {
143 sharedVariables.put(name, getObjectWrapper().wrap(value));
144 }
145
146 public TemplateExceptionHandler getTemplateExceptionHandler() {
147 return templateExceptionHandler;
148 }
149
150 public void setTemplateExceptionHandler(TemplateExceptionHandler templateExceptionHandler) {
151 this.templateExceptionHandler = templateExceptionHandler;
152 }
153 }