【仅供内部供应商使用,不提供对外解答和培训】
【仅供内部供应商使用,不提供对外解答和培训】
可以扩展权限模块中的扩展权限实体和外部权限实体,权限模块表间关系可以参考其他文档
通过插件权限模块扩展接口注册的DAO和entity等模块,是由权限模块统一管理,插件自己的代码中一般不会主动访问数据库
提供插件接口,让插件实现权限模块现有的AuthorityExpanderProvider接口即可
权限模块启动时以及插件动态安装时,将插件实现的AuthorityExpanderProvider注册到权限模块;插件动态卸载时移除AuthorityExpanderProvider对象
插件注册或移除AuthorityExpanderProvider对象时处理表名重复检测逻辑
插件动态安装、卸载、升级时,需要重启DecisionDB数据库
提供给插件在finedb中注册自己的数据表功能,通过该接口注册的数据表是保存在独立的PluginDB中,与BaseDB和DecisionDB相互独立
插件数据库模块在插件框架启动时启动,创建一个PluginDBManager来管理插件注册的DBAccessProvider
插件数据库模块启动或者插件动态安装时,处理表名重复检测逻辑
插件动态安装、卸载、升级时,需要重启PluginDB数据库
使用一个全局的检测器类TableDuplicateChecker,收集BaseDB和DecisionDB中,以及插件中的entity表进行表名重复判断
使用ModuleContext.bindValidator注册一个针对BaseDBConstant.BASE_ENTITY_KEY的校验器,每收集一个BaseDB的entity,就会自动加入到全局检测器TableDuplicateChecker中,并判断是否与现有表名重复
方法同BaseDB,注册针对DecisionDBEntityKey.Key的校验器
读取插件注册的接口时,会获取插件的entity类,同样加入到全局检测器TableDuplicateChecker中,并判断重复
当插件卸载时,将插件注册的entity类从TableDuplicateChecker移除
从entity的注解中读取表名,如果注解中没有表名,则表名默认为类名
如果entity父类同样是entity(有关联的时候),则同时读取父类的表名
添加一个entity时,读取表名,判断表是否已经存在
判断表是否存在方法:
entity重复校验通过后,记录到map中
移除entity时直接从map中移除相关项,若有父类时,父类下所有子类均已移除时一并移除父类
迁移逻辑复用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>