/**
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
*
* You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
* copy, modify, and distribute this software in source code or binary form for use
* in connection with the web services and APIs provided by Facebook.
*
* As with any software that integrates with the Facebook platform, your use of
* this software is subject to the Facebook Developer Principles and Policies
* [http://developers.facebook.com/policy/]. This copyright notice shall be
* included in all copies or substantial portions of the software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.facebook.share.internal;
import android.os.Bundle;
import android.support.annotation.Nullable;
import com.facebook.internal.Validate;
import com.facebook.share.model.ShareOpenGraphAction;
import com.facebook.share.model.ShareOpenGraphObject;
import com.facebook.share.model.SharePhoto;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.*;
/**
* com.facebook.share.internal is solely for the use of other packages within the
* Facebook SDK for Android. Use of any of the classes in this package is
* unsupported, and they may be modified or removed without warning at any time.
*
* Utility methods for JSON representation of Open Graph models.
*/
public final class OpenGraphJSONUtility {
/**
* Converts an action to a JSONObject.
*
* NOTE: All images are removed from the JSON representation and must be added to the builder
* separately.
*
* @param action {@link com.facebook.share.model.ShareOpenGraphAction} to be converted.
* @return {@link org.json.JSONObject} representing the action.
* @throws JSONException
*/
public static JSONObject toJSONObject(
final ShareOpenGraphAction action,
final PhotoJSONProcessor photoJSONProcessor) throws JSONException {
final JSONObject result = new JSONObject();
final Set<String> keys = action.keySet();
for (String key : keys) {
result.put(key, toJSONValue(action.get(key), photoJSONProcessor));
}
return result;
}
private static JSONObject toJSONObject(
final ShareOpenGraphObject object,
final PhotoJSONProcessor photoJSONProcessor) throws JSONException {
final JSONObject result = new JSONObject();
final Set<String> keys = object.keySet();
for (String key : keys) {
result.put(key, toJSONValue(object.get(key), photoJSONProcessor));
}
return result;
}
private static JSONArray toJSONArray(
final List list,
final PhotoJSONProcessor photoJSONProcessor) throws JSONException {
final JSONArray result = new JSONArray();
for (Object item : list) {
result.put(toJSONValue(item, photoJSONProcessor));
}
return result;
}
public static Object toJSONValue(
@Nullable final Object object,
final PhotoJSONProcessor photoJSONProcessor) throws JSONException {
if (object == null) {
return JSONObject.NULL;
}
if ((object instanceof String) ||
(object instanceof Boolean) ||
(object instanceof Double) ||
(object instanceof Float) ||
(object instanceof Integer) ||
(object instanceof Long)) {
return object;
}
if (object instanceof SharePhoto) {
if (photoJSONProcessor != null) {
return photoJSONProcessor.toJSONObject((SharePhoto) object);
}
return null;
}
if (object instanceof ShareOpenGraphObject) {
return toJSONObject((ShareOpenGraphObject) object, photoJSONProcessor);
}
if (object instanceof List) {
return toJSONArray((List) object, photoJSONProcessor);
}
throw new IllegalArgumentException(
"Invalid object found for JSON serialization: " +object.toString());
}
private OpenGraphJSONUtility() {}
public interface PhotoJSONProcessor {
public JSONObject toJSONObject(SharePhoto photo);
}
}