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