/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.background.announcements;
import java.net.URI;
import java.net.URISyntaxException;
import org.mozilla.gecko.sync.ExtendedJSONObject;
import org.mozilla.gecko.sync.Logger;
/**
* Represents a retrieved product announcement.
*
* Instances of this class are immutable.
*/
public class Announcement {
private static final String LOG_TAG = "Announcement";
private static final String KEY_ID = "id";
private static final String KEY_TITLE = "title";
private static final String KEY_URL = "url";
private static final String KEY_TEXT = "text";
private final int id;
private final String title;
private final URI uri;
private final String text;
public Announcement(int id, String title, String text, URI uri) {
this.id = id;
this.title = title;
this.uri = uri;
this.text = text;
}
public static Announcement parseAnnouncement(ExtendedJSONObject body) throws URISyntaxException, IllegalArgumentException {
final Integer id = body.getIntegerSafely(KEY_ID);
if (id == null) {
throw new IllegalArgumentException("No id provided in JSON.");
}
final String title = body.getString(KEY_TITLE);
if (title == null || title.trim().length() == 0) {
throw new IllegalArgumentException("Missing or empty announcement title.");
}
final String uri = body.getString(KEY_URL);
if (uri == null) {
// Empty or otherwise unhappy URI will throw a URISyntaxException.
throw new IllegalArgumentException("Missing announcement URI.");
}
final String text = body.getString(KEY_TEXT);
if (text == null) {
throw new IllegalArgumentException("Missing announcement body.");
}
return new Announcement(id, title, text, new URI(uri));
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public String getText() {
return text;
}
public URI getUri() {
return uri;
}
public ExtendedJSONObject asJSON() {
ExtendedJSONObject out = new ExtendedJSONObject();
out.put(KEY_ID, id);
out.put(KEY_TITLE, title);
out.put(KEY_URL, uri.toASCIIString());
out.put(KEY_TEXT, text);
return out;
}
/**
* Return false if the provided Announcement is in some way invalid,
* regardless of being well-formed.
*/
public static boolean isValidAnnouncement(final Announcement an) {
final URI uri = an.getUri();
if (uri == null) {
Logger.warn(LOG_TAG, "No URI: announcement not valid.");
return false;
}
final String scheme = uri.getScheme();
if (scheme == null) {
Logger.warn(LOG_TAG, "Null scheme: announcement not valid.");
return false;
}
// Only allow HTTP and HTTPS URLs.
if (!scheme.equalsIgnoreCase("http") && !scheme.equalsIgnoreCase("https")) {
Logger.warn(LOG_TAG, "Scheme '" + scheme + "' forbidden: announcement not valid.");
return false;
}
return true;
}
}