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

Page tree

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

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »

插件接口

权限模块扩展

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

通过插件权限模块扩展接口注册的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