1 /*
2 * #%L
3 * BooleanElement.java - mongodb-async-driver - Allanbank Consulting, Inc.
4 * %%
5 * Copyright (C) 2011 - 2014 Allanbank Consulting, Inc.
6 * %%
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * #L%
19 */
20 package com.allanbank.mongodb.bson.element;
21
22 import com.allanbank.mongodb.bson.Element;
23 import com.allanbank.mongodb.bson.ElementType;
24 import com.allanbank.mongodb.bson.Visitor;
25 import com.allanbank.mongodb.bson.io.StringEncoder;
26
27 /**
28 * A wrapper for a BSON boolean.
29 *
30 * @api.yes This class is part of the driver's API. Public and protected members
31 * will be deprecated for at least 1 non-bugfix release (version
32 * numbers are <major>.<minor>.<bugfix>) before being
33 * removed or modified.
34 * @copyright 2011-2013, Allanbank Consulting, Inc., All Rights Reserved
35 */
36 public class BooleanElement extends AbstractElement {
37
38 /** The BSON type for a Object Id. */
39 public static final ElementType TYPE = ElementType.BOOLEAN;
40
41 /** Serialization version for the class. */
42 private static final long serialVersionUID = -3534279865960686134L;
43
44 /**
45 * Computes and returns the number of bytes that are used to encode the
46 * element.
47 *
48 * @param name
49 * The name for the element.
50 * @return The size of the element when encoded in bytes.
51 */
52 private static long computeSize(final String name) {
53 long result = 3; // type (1) + name null byte (1) + value (1).
54 result += StringEncoder.utf8Size(name);
55
56 return result;
57 }
58
59 /** The boolean value */
60 private final boolean myValue;
61
62 /**
63 * Constructs a new {@link BooleanElement}.
64 *
65 * @param name
66 * The name for the BSON boolean.
67 * @param value
68 * The BSON boolean value.
69 * @throws IllegalArgumentException
70 * If the {@code name} is <code>null</code>.
71 */
72 public BooleanElement(final String name, final boolean value) {
73 this(name, value, computeSize(name));
74 }
75
76 /**
77 * Constructs a new {@link BooleanElement}.
78 *
79 * @param name
80 * The name for the BSON boolean.
81 * @param value
82 * The BSON boolean value.
83 * @param size
84 * The size of the element when encoded in bytes. If not known
85 * then use the
86 * {@link BooleanElement#BooleanElement(String, boolean)}
87 * constructor instead.
88 * @throws IllegalArgumentException
89 * If the {@code name} is <code>null</code>.
90 */
91 public BooleanElement(final String name, final boolean value,
92 final long size) {
93 super(name, size);
94 myValue = value;
95 }
96
97 /**
98 * Accepts the visitor and calls the {@link Visitor#visitBoolean} method.
99 *
100 * @see Element#accept(Visitor)
101 */
102 @Override
103 public void accept(final Visitor visitor) {
104 visitor.visitBoolean(getName(), getValue());
105 }
106
107 /**
108 * {@inheritDoc}
109 * <p>
110 * Overridden to compare the values if the base class comparison is equals.
111 * False is less than true.
112 * </p>
113 */
114 @Override
115 public int compareTo(final Element otherElement) {
116 int result = super.compareTo(otherElement);
117
118 if (result == 0) {
119 final BooleanElement other = (BooleanElement) otherElement;
120
121 final int value = myValue ? 1 : 0;
122 final int otherValue = other.myValue ? 1 : 0;
123
124 result = value - otherValue;
125 }
126
127 return result;
128 }
129
130 /**
131 * Determines if the passed object is of this same type as this object and
132 * if so that its fields are equal.
133 *
134 * @param object
135 * The object to compare to.
136 *
137 * @see java.lang.Object#equals(java.lang.Object)
138 */
139 @Override
140 public boolean equals(final Object object) {
141 boolean result = false;
142 if (this == object) {
143 result = true;
144 }
145 else if ((object != null) && (getClass() == object.getClass())) {
146 final BooleanElement other = (BooleanElement) object;
147
148 result = super.equals(object) && (myValue == other.myValue);
149 }
150 return result;
151 }
152
153 /**
154 * {@inheritDoc}
155 */
156 @Override
157 public ElementType getType() {
158 return TYPE;
159 }
160
161 /**
162 * Returns the BSON boolean value.
163 *
164 * @return The BSON boolean value.
165 */
166 public boolean getValue() {
167 return myValue;
168 }
169
170 /**
171 * {@inheritDoc}
172 * <p>
173 * Returns a {@link Boolean}.
174 * </p>
175 */
176 @Override
177 public Boolean getValueAsObject() {
178 return Boolean.valueOf(getValue());
179 }
180
181 /**
182 * {@inheritDoc}
183 * <p>
184 * Returns "true" or "false".
185 * </p>
186 */
187 @Override
188 public String getValueAsString() {
189 return Boolean.toString(myValue);
190 }
191
192 /**
193 * Computes a reasonable hash code.
194 *
195 * @return The hash code value.
196 */
197 @Override
198 public int hashCode() {
199 return super.hashCode() + (myValue ? 31 : 11);
200 }
201
202 /**
203 * {@inheritDoc}
204 * <p>
205 * Returns a new {@link BooleanElement}.
206 * </p>
207 */
208 @Override
209 public BooleanElement withName(final String name) {
210 if (getName().equals(name)) {
211 return this;
212 }
213 return new BooleanElement(name, myValue);
214 }
215 }