1 package com.fasterxml.jackson.databind.node;
2
3 import java.io.IOException;
4 import java.math.BigDecimal;
5 import java.math.BigInteger;
6
7 import com.fasterxml.jackson.core.*;
8 import com.fasterxml.jackson.databind.*;
9
10 /**
11  * Numeric node that contains values that do not fit in simple
12  * integer (intlong) or floating point (double) values.
13  */

14 @SuppressWarnings("serial")
15 public class DecimalNode
16     extends NumericNode
17 {
18     public static final DecimalNode ZERO = new DecimalNode(BigDecimal.ZERO);
19
20     private final static BigDecimal MIN_INTEGER = BigDecimal.valueOf(Integer.MIN_VALUE);
21     private final static BigDecimal MAX_INTEGER = BigDecimal.valueOf(Integer.MAX_VALUE);
22     private final static BigDecimal MIN_LONG = BigDecimal.valueOf(Long.MIN_VALUE);
23     private final static BigDecimal MAX_LONG = BigDecimal.valueOf(Long.MAX_VALUE);
24
25     final protected BigDecimal _value;
26
27     /* 
28     /**********************************************************
29     /* Construction
30     /**********************************************************
31      */

32
33     public DecimalNode(BigDecimal v) { _value = v; }
34
35     public static DecimalNode valueOf(BigDecimal d) { return new DecimalNode(d); }
36
37     /* 
38     /**********************************************************
39     /* BaseJsonNode extended API
40     /**********************************************************
41      */

42
43     @Override public JsonToken asToken() { return JsonToken.VALUE_NUMBER_FLOAT; }
44
45     @Override
46     public JsonParser.NumberType numberType() { return JsonParser.NumberType.BIG_DECIMAL; }
47
48     /* 
49     /**********************************************************
50     /* Overrridden JsonNode methods
51     /**********************************************************
52      */

53
54     @Override
55     public boolean isFloatingPointNumber() { return true; }
56     
57     @Override
58     public boolean isBigDecimal() { return true; }
59
60     @Override public boolean canConvertToInt() {
61         return (_value.compareTo(MIN_INTEGER) >= 0) && (_value.compareTo(MAX_INTEGER) <= 0);
62     }
63     @Override public boolean canConvertToLong() {
64         return (_value.compareTo(MIN_LONG) >= 0) && (_value.compareTo(MAX_LONG) <= 0);
65     }
66     
67     @Override
68     public Number numberValue() { return _value; }
69
70     @Override
71     public short shortValue() { return _value.shortValue(); }
72
73     @Override
74     public int intValue() { return _value.intValue(); }
75
76     @Override
77     public long longValue() { return _value.longValue(); }
78
79
80     @Override
81     public BigInteger bigIntegerValue() { return _value.toBigInteger(); }
82
83     @Override
84     public float floatValue() { return _value.floatValue(); }
85     
86     @Override
87     public double doubleValue() { return _value.doubleValue(); }
88
89     @Override
90     public BigDecimal decimalValue() { return _value; }
91
92     @Override
93     public String asText() {
94         return _value.toString();
95     }
96
97     @Override
98     public final void serialize(JsonGenerator jgen, SerializerProvider provider)
99         throws IOException, JsonProcessingException
100     {
101         // 07-Jul-2013, tatu: Should be handled by propagating setting to JsonGenerator
102         //    so this should not be needed:
103         /*
104         if (provider.isEnabled(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN)) {
105             if (!(jgen instanceof TokenBuffer)) { // [Issue#232]
106                 jgen.writeNumber(((BigDecimal) _value).toPlainString());
107                 return;
108             }
109         }
110         */

111         jgen.writeNumber(_value);
112     }
113
114     @Override
115     public boolean equals(Object o)
116     {
117         if (o == thisreturn true;
118         if (o == nullreturn false;
119         if (o instanceof DecimalNode) {
120             return ((DecimalNode) o)._value.compareTo(_value) == 0;
121         }
122         return false;
123     }
124
125     @Override
126     public int hashCode() { return Double.valueOf(doubleValue()).hashCode(); }
127 }
128