• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.fasterxml.jackson.databind.node;
2 
3 import java.io.IOException;
4 import java.util.Arrays;
5 
6 import com.fasterxml.jackson.core.*;
7 import com.fasterxml.jackson.databind.SerializerProvider;
8 
9 
10 /**
11  * Value node that contains Base64 encoded binary value, which will be
12  * output and stored as Json String value.
13  */
14 public class BinaryNode
15     extends ValueNode
16 {
17     private static final long serialVersionUID = 2L;
18 
19     final static BinaryNode EMPTY_BINARY_NODE = new BinaryNode(new byte[0]);
20 
21     protected final byte[] _data;
22 
BinaryNode(byte[] data)23     public BinaryNode(byte[] data)
24     {
25         _data = data;
26     }
27 
BinaryNode(byte[] data, int offset, int length)28     public BinaryNode(byte[] data, int offset, int length)
29     {
30         if (offset == 0 && length == data.length) {
31             _data = data;
32         } else {
33             _data = new byte[length];
34             System.arraycopy(data, offset, _data, 0, length);
35         }
36     }
37 
valueOf(byte[] data)38     public static BinaryNode valueOf(byte[] data)
39     {
40         if (data == null) {
41             return null;
42         }
43         if (data.length == 0) {
44             return EMPTY_BINARY_NODE;
45         }
46         return new BinaryNode(data);
47     }
48 
valueOf(byte[] data, int offset, int length)49     public static BinaryNode valueOf(byte[] data, int offset, int length)
50     {
51         if (data == null) {
52             return null;
53         }
54         if (length == 0) {
55             return EMPTY_BINARY_NODE;
56         }
57         return new BinaryNode(data, offset, length);
58     }
59 
60     @Override
getNodeType()61     public JsonNodeType getNodeType()
62     {
63         return JsonNodeType.BINARY;
64     }
65 
66     @Override
asToken()67     public JsonToken asToken() {
68         /* No distinct type; could use one for textual values,
69          * but given that it's not in text form at this point,
70          * embedded-object is closest
71          */
72         return JsonToken.VALUE_EMBEDDED_OBJECT;
73     }
74 
75     /**
76      *<p>
77      * Note: caller is not to modify returned array in any way, since
78      * it is not a copy but reference to the underlying byte array.
79      */
80     @Override
binaryValue()81     public byte[] binaryValue() { return _data; }
82 
83     /**
84      * Hmmh. This is not quite as efficient as using {@link #serialize},
85      * but will work correctly.
86      */
87     @Override
asText()88     public String asText() {
89         return Base64Variants.getDefaultVariant().encode(_data, false);
90     }
91 
92     @Override
serialize(JsonGenerator jg, SerializerProvider provider)93     public final void serialize(JsonGenerator jg, SerializerProvider provider)
94         throws IOException, JsonProcessingException
95     {
96         jg.writeBinary(provider.getConfig().getBase64Variant(),
97                 _data, 0, _data.length);
98     }
99 
100     @Override
equals(Object o)101     public boolean equals(Object o)
102     {
103         if (o == this) return true;
104         if (o == null) return false;
105         if (!(o instanceof BinaryNode)) {
106             return false;
107         }
108         return Arrays.equals(((BinaryNode) o)._data, _data);
109     }
110 
111     @Override
hashCode()112     public int hashCode() {
113         return (_data == null) ? -1 : _data.length;
114     }
115 }
116