com.jbirdvegas.mgerrit.tasks.Deserializers.java Source code

Java tutorial

Introduction

Here is the source code for com.jbirdvegas.mgerrit.tasks.Deserializers.java

Source

package com.jbirdvegas.mgerrit.tasks;

/*
 * Copyright (C) 2013 Android Open Kang Project (AOKP)
 *  Author: Evan Conway (P4R4N01D), 2013
 *
 *  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.
 */

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.jbirdvegas.mgerrit.objects.CommitInfo;
import com.jbirdvegas.mgerrit.objects.CommitterObject;
import com.jbirdvegas.mgerrit.objects.JSONCommit;
import com.jbirdvegas.mgerrit.objects.Projects;
import com.jbirdvegas.mgerrit.objects.Reviewer;
import com.jbirdvegas.mgerrit.objects.ReviewerList;

import org.jetbrains.annotations.NotNull;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;

public final class Deserializers {

    private static final String KEY_ALL = "all";

    // Custom deserializer as we are separating the one object into two (the committer is not nested)
    private static final JsonDeserializer<Reviewer> d_reviewer = new JsonDeserializer<Reviewer>() {

        @Override
        public Reviewer deserialize(JsonElement jsonElement, Type type,
                JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {

            Reviewer reviewer = new Gson().fromJson(jsonElement, type);
            reviewer.setCommitter(new Gson().fromJson(jsonElement, CommitterObject.class));
            return reviewer;
        }
    };

    // Custom deserializer to get all the reviewers and their associated labels
    private static final JsonDeserializer<ReviewerList> d_reviewers = new JsonDeserializer<ReviewerList>() {

        @Override
        public ReviewerList deserialize(JsonElement jsonElement, Type type,
                JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {

            ArrayList<Reviewer> reviewers = new ArrayList<>();

            JsonObject labels = jsonElement.getAsJsonObject();
            for (Map.Entry<String, JsonElement> labelParent : labels.entrySet()) {
                JsonObject label = labelParent.getValue().getAsJsonObject();
                if (label.has(KEY_ALL)) {
                    Reviewer[] rs = jsonDeserializationContext.deserialize(label.getAsJsonArray(KEY_ALL),
                            Reviewer[].class);
                    for (Reviewer r : rs) {
                        r.setLabel(labelParent.getKey()); // Set the label the value corresponds to
                    }
                    reviewers.addAll(Arrays.asList(rs));
                }
            }
            return new ReviewerList(reviewers);
        }
    };

    private static final JsonDeserializer<JSONCommit> d_commit = new JsonDeserializer<JSONCommit>() {

        @Override
        public JSONCommit deserialize(JsonElement jsonElement, Type type,
                JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {

            Gson gson = new Gson();
            JSONCommit commit = gson.fromJson(jsonElement, type);
            JsonObject object = jsonElement.getAsJsonObject();

            commit.setReviewers(jsonDeserializationContext
                    .<ReviewerList>deserialize(object.getAsJsonObject("labels"), ReviewerList.class));

            // Set the Revision number
            if (commit.getCurrentRevision() == null) {
                if (object.has(JSONCommit.KEY_REVISIONS)) {
                    JsonObject revisionsObj = object.get(JSONCommit.KEY_REVISIONS).getAsJsonObject();
                    Set<Map.Entry<String, JsonElement>> entries = revisionsObj.entrySet();
                    for (Map.Entry<String, JsonElement> entry : entries) {
                        commit.setCurrentRevision(entry.getKey());
                        break;
                    }
                }
            }

            // If we don't have a revision number, there is no further information
            String currentRevision = commit.getCurrentRevision();
            if (currentRevision == null)
                return commit;

            JsonObject revisionsObj = object.get(JSONCommit.KEY_REVISIONS).getAsJsonObject();
            JsonObject psObj = revisionsObj.get(currentRevision).getAsJsonObject();

            commit.setPatchSet(CommitInfo.deserialise(psObj, commit.getChangeId()));
            return commit;
        }
    };

    // Register all of the custom deserializers here
    public static void addDeserializers(@NotNull GsonBuilder gsonBuilder) {
        gsonBuilder.registerTypeAdapter(Projects.class, new Projects());
        gsonBuilder.registerTypeAdapter(Reviewer.class, d_reviewer);
        gsonBuilder.registerTypeAdapter(ReviewerList.class, d_reviewers);
        gsonBuilder.registerTypeAdapter(JSONCommit.class, d_commit);
    }
}