【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

插件接口

权限模块扩展

可以扩展权限模块中的扩展权限实体和外部权限实体,权限模块表间关系可以参考其他文档

通过插件权限模块扩展接口注册的DAO和entity等模块,是由权限模块统一管理,插件自己的代码中一般不会主动访问数据库

插件注册扩展权限实体接口

提供插件接口,让插件实现权限模块现有的AuthorityExpanderProvider接口即可

权限模块启动时以及插件动态安装时,将插件实现的AuthorityExpanderProvider注册到权限模块;插件动态卸载时移除AuthorityExpanderProvider对象

插件注册或移除AuthorityExpanderProvider对象时处理表名重复检测逻辑

插件动态安装、卸载、升级时,需要重启DecisionDB数据库

独立访问数据库接口

提供给插件在finedb中注册自己的数据表功能,通过该接口注册的数据表是保存在独立的PluginDB中,与BaseDB和DecisionDB相互独立

插件数据库模块在插件框架启动时启动,创建一个PluginDBManager来管理插件注册的DBAccessProvider

插件数据库模块启动或者插件动态安装时,处理表名重复检测逻辑

插件动态安装、卸载、升级时,需要重启PluginDB数据库

其他相关功能

表名重复检测

使用一个全局的检测器类TableDuplicateChecker,收集BaseDB和DecisionDB中,以及插件中的entity表进行表名重复判断

收集BaseDB中的entity

使用ModuleContext.bindValidator注册一个针对BaseDBConstant.BASE_ENTITY_KEY的校验器,每收集一个BaseDB的entity,就会自动加入到全局检测器TableDuplicateChecker中,并判断是否与现有表名重复

收集DecisionDB中的entity

方法同BaseDB,注册针对DecisionDBEntityKey.Key的校验器

收集插件中的entity

读取插件注册的接口时,会获取插件的entity类,同样加入到全局检测器TableDuplicateChecker中,并判断重复

当插件卸载时,将插件注册的entity类从TableDuplicateChecker移除

重复检测逻辑

从entity的注解中读取表名,如果注解中没有表名,则表名默认为类名

如果entity父类同样是entity(有关联的时候),则同时读取父类的表名

添加一个entity时,读取表名,判断表是否已经存在

判断表是否存在方法:

  1. 表名已存在时,判断类名,类名若相同则表示重复添加类,不算表名重复;若类名不相同,表示表重复,报错
  2. 步骤1中校验通过,判断父类是否重复(如果有父类的话),使用步骤1中逻辑

entity重复校验通过后,记录到map中

移除entity时直接从map中移除相关项,若有父类时,父类下所有子类均已移除时一并移除父类

默认hsql迁移时PluginDB的兼容

迁移逻辑复用BaseDB和DecisionDB的逻辑

数据迁移时只有已生效的插件中的表数据能够迁移

插件注册的数据库表,表结构改动时的兼容

每次插件加载时(包括安装和插件模块启动时),相关数据库管理器会将数据库访问器注入给插件,插件可以直接操作自己的数据库表,处理字段修改的兼容

修改表结构的兼容方案可以参考其他文档


接口使用

扩展权限实体接口

/**
 * Created by loy on 2018/8/22.
 *
 * 用于插件注册扩展权限实体的接口
 */
public interface AuthorityExpandTypesProvider extends Mutable, DBInjectable {

    String XML_TAG = "AuthorityExpandTypesProvider";

    int CURRENT_LEVEL = 1;

    /**
     * 注册权限扩展
     */
    AuthorityExpanderProvider[] registerProviders();
}

插件实现一个AuthorityExpandTypesProvider接口,将扩展权限实体以AuthorityExpanderProvider实现类的方式注册到权限模块,然后使用权限模块提供的方法来操作权限实体

plugin.xml中添加内容:

<extra-decision>
	<AuthorityExpandTypesProvider class="com.fr.plugin.xxxxxx"/>
</extra-decision>

独立访问数据库接口

/**
 * Created by loy on 2018/8/21.
 *
 * 用于插件注册自定义数据库表的接口
 */
public interface DBAccessProvider extends Mutable, DBInjectable {

    String XML_TAG = "DBAccessProvider";

    int CURRENT_LEVEL = 1;

    /**
     * 注册DAO
     */
    DAOProvider[] registerDAO();
}
 
 
/**
 * Created by loy on 2018/8/23.
 *
 * 数据库访问注入接口
 */
public interface DBInjectable {

    /**
     * 当可以访问数据库时的回调
     * @param accessor 数据库访问接口
     */
    void onDBAvailable(DBAccessor accessor);
}

插件实现DBAccessProvider接口,将自己的DAO和entity以DAOProvider实现类的方式注册到插件数据库模块中

插件通过接口中的onDBAvailable方法,接受DBAccessor对象,通过DBAccessor可以执行数据库任务(DBAction),在DBAction可以拿到自己注册的DAO进行数据库操作

注:DBAccessor中的方法已经自动处理了数据库session和事务,插件无需手动操作

plugin.xml中添加内容:

<extra-core>
	<DBAccessProvider class="com.fr.plugin.xxxxxx"/>
</extra-core>

访问平台数据库接口

跟上面独立访问数据库接口一样,但是是注册到平台数据库(DecisionDB)中

实现DecisionDBAccessProvider接口,

plugin.xml中添加内容:

<extra-decision>
	<DecisionDBAccessProvider class="com.fr.plugin.xxxxxx"/>
</extra-decision>

 

 

 

  • No labels