// Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants.service.project.model;
import com.google.common.collect.Iterators;
import com.google.gson.*;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import com.twitter.intellij.pants.model.TargetAddressInfo;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
public class TargetInfoDeserializer implements JsonDeserializer<TargetInfo> {
public static TargetInfoDeserializer INSTANCE = new TargetInfoDeserializer();
@Override
public TargetInfo deserialize(JsonElement element, Type type, final JsonDeserializationContext context) throws JsonParseException {
final JsonObject object = element.getAsJsonObject();
final List<String> targets = getStringListField(object, "targets");
final List<String> libraries = getStringListField(object, "libraries");
final List<String> excludes = getStringListField(object, "excludes");
final List<ContentRoot> contentRoots = getFieldAsList(
object.getAsJsonArray("roots"),
new Function<JsonElement, ContentRoot>() {
@Override
public ContentRoot fun(JsonElement element) {
return context.deserialize(element, ContentRoot.class);
}
}
);
final TargetAddressInfo addressInfo = context.deserialize(element, TargetAddressInfo.class);
return new TargetInfo(
new HashSet<TargetAddressInfo>(Collections.singleton(addressInfo)),
new HashSet<String>(targets),
new HashSet<String>(libraries),
new HashSet<String>(excludes),
new HashSet<ContentRoot>(contentRoots)
);
}
@NotNull
private List<String> getStringListField(JsonObject object, String memberName) {
if (!object.has(memberName)) {
return Collections.emptyList();
}
return getFieldAsList(
object.getAsJsonArray(memberName),
new Function<JsonElement, String>() {
@Override
public String fun(JsonElement element) {
return element.getAsString();
}
}
);
}
private <T> List<T> getFieldAsList(JsonArray jsonArray, Function<JsonElement, T> fun) {
return ContainerUtil.mapNotNull(
Iterators.toArray(jsonArray.iterator(), JsonElement.class),
fun
);
}
}