JsonProduct.java
- package gov.usgs.earthquake.product.io;
- import gov.usgs.earthquake.product.AbstractContent;
- import gov.usgs.earthquake.product.Content;
- import gov.usgs.earthquake.product.Product;
- import gov.usgs.earthquake.product.ProductId;
- import gov.usgs.earthquake.product.URLContent;
- import gov.usgs.util.CryptoUtils.Version;
- import gov.usgs.util.protocolhandlers.data.Handler;
- import gov.usgs.util.StreamUtils;
- import gov.usgs.util.XmlUtils;
- import java.math.BigDecimal;
- import java.net.URI;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.Base64;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.json.Json;
- import javax.json.JsonArray;
- import javax.json.JsonArrayBuilder;
- import javax.json.JsonObject;
- import javax.json.JsonObjectBuilder;
- import javax.json.JsonValue;
- public class JsonProduct {
- static {
- // make sure data protocol handler registered
- Handler.register();
- }
- /**
- * Convert product object to json.
- *
- * @param product a product
- * @return a json object
- * @throws Exception if error occurs
- */
- public JsonObject getJsonObject(final Product product) throws Exception {
- JsonObjectBuilder json = Json.createObjectBuilder();
- json.add("contents", getContentsJson(product.getContents()));
- JsonObjectBuilder geometry = getGeometryJson(product);
- if (geometry == null) {
- json.addNull("geometry");
- } else {
- json.add("geometry", geometry);
- }
- final ProductId id = product.getId();
- json.add("id", getIdJson(id));
- json.add("links", getLinksJson(product.getLinks()));
- json.add("properties", getPropertiesJson(product.getProperties()));
- if (product.getSignature() == null) {
- json.addNull("signature");
- } else {
- json.add("signature", product.getSignature());
- }
- json.add("signatureVersion", product.getSignatureVersion().toString());
- json.add("status", product.getStatus());
- json.add("type", "Feature");
- return json.build();
- }
- /**
- * Convert json object to product.
- * @param json a json object
- * @return a product
- * @throws Exception if error occurs
- */
- public Product getProduct(final JsonObject json) throws Exception {
- Product product = new Product(getId(json.getJsonObject("id")));
- product.setContents(getContents(json.getJsonArray("contents")));
- product.setLinks(getLinks(json.getJsonArray("links")));
- product.setProperties(getProperties(json.getJsonObject("properties")));
- product.setStatus(json.getString("status"));
- try {
- product.setSignature(json.getString("signature"));
- } catch (Exception e) {
- product.setSignature(null);
- }
- product.setSignatureVersion(Version.fromString(json.getString("signatureVersion")));
- product.setTrackerURL(new URL("data:,"));
- return product;
- }
- /**
- * Convert contents map to json.
- *
- * @param contents contents map
- * @return JSOnArrayBuilder
- * @throws Exception if error occurs
- */
- public JsonArrayBuilder getContentsJson(final Map<String, Content> contents) throws Exception {
- final JsonArrayBuilder builder = Json.createArrayBuilder();
- for (final String path : contents.keySet()) {
- final Content content = contents.get(path);
- final JsonObjectBuilder jsonContent =
- Json.createObjectBuilder()
- .add("length", content.getLength())
- .add("modified", XmlUtils.formatDate(content.getLastModified()))
- .add("path", path)
- .add("sha256", content.getSha256())
- .add("type", content.getContentType());
- if (content instanceof URLContent) {
- jsonContent.add("url", ((URLContent) content).getURL().toString());
- } else if ("".equals(path)) {
- jsonContent.add(
- "url",
- "data:"
- + content.getContentType()
- + ";base64,"
- + Base64.getEncoder()
- .encodeToString(StreamUtils.readStream(content.getInputStream())));
- } else {
- // no url, will throw parse error
- // this is used to get upload urls, and returned object includes urls...
- jsonContent.addNull("url");
- }
- builder.add(jsonContent);
- }
- return builder;
- }
- /**
- * Convert contents json to map.
- *
- * @param json JsonArray
- * @return Contents map
- * @throws Exception if error occurs
- */
- public Map<String, Content> getContents(final JsonArray json) throws Exception {
- Map<String, Content> contents = new HashMap<String, Content>();
- for (JsonValue value : json) {
- JsonObject object = value.asJsonObject();
- Long length = object.getJsonNumber("length").longValue();
- Date modified = XmlUtils.getDate(object.getString("modified"));
- String path = object.getString("path");
- String sha256 = object.getString("sha256");
- String type = object.getString("type");
- String url = object.getString("url");
- AbstractContent content = new URLContent(new URL(url));
- content.setContentType(type);
- content.setLastModified(modified);
- content.setLength(length);
- content.setSha256(sha256);
- contents.put(path, content);
- }
- return contents;
- }
- /**
- * Create json geometry from product properties.
- *
- * @param product a product
- * @return JSON geometry via JsonObjectBuilder
- * @throws Exception if error occurs
- */
- public JsonObjectBuilder getGeometryJson(final Product product) throws Exception {
- final BigDecimal latitude = product.getLatitude();
- final BigDecimal longitude = product.getLongitude();
- final BigDecimal depth = product.getDepth();
- if (latitude != null || longitude != null || depth != null) {
- final JsonArrayBuilder coordinates = Json.createArrayBuilder();
- if (latitude != null) {
- coordinates.add(latitude);
- } else {
- coordinates.addNull();
- }
- if (longitude != null) {
- coordinates.add(longitude);
- } else {
- coordinates.addNull();
- }
- if (depth != null) {
- coordinates.add(depth);
- } else {
- coordinates.addNull();
- }
- return Json.createObjectBuilder()
- .add("type", "Point")
- .add("coordinates", coordinates);
- }
- return null;
- }
- /**
- * Convert json id to ProductId object.
- *
- * @param json A JsonObject ID
- * @return a productId
- * @throws Exception if error occurs
- */
- public ProductId getId(final JsonObject json) throws Exception {
- final String code = json.getString("code");
- final String source = json.getString("source");
- final String type = json.getString("type");
- final Date updateTime = XmlUtils.getDate(json.getString("updateTime"));
- return new ProductId(source, type, code, updateTime);
- }
- /**
- * Convert ProductId to json object.
- * @param id A ProductId
- * @return JsonObjectBuilder
- * @throws Exception if error occurs
- */
- public JsonObjectBuilder getIdJson(final ProductId id) throws Exception {
- return Json.createObjectBuilder()
- .add("code", id.getCode())
- .add("source", id.getSource())
- .add("type", id.getType())
- .add("updateTime", XmlUtils.formatDate(id.getUpdateTime()));
- }
- /**
- * Convert json links to map.
- * @param json a Jsonarray
- * @return a Map of links
- * @throws Exception if error occurs
- */
- public Map<String, List<URI>> getLinks(final JsonArray json) throws Exception {
- final Map<String, List<URI>> links = new HashMap<String, List<URI>>();
- for (final JsonValue value : json) {
- final JsonObject link = value.asJsonObject();
- final String relation = link.getString("relation");
- final URI uri = new URI(link.getString("uri"));
- List<URI> relationLinks = links.get(relation);
- if (relationLinks == null) {
- relationLinks = new ArrayList<URI>();
- links.put(relation, relationLinks);
- }
- relationLinks.add(uri);
- }
- return links;
- }
- /**
- * Convert links map to json.
- *
- * @param links map
- * @return JsonArray of JsonArrayBuilder
- * @throws Exception if error occurs
- */
- public JsonArrayBuilder getLinksJson(final Map<String, List<URI>> links) throws Exception {
- final JsonArrayBuilder builder = Json.createArrayBuilder();
- for (final String relation : links.keySet()) {
- final List<URI> relationLinks = links.get(relation);
- for (final URI uri : relationLinks) {
- builder.add(
- Json.createObjectBuilder().add("relation", relation).add("uri", uri.toString()));
- }
- }
- return builder;
- }
- /**
- * Convert properties json to map.
- * @param json JsonObject properties
- * @return A map
- * @throws Exception if error occurs
- */
- public Map<String, String> getProperties(final JsonObject json) throws Exception {
- final Map<String, String> properties = new HashMap<String, String>();
- for (final String name : json.keySet()) {
- properties.put(name, json.getString(name));
- }
- return properties;
- }
- /**
- * Convert properties map to json.
- *
- * @param properties Map of properties
- * @return JsonObjectBuilder
- * @throws Exception if error occurs
- */
- public JsonObjectBuilder getPropertiesJson(final Map<String, String> properties)
- throws Exception {
- final JsonObjectBuilder builder = Json.createObjectBuilder();
- for (final String name : properties.keySet()) {
- builder.add(name, properties.get(name));
- }
- return builder;
- }
- }