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.models;
35
36 import info.magnolia.context.Context;
37 import info.magnolia.freemarker.FreemarkerConfig;
38 import info.magnolia.jcr.util.ContentMap;
39
40 import java.util.ArrayList;
41 import java.util.Calendar;
42 import java.util.List;
43
44 import freemarker.ext.util.ModelFactory;
45 import freemarker.template.DefaultObjectWrapper;
46 import freemarker.template.SimpleDate;
47 import freemarker.template.TemplateDateModel;
48 import freemarker.template.TemplateModel;
49 import freemarker.template.TemplateModelException;
50
51
52
53
54
55
56
57
58 public class MagnoliaObjectWrapper extends DefaultObjectWrapper {
59 private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MagnoliaObjectWrapper.class);
60
61 private final static List<MagnoliaModelFactory> DEFAULT_MODEL_FACTORIES = new ArrayList<MagnoliaModelFactory>() {{
62 add(NodeDataModelFactory.INSTANCE);
63 add(ContentModel.FACTORY);
64 add(ContentMapModel.FACTORY);
65 add(CalendarModel.FACTORY);
66 add(UserModel.FACTORY);
67 add(ContextModelFactory.INSTANCE);
68 }};
69
70 private final FreemarkerConfig freemarkerConfig;
71
72 public MagnoliaObjectWrapper(FreemarkerConfig freemarkerConfig) {
73 super();
74 this.freemarkerConfig = freemarkerConfig;
75 }
76
77
78
79
80 @Override
81 public Object unwrap(TemplateModel model, Class hint) throws TemplateModelException {
82
83 return super.unwrap(model, hint);
84 }
85
86 @Override
87 public TemplateModel wrap(Object obj) throws TemplateModelException {
88 if (obj instanceof Context) {
89
90
91 return handleUnknownType(obj);
92 }
93
94
95
96 if (obj != null && (obj instanceof Class) && ((Class) obj).isEnum()) {
97 final String enumClassName = ((Class) obj).getName();
98 return getEnumModels().get(enumClassName);
99 }
100
101
102 if (obj != null && (obj instanceof ContentMap)) {
103 return handleUnknownType(obj);
104 }
105 return super.wrap(obj);
106 }
107
108
109
110
111
112
113
114
115
116
117
118
119 @Override
120 protected ModelFactory getModelFactory(Class clazz) {
121 final List<MagnoliaModelFactory> registeredModelFactories = freemarkerConfig.getModelFactories();
122 ModelFactory modelFactory = getModelFactory(clazz, registeredModelFactories);
123
124 if (modelFactory == null) {
125 modelFactory = getModelFactory(clazz, DEFAULT_MODEL_FACTORIES);
126 }
127 if (modelFactory == null) {
128 modelFactory = super.getModelFactory(clazz);
129 }
130 return modelFactory;
131 }
132
133 private ModelFactory getModelFactory(Class clazz, List<MagnoliaModelFactory> factories) {
134 for (MagnoliaModelFactory factory : factories) {
135 if (factory.factoryFor().isAssignableFrom(clazz)) {
136 return factory;
137 }
138 }
139 return null;
140 }
141
142
143
144
145
146 @Deprecated
147 protected SimpleDate handleCalendar(Calendar cal) {
148 return new SimpleDate(cal.getTime(), TemplateDateModel.DATETIME);
149 }
150
151 }