org.ldaptive.io.JsonWriter.java Source code

Java tutorial

Introduction

Here is the source code for org.ldaptive.io.JsonWriter.java

Source

/* 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;
        }
    }
}