001    /*
002     * Copyright 2015-2017 UnboundID Corp.
003     * All Rights Reserved.
004     */
005    /*
006     * Copyright (C) 2015-2017 UnboundID Corp.
007     *
008     * This program is free software; you can redistribute it and/or modify
009     * it under the terms of the GNU General Public License (GPLv2 only)
010     * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
011     * as published by the Free Software Foundation.
012     *
013     * This program is distributed in the hope that it will be useful,
014     * but WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016     * GNU General Public License for more details.
017     *
018     * You should have received a copy of the GNU General Public License
019     * along with this program; if not, see <http://www.gnu.org/licenses>.
020     */
021    package com.unboundid.util.json;
022    
023    
024    
025    import com.unboundid.util.NotMutable;
026    import com.unboundid.util.ThreadSafety;
027    import com.unboundid.util.ThreadSafetyLevel;
028    
029    
030    
031    /**
032     * This class provides an implementation of a JSON value that represents a
033     * Java Boolean.  The string representation of the JSON Boolean true value is
034     * {@code true}, and the string representation of the JSON Boolean false value
035     * is {@code false}.  These values are not surrounded by quotation marks, and
036     * they must be entirely lowercase.
037     */
038    @NotMutable()
039    @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
040    public final class JSONBoolean
041           extends JSONValue
042    {
043      /**
044       * A pre-allocated object that represents a value of {@code false}.
045       */
046      public static final JSONBoolean FALSE = new JSONBoolean(false);
047    
048    
049    
050      /**
051       * A pre-allocated object that represents a value of {@code true}.
052       */
053      public static final JSONBoolean TRUE = new JSONBoolean(true);
054    
055    
056    
057      /**
058       * The serial version UID for this serializable class.
059       */
060      private static final long serialVersionUID = -5090296701442873481L;
061    
062    
063    
064      // The boolean value for this object.
065      private final boolean booleanValue;
066    
067      // The string representation for this object.
068      private final String stringRepresentation;
069    
070    
071    
072      /**
073       * Creates a new JSON value capable of representing a Boolean value of either
074       * {@code true} or {@code false}.
075       *
076       * @param  booleanValue  The Boolean value for this JSON value.
077       */
078      public JSONBoolean(final boolean booleanValue)
079      {
080        this.booleanValue = booleanValue;
081        stringRepresentation = (booleanValue ? "true" : "false");
082      }
083    
084    
085    
086      /**
087       * Retrieves the Java boolean value for this JSON value.
088       *
089       * @return  The Java boolean value for this JSON value.
090       */
091      public boolean booleanValue()
092      {
093        return booleanValue;
094      }
095    
096    
097    
098      /**
099       * {@inheritDoc}
100       */
101      @Override()
102      public int hashCode()
103      {
104        return (booleanValue ? Boolean.TRUE.hashCode() : Boolean.FALSE.hashCode());
105      }
106    
107    
108    
109      /**
110       * {@inheritDoc}
111       */
112      @Override()
113      public boolean equals(final Object o)
114      {
115        if (o == this)
116        {
117          return true;
118        }
119    
120        if (o instanceof JSONBoolean)
121        {
122          final JSONBoolean b = (JSONBoolean) o;
123          return (b.booleanValue == booleanValue);
124        }
125    
126        return false;
127      }
128    
129    
130    
131      /**
132       * {@inheritDoc}
133       */
134      @Override()
135      public boolean equals(final JSONValue v, final boolean ignoreFieldNameCase,
136                            final boolean ignoreValueCase,
137                            final boolean ignoreArrayOrder)
138      {
139        return ((v instanceof JSONBoolean) &&
140             (booleanValue == ((JSONBoolean) v).booleanValue));
141      }
142    
143    
144    
145      /**
146       * Retrieves a string representation of this Boolean value as it should appear
147       * in a JSON object.  If the Boolean value is {@code true}, then the string
148       * representation will be "{@code true}" (without the surrounding quotes).  If
149       * the Boolean value is {@code false}, then the string representation will be
150       * "{@code false}" (again, without the quotes).
151       *
152       * @return  A string representation of this Boolean value as it should appear
153       *          in a JSON object.
154       */
155      @Override()
156      public String toString()
157      {
158        return stringRepresentation;
159      }
160    
161    
162    
163      /**
164       * Appends a string representation of this Boolean value as it should appear
165       * in a JSON object to the provided buffer.  If the Boolean value is
166       * {@code true}, then the string representation will be "{@code true}"
167       * (without the surrounding quotes).  If the Boolean value is {@code false},
168       * then the string representation will be "{@code false}" (again, without the
169       * quotes).
170       *
171       * @param  buffer  The buffer to which the information should be appended.
172       */
173      @Override()
174      public void toString(final StringBuilder buffer)
175      {
176        buffer.append(stringRepresentation);
177      }
178    
179    
180    
181      /**
182       * Retrieves a single-line string representation of this Boolean value as it
183       * should appear in a JSON object.  If the Boolean value is {@code true}, then
184       * the string representation will be "{@code true}" (without the surrounding
185       * quotes).  If the Boolean value is {@code false}, then the string
186       * representation will be "{@code false}" (again, without the quotes).
187       *
188       * @return  A single-line string representation of this Boolean value as it
189       *          should appear in a JSON object.
190       */
191      @Override()
192      public String toSingleLineString()
193      {
194        return stringRepresentation;
195      }
196    
197    
198    
199      /**
200       * Appends a single-line string representation of this Boolean value as it
201       * should appear in a JSON object to the provided buffer.  If the Boolean
202       * value is {@code true}, then the string representation will be
203       * "{@code true}" (without the surrounding quotes).  If the Boolean value is
204       * {@code false}, then the string representation will be "{@code false}"
205       * (again, without the quotes).
206       *
207       * @param  buffer  The buffer to which the information should be appended.
208       */
209      @Override()
210      public void toSingleLineString(final StringBuilder buffer)
211      {
212        buffer.append(stringRepresentation);
213      }
214    
215    
216    
217      /**
218       * Retrieves a normalized string representation of this Boolean value as it
219       * should appear in a JSON object.  If the Boolean value is {@code true}, then
220       * the string representation will be "{@code true}" (without the surrounding
221       * quotes).  If the Boolean value is {@code false}, then the string
222       * representation will be "{@code false}" (again, without the quotes).
223       *
224       * @return  A normalized string representation of this Boolean value as it
225       *          should appear in a JSON object.
226       */
227      @Override()
228      public String toNormalizedString()
229      {
230        return stringRepresentation;
231      }
232    
233    
234    
235      /**
236       * Appends a normalized string representation of this Boolean value as it
237       * should appear in a JSON object to the provided buffer.  If the Boolean
238       * value is {@code true}, then the string representation will be
239       * "{@code true}" (without the surrounding quotes).  If the Boolean value is
240       * {@code false}, then the string representation will be "{@code false}"
241       * (again, without the quotes).
242       *
243       * @param  buffer  The buffer to which the information should be appended.
244       */
245      @Override()
246      public void toNormalizedString(final StringBuilder buffer)
247      {
248        buffer.append(stringRepresentation);
249      }
250    
251    
252    
253      /**
254       * {@inheritDoc}
255       */
256      @Override()
257      public void appendToJSONBuffer(final JSONBuffer buffer)
258      {
259        buffer.appendBoolean(booleanValue);
260      }
261    
262    
263    
264      /**
265       * {@inheritDoc}
266       */
267      @Override()
268      public void appendToJSONBuffer(final String fieldName,
269                                     final JSONBuffer buffer)
270      {
271        buffer.appendBoolean(fieldName, booleanValue);
272      }
273    }