/*
* Copyright 2008-present MongoDB, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.bson;
import org.bson.types.BasicBSONList;
import org.bson.types.ObjectId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
A simple implementation of DBObject
. A DBObject
can be created as follows, using this class: DBObject obj = new
BasicBSONObject(); obj.put( "foo", "bar" );
/**
* A simple implementation of {@code DBObject}. A {@code DBObject} can be created as follows, using this class: {@code DBObject obj = new
* BasicBSONObject(); obj.put( "foo", "bar" ); }
*/
@SuppressWarnings({"rawtypes"})
public class BasicBSONObject extends LinkedHashMap<String, Object> implements BSONObject {
private static final long serialVersionUID = -4415279469780082174L;
Creates an empty object.
/**
* Creates an empty object.
*/
public BasicBSONObject() {
}
Creates an empty object.
Params: - size – the initial capacity for the Map storing this document.
/**
* Creates an empty object.
*
* @param size the initial capacity for the Map storing this document.
*/
public BasicBSONObject(final int size) {
super(size);
}
Creates a BSONObject initialised with a single key/value pair.
Params: - key – key under which to store
- value – value to store
/**
* Creates a BSONObject initialised with a single key/value pair.
*
* @param key key under which to store
* @param value value to store
*/
public BasicBSONObject(final String key, final Object value) {
put(key, value);
}
Creates a DBObject from a map.
Params: - map – map to convert
/**
* Creates a DBObject from a map.
*
* @param map map to convert
*/
@SuppressWarnings("unchecked")
public BasicBSONObject(final Map map) {
super(map);
}
Converts a DBObject to a map.
Returns: the DBObject
/**
* Converts a DBObject to a map.
*
* @return the DBObject
*/
public Map toMap() {
return new LinkedHashMap<String, Object>(this);
}
Deletes a field from this object.
Params: - key – the field name to remove
Returns: the object removed
/**
* Deletes a field from this object.
*
* @param key the field name to remove
* @return the object removed
*/
public Object removeField(final String key) {
return remove(key);
}
Checks if this object contains a given field
Params: - field – field name
Returns: if the field exists
/**
* Checks if this object contains a given field
*
* @param field field name
* @return if the field exists
*/
public boolean containsField(final String field) {
return super.containsKey(field);
}
@Deprecated
@Override
public boolean containsKey(final String key) {
return containsField(key);
}
Gets a value from this object
Params: - key – field name
Returns: the value
/**
* Gets a value from this object
*
* @param key field name
* @return the value
*/
public Object get(final String key) {
return super.get(key);
}
Returns the value of a field as an int
. Params: - key – the field to look for
Returns: the field value (or default)
/**
* Returns the value of a field as an {@code int}.
*
* @param key the field to look for
* @return the field value (or default)
*/
public int getInt(final String key) {
Object o = get(key);
if (o == null) {
throw new NullPointerException("no value for: " + key);
}
return toInt(o);
}
Returns the value of a field as an int
. Params: - key – the field to look for
- def – the default to return
Returns: the field value (or default)
/**
* Returns the value of a field as an {@code int}.
*
* @param key the field to look for
* @param def the default to return
* @return the field value (or default)
*/
public int getInt(final String key, final int def) {
Object foo = get(key);
if (foo == null) {
return def;
}
return toInt(foo);
}
Returns the value of a field as a long
. Params: - key – the field to return
Returns: the field value
/**
* Returns the value of a field as a {@code long}.
*
* @param key the field to return
* @return the field value
*/
public long getLong(final String key) {
Object foo = get(key);
return ((Number) foo).longValue();
}
Returns the value of a field as an long
. Params: - key – the field to look for
- def – the default to return
Returns: the field value (or default)
/**
* Returns the value of a field as an {@code long}.
*
* @param key the field to look for
* @param def the default to return
* @return the field value (or default)
*/
public long getLong(final String key, final long def) {
Object foo = get(key);
if (foo == null) {
return def;
}
return ((Number) foo).longValue();
}
Returns the value of a field as a double
. Params: - key – the field to return
Returns: the field value
/**
* Returns the value of a field as a {@code double}.
*
* @param key the field to return
* @return the field value
*/
public double getDouble(final String key) {
Object foo = get(key);
return ((Number) foo).doubleValue();
}
Returns the value of a field as an double
. Params: - key – the field to look for
- def – the default to return
Returns: the field value (or default)
/**
* Returns the value of a field as an {@code double}.
*
* @param key the field to look for
* @param def the default to return
* @return the field value (or default)
*/
public double getDouble(final String key, final double def) {
Object foo = get(key);
if (foo == null) {
return def;
}
return ((Number) foo).doubleValue();
}
Returns the value of a field as a string
Params: - key – the field to look up
Returns: the value of the field, converted to a string
/**
* Returns the value of a field as a string
*
* @param key the field to look up
* @return the value of the field, converted to a string
*/
public String getString(final String key) {
Object foo = get(key);
if (foo == null) {
return null;
}
return foo.toString();
}
Returns the value of a field as a string
Params: - key – the field to look up
- def – the default to return
Returns: the value of the field, converted to a string
/**
* Returns the value of a field as a string
*
* @param key the field to look up
* @param def the default to return
* @return the value of the field, converted to a string
*/
public String getString(final String key, final String def) {
Object foo = get(key);
if (foo == null) {
return def;
}
return foo.toString();
}
Returns the value of a field as a boolean.
Params: - key – the field to look up
Returns: the value of the field, or false if field does not exist
/**
* Returns the value of a field as a boolean.
*
* @param key the field to look up
* @return the value of the field, or false if field does not exist
*/
public boolean getBoolean(final String key) {
return getBoolean(key, false);
}
Returns the value of a field as a boolean
Params: - key – the field to look up
- def – the default value in case the field is not found
Returns: the value of the field, converted to a string
/**
* Returns the value of a field as a boolean
*
* @param key the field to look up
* @param def the default value in case the field is not found
* @return the value of the field, converted to a string
*/
public boolean getBoolean(final String key, final boolean def) {
Object foo = get(key);
if (foo == null) {
return def;
}
if (foo instanceof Number) {
return ((Number) foo).intValue() > 0;
}
if (foo instanceof Boolean) {
return (Boolean) foo;
}
throw new IllegalArgumentException("can't coerce to bool:" + foo.getClass());
}
Returns the object id or null if not set.
Params: - field – The field to return
Returns: The field object value or null if not found (or if null :-^).
/**
* Returns the object id or null if not set.
*
* @param field The field to return
* @return The field object value or null if not found (or if null :-^).
*/
public ObjectId getObjectId(final String field) {
return (ObjectId) get(field);
}
Returns the object id or def if not set.
Params: - field – The field to return
- def – the default value in case the field is not found
Returns: The field object value or def if not set.
/**
* Returns the object id or def if not set.
*
* @param field The field to return
* @param def the default value in case the field is not found
* @return The field object value or def if not set.
*/
public ObjectId getObjectId(final String field, final ObjectId def) {
Object foo = get(field);
return (foo != null) ? (ObjectId) foo : def;
}
Returns the date or null if not set.
Params: - field – The field to return
Returns: The field object value or null if not found.
/**
* Returns the date or null if not set.
*
* @param field The field to return
* @return The field object value or null if not found.
*/
public Date getDate(final String field) {
return (Date) get(field);
}
Returns the date or def if not set.
Params: - field – The field to return
- def – the default value in case the field is not found
Returns: The field object value or def if not set.
/**
* Returns the date or def if not set.
*
* @param field The field to return
* @param def the default value in case the field is not found
* @return The field object value or def if not set.
*/
public Date getDate(final String field, final Date def) {
Object foo = get(field);
return (foo != null) ? (Date) foo : def;
}
@SuppressWarnings("unchecked")
@Override
public void putAll(final Map m) {
for (final Map.Entry entry : (Set<Map.Entry>) m.entrySet()) {
put(entry.getKey().toString(), entry.getValue());
}
}
@Override
public void putAll(final BSONObject o) {
for (final String k : o.keySet()) {
put(k, o.get(k));
}
}
Add a key/value pair to this object
Params: - key – the field name
- val – the field value
Returns: this
/**
* Add a key/value pair to this object
*
* @param key the field name
* @param val the field value
* @return {@code this}
*/
public BasicBSONObject append(final String key, final Object val) {
put(key, val);
return this;
}
Compares two documents according to their serialized form, ignoring the order of keys.
Params: - o – the document to compare to, which must be an instance of
BSONObject
.
Returns: true if the documents have the same serialized form, ignoring key order.
/**
* Compares two documents according to their serialized form, ignoring the order of keys.
*
* @param o the document to compare to, which must be an instance of {@link org.bson.BSONObject}.
* @return true if the documents have the same serialized form, ignoring key order.
*/
@Override
public boolean equals(final Object o) {
if (o == this) {
return true;
}
if (!(o instanceof BSONObject)) {
return false;
}
BSONObject other = (BSONObject) o;
if (!keySet().equals(other.keySet())) {
return false;
}
return Arrays.equals(getEncoder().encode(canonicalizeBSONObject(this)), getEncoder().encode(canonicalizeBSONObject(other)));
}
@Override
public int hashCode() {
return Arrays.hashCode(canonicalizeBSONObject(this).encode());
}
private byte[] encode() {
return getEncoder().encode(this);
}
private BSONEncoder getEncoder() {
return new BasicBSONEncoder();
}
// create a copy of "from", but with keys ordered alphabetically
@SuppressWarnings("unchecked")
private static Object canonicalize(final Object from) {
if (from instanceof BSONObject && !(from instanceof BasicBSONList)) {
return canonicalizeBSONObject((BSONObject) from);
} else if (from instanceof List) {
return canonicalizeList((List<Object>) from);
} else if (from instanceof Map) {
return canonicalizeMap((Map<String, Object>) from);
} else {
return from;
}
}
private static Map<String, Object> canonicalizeMap(final Map<String, Object> from) {
Map<String, Object> canonicalized = new LinkedHashMap<String, Object>(from.size());
TreeSet<String> keysInOrder = new TreeSet<String>(from.keySet());
for (String key : keysInOrder) {
Object val = from.get(key);
canonicalized.put(key, canonicalize(val));
}
return canonicalized;
}
private static BasicBSONObject canonicalizeBSONObject(final BSONObject from) {
BasicBSONObject canonicalized = new BasicBSONObject();
TreeSet<String> keysInOrder = new TreeSet<String>(from.keySet());
for (String key : keysInOrder) {
Object val = from.get(key);
canonicalized.put(key, canonicalize(val));
}
return canonicalized;
}
private static List canonicalizeList(final List<Object> list) {
List<Object> canonicalized = new ArrayList<Object>(list.size());
for (Object cur : list) {
canonicalized.add(canonicalize(cur));
}
return canonicalized;
}
private int toInt(final Object o) {
if (o instanceof Number) {
return ((Number) o).intValue();
}
if (o instanceof Boolean) {
return ((Boolean) o) ? 1 : 0;
}
throw new IllegalArgumentException("can't convert: " + o.getClass().getName() + " to int");
}
}