silentbalanceyh/vertx-zero

View on GitHub
vertx-gaia/vertx-co/src/main/java/io/vertx/up/atom/shape/KJoin.java

Summary

Maintainability
A
1 hr
Test Coverage
package io.vertx.up.atom.shape;

import io.horizon.uca.log.Annal;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.up.exception.web._412IndentParsingException;
import io.vertx.up.exception.web._412IndentUnknownException;
import io.vertx.up.fn.Fn;
import io.vertx.up.util.Ut;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.Consumer;

/**
 * ## 「Pojo」Join Configuration
 */
public class KJoin implements Serializable {
    /**
     * Zero standard logger
     */
    private static final Annal LOGGER = Annal.get(KJoin.class);
    /**
     * `identifier` field of join configuration
     */
    private volatile String targetIndent;
    /**
     * `source` field of join configuration
     */
    private KPoint source;
    /**
     * `target` field of join configuration
     */
    private ConcurrentMap<String, KPoint> target = new ConcurrentHashMap<>();

    public String getTargetIndent() {
        return this.targetIndent;
    }

    public void setTargetIndent(final String targetIndent) {
        this.targetIndent = targetIndent;
    }

    public KPoint getSource() {
        return this.source;
    }

    public void setSource(final KPoint source) {
        this.source = source;
    }

    public ConcurrentMap<String, KPoint> getTarget() {
        return this.target;
    }

    public void setTarget(final ConcurrentMap<String, KPoint> target) {
        this.target = target;
    }

    private String identifier(final JsonObject data) {
        /*
         * Joined configuration read
         */
        /*
         * Search by `field`
         */
        if (Ut.isNil(this.targetIndent)) {
            LOGGER.warn("The `targetIndent` field is null");
            return null;
        }
        final String identifier;
        if (data.containsKey(this.targetIndent)) {
            /*
             * Data Processing
             */
            identifier = data.getString(this.targetIndent);
        } else {
            identifier = this.targetIndent;
        }
        return identifier;
    }

    public KPoint point(final JsonObject data) {
        final String identifier = this.identifier(data);
        Fn.out(Ut.isNil(identifier), _412IndentParsingException.class, this.getClass(), this.targetIndent, data);
        final KPoint result = this.point(identifier);
        if (Objects.isNull(result)) {
            LOGGER.info("System could not find configuration for `{0}` with data = {1}",
                identifier, data.encode());
        }
        return result;
    }

    public KPoint point(final String identifier) {
        final KPoint target = this.target.getOrDefault(identifier, null);
        if (Objects.isNull(target)) {
            return null;
        }
        return target.indent(identifier);
    }

    public KPoint point(final JsonArray data) {
        final Set<String> idSet = new HashSet<>();
        Ut.itJArray(data).map(this::identifier).filter(Objects::nonNull).forEach(idSet::add);
        Fn.out(1 != idSet.size(), _412IndentUnknownException.class, this.getClass(), this.targetIndent);
        final String identifier = idSet.iterator().next();
        return this.point(identifier);
    }

    /**
     * key -> keyJoin
     */
    public void dataIn(final JsonObject ds, final KPoint target, final JsonObject data) {
        this.dataRun(target, (source) -> {
            final String joinedValue = ds.getString(source.getKey());
            if (Ut.isNotNil(joinedValue)) {
                data.put(target.getKeyJoin(), joinedValue);
            }
        });
    }

    public void dataCond(final JsonObject ds, final KPoint target, final JsonObject data) {
        this.dataRun(target, (source) -> {
            String joinedValue = ds.getString(source.getKey());
            if (Ut.isNil(joinedValue)) {
                /*
                 * Here has no `key` defined in ds, synced by `keyJoin` directly
                 */
                joinedValue = ds.getString(target.getKeyJoin());
            }
            if (Ut.isNotNil(joinedValue)) {
                data.put(target.getKeyJoin(), joinedValue);
            }
        });
    }

    /**
     * keyJoin -> key
     */
    public void dataOut(final JsonObject ds, final KPoint target, final JsonObject data) {
        this.dataRun(target, (source) -> {
            final String joinedValue = ds.getString(target.getKeyJoin());
            if (Ut.isNotNil(joinedValue)) {
                data.put(source.getKey(), joinedValue);
            }
        });
    }

    private void dataRun(final KPoint target, final Consumer<KPoint> consumer) {
        final KPoint source = this.source;
        if (Objects.nonNull(target) && Objects.nonNull(source)) {
            consumer.accept(source);
        }
    }
}