Java tutorial
/******************************************************************************* * Copyright 2018 The MIT Internet Trust Consortium * * Portions copyright 2011-2013 The MITRE Corporation * * 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.mitre.util; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.mitre.oauth2.model.PKCEAlgorithm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.nimbusds.jose.EncryptionMethod; import com.nimbusds.jose.JWEAlgorithm; import com.nimbusds.jose.JWSAlgorithm; /** * A collection of null-safe converters from common classes and JSON elements, using GSON. * * @author jricher * */ @SuppressWarnings(value = { "rawtypes", "unchecked" }) public class JsonUtils { /** * Logger for this class */ private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class); private static Gson gson = new Gson(); /** * Translate a set of strings to a JSON array, empty array returned as null * @param value * @return */ public static JsonElement getAsArray(Set<String> value) { return getAsArray(value, false); } /** * Translate a set of strings to a JSON array, optionally preserving the empty array. Otherwise (default) empty array is returned as null. * @param value * @param preserveEmpty * @return */ public static JsonElement getAsArray(Set<String> value, boolean preserveEmpty) { if (!preserveEmpty && value != null && value.isEmpty()) { // if we're not preserving empty arrays and the value is empty, return null return JsonNull.INSTANCE; } else { return gson.toJsonTree(value, new TypeToken<Set<String>>() { }.getType()); } } /** * Gets the value of the given member (expressed as integer seconds since epoch) as a Date */ public static Date getAsDate(JsonObject o, String member) { if (o.has(member)) { JsonElement e = o.get(member); if (e != null && e.isJsonPrimitive()) { return new Date(e.getAsInt() * 1000L); } else { return null; } } else { return null; } } /** * Gets the value of the given member as a JWE Algorithm, null if it doesn't exist */ public static JWEAlgorithm getAsJweAlgorithm(JsonObject o, String member) { String s = getAsString(o, member); if (s != null) { return JWEAlgorithm.parse(s); } else { return null; } } /** * Gets the value of the given member as a JWE Encryption Method, null if it doesn't exist */ public static EncryptionMethod getAsJweEncryptionMethod(JsonObject o, String member) { String s = getAsString(o, member); if (s != null) { return EncryptionMethod.parse(s); } else { return null; } } /** * Gets the value of the given member as a JWS Algorithm, null if it doesn't exist */ public static JWSAlgorithm getAsJwsAlgorithm(JsonObject o, String member) { String s = getAsString(o, member); if (s != null) { return JWSAlgorithm.parse(s); } else { return null; } } /** * Gets the value of the given member as a PKCE Algorithm, null if it doesn't exist * @param o * @param member * @return */ public static PKCEAlgorithm getAsPkceAlgorithm(JsonObject o, String member) { String s = getAsString(o, member); if (s != null) { return PKCEAlgorithm.parse(s); } else { return null; } } /** * Gets the value of the given member as a string, null if it doesn't exist */ public static String getAsString(JsonObject o, String member) { if (o.has(member)) { JsonElement e = o.get(member); if (e != null && e.isJsonPrimitive()) { return e.getAsString(); } else { return null; } } else { return null; } } /** * Gets the value of the given member as a boolean, null if it doesn't exist */ public static Boolean getAsBoolean(JsonObject o, String member) { if (o.has(member)) { JsonElement e = o.get(member); if (e != null && e.isJsonPrimitive()) { return e.getAsBoolean(); } else { return null; } } else { return null; } } /** * Gets the value of the given member as a Long, null if it doesn't exist */ public static Long getAsLong(JsonObject o, String member) { if (o.has(member)) { JsonElement e = o.get(member); if (e != null && e.isJsonPrimitive()) { return e.getAsLong(); } else { return null; } } else { return null; } } /** * Gets the value of the given given member as a set of strings, null if it doesn't exist */ public static Set<String> getAsStringSet(JsonObject o, String member) throws JsonSyntaxException { if (o.has(member)) { if (o.get(member).isJsonArray()) { return gson.fromJson(o.get(member), new TypeToken<Set<String>>() { }.getType()); } else { return Sets.newHashSet(o.get(member).getAsString()); } } else { return null; } } /** * Gets the value of the given given member as a set of strings, null if it doesn't exist */ public static List<String> getAsStringList(JsonObject o, String member) throws JsonSyntaxException { if (o.has(member)) { if (o.get(member).isJsonArray()) { return gson.fromJson(o.get(member), new TypeToken<List<String>>() { }.getType()); } else { return Lists.newArrayList(o.get(member).getAsString()); } } else { return null; } } /** * Gets the value of the given member as a list of JWS Algorithms, null if it doesn't exist */ public static List<JWSAlgorithm> getAsJwsAlgorithmList(JsonObject o, String member) { List<String> strings = getAsStringList(o, member); if (strings != null) { List<JWSAlgorithm> algs = new ArrayList<>(); for (String alg : strings) { algs.add(JWSAlgorithm.parse(alg)); } return algs; } else { return null; } } /** * Gets the value of the given member as a list of JWS Algorithms, null if it doesn't exist */ public static List<JWEAlgorithm> getAsJweAlgorithmList(JsonObject o, String member) { List<String> strings = getAsStringList(o, member); if (strings != null) { List<JWEAlgorithm> algs = new ArrayList<>(); for (String alg : strings) { algs.add(JWEAlgorithm.parse(alg)); } return algs; } else { return null; } } /** * Gets the value of the given member as a list of JWS Algorithms, null if it doesn't exist */ public static List<EncryptionMethod> getAsEncryptionMethodList(JsonObject o, String member) { List<String> strings = getAsStringList(o, member); if (strings != null) { List<EncryptionMethod> algs = new ArrayList<>(); for (String alg : strings) { algs.add(EncryptionMethod.parse(alg)); } return algs; } else { return null; } } public static Map readMap(JsonReader reader) throws IOException { Map map = new HashMap<>(); reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); Object value = null; switch (reader.peek()) { case STRING: value = reader.nextString(); break; case BOOLEAN: value = reader.nextBoolean(); break; case NUMBER: value = reader.nextLong(); break; default: logger.debug("Found unexpected entry"); reader.skipValue(); continue; } map.put(name, value); } reader.endObject(); return map; } public static Set readSet(JsonReader reader) throws IOException { Set arraySet = null; reader.beginArray(); switch (reader.peek()) { case STRING: arraySet = new HashSet<>(); while (reader.hasNext()) { arraySet.add(reader.nextString()); } break; case NUMBER: arraySet = new HashSet<>(); while (reader.hasNext()) { arraySet.add(reader.nextLong()); } break; default: arraySet = new HashSet(); break; } reader.endArray(); return arraySet; } public static void writeNullSafeArray(JsonWriter writer, Set<String> items) throws IOException { if (items != null) { writer.beginArray(); for (String s : items) { writer.value(s); } writer.endArray(); } else { writer.nullValue(); } } }