All Downloads are FREE. Search and download functionalities are using the official Maven repository.

no.arktekk.siren.Entity Maven / Gradle / Ivy

package no.arktekk.siren;

import io.vavr.control.Option;
import net.hamnaberg.json.Json;
import net.hamnaberg.json.codec.DecodeJson;
import net.hamnaberg.json.codec.DecodeResult;
import net.hamnaberg.json.codec.EncodeJson;

import static io.vavr.control.Option.none;

public final class Entity implements JsonSerializable {
    public final Option classes;
    public final Option properties;
    public final Option entities;
    public final Option actions;
    public final Option links;
    public final Option title;

    public Entity(Option classes, Option properties, Option entities, Option actions, Option links, Option title) {
        this.classes = classes;
        this.properties = properties;
        this.entities = entities;
        this.actions = actions;
        this.links = links;
        this.title = title;
    }

    public static Entity of() {
        return new Entity(none(), none(), none(), none(), none(), none());
    }

    public Entity with(Classes classes) {
        return new Entity(Option.of(classes), properties, entities, actions, links, title);
    }

    public Entity with(Json.JObject properties) {
        return new Entity(classes, Option.of(properties), entities, actions, links, title);
    }

    public Entity with(Entities entities) {
        return new Entity(classes, properties, Option.of(entities), actions, links, title);
    }

    public Entity with(Actions actions) {
        return new Entity(classes, properties, entities, Option.of(actions), links, title);
    }

    public Entity with(Links links) {
        return new Entity(classes, properties, entities, actions, Option.of(links), title);
    }

    public Entity with(String title) {
        return new Entity(classes, properties, entities, actions, links, Option.of(title));
    }

    public  DecodeResult decodeProperties(DecodeJson decoder) {
        return decoder.fromJson(properties.getOrElse(Json.jEmptyObject()));
    }

    public  Entity encodeProperties(EncodeJson encoder, A value) {
        return with(encoder.toJson(value).asJsonObjectOrEmpty());
    }

    public SubEntity.EmbeddedRepresentation toEmbedded(Rel rel) {
        return new SubEntity.EmbeddedRepresentation(rel, this);
    }

    public Option getLinkByRel(Rel rel) {
        return links.flatMap(links -> links.getLinkByRel(rel));
    }

    public Option getLinkByRelIncludes(Rel rel) {
        return links.flatMap(links -> links.getLinkByRelIncludes(rel));
    }

    public Option getActionByName(String name) {
        return actions.flatMap(actions -> actions.getActionByName(name));
    }

    public Option getActionByClasses(Classes classes) {
        return actions.flatMap(actions -> actions.getActionByClasses(classes));
    }

    public Option getActionByClassesIncludes(Classes classes) {
        return actions.flatMap(actions -> actions.getActionByClassesIncludes(classes));
    }

    public Option getEntityByRel(Rel rel) {
        return entities.flatMap(entities -> entities.getEntityByRel(rel));
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Entity entity = (Entity) o;

        if (!classes.equals(entity.classes)) return false;
        if (!properties.equals(entity.properties)) return false;
        if (!entities.equals(entity.entities)) return false;
        if (!actions.equals(entity.actions)) return false;
        if (!links.equals(entity.links)) return false;
        return title.equals(entity.title);

    }

    @Override
    public int hashCode() {
        int result = classes.hashCode();
        result = 31 * result + properties.hashCode();
        result = 31 * result + entities.hashCode();
        result = 31 * result + actions.hashCode();
        result = 31 * result + links.hashCode();
        result = 31 * result + title.hashCode();
        return result;
    }

    public Option getClasses() {
        return classes;
    }

    public Option getProperties() {
        return properties;
    }

    public Json.JObject getPropertiesOrEmpty() {
        return properties.getOrElse(Json.jEmptyObject());
    }

    public Option getEntities() {
        return entities;
    }

    public Entities getEntitiesOrEmpty() {
        return entities.getOrElse(Entities.empty());
    }

    public Option getActions() {
        return actions;
    }

    public Actions getActionsOrEmpty() {
        return actions.getOrElse(Actions.empty());
    }

    public Option getLinks() {
        return links;
    }

    public Links getLinksOrEmpty() {
        return links.getOrElse(Links.empty());
    }

    public Option getTitle() {
        return title;
    }

    public  T toJson(JsonSerializer serializer) {
        return serializer.serialize(this);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy