1 package com.fasterxml.jackson.databind.node; 2 3 import java.io.IOException; 4 import java.util.List; 5 6 import com.fasterxml.jackson.core.*; 7 import com.fasterxml.jackson.core.type.WritableTypeId; 8 import com.fasterxml.jackson.databind.JsonNode; 9 import com.fasterxml.jackson.databind.SerializerProvider; 10 import com.fasterxml.jackson.databind.jsontype.TypeSerializer; 11 12 /** 13 * This intermediate base class is used for all leaf nodes, that is, 14 * all non-container (array or object) nodes, except for the 15 * "missing node". 16 */ 17 public abstract class ValueNode 18 extends BaseJsonNode 19 { 20 private static final long serialVersionUID = 1L; 21 ValueNode()22 protected ValueNode() { } 23 24 @Override _at(JsonPointer ptr)25 protected JsonNode _at(JsonPointer ptr) { 26 // will only allow direct matches, but no traversal through 27 // (base class checks for direct match) 28 return MissingNode.getInstance(); 29 } 30 31 /** 32 * All current value nodes are immutable, so we can just return 33 * them as is. 34 */ 35 @SuppressWarnings("unchecked") 36 @Override deepCopy()37 public <T extends JsonNode> T deepCopy() { return (T) this; } 38 asToken()39 @Override public abstract JsonToken asToken(); 40 41 @Override serializeWithType(JsonGenerator g, SerializerProvider provider, TypeSerializer typeSer)42 public void serializeWithType(JsonGenerator g, SerializerProvider provider, 43 TypeSerializer typeSer) 44 throws IOException 45 { 46 WritableTypeId typeIdDef = typeSer.writeTypePrefix(g, 47 typeSer.typeId(this, asToken())); 48 serialize(g, provider); 49 typeSer.writeTypeSuffix(g, typeIdDef); 50 } 51 52 /* 53 /********************************************************************** 54 /* Basic property access 55 /********************************************************************** 56 */ 57 58 @Override isEmpty()59 public boolean isEmpty() { return true; } 60 61 /* 62 /********************************************************************** 63 /* Navigation methods 64 /********************************************************************** 65 */ 66 67 @Override get(int index)68 public final JsonNode get(int index) { return null; } 69 70 @Override path(int index)71 public final JsonNode path(int index) { return MissingNode.getInstance(); } 72 73 @Override has(int index)74 public final boolean has(int index) { return false; } 75 76 @Override hasNonNull(int index)77 public final boolean hasNonNull(int index) { return false; } 78 79 @Override get(String fieldName)80 public final JsonNode get(String fieldName) { return null; } 81 82 @Override path(String fieldName)83 public final JsonNode path(String fieldName) { return MissingNode.getInstance(); } 84 85 @Override has(String fieldName)86 public final boolean has(String fieldName) { return false; } 87 88 @Override hasNonNull(String fieldName)89 public final boolean hasNonNull(String fieldName) { return false; } 90 91 /* 92 ********************************************************************** 93 * Find methods: all "leaf" nodes return the same for these 94 ********************************************************************** 95 */ 96 97 @Override findValue(String fieldName)98 public final JsonNode findValue(String fieldName) { 99 return null; 100 } 101 102 // note: co-variant return type 103 @Override findParent(String fieldName)104 public final ObjectNode findParent(String fieldName) { 105 return null; 106 } 107 108 @Override findValues(String fieldName, List<JsonNode> foundSoFar)109 public final List<JsonNode> findValues(String fieldName, List<JsonNode> foundSoFar) { 110 return foundSoFar; 111 } 112 113 @Override findValuesAsText(String fieldName, List<String> foundSoFar)114 public final List<String> findValuesAsText(String fieldName, List<String> foundSoFar) { 115 return foundSoFar; 116 } 117 118 @Override findParents(String fieldName, List<JsonNode> foundSoFar)119 public final List<JsonNode> findParents(String fieldName, List<JsonNode> foundSoFar) { 120 return foundSoFar; 121 } 122 } 123