
com.yahoo.elide.jsonapi.models.JsonApiDocument Maven / Gradle / Ivy
/*
* Copyright 2015, Yahoo Inc.
* Licensed under the Apache License, Version 2.0
* See LICENSE file in project root for terms.
*/
package com.yahoo.elide.jsonapi.models;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import lombok.ToString;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* JSON API Document.
*/
@ToString
public class JsonApiDocument {
private Data data;
private Meta meta;
private final Map links;
private final LinkedHashSet includedRecs;
private final List included;
public JsonApiDocument() {
this(null);
}
public JsonApiDocument(Data data) {
links = new LinkedHashMap<>();
included = new ArrayList<>();
includedRecs = new LinkedHashSet<>();
this.data = data;
}
public void setData(Data data) {
this.data = data;
}
public Data getData() {
return data;
}
public void setMeta(Meta meta) {
this.meta = meta;
}
@JsonInclude(Include.NON_NULL)
public Meta getMeta() {
return meta;
}
@JsonInclude(Include.NON_NULL)
public Map getLinks() {
return links.isEmpty() ? null : links;
}
public void addLink(String key, String val) {
this.links.put(key, val);
}
@JsonInclude(Include.NON_NULL)
public List getIncluded() {
return included.isEmpty() ? null : included;
}
public void addIncluded(Resource resource) {
if (!includedRecs.contains(resource)) {
included.add(resource);
includedRecs.add(resource);
}
}
@Override
public int hashCode() {
Collection resources = data == null ? null : data.get();
return new HashCodeBuilder(37, 79)
.append(resources == null ? 0 : resources.stream().mapToInt(Object::hashCode).sum())
.append(links)
.append(included == null ? 0 : included.stream().mapToInt(Object::hashCode).sum())
.build();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof JsonApiDocument)) {
return false;
}
JsonApiDocument other = (JsonApiDocument) obj;
Collection resources = Optional.ofNullable(data).map(Data::get).orElseGet(Collections::emptySet);
Collection otherResources =
Optional.ofNullable(other.data).map(Data::get).orElseGet(Collections::emptySet);
if (resources.size() != otherResources.size() || !resources.stream().allMatch(otherResources::contains)) {
return false;
}
// TODO: Verify links and meta?
if (other.getIncluded() == null) {
return included.isEmpty();
}
return included.stream().allMatch(other.getIncluded()::contains);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy