1919import io .netty .buffer .ByteBufOutputStream ;
2020
2121import java .io .IOException ;
22+ import java .lang .reflect .Type ;
2223import java .util .ArrayList ;
2324import java .util .Arrays ;
2425import java .util .Collections ;
26+ import java .util .HashMap ;
2527import java .util .Iterator ;
2628import java .util .List ;
2729import java .util .Map ;
3436import com .corundumstudio .socketio .MultiTypeAckCallback ;
3537import com .corundumstudio .socketio .namespace .Namespace ;
3638import com .fasterxml .jackson .annotation .JsonInclude .Include ;
39+ import com .fasterxml .jackson .core .JsonGenerationException ;
40+ import com .fasterxml .jackson .core .JsonGenerator ;
3741import com .fasterxml .jackson .core .JsonParser ;
3842import com .fasterxml .jackson .core .JsonProcessingException ;
3943import com .fasterxml .jackson .core .SerializableString ;
4044import com .fasterxml .jackson .core .io .CharacterEscapes ;
4145import com .fasterxml .jackson .core .io .SerializedString ;
46+ import com .fasterxml .jackson .databind .BeanDescription ;
4247import com .fasterxml .jackson .databind .DeserializationContext ;
4348import com .fasterxml .jackson .databind .DeserializationFeature ;
49+ import com .fasterxml .jackson .databind .JavaType ;
50+ import com .fasterxml .jackson .databind .JsonMappingException ;
4451import com .fasterxml .jackson .databind .JsonNode ;
52+ import com .fasterxml .jackson .databind .JsonSerializer ;
4553import com .fasterxml .jackson .databind .Module ;
4654import com .fasterxml .jackson .databind .ObjectMapper ;
55+ import com .fasterxml .jackson .databind .SerializationConfig ;
4756import com .fasterxml .jackson .databind .SerializationFeature ;
57+ import com .fasterxml .jackson .databind .SerializerProvider ;
4858import com .fasterxml .jackson .databind .deser .std .StdDeserializer ;
59+ import com .fasterxml .jackson .databind .jsonFormatVisitors .JsonArrayFormatVisitor ;
60+ import com .fasterxml .jackson .databind .jsonFormatVisitors .JsonFormatTypes ;
61+ import com .fasterxml .jackson .databind .jsonFormatVisitors .JsonFormatVisitorWrapper ;
62+ import com .fasterxml .jackson .databind .jsontype .TypeSerializer ;
4963import com .fasterxml .jackson .databind .module .SimpleModule ;
5064import com .fasterxml .jackson .databind .node .ArrayNode ;
65+ import com .fasterxml .jackson .databind .node .ObjectNode ;
66+ import com .fasterxml .jackson .databind .ser .BeanSerializerModifier ;
67+ import com .fasterxml .jackson .databind .ser .std .StdSerializer ;
68+ import com .fasterxml .jackson .databind .type .ArrayType ;
5169
5270public class JacksonJsonSupport implements JsonSupport {
5371
@@ -218,6 +236,95 @@ public Event deserialize(JsonParser jp, DeserializationContext ctxt) throws IOEx
218236
219237 }
220238
239+ public static class ByteArraySerializer extends StdSerializer <byte []>
240+ {
241+
242+ private final ThreadLocal <List <byte []>> arrays = new ThreadLocal <List <byte []>>() {
243+ protected List <byte []> initialValue () {
244+ return new ArrayList <byte []>();
245+ };
246+ };
247+
248+ public ByteArraySerializer () {
249+ super (byte [].class );
250+ }
251+
252+ @ Override
253+ public boolean isEmpty (byte [] value ) {
254+ return (value == null ) || (value .length == 0 );
255+ }
256+
257+ @ Override
258+ public void serialize (byte [] value , JsonGenerator jgen , SerializerProvider provider )
259+ throws IOException , JsonGenerationException
260+ {
261+ Map <String , Object > map = new HashMap <String , Object >();
262+ map .put ("num" , arrays .get ().size ());
263+ map .put ("_placeholder" , true );
264+ jgen .writeObject (map );
265+ arrays .get ().add (value );
266+ }
267+
268+ @ Override
269+ public void serializeWithType (byte [] value , JsonGenerator jgen , SerializerProvider provider ,
270+ TypeSerializer typeSer )
271+ throws IOException , JsonGenerationException
272+ {
273+ serialize (value , jgen , provider );
274+ }
275+
276+ @ Override
277+ public JsonNode getSchema (SerializerProvider provider , Type typeHint )
278+ {
279+ ObjectNode o = createSchemaNode ("array" , true );
280+ ObjectNode itemSchema = createSchemaNode ("string" ); //binary values written as strings?
281+ return o .set ("items" , itemSchema );
282+ }
283+
284+ @ Override
285+ public void acceptJsonFormatVisitor (JsonFormatVisitorWrapper visitor , JavaType typeHint )
286+ throws JsonMappingException
287+ {
288+ if (visitor != null ) {
289+ JsonArrayFormatVisitor v2 = visitor .expectArrayFormat (typeHint );
290+ if (v2 != null ) {
291+ v2 .itemsFormat (JsonFormatTypes .STRING );
292+ }
293+ }
294+ }
295+
296+ public List <byte []> getArrays () {
297+ return arrays .get ();
298+ }
299+
300+ public void clear () {
301+ arrays .set (new ArrayList <byte []>());
302+ }
303+
304+ }
305+
306+
307+ private class ExBeanSerializerModifier extends BeanSerializerModifier {
308+
309+ private final ByteArraySerializer serializer = new ByteArraySerializer ();
310+
311+ @ Override
312+ public JsonSerializer <?> modifyArraySerializer (SerializationConfig config , ArrayType valueType ,
313+ BeanDescription beanDesc , JsonSerializer <?> serializer ) {
314+ if (valueType .getRawClass ().equals (byte [].class )) {
315+ return this .serializer ;
316+ }
317+
318+ return super .modifyArraySerializer (config , valueType , beanDesc , serializer );
319+ }
320+
321+ public ByteArraySerializer getSerializer () {
322+ return serializer ;
323+ }
324+
325+ }
326+
327+ private final ExBeanSerializerModifier modifier = new ExBeanSerializerModifier ();
221328 private final ThreadLocal <String > namespaceClass = new ThreadLocal <String >();
222329 private final ThreadLocal <AckCallback <?>> currentAckClass = new ThreadLocal <AckCallback <?>>();
223330 private final ObjectMapper objectMapper = new ObjectMapper ();
@@ -239,6 +346,7 @@ public JacksonJsonSupport(Module... modules) {
239346
240347 protected void init (ObjectMapper objectMapper ) {
241348 SimpleModule module = new SimpleModule ();
349+ module .setSerializerModifier (modifier );
242350 module .addDeserializer (Event .class , eventDeserializer );
243351 module .addDeserializer (AckArgs .class , ackArgsDeserializer );
244352 objectMapper .registerModule (module );
@@ -273,12 +381,19 @@ public AckArgs readAckArgs(ByteBufInputStream src, AckCallback<?> callback) thro
273381
274382 @ Override
275383 public void writeValue (ByteBufOutputStream out , Object value ) throws IOException {
384+ modifier .getSerializer ().clear ();
276385 objectMapper .writeValue (out , value );
277386 }
278387
279388 @ Override
280389 public void writeJsonpValue (ByteBufOutputStream out , Object value ) throws IOException {
390+ modifier .getSerializer ().clear ();
281391 jsonpObjectMapper .writeValue (out , value );
282392 }
283393
394+ @ Override
395+ public List <byte []> getArrays () {
396+ return modifier .getSerializer ().getArrays ();
397+ }
398+
284399}
0 commit comments