1 package com.fasterxml.jackson.databind.node; 2 3 import java.math.BigDecimal; 4 import java.math.BigInteger; 5 6 import com.fasterxml.jackson.core.*; 7 import com.fasterxml.jackson.databind.JsonNode; 8 import com.fasterxml.jackson.databind.util.RawValue; 9 10 /** 11 * This intermediate base class is used for all container nodes, 12 * specifically, array and object nodes. 13 */ 14 public abstract class ContainerNode<T extends ContainerNode<T>> 15 extends BaseJsonNode 16 implements JsonNodeCreator 17 { 18 private static final long serialVersionUID = 1L; 19 20 /** 21 * We will keep a reference to the Object (usually TreeMapper) 22 * that can construct instances of nodes to add to this container 23 * node. 24 */ 25 protected final JsonNodeFactory _nodeFactory; 26 ContainerNode(JsonNodeFactory nc)27 protected ContainerNode(JsonNodeFactory nc) { 28 _nodeFactory = nc; 29 } 30 ContainerNode()31 protected ContainerNode() { _nodeFactory = null; } // only for JDK ser 32 33 // all containers are mutable: can't define: 34 // @Override public abstract <T extends JsonNode> T deepCopy(); 35 36 @Override asToken()37 public abstract JsonToken asToken(); 38 39 @Override asText()40 public String asText() { return ""; } 41 42 /* 43 /********************************************************** 44 /* Methods reset as abstract to force real implementation 45 /********************************************************** 46 */ 47 48 @Override size()49 public abstract int size(); 50 51 @Override get(int index)52 public abstract JsonNode get(int index); 53 54 @Override get(String fieldName)55 public abstract JsonNode get(String fieldName); 56 57 /* 58 /********************************************************** 59 /* JsonNodeCreator implementation, Enumerated/singleton types 60 /********************************************************** 61 */ 62 63 @Override booleanNode(boolean v)64 public final BooleanNode booleanNode(boolean v) { return _nodeFactory.booleanNode(v); } 65 missingNode()66 public JsonNode missingNode() { 67 return _nodeFactory.missingNode(); 68 } 69 70 @Override nullNode()71 public final NullNode nullNode() { return _nodeFactory.nullNode(); } 72 73 /* 74 /********************************************************** 75 /* JsonNodeCreator implementation, just dispatch to real creator 76 /********************************************************** 77 */ 78 79 /** 80 * Factory method that constructs and returns an empty {@link ArrayNode} 81 * Construction is done using registered {@link JsonNodeFactory}. 82 */ 83 @Override arrayNode()84 public final ArrayNode arrayNode() { return _nodeFactory.arrayNode(); } 85 86 /** 87 * Factory method that constructs and returns an {@link ArrayNode} with an initial capacity 88 * Construction is done using registered {@link JsonNodeFactory} 89 * @param capacity the initial capacity of the ArrayNode 90 */ 91 @Override arrayNode(int capacity)92 public final ArrayNode arrayNode(int capacity) { return _nodeFactory.arrayNode(capacity); } 93 94 /** 95 * Factory method that constructs and returns an empty {@link ObjectNode} 96 * Construction is done using registered {@link JsonNodeFactory}. 97 */ 98 @Override objectNode()99 public final ObjectNode objectNode() { return _nodeFactory.objectNode(); } 100 101 @Override numberNode(byte v)102 public final NumericNode numberNode(byte v) { return _nodeFactory.numberNode(v); } 103 @Override numberNode(short v)104 public final NumericNode numberNode(short v) { return _nodeFactory.numberNode(v); } 105 @Override numberNode(int v)106 public final NumericNode numberNode(int v) { return _nodeFactory.numberNode(v); } 107 @Override numberNode(long v)108 public final NumericNode numberNode(long v) { 109 return _nodeFactory.numberNode(v); 110 } 111 112 @Override numberNode(float v)113 public final NumericNode numberNode(float v) { return _nodeFactory.numberNode(v); } 114 @Override numberNode(double v)115 public final NumericNode numberNode(double v) { return _nodeFactory.numberNode(v); } 116 117 @Override numberNode(BigInteger v)118 public final ValueNode numberNode(BigInteger v) { return _nodeFactory.numberNode(v); } 119 @Override numberNode(BigDecimal v)120 public final ValueNode numberNode(BigDecimal v) { return (_nodeFactory.numberNode(v)); } 121 122 @Override numberNode(Byte v)123 public final ValueNode numberNode(Byte v) { return _nodeFactory.numberNode(v); } 124 @Override numberNode(Short v)125 public final ValueNode numberNode(Short v) { return _nodeFactory.numberNode(v); } 126 @Override numberNode(Integer v)127 public final ValueNode numberNode(Integer v) { return _nodeFactory.numberNode(v); } 128 @Override numberNode(Long v)129 public final ValueNode numberNode(Long v) { return _nodeFactory.numberNode(v); } 130 131 @Override numberNode(Float v)132 public final ValueNode numberNode(Float v) { return _nodeFactory.numberNode(v); } 133 @Override numberNode(Double v)134 public final ValueNode numberNode(Double v) { return _nodeFactory.numberNode(v); } 135 136 @Override textNode(String text)137 public final TextNode textNode(String text) { return _nodeFactory.textNode(text); } 138 139 @Override binaryNode(byte[] data)140 public final BinaryNode binaryNode(byte[] data) { return _nodeFactory.binaryNode(data); } 141 @Override binaryNode(byte[] data, int offset, int length)142 public final BinaryNode binaryNode(byte[] data, int offset, int length) { return _nodeFactory.binaryNode(data, offset, length); } 143 144 @Override pojoNode(Object pojo)145 public final ValueNode pojoNode(Object pojo) { return _nodeFactory.pojoNode(pojo); } 146 147 @Override rawValueNode(RawValue value)148 public final ValueNode rawValueNode(RawValue value) { return _nodeFactory.rawValueNode(value); } 149 150 /* 151 /********************************************************** 152 /* Common mutators 153 /********************************************************** 154 */ 155 156 /** 157 * Method for removing all children container has (if any) 158 * 159 * @return Container node itself (to allow method call chaining) 160 */ removeAll()161 public abstract T removeAll(); 162 } 163