package io.katharsis.resource.information;
import io.katharsis.resource.field.ResourceAttributesBridge;
import io.katharsis.resource.field.ResourceField;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
* Holds information about the type of the resource.
*/
public final class ResourceInformation {
private final Class<?> resourceClass;
/**
* Found field of the id. Each resource has to contain a field marked by JsonApiId annotation.
*/
private final ResourceField idField;
/**
* A set of resource's attribute fields.
*/
private final ResourceAttributesBridge attributeFields;
/**
* A set of fields that contains non-standard Java types (List, Set, custom classes, ...).
*/
private final Set<ResourceField> relationshipFields;
/**
* An underlying field's name which contains meta information about for a resource
*/
private final String metaFieldName;
/**
* An underlying field's name which contain links information about for a resource
*/
private final String linksFieldName;
public ResourceInformation(Class<?> resourceClass, ResourceField idField, ResourceAttributesBridge attributeFields,
Set<ResourceField> relationshipFields) {
this(resourceClass, idField, attributeFields, relationshipFields, null, null);
}
public ResourceInformation(Class<?> resourceClass, ResourceField idField, ResourceAttributesBridge attributeFields,
Set<ResourceField> relationshipFields, String metaFieldName, String linksFieldName) {
this.resourceClass = resourceClass;
this.idField = idField;
this.attributeFields = attributeFields;
this.relationshipFields = relationshipFields;
this.metaFieldName = metaFieldName;
this.linksFieldName = linksFieldName;
}
public Class<?> getResourceClass() {
return resourceClass;
}
public ResourceField getIdField() {
return idField;
}
public ResourceAttributesBridge getAttributeFields() {
return attributeFields;
}
public Set<ResourceField> getRelationshipFields() {
return relationshipFields;
}
public ResourceField findRelationshipFieldByName(String name) {
return getJsonField(name, relationshipFields);
}
private static ResourceField getJsonField(String name, Set<ResourceField> fields) {
ResourceField foundField = null;
for (ResourceField field : fields) {
if (field.getJsonName().equals(name)) {
foundField = field;
break;
}
}
return foundField;
}
public String getMetaFieldName() {
return metaFieldName;
}
public String getLinksFieldName() {
return linksFieldName;
}
/**
* Returns a set of field names which are not basic fields (resource attributes)
*
* @return not basic attribute names
*/
public Set<String> getNotAttributeFields() {
Set<String> notAttributeFields = new HashSet<>();
for (ResourceField relationshipField : relationshipFields) {
notAttributeFields.add(relationshipField.getJsonName());
}
notAttributeFields.add(idField.getJsonName());
if (metaFieldName != null) {
notAttributeFields.add(metaFieldName);
}
if (linksFieldName != null) {
notAttributeFields.add(linksFieldName);
}
return notAttributeFields;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ResourceInformation that = (ResourceInformation) o;
return Objects.equals(resourceClass, that.resourceClass) &&
Objects.equals(idField, that.idField) &&
Objects.equals(attributeFields, that.attributeFields) &&
Objects.equals(relationshipFields, that.relationshipFields) &&
Objects.equals(metaFieldName, that.metaFieldName) &&
Objects.equals(linksFieldName, that.linksFieldName);
}
@Override
public int hashCode() {
return Objects.hash(resourceClass, idField, attributeFields, relationshipFields, metaFieldName, linksFieldName);
}
}