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

com.flagwind.application.Application Maven / Gradle / Ivy

There is a newer version: 1.0.9
Show newest version
package com.flagwind.application;

import com.flagwind.application.base.ApplicationContextBase;
import com.flagwind.application.base.WorkbenchBase;
import com.flagwind.events.CancelEventArgs;
import com.flagwind.events.EventArgs;
import com.flagwind.events.EventProvider;
import com.flagwind.services.ServiceProvider;
import com.flagwind.services.ServiceProviderFactory;

import java.util.function.Consumer;

import org.apache.commons.lang3.StringUtils;

/**
 * @author chendb
 */
public class Application {

    // region 私有变量

    /**
     * 标识应用程序是否启动完成
     */
    private static boolean isStarted = false;

    /**
     * 应用程序上下文实例
     */
    private static ApplicationContextBase context = null;

    /**
     * 事件提供程序
     */
    private static EventProvider eventProvider;

    // endregion

    // region 公共属性
    /**
    * 获取一个事件提供程序实例。
    * @private
    * @property
    * @return IEventProvider
    */
    public static EventProvider getEventProvider() {
        if (eventProvider == null) {
            eventProvider = new EventProvider(null);
        }

        return eventProvider;
    }

    /**
     * @return the isStarted
     */
    public static boolean isStarted() {
        return isStarted;
    }

    /**
     * @return the context
     */
    public static ApplicationContextBase getContext() {
        return context;
    }

    public static ServiceProviderFactory getServiceFactory() {
        ApplicationContextBase context = getContext();
        if (context != null) {
            return context.getServiceFactory();
        }
        return null;
    }

    public static ServiceProvider getServiceProvider(String name) {
        ServiceProviderFactory factory = getServiceFactory();
        if (factory != null) {
            return StringUtils.isBlank(name) ? factory.getDefault() : factory.getProvider(name);
        }
        return null;
    }

    // endregion

    // region 事件名称
    /**
       * 当应用程序启动时产生的事件。
       * @event ApplicationEventArgs
       */
    public static String STARTING = "starting";

    /**
     * 当应用程序启动后产生的事件。
     * @event ApplicationEventArgs
     */
    public static String STARTED = "started";

    /**
     * 当应用程序即将退出时产生的事件。
     * @event CancelEventArgs
     */
    public static String EXITING = "exiting";

    // endregion

    // region 启动/退出

    /**
     * 启动应用程序。
     * @static
     * @param  {ApplicationContextBase} context 应用程序上下文实例。
     * @param  {Array} args 启动参数。
     * 
     */
    public static void start(ApplicationContextBase applicationContext, String... args) {
        if (applicationContext == null) {
            throw new IllegalArgumentException("context");
        }

        if (isStarted) {
            return;
        }

        // 激发 "starting" 事件
        dispatchEvent(new ApplicationEventArgs(STARTING, applicationContext));

        try {
            // 保存应用程序上下文
            context = applicationContext;

            // 将应用上下文对象注册到默认服务容器中

            // if (context.getServiceFactory().getDefault() != null) {
            //     context.getServiceFactory().getDefault().register("applicationContext", applicationContext);
            // }

            // 初始化全局模块
            initializeGlobalModules(context);

            // 获取工作台对象
            WorkbenchBase workbench = (WorkbenchBase) context.getWorkbench(args);

            // 如果工作台对象不为空则运行工作台
            if (workbench != null) {
                // 挂载工作台打开事件
                workbench.addListener(workbench.OPENED, (e) -> {
                    // 标识应用程序启动完成
                    isStarted = true;
                    // 激发 "started" 事件
                    dispatchEvent(new ApplicationEventArgs(STARTED, context));
                }, null, false);

                // 挂载工作台关闭事件
                workbench.addListener(workbench.CLOSED, (e) -> {
                    exit();
                }, null, false);

                // 启动工作台
                workbench.open(args);
            }
        } catch (Exception ex) {
            // 重抛异常
            throw ex;
        }
    }

    /**
     * 关闭当前应用程序。
     * @static
     * 
     */
    public static void exit() {

        // 如果上下文对象为空,则表示尚未启动
        if (context == null) {
            return;
        }

        // 重置启动标记
        isStarted = false;

        // 创建取消事件参数
        CancelEventArgs args = new CancelEventArgs(EXITING, null);

        // 激发 "exiting" 事件
        dispatchEvent(args);

        // 判断是否取消退出,如果是则退出
        if (args.getCancel()) {
            return;
        }

        // 关闭工作台
        if (context.getWorkbench() != null) {
            context.getWorkbench().close();
        }

        // 卸载全局模块
        disposeGlobalModules(context);

        // 释放应用程序上下文
        context = null;
    }

    // endregion

    // region 对象获取

    /**
     * 根据名称与对象提供器解析对象
     * 
     * @param name 名称
     * @param providerName 对象提供器解析
     * @param  解析对象类型
     * @return 解析后对象
     * @author chendb
     * @date 2016年12月9日 上午9:22:58
     */
    public static  T resolve(String name, String providerName) {
        ServiceProvider provider = getServiceProvider(providerName);
        return provider.resolve(name);
    }

    /**
     * 根据名称解析对象
     * 
     * @param name 名称
     * @param  解析对象类型
     * @return 解析后对象
     * @author chendb
     * @date 2016年12月9日 上午9:22:58
     */
    public static  T resolve(String name) {
        ServiceProvider provider = getServiceProvider(null);
        return provider.resolve(name);
    }

    /**
     * 向容器中注册对象
     */
    public static void register(String name,Object service) {
        ServiceProvider provider = getServiceProvider(null);
        provider.register(name, service);
    }

    // endregion

    // region 事件监听与触发

    public static void addListener(String type, Consumer listener, Object scope, boolean once) {
        getEventProvider().addListener(type, listener, scope, once);
    }

    public static void removeListener(String type, Consumer listener, Object scope) {
        getEventProvider().removeListener(type, listener, scope);
    }

    /**
    * 派发一个指定参数的事件。
    * @param  {EventArgs} eventArgs 事件参数实例。
    * 
    */
    public static void dispatchEvent(EventArgs args) {
        getEventProvider().dispatchEvent(args);
    }

    // endregion

    // region Module 调用
    private static void disposeGlobalModules(ApplicationContextBase context) {
        context.getModules().forEach(p -> {
            if (p != null) {
                p.dispose();
            }
        });
    }

    private static void initializeGlobalModules(ApplicationContextBase context) {
        context.getModules().forEach(p -> {
            if (p != null) {
                p.initialize(context);
            }
        });
    }
    // endregion

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy