/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.io; import java.io.IOException; import java.io.Writer; import java.lang.reflect.Type; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import org.ldaptive.LdapAttribute; import org.ldaptive.LdapEntry; import org.ldaptive.SearchResult; /** * Writes a {@link SearchResult} as JSON to a {@link Writer}. * * @author Middleware Services */ public class JsonWriter implements SearchResultWriter { /** Writer to write to. */ private final Writer jsonWriter; /** To convert a search result to JSON. */ private final Gson gson; /** * Creates a new json writer. * * @param writer to write JSON to */ public JsonWriter(final Writer writer) { jsonWriter = writer; final GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(SearchResult.class, new SearchResultSerializer()); gson = builder.disableHtmlEscaping().create(); } /** * Writes the supplied search result to the writer. * * @param result search result to write * * @throws IOException if an error occurs using the writer */ @Override public void write(final SearchResult result) throws IOException { gson.toJson(result, jsonWriter); jsonWriter.flush(); } /** * Serializes a {@link SearchResult} by creating a json array to contain the entries. Each entry is a json object with * the DN represented as a json primitive. Each attribute contains a json array of values. */ private static class SearchResultSerializer implements JsonSerializer<SearchResult> { @Override public JsonElement serialize(final SearchResult result, final Type type, final JsonSerializationContext context) { final JsonArray json = new JsonArray(); for (LdapEntry entry : result.getEntries()) { final JsonObject jsonEntry = new JsonObject(); jsonEntry.add("dn", entry.getDn() != null ? new JsonPrimitive(entry.getDn()) : null); for (LdapAttribute attr : entry.getAttributes()) { final JsonArray jsonAttrValues = new JsonArray(); attr.getStringValues().forEach(jsonAttrValues::add); jsonEntry.add(attr.getName(), jsonAttrValues); } json.add(jsonEntry); } return json; } } }