silentbalanceyh/vertx-zero

View on GitHub
vertx-pin/zero-vie/src/main/java/io/mature/extension/refine/OxAmbient.java

Summary

Maintainability
A
0 mins
Test Coverage
package io.mature.extension.refine;

import cn.vertxup.ambient.service.application.AppService;
import cn.vertxup.ambient.service.application.AppStub;
import cn.vertxup.ambient.service.application.InitService;
import cn.vertxup.ambient.service.application.InitStub;
import io.horizon.eon.em.Environment;
import io.modello.eon.VDBC;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.up.util.Ut;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * ## 环境工具
 *
 * ### 1. 基本介绍
 *
 * Ox平台系统中定义了三种核心环境:
 *
 * - Development:开发环境。
 * - Production:生产环境。
 * - Mockito:模拟测试环境(集成debug=true)。
 *
 * ### 2. 工具介绍:
 *
 * 当前工具类为包域,它的执行功能如:
 *
 * 1. 从`UQUIP`中提取字典翻译器。
 * 2. 构造专用初始化执行器。
 * 3. 辅助执行通道专用的插件组件、服务配置构造。
 *
 * @author <a href="http://www.origin-x.cn">Lang</a>
 */
final class OxAmbient {
    /*
     * 私有构造函数(工具类转换)
     */
    private OxAmbient() {
    }

    /**
     * 从原始配置数据中读取`plugin.config`节点,根据传入的`clazz`读取和当前插件相关的配置信息。
     *
     * - 从原始配置中读取基础配置,上层传入的`options`数据。
     * - 提取`plugin.config`中和`clazz`绑定的配置数据。
     * - 合并二者所有配置数据构造最终配置数据。
     *
     * @param clazz   {@link Class} 执行初始化的类信息,反射调用
     * @param options {@link JsonObject} 服务配置数据,对应ServiceConfig字段
     *
     * @return {@link JsonObject}
     */
    static JsonObject pluginOptions(final Class<?> clazz, final JsonObject options) {
        final JsonObject normalized = Ut.valueJObject(options);
        final JsonObject configData = Ut.valueJObject(normalized.getJsonObject(VDBC.I_SERVICE.SERVICE_CONFIG.PLUGIN_CONFIG)).copy();
        /*
         * 查找单个组件配置
         */
        final JsonObject configuration = new JsonObject();
        if (configData.containsKey(clazz.getName())) {
            final JsonObject componentConfig = configData.getJsonObject(clazz.getName());
            configuration.mergeIn(componentConfig, true);
        }
        /*
         * 将 plugin 开头的过滤掉
         */
        normalized.stream()
            .filter(entry -> Objects.nonNull(entry.getKey()))
            .filter(entry -> !entry.getKey().startsWith("plugin"))
            .forEach(entry -> configuration.put(entry.getKey(), entry.getValue()));
        return configuration;
    }

    /**
     * 返回插件链上的所有组件类信息,可执行反射操作。
     *
     * @param options {@link JsonObject} 服务配置数据,对应ServiceConfig字段
     * @param key     {@link String} 传入的固定`key`值
     *
     * @return {@link List}<{@link Class}>
     */
    static List<Class<?>> pluginClass(final JsonObject options, final String key) {
        final JsonObject normalized = Ut.valueJObject(options);
        final JsonArray configured = Ut.valueJArray(normalized.getJsonArray(key));
        final List<Class<?>> queue = new ArrayList<>();
        Ut.itJArray(configured, String.class, (className, index) -> {
            final Class<?> clazz = Ut.clazz(className, null);
            final int current = index + 1;
            if (Objects.nonNull(clazz)) {
                Ox.LOG.Plugin.info(OxAmbient.class, "{0}. 插件类: {1}", current, className);
                queue.add(clazz);
            } else {
                Ox.LOG.Plugin.info(OxAmbient.class, "{0}. 插件类异常(null): {1}", current, className);
            }
        });
        return queue;
    }

    /**
     * 根据传入路径执行路径解析工作,解析三种不同环境的路径。
     *
     * - Development:开发环境
     * - Production:生产环境
     * - Mockito:模拟测试环境(integration中的debug = true)
     *
     * @param path        {@link String} 构造的环境读取数据专用路径
     * @param environment {@link Environment} 传入环境数据
     *
     * @return {@link String} 返回不同环境处理过的绝对路径信息
     */
    static String resolve(final String path, final Environment environment) {
        if (Environment.Production == environment) {
            return path;
        } else {
            return "src/main/resources/" + path;
        }
    }

    /**
     * 构造初始化专用接口,用于初始化某个`X_APP`的应用配置。
     *
     * - 初始化接口{@link InitStub},执行应用初始化。
     * - 应用访问接口{@link AppStub}。
     *
     * @return {@link InitStub}
     */
    static InitStub pluginInitializer() {
        /*
         * 初始化专用(同样需要初始化注入字段)
         */
        final InitStub stub = Ut.singleton(InitService.class);
        final AppStub appStub = Ut.singleton(AppService.class);
        Ut.field(stub, "stub", appStub);
        return stub;
    }
}