/* * Copyright 2007 Yusuke Yamamoto * * 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 twitter4j.json; import org.json.JSONException; import org.json.JSONObject; import twitter4j.internal.logging.Logger; /** * @author Dan Checkoway - dcheckoway at gmail.com * @since Twitter4J 2.1.9 */ public final class JSONObjectType { private static final Logger logger = Logger.getLogger(JSONObjectType.class); /** * Determine the respective object type for a given JSONObject. This method * inspects the object to figure out what type of object it represents. This * is useful when processing JSON events of mixed type from a stream, in * which case you may need to know what type of object to construct, or how * to handle the event properly. * * @param json the JSONObject whose type should be determined * @return the determined JSONObjectType, or null if not recognized */ public static Type determine(final JSONObject json) { // This code originally lived in AbstractStreamImplementation. // I've moved it in here to expose it as a public encapsulation of // the object type determination logic. if (!json.isNull("sender")) return Type.SENDER; else if (!json.isNull("text")) return Type.STATUS; else if (!json.isNull("direct_message")) return Type.DIRECT_MESSAGE; else if (!json.isNull("delete")) return Type.DELETE; else if (!json.isNull("limit")) return Type.LIMIT; else if (!json.isNull("warning")) return Type.STALL_WARNING; else if (!json.isNull("scrub_geo")) return Type.SCRUB_GEO; else if (!json.isNull("friends")) return Type.FRIENDS; else if (!json.isNull("event")) { String event; try { event = json.getString("event"); if ("favorite".equals(event)) return Type.FAVORITE; else if ("unfavorite".equals(event)) return Type.UNFAVORITE; else if ("follow".equals(event)) return Type.FOLLOW; else if ("unfollow".equals(event)) return Type.UNFOLLOW; else if (event.startsWith("list")) { if ("list_member_added".equals(event)) return Type.USER_LIST_MEMBER_ADDED; else if ("list_member_removed".equals(event)) return Type.USER_LIST_MEMBER_DELETED; else if ("list_user_subscribed".equals(event)) return Type.USER_LIST_SUBSCRIBED; else if ("list_user_unsubscribed".equals(event)) return Type.USER_LIST_UNSUBSCRIBED; else if ("list_created".equals(event)) return Type.USER_LIST_CREATED; else if ("list_updated".equals(event)) return Type.USER_LIST_UPDATED; else if ("list_destroyed".equals(event)) return Type.USER_LIST_DESTROYED; } else if ("user_update".equals(event)) return Type.USER_UPDATE; else if ("block".equals(event)) return Type.BLOCK; else if ("unblock".equals(event)) return Type.UNBLOCK; } catch (final JSONException jsone) { try { logger.warn("Failed to get event element: ", json.toString(2)); } catch (final JSONException ignore) { } } } else if (!json.isNull("disconnect")) return Type.DISCONNECTION; return Type.UNKNOWN; } public enum Type { SENDER, STATUS, DIRECT_MESSAGE, DELETE, LIMIT, STALL_WARNING, SCRUB_GEO, FRIENDS, FAVORITE, UNFAVORITE, FOLLOW, UNFOLLOW, USER_LIST_MEMBER_ADDED, USER_LIST_MEMBER_DELETED, USER_LIST_SUBSCRIBED, USER_LIST_UNSUBSCRIBED, USER_LIST_CREATED, USER_LIST_UPDATED, USER_LIST_DESTROYED, USER_UPDATE, BLOCK, UNBLOCK, DISCONNECTION, UNKNOWN } }