001    package ezvcard.io.json;
002    
003    import java.util.List;
004    import java.util.Map;
005    
006    /*
007     Copyright (c) 2013, Michael Angstadt
008     All rights reserved.
009    
010     Redistribution and use in source and binary forms, with or without
011     modification, are permitted provided that the following conditions are met: 
012    
013     1. Redistributions of source code must retain the above copyright notice, this
014     list of conditions and the following disclaimer. 
015     2. Redistributions in binary form must reproduce the above copyright notice,
016     this list of conditions and the following disclaimer in the documentation
017     and/or other materials provided with the distribution. 
018    
019     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
020     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
021     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
022     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
023     ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
024     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
026     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029     */
030    
031    /**
032     * Represents a JSON value, array, or object.
033     * @author Michael Angstadt
034     */
035    public class JsonValue {
036            private final boolean isNull;
037            private final Object value;
038            private final List<JsonValue> array;
039            private final Map<String, JsonValue> object;
040    
041            /**
042             * Creates a JSON value (such as a string or integer).
043             * @param value the value
044             */
045            public JsonValue(Object value) {
046                    this.value = value;
047                    array = null;
048                    object = null;
049                    isNull = (value == null);
050            }
051    
052            /**
053             * Creates a JSON array.
054             * @param array the array elements
055             */
056            public JsonValue(List<JsonValue> array) {
057                    this.array = array;
058                    value = null;
059                    object = null;
060                    isNull = (array == null);
061            }
062    
063            /**
064             * Creates a JSON object.
065             * @param object the object fields
066             */
067            public JsonValue(Map<String, JsonValue> object) {
068                    this.object = object;
069                    value = null;
070                    array = null;
071                    isNull = (object == null);
072            }
073    
074            /**
075             * Gets the JSON value.
076             * @return the value or null if it's not a JSON value
077             */
078            public Object getValue() {
079                    return value;
080            }
081    
082            /**
083             * Gets the JSON array elements.
084             * @return the array elements or null if it's not a JSON array
085             */
086            public List<JsonValue> getArray() {
087                    return array;
088            }
089    
090            /**
091             * Gets the JSON object.
092             * @return the object or null if it's not a JSON object
093             */
094            public Map<String, JsonValue> getObject() {
095                    return object;
096            }
097    
098            /**
099             * Determines if the value is "null" or not.
100             * @return true if the value is "null", false if not
101             */
102            public boolean isNull() {
103                    return isNull;
104            }
105    
106            @Override
107            public int hashCode() {
108                    final int prime = 31;
109                    int result = 1;
110                    result = prime * result + ((array == null) ? 0 : array.hashCode());
111                    result = prime * result + (isNull ? 1231 : 1237);
112                    result = prime * result + ((object == null) ? 0 : object.hashCode());
113                    result = prime * result + ((value == null) ? 0 : value.hashCode());
114                    return result;
115            }
116    
117            @Override
118            public boolean equals(Object obj) {
119                    if (this == obj)
120                            return true;
121                    if (obj == null)
122                            return false;
123                    if (getClass() != obj.getClass())
124                            return false;
125                    JsonValue other = (JsonValue) obj;
126                    if (array == null) {
127                            if (other.array != null)
128                                    return false;
129                    } else if (!array.equals(other.array))
130                            return false;
131                    if (isNull != other.isNull)
132                            return false;
133                    if (object == null) {
134                            if (other.object != null)
135                                    return false;
136                    } else if (!object.equals(other.object))
137                            return false;
138                    if (value == null) {
139                            if (other.value != null)
140                                    return false;
141                    } else if (!value.equals(other.value))
142                            return false;
143                    return true;
144            }
145    
146            @Override
147            public String toString() {
148                    if (isNull) {
149                            return "NULL";
150                    }
151    
152                    if (value != null) {
153                            return "VALUE = " + value;
154                    }
155    
156                    if (array != null) {
157                            return "ARRAY = " + array;
158                    }
159    
160                    if (object != null) {
161                            return "OBJECT = " + object;
162                    }
163    
164                    return "";
165            }
166    }