1
1
package com .fasterxml .jackson .datatype .hibernate3 ;
2
2
3
3
import java .io .IOException ;
4
+ import java .util .Collection ;
5
+ import java .util .Map ;
4
6
5
- import org .hibernate .FlushMode ;
6
- import org .hibernate .Hibernate ;
7
- import org .hibernate .Session ;
8
- import org .hibernate .SessionFactory ;
7
+ import javax .persistence .*;
8
+
9
+ import org .hibernate .*;
9
10
import org .hibernate .collection .PersistentCollection ;
10
11
11
12
import com .fasterxml .jackson .core .*;
12
13
import com .fasterxml .jackson .databind .*;
14
+ import com .fasterxml .jackson .databind .jsonFormatVisitors .JsonFormatVisitorWrapper ;
13
15
import com .fasterxml .jackson .databind .jsontype .TypeSerializer ;
14
16
import com .fasterxml .jackson .databind .ser .*;
15
17
import com .fasterxml .jackson .datatype .hibernate3 .Hibernate3Module .Feature ;
18
+
16
19
import org .hibernate .engine .PersistenceContext ;
17
20
import org .hibernate .engine .SessionFactoryImplementor ;
18
21
import org .hibernate .engine .SessionImplementor ;
19
22
import org .hibernate .impl .SessionFactoryImpl ;
20
23
import org .hibernate .transaction .JDBCTransactionFactory ;
21
24
import org .hibernate .transaction .TransactionFactory ;
22
25
23
- import javax .persistence .*;
24
-
25
26
/**
26
27
* Wrapper serializer used to handle aspects of lazy loading that can be used
27
28
* for Hibernate collection datatypes; which includes both <code>Collection</code>
28
29
* and <code>Map</code> types (unlike in JDK).
29
30
*/
30
31
public class PersistentCollectionSerializer
31
- extends JsonSerializer <Object >
32
- implements ContextualSerializer
32
+ extends ContainerSerializer <Object >
33
+ implements ContextualSerializer , ResolvableSerializer
33
34
{
35
+ private static final long serialVersionUID = 1L ; // since 2.7
36
+
37
+ /**
38
+ * Type for which underlying serializer was created.
39
+ *
40
+ * @since 2.7
41
+ */
42
+ protected final JavaType _originalType ;
43
+
44
+ /**
45
+ * Hibernate-module features set, if any.
46
+ */
34
47
protected final int _features ;
35
48
36
49
/**
@@ -48,13 +61,63 @@ public class PersistentCollectionSerializer
48
61
*/
49
62
50
63
@ SuppressWarnings ("unchecked" )
51
- public PersistentCollectionSerializer (JsonSerializer <?> serializer , int features , SessionFactory sessionFactory )
52
- {
64
+ public PersistentCollectionSerializer (JavaType containerType ,
65
+ JsonSerializer <?> serializer , int features , SessionFactory sessionFactory ) {
66
+ super (containerType );
67
+ _originalType = containerType ;
53
68
_serializer = (JsonSerializer <Object >) serializer ;
54
69
_features = features ;
55
70
_sessionFactory = sessionFactory ;
56
71
}
57
72
73
+ /**
74
+ * @since 2.7
75
+ */
76
+ @ SuppressWarnings ("unchecked" )
77
+ protected PersistentCollectionSerializer (PersistentCollectionSerializer base , JsonSerializer <?> serializer )
78
+ {
79
+ super (base );
80
+ _originalType = base ._originalType ;
81
+ _serializer = (JsonSerializer <Object >) serializer ;
82
+ _features = base ._features ;
83
+ _sessionFactory = base ._sessionFactory ;
84
+ }
85
+
86
+ protected PersistentCollectionSerializer _withSerializer (JsonSerializer <?> ser ) {
87
+ if (ser == _serializer ) {
88
+ return this ;
89
+ }
90
+ return new PersistentCollectionSerializer (this , ser );
91
+ }
92
+
93
+ // from `ContainerSerializer`
94
+ @ Override
95
+ protected ContainerSerializer <?> _withValueTypeSerializer (TypeSerializer vts )
96
+ {
97
+ ContainerSerializer <?> ser0 = _containerSerializer ();
98
+ if (ser0 != null ) {
99
+ return _withSerializer (ser0 .withValueTypeSerializer (vts ));
100
+ }
101
+ // 03-Jan-2016, tatu: Not sure what to do here; most likely can not make it work without
102
+ // knowing how to pass various calls... so in a way, should limit to only accepting
103
+ // ContainerSerializers as delegates.
104
+ return this ;
105
+ }
106
+
107
+ /*
108
+ /**********************************************************************
109
+ /* Contextualization
110
+ /**********************************************************************
111
+ */
112
+
113
+ @ Override
114
+ public void resolve (SerializerProvider provider ) throws JsonMappingException
115
+ {
116
+ if (_serializer instanceof ResolvableSerializer ) {
117
+ ((ResolvableSerializer ) _serializer ).resolve (provider );
118
+ }
119
+ }
120
+
58
121
/**
59
122
* We need to resolve actual serializer once we know the context; specifically
60
123
* must know type of property being serialized.
@@ -74,19 +137,15 @@ public JsonSerializer<?> createContextual(SerializerProvider provider,
74
137
if (!usesLazyLoading (property )) {
75
138
return ser ;
76
139
}
77
- if (ser != _serializer ) {
78
- return new PersistentCollectionSerializer (ser , _features , _sessionFactory );
79
- }
80
- return this ;
140
+ return _withSerializer (ser );
81
141
}
82
-
142
+
83
143
/*
84
144
/**********************************************************************
85
- /* JsonSerializer impl
145
+ /* JsonSerializer simple accessors, metadata
86
146
/**********************************************************************
87
147
*/
88
148
89
- // since 2.3
90
149
@ Deprecated // since 2.5
91
150
@ Override
92
151
public boolean isEmpty (Object value )
@@ -111,7 +170,56 @@ public boolean isEmpty(SerializerProvider provider, Object value)
111
170
}
112
171
return _serializer .isEmpty (provider , value );
113
172
}
114
-
173
+
174
+ @ Override
175
+ public void acceptJsonFormatVisitor (JsonFormatVisitorWrapper visitor , JavaType typeHint )
176
+ throws JsonMappingException
177
+ {
178
+ _serializer .acceptJsonFormatVisitor (visitor , typeHint );
179
+ }
180
+
181
+ /*
182
+ /**********************************************************************
183
+ /* ContainerSerializer methods
184
+ /**********************************************************************
185
+ */
186
+
187
+ @ Override
188
+ public JavaType getContentType () {
189
+ ContainerSerializer <?> ser = _containerSerializer ();
190
+ if (ser != null ) {
191
+ return ser .getContentType ();
192
+ }
193
+ return _originalType .getContentType ();
194
+ }
195
+
196
+ @ Override
197
+ public JsonSerializer <?> getContentSerializer () {
198
+ ContainerSerializer <?> ser = _containerSerializer ();
199
+ if (ser != null ) {
200
+ return ser .getContentSerializer ();
201
+ }
202
+ // no idea, alas
203
+ return null ;
204
+ }
205
+
206
+ @ Override
207
+ public boolean hasSingleElement (Object value ) {
208
+ if (value instanceof Collection <?>) {
209
+ return ((Collection <?>) value ).size () == 1 ;
210
+ }
211
+ if (value instanceof Map <?,?>) {
212
+ return ((Map <?,?>) value ).size () == 1 ;
213
+ }
214
+ return false ;
215
+ }
216
+
217
+ /*
218
+ /**********************************************************************
219
+ /* JsonSerializer, actual serialization
220
+ /**********************************************************************
221
+ */
222
+
115
223
@ Override
116
224
public void serialize (Object value , JsonGenerator jgen , SerializerProvider provider )
117
225
throws IOException
@@ -164,6 +272,13 @@ public void serializeWithType(Object value, JsonGenerator jgen, SerializerProvid
164
272
/**********************************************************************
165
273
*/
166
274
275
+ protected ContainerSerializer <?> _containerSerializer () {
276
+ if (_serializer instanceof ContainerSerializer ) {
277
+ return (ContainerSerializer <?>) _serializer ;
278
+ }
279
+ return null ;
280
+ }
281
+
167
282
protected Object findLazyValue (PersistentCollection coll )
168
283
{
169
284
// If lazy-loaded, not yet loaded, may serialize as null?
0 commit comments