/* * Copyright 2015 Google Inc. All rights reserved. * * 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.physical_web.collection; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; /** * Metadata returned from the Physical Web Service for a single URL. */ public class PwsResult { private static final String REQUESTURL_KEY = "requesturl"; private static final String SITEURL_KEY = "siteurl"; private static final String TITLE_KEY = "title"; private static final String DESCRIPTION_KEY = "description"; private static final String ICONURL_KEY = "iconurl"; private static final String GROUPID_KEY = "groupid"; private static final String EXTRA_KEY = "extra"; private String mRequestUrl; private String mSiteUrl; private String mTitle; private String mDescription; private String mIconUrl; private String mGroupId; private JSONObject mExtraData; /** * Construct a PwsResult. * @param requestUrl The request URL, as broadcasted by the device. * @param siteUrl The site URL, as reported by the PWS. * @param title The site title, as reported by the PWS. * @param description The site description, as reported by the PWS. * @param iconUrl The site icon URL, as reported by the PWS. * @param groupId The URL group ID, as reported by the PWS. * @param extraData Extra data to associate with this UrlDevice. */ public PwsResult( String requestUrl, String siteUrl, String title, String description, String iconUrl, String groupId, JSONObject extraData) { mRequestUrl = requestUrl; mSiteUrl = siteUrl; mIconUrl = (iconUrl == null || iconUrl.isEmpty()) ? null : iconUrl; mTitle = (title == null || title.isEmpty()) ? null : title; mDescription = (description == null || description.isEmpty()) ? null : description; mGroupId = (groupId == null || groupId.isEmpty()) ? null : groupId; mExtraData = extraData == null ? new JSONObject() : new JSONObject(extraData.toString()); } /** * Construct a PwsResult. * @param requestUrl The request URL, as broadcasted by the device. * @param siteUrl The site URL, as reported by the PWS. */ public PwsResult(String requestUrl, String siteUrl) { this(requestUrl, siteUrl, null, null, null, null, null); } /** * Builder class for constructing PwsResults. */ public static class Builder { private String mNewRequestUrl; private String mNewSiteUrl; private String mNewTitle; private String mNewDescription; private String mNewIconUrl; private String mNewGroupId; private JSONObject mNewExtraData; /** * Construct a PwsResult Builder. * @param requestUrl The request URL, as broadcasted by the device. * @param siteUrl The site URL, as reported by the PWS. */ public Builder(String requestUrl, String siteUrl) { mNewRequestUrl = requestUrl; mNewSiteUrl = siteUrl; mNewTitle = null; mNewDescription = null; mNewIconUrl = null; mNewGroupId = null; mNewExtraData = new JSONObject(); } /** * Construct a PwsResult Builder. * @param pwsResult the PWSResult to clone. */ public Builder(PwsResult pwsResult) { mNewRequestUrl = pwsResult.mRequestUrl; mNewSiteUrl = pwsResult.mSiteUrl; mNewIconUrl = pwsResult.mIconUrl; mNewTitle = pwsResult.mTitle; mNewDescription = pwsResult.mDescription; mNewGroupId = pwsResult.mGroupId; mNewExtraData = new JSONObject(pwsResult.mExtraData.toString()); } /** * Sets a group ID. * @param iconUrl The site icon URL, as reported by the PWS. * @return the Builder object for chaining operations. */ public Builder setIconUrl(String iconUrl) { mNewIconUrl = iconUrl; return this; } /** * Sets a group ID. * @param title The site title, as reported by the PWS. * @return the Builder object for chaining operations. */ public Builder setTitle(String title) { mNewTitle = title; return this; } /** * Sets a description. * @param description The site description, as reported by the PWS. * @return the Builder object for chaining operations. */ public Builder setDescription(String description) { mNewDescription = description; return this; } /** * Sets a group ID. * @param groupId The URL group ID, as reported by the PWS. * @return the Builder object for chaining operations. */ public Builder setGroupId(String groupId) { mNewGroupId = groupId; return this; } /** * Sets a JSONObject to be the base extra data. * @param extraData the base extra data. * @return the Builder object for chaining operations. */ public Builder setExtra(JSONObject extraData) { mNewExtraData = extraData == null ? new JSONObject() : new JSONObject(extraData.toString()); return this; } /** * Stores a boolean as extra data. * @param value The value to store. * @return the Builder object for chaining operations. */ public Builder addExtra(String key, boolean value) { mNewExtraData.put(key, value); return this; } /** * Stores an int as extra data. * @param value The value to store. * @return the Builder object for chaining operations. */ public Builder addExtra(String key, int value) { mNewExtraData.put(key, value); return this; } /** * Stores an long as extra data. * @param value The value to store. * @return the Builder object for chaining operations. */ public Builder addExtra(String key, long value) { mNewExtraData.put(key, value); return this; } /** * Stores an object as extra data. * @param value The value to store. Any object of type JSONObject, JSONArray, String, Boolean, * Integer, Long, Double, NULL, or null. May not be NaNs or infinities. * @return the Builder object for chaining operations. */ public Builder addExtra(String key, Object value) { mNewExtraData.put(key, value); return this; } /** * Creates a PWSResult from data provided to the builder. * @return The constructed PwsResult. */ public PwsResult build() { return new PwsResult( mNewRequestUrl, mNewSiteUrl, mNewTitle, mNewDescription, mNewIconUrl, mNewGroupId, mNewExtraData); } } /** * Fetches the request URL. * The request URL is the query sent to the Physical Web Service and should be identical to the * URL broadcasted by the device. * @return The request URL */ public String getRequestUrl() { return mRequestUrl; } /** * Fetches the site URL. * The site URL is returned by the Physical Web Service. It may differ from the request URL if * a redirector or URL shortener was used. * @return The site URL */ public String getSiteUrl() { return mSiteUrl; } /** * Check if we have a title. * @return whether this object has a title. */ public boolean hasTitle() { return mTitle != null; } /** * Fetches the title. * The title is parsed from the title tag of the web page. * @return The title */ public String getTitle() { return mTitle; } /** * Check if we have a description. * @return whether this object has a description. */ public boolean hasDescription() { return mDescription != null; } /** * Fetches the description. * The description is a snippet of text describing the contents of the web page. * @return The description */ public String getDescription() { return mDescription; } /** * Check if we have an icon URL. * @return whether this object has an icon URL. */ public boolean hasIconUrl() { return mIconUrl != null; } /** * Fetches the icon URL. * The icon URL is returned by the Physical Web Service. * @return The icon URL */ public String getIconUrl() { return mIconUrl; } /** * Check if we have a group id. * @return whether this object has a group id. */ public boolean hasGroupId() { return mGroupId != null; } /** * Fetches the URL group ID. * The group ID is returned by the Physical Web Service and is used to group similar (but not * necessarily identical) URLs. * @return The URL group ID, may be null */ public String getGroupId() { return mGroupId; } /** * Get extra boolean value. * @param key The key of the stored value. * @return The stored value. * @throws JSONException If the mapping doesn't exist or is not the required type. */ public boolean getExtraBoolean(String key) throws JSONException { return mExtraData.getBoolean(key); } /** * Get extra boolean value. * @param key The key of the stored value. * @return The stored value or false if it doesn't exist in specified form. */ public boolean optExtraBoolean(String key) { return mExtraData.optBoolean(key); } /** * Get extra boolean value. * @param key The key of the stored value. * @param defaultValue The value to return if the key does not exist or the value cannot be * coerced into the necessary type. * @return The stored value or the provided default if it doesn't exist in specified form. */ public boolean optExtraBoolean(String key, boolean defaultValue) { return mExtraData.optBoolean(key, defaultValue); } /** * Get extra int value. * @param key The key of the stored value. * @return The stored value. * @throws JSONException If the mapping doesn't exist or is not the required type. */ public int getExtraInt(String key) throws JSONException { return mExtraData.getInt(key); } /** * Get extra int value. * @param key The key of the stored value. * @return The stored value or 0 if it doesn't exist in specified form. */ public int optExtraInt(String key) { return mExtraData.optInt(key); } /** * Get extra int value. * @param key The key of the stored value. * @param defaultValue The value to return if the key does not exist or the value cannot be * coerced into the necessary type. * @return The stored value or the provided default if it doesn't exist in specified form. */ public int optExtraInt(String key, int defaultValue) { return mExtraData.optInt(key, defaultValue); } /** * Get extra long value. * @param key The key of the stored value. * @return The stored value. * @throws JSONException If the mapping doesn't exist or is not the required type. */ public long getExtraLong(String key) throws JSONException { return mExtraData.getLong(key); } /** * Get extra long value. * @param key The key of the stored value. * @return The stored value or 0 if it doesn't exist in specified form. */ public long optExtraLong(String key) { return mExtraData.optLong(key); } /** * Get extra long value. * @param key The key of the stored value. * @param defaultValue The value to return if the key does not exist or the value cannot be * coerced into the necessary type. * @return The stored value or the provided default if it doesn't exist in specified form. */ public long optExtraLong(String key, long defaultValue) { return mExtraData.optLong(key, defaultValue); } /** * Get extra double value. * @param key The key of the stored value. * @return The stored value. * @throws JSONException If the mapping doesn't exist or is not the required type. */ public double getExtraDouble(String key) throws JSONException { return mExtraData.getDouble(key); } /** * Get extra double value. * @param key The key of the stored value. * @return The stored value or 0 if it doesn't exist in specified form. */ public double optExtraDouble(String key) { return mExtraData.optDouble(key); } /** * Get extra double value. * @param key The key of the stored value. * @param defaultValue The value to return if the key does not exist or the value cannot be * coerced into the necessary type. * @return The stored value or the provided default if it doesn't exist in specified form. */ public double optExtraDouble(String key, double defaultValue) { return mExtraData.optDouble(key, defaultValue); } /** * Get extra String value. * @param key The key of the stored value. * @return The stored value. * @throws JSONException If the mapping doesn't exist or is not the required type. */ public String getExtraString(String key) throws JSONException { return mExtraData.getString(key); } /** * Get extra String value. * @param key The key of the stored value. * @return The stored value or null if it doesn't exist in specified form. */ public String optExtraString(String key) { return mExtraData.optString(key); } /** * Get extra String value. * @param key The key of the stored value. * @param defaultValue The value to return if the key does not exist or the value cannot be * coerced into the necessary type. * @return The stored value or the provided default if it doesn't exist in specified form. */ public String optExtraString(String key, String defaultValue) { return mExtraData.optString(key, defaultValue); } /** * Get extra JSONArray value. * @param key The key of the stored value. * @return The stored value. * @throws JSONException If the mapping doesn't exist or is not the required type. */ public JSONArray getExtraJSONArray(String key) throws JSONException { return mExtraData.getJSONArray(key); } /** * Get extra JSONArray value. * @param key The key of the stored value. * @return The stored value or null if it doesn't exist in specified form. */ public JSONArray optExtraJSONArray(String key) { return mExtraData.optJSONArray(key); } /** * Get extra JSONObject value. * @param key The key of the stored value. * @return The stored value. * @throws JSONException If the mapping doesn't exist or is not the required type. */ public JSONObject getExtraJSONObject(String key) throws JSONException { return mExtraData.getJSONObject(key); } /** * Get extra JSONObject value. * @param key The key of the stored value. * @return The stored value or null if it doesn't exist in specified form. */ public JSONObject optExtraJSONObject(String key) { return mExtraData.optJSONObject(key); } /** * Create a JSON object that represents this data structure. * @return a JSON serialization of this data structure. */ public JSONObject jsonSerialize() { JSONObject jsonObject = new JSONObject(); jsonObject.put(REQUESTURL_KEY, mRequestUrl); jsonObject.put(SITEURL_KEY, mSiteUrl); if (mTitle != null) { jsonObject.put(TITLE_KEY, mTitle); } if (mDescription != null) { jsonObject.put(DESCRIPTION_KEY, mDescription); } if (mIconUrl != null) { jsonObject.put(ICONURL_KEY, mIconUrl); } if (mGroupId != null) { jsonObject.put(GROUPID_KEY, mGroupId); } if (mExtraData.length() > 0) { jsonObject.put(EXTRA_KEY, mExtraData); } return jsonObject; } /** * Populate a PwsResult with data from a given JSON object. * @param jsonObject a serialized PwsResult. * @return The PwsResult represented by the serialized object. */ public static PwsResult jsonDeserialize(JSONObject jsonObject) { return new Builder(jsonObject.getString(REQUESTURL_KEY), jsonObject.getString(SITEURL_KEY)) .setExtra(jsonObject.optJSONObject(EXTRA_KEY)) .setTitle(jsonObject.optString(TITLE_KEY)) .setDescription(jsonObject.optString(DESCRIPTION_KEY)) .setIconUrl(jsonObject.optString(ICONURL_KEY)) .setGroupId(jsonObject.optString(GROUPID_KEY)) .build(); } }