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