EntityImpl.java

package io.github.jonloucks.metalog.impl;

import io.github.jonloucks.metalog.api.Entities;
import io.github.jonloucks.metalog.api.Entity;

import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Supplier;

import static io.github.jonloucks.contracts.api.Checks.builderConsumerCheck;
import static io.github.jonloucks.metalog.impl.Internal.entityCheck;
import static java.util.Optional.ofNullable;

final class EntityImpl implements Entity, Entity.Builder<EntityImpl> {
    
    @Override
    public EntityImpl id(String id) {
        this.id = id;
        return this;
    }
    
    @Override
    public EntityImpl name(String name) {
        this.name = name;
        return this;
    }
    
    @Override
    public EntityImpl unique(boolean unique) {
        this.unique = unique;
        return this;
    }
    
    @Override
    public EntityImpl text(Supplier<CharSequence> textSupplier) {
        this.textSupplier = textSupplier;
        this.text = null;
        return this;
    }
    
    @Override
    public EntityImpl value(Object value) {
        this.value = value;
        this.text = null;
        return this;
    }
    
    @Override
    public Optional<Entities> getCorrelations() {
       return entityList.isEmpty() ? Optional.empty() : Optional.of(entityList);
    }
    
    @Override
    public EntityImpl correlation(Consumer<Builder<?>> builderConsumer) {
        entityList.entity(builderConsumer);
        return this;
    }
    
    @Override
    public EntityImpl correlation(Entity entity) {
        entityList.entity(entity);
        return this;
    }
    
    @Override
    public EntityImpl correlations(Consumer<Entities.Builder<?>> builderConsumer) {
        
        builderConsumerCheck(builderConsumer).accept(entityList);
       
        return this;
    }
    
    @Override
    public EntityImpl copy(Entity entity) {
        final Entity validFromEntity = entityCheck(entity);
        
        unique(validFromEntity.isUnique());
        validFromEntity.getId().ifPresent(this::id);
        validFromEntity.getName().ifPresent(this::name);
        validFromEntity.getValue().ifPresent(this::value);
        
        validFromEntity.getCorrelations().ifPresent(c -> c.visitEach(e -> {
                correlation(e);
                return true;
            }
        ));
        return this;
    }
    
    @Override
    public Optional<String> getId() {
        return ofNullable(id);
    }
    
    @Override
    public Optional<String> getName() {
        return ofNullable(name);
    }
    
    @Override
    public boolean isUnique() {
        return unique;
    }
    
    @Override
    public Optional<Object> getValue() {
        return ofNullable(value);
    }

    @Override
    public CharSequence get() {
        if (null == text) {
            if (null == textSupplier) {
                if (null != value) {
                    text = value.toString();
                }
            } else {
                text = textSupplier.get();
            }
        }
        return null == text ? "" : text;
    }
    
    EntityImpl() {
    
    }

    private String id;
    private String name;
    private boolean unique;
    private Supplier<CharSequence> textSupplier;
    private Object value;
    private CharSequence text;
    private final EntitiesImpl entityList = new EntitiesImpl();
}