/** * * Funf: Open Sensing Framework * Copyright (C) 2010-2011 Nadav Aharony, Wei Pan, Alex Pentland. * Acknowledgments: Alan Gardner * Contact: nadav@media.mit.edu * * This file is part of Funf. * * Funf is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * Funf is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Funf. If not, see <http://www.gnu.org/licenses/>. * */ package edu.mit.media.funf.json; import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import android.util.Log; import com.google.gson.JsonElement; import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import edu.mit.media.funf.util.HashCodeUtil; /** * An immutable JsonObject that orders keys alphabetically for consistency in * serialization. This contains no mutation functions, and only contains immutable JsonElements in the tree. * * @author Alan Gardner */ public class IJsonObject extends JsonElement { /** * The immutable map of entries */ private final SortedMap<String, JsonElement> members; public IJsonObject(IJsonObject jsonObject) { this.members = jsonObject.members; } public IJsonObject(JsonObject jsonObject) { if (jsonObject == null) { throw new IllegalStateException("Cannot create null IJsonObject"); } SortedMap<String, JsonElement> map = new TreeMap<String, JsonElement>(); for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) { map.put(entry.getKey(), JsonUtils.immutable(entry.getValue())); } members = Collections.unmodifiableSortedMap(map); } @Override public boolean isJsonObject() { return true; } @Override public JsonObject getAsJsonObject() { JsonObject jsonObject = new JsonObject(); for (Map.Entry<String, JsonElement> entry : members.entrySet()) { jsonObject.add(entry.getKey(), entry.getValue()); } return jsonObject; } /** * Returns a set of members of this object. The set is ordered alphabetically. * * @return a set of members of this object. */ public Set<Map.Entry<String, JsonElement>> entrySet() { return Collections.unmodifiableSet(members.entrySet()); } /** * Convenience method to check if a member with the specified name is * present in this object. * * @param memberName * name of the member that is being checked for presence. * @return true if there is a member with the specified name, false * otherwise. */ public boolean has(String memberName) { return members.containsKey(memberName); } /** * Returns the member with the specified name. * * @param memberName * name of the member that is being requested. * @return the member matching the name. Null if no such member exists. */ public JsonElement get(String memberName) { if (members.containsKey(memberName)) { JsonElement member = members.get(memberName); return member == null ? JsonNull.INSTANCE : member; } return null; } /** * Convenience method to get the specified member as a JsonPrimitive * element. * * @param memberName * name of the member being requested. * @return the JsonPrimitive corresponding to the specified member. */ public JsonPrimitive getAsJsonPrimitive(String memberName) { return (JsonPrimitive) members.get(memberName); } /** * Convenience method to get the specified member as a JsonArray. * * @param memberName * name of the member being requested. * @return the JsonArray corresponding to the specified member. */ public IJsonArray getAsJsonArray(String memberName) { return (IJsonArray) members.get(memberName); } /** * Convenience method to get the specified member as a JsonObject. * * @param memberName * name of the member being requested. * @return the JsonObject corresponding to the specified member. */ public IJsonObject getAsJsonObject(String memberName) { return (IJsonObject) members.get(memberName); } @Override public boolean equals(Object o) { return (o == this) || (o instanceof IJsonObject && ((IJsonObject) o).members.equals(members)); } @Override public int hashCode() { return members.hashCode(); } private String toStringCache = null; @Override public String toString() { // Since this is immutable, the string result can be cached // Does not need to be synchronized, last one is kept if (toStringCache == null) { toStringCache = super.toString(); } return toStringCache; } }