浏览代码

支持配置驱动插件参数 https://gitee.com/ghi/dbsyncer/issues/I83J6E

AE86 1 年之前
父节点
当前提交
f20211e007

+ 2 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/mapping/MappingChecker.java

@@ -113,6 +113,8 @@ public class MappingChecker extends AbstractChecker {
 
         // 修改高级配置:过滤条件/转换配置/插件配置
         this.modifySuperConfigModel(mapping, params);
+        // 插件参数
+        mapping.setPluginExtInfo(params.get("pluginExtInfo"));
 
         // 更新meta
         String metaSnapshot = params.get("metaSnapshot");

+ 1 - 1
dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/impl/GeneralBufferActuator.java

@@ -146,7 +146,7 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
         // 4、插件转换
         final ConnectorInstance sConnectorInstance = connectorFactory.connect(getConnectorConfig(mapping.getSourceConnectorId()));
         final ConnectorInstance tConnectorInstance = connectorFactory.connect(getConnectorConfig(mapping.getTargetConnectorId()));
-        final IncrementPluginContext context = new IncrementPluginContext(sConnectorInstance, tConnectorInstance, sourceTableName, targetTableName, event, sourceDataList, targetDataList);
+        final IncrementPluginContext context = new IncrementPluginContext(sConnectorInstance, tConnectorInstance, sourceTableName, targetTableName, event, sourceDataList, targetDataList, mapping.getPluginExtInfo());
         pluginFactory.convert(group.getPlugin(), context);
 
         // 5、批量执行同步

+ 1 - 1
dbsyncer-parser/src/main/java/org/dbsyncer/parser/impl/ParserComponentImpl.java

@@ -147,7 +147,7 @@ public class ParserComponentImpl implements ParserComponent {
         final ConnectorInstance sConnectorInstance = connectorFactory.connect(sConfig);
         final ConnectorInstance tConnectorInstance = connectorFactory.connect(tConfig);
         final String event = ConnectorConstant.OPERTION_INSERT;
-        final FullPluginContext context = new FullPluginContext(sConnectorInstance, tConnectorInstance, sTableName, tTableName, event);
+        final FullPluginContext context = new FullPluginContext(sConnectorInstance, tConnectorInstance, sTableName, tTableName, event, mapping.getPluginExtInfo());
 
         for (; ; ) {
             if (!task.isRunning()) {

+ 11 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/model/Mapping.java

@@ -57,6 +57,9 @@ public class Mapping extends AbstractConfigModel {
     // 覆盖写入
     private boolean forceUpdate = true;
 
+    // 插件参数
+    private String pluginExtInfo;
+
     public String getSourceConnectorId() {
         return sourceConnectorId;
     }
@@ -148,4 +151,12 @@ public class Mapping extends AbstractConfigModel {
     public void setForceUpdate(boolean forceUpdate) {
         this.forceUpdate = forceUpdate;
     }
+
+    public String getPluginExtInfo() {
+        return pluginExtInfo;
+    }
+
+    public void setPluginExtInfo(String pluginExtInfo) {
+        this.pluginExtInfo = pluginExtInfo;
+    }
 }

+ 19 - 8
dbsyncer-plugin/src/main/java/org/dbsyncer/plugin/AbstractPluginContext.java

@@ -22,39 +22,44 @@ public abstract class AbstractPluginContext implements PluginContext {
     /**
      * 数据源连接实例
      */
-    protected ConnectorInstance sourceConnectorInstance;
+    private ConnectorInstance sourceConnectorInstance;
 
     /**
      * 目标源连接实例
      */
-    protected ConnectorInstance targetConnectorInstance;
+    private ConnectorInstance targetConnectorInstance;
 
     /**
      * 数据源表
      */
-    protected String sourceTableName;
+    private String sourceTableName;
 
     /**
      * 目标源表
      */
-    protected String targetTableName;
+    private String targetTableName;
 
     /**
      * 同步事件(INSERT/UPDATE/DELETE)
      */
-    protected String event;
+    private String event;
 
     /**
      * 数据源数据集合
      */
-    protected List<Map> sourceList;
+    private List<Map> sourceList;
 
     /**
      * 目标源源数据集合
      */
-    protected List<Map> targetList;
+    private List<Map> targetList;
 
-    public void init(ConnectorInstance sourceConnectorInstance, ConnectorInstance targetConnectorInstance, String sourceTableName, String targetTableName, String event, List<Map> sourceList, List<Map> targetList) {
+    /**
+     * 插件参数
+     */
+    private String pluginExtInfo;
+
+    public void init(ConnectorInstance sourceConnectorInstance, ConnectorInstance targetConnectorInstance, String sourceTableName, String targetTableName, String event, List<Map> sourceList, List<Map> targetList, String pluginExtInfo) {
         this.sourceConnectorInstance = sourceConnectorInstance;
         this.targetConnectorInstance = targetConnectorInstance;
         this.sourceTableName = sourceTableName;
@@ -62,6 +67,7 @@ public abstract class AbstractPluginContext implements PluginContext {
         this.event = event;
         this.sourceList = sourceList;
         this.targetList = targetList;
+        this.pluginExtInfo = pluginExtInfo;
     }
 
     @Override
@@ -116,4 +122,9 @@ public abstract class AbstractPluginContext implements PluginContext {
     public void setTargetList(List<Map> targetList) {
         this.targetList = targetList;
     }
+
+    @Override
+    public String getPluginExtInfo() {
+        return pluginExtInfo;
+    }
 }

+ 2 - 2
dbsyncer-plugin/src/main/java/org/dbsyncer/plugin/impl/FullPluginContext.java

@@ -11,8 +11,8 @@ import org.dbsyncer.plugin.AbstractPluginContext;
  */
 public final class FullPluginContext extends AbstractPluginContext {
 
-    public FullPluginContext(ConnectorInstance sourceConnectorInstance, ConnectorInstance targetConnectorInstance, String sourceTableName, String targetTableName, String event) {
-        super.init(sourceConnectorInstance, targetConnectorInstance, sourceTableName, targetTableName, event, null, null);
+    public FullPluginContext(ConnectorInstance sourceConnectorInstance, ConnectorInstance targetConnectorInstance, String sourceTableName, String targetTableName, String event, String pluginExtInfo) {
+        super.init(sourceConnectorInstance, targetConnectorInstance, sourceTableName, targetTableName, event, null, null, pluginExtInfo);
     }
 
     @Override

+ 2 - 2
dbsyncer-plugin/src/main/java/org/dbsyncer/plugin/impl/IncrementPluginContext.java

@@ -14,8 +14,8 @@ import java.util.Map;
  */
 public final class IncrementPluginContext extends AbstractPluginContext {
 
-    public IncrementPluginContext(ConnectorInstance sourceConnectorInstance, ConnectorInstance targetConnectorInstance, String sourceTableName, String targetTableName, String event, List<Map> sourceList, List<Map> targetList) {
-        super.init(sourceConnectorInstance, targetConnectorInstance, sourceTableName, targetTableName, event, sourceList, targetList);
+    public IncrementPluginContext(ConnectorInstance sourceConnectorInstance, ConnectorInstance targetConnectorInstance, String sourceTableName, String targetTableName, String event, List<Map> sourceList, List<Map> targetList, String pluginExtInfo) {
+        super.init(sourceConnectorInstance, targetConnectorInstance, sourceTableName, targetTableName, event, sourceList, targetList, pluginExtInfo);
     }
 
     @Override

+ 7 - 0
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/plugin/PluginContext.java

@@ -72,4 +72,11 @@ public interface PluginContext {
      */
     List<Map> getTargetList();
 
+    /**
+     * 获取插件参数
+     *
+     * @return
+     */
+    String getPluginExtInfo();
+
 }

+ 1 - 7
dbsyncer-web/src/main/resources/public/mapping/editParameter.html

@@ -13,13 +13,7 @@
                     <input name="forceUpdate" class="dbsyncer_switch" th:checked="${mapping?.forceUpdate}" type="checkbox">
                 </div>
             </div>
-            <div class="col-md-4">
-                <label class="col-sm-3 control-label">扩展参数 <i class="fa fa-question-circle fa_gray" aria-hidden="true" title="需要自定义参数用于插件内使用,推荐填写JSON格式文本,例:{'key': 123}"></i></label>
-                <div class="col-sm-9">
-                    <textarea id="extInfo" name="extInfo" class="form-control dbsyncer_textarea_resize_none" maxlength="512" rows="2"></textarea>
-                </div>
-            </div>
-            <div class="col-md-4"></div>
+            <div class="col-md-8"></div>
         </div>
     </div>
 

+ 8 - 2
dbsyncer-web/src/main/resources/public/mapping/editPlugin.html

@@ -8,14 +8,20 @@
     <div class="form-group">
         <div class="row">
             <div class="col-md-4">
-                <label class="col-sm-3 control-label text-right">名称</label>
+                <label class="col-sm-3 control-label text-right">插件名称</label>
                 <div class="col-sm-9">
-                    <select id="pluginClassName" name="pluginId" class="form-control select-control-default">
+                    <select id="pluginId" name="pluginId" class="form-control select-control-default">
                         <option value="" selected="selected">无</option>
                         <option th:value="${p?.className +'_'+ p?.version}" th:text="${p?.name +'_'+ p?.version}" th:each="p,state : ${plugin}" th:selected="${tableGroup eq null and p.className eq mapping?.plugin?.className or p.className eq tableGroup?.plugin?.className}">
                     </select>
                 </div>
             </div>
+            <div id="pluginExtInfo" class="col-md-4 hidden">
+                <label class="col-sm-3 control-label">插件参数 <i class="fa fa-question-circle fa_gray" aria-hidden="true" title="用于插件内部使用,推荐填写JSON格式"></i></label>
+                <div class="col-sm-9">
+                    <textarea name="pluginExtInfo" class="form-control dbsyncer_textarea_resize_none" maxlength="512" rows="2" th:text="${mapping?.pluginExtInfo}"></textarea>
+                </div>
+            </div>
             <div class="col-md-8"></div>
         </div>
     </div>

+ 20 - 2
dbsyncer-web/src/main/resources/static/js/mapping/edit.js

@@ -113,8 +113,8 @@ function bindMappingTableGroupListClick() {
 
 // 绑定下拉选择事件自动匹配相似表事件
 function bindTableSelect(){
-    var $sourceSelect = $("#sourceTable");
-    var $targetSelect = $("#targetTable");
+    const $sourceSelect = $("#sourceTable");
+    const $targetSelect = $("#targetTable");
     $sourceSelect.on('changed.bs.select',function(e){
         $targetSelect.selectpicker('val', $(this).selectpicker('val'));
     });
@@ -217,6 +217,22 @@ function bindRefreshTablesClick() {
     });
 }
 
+// 绑定插件下拉选择事件
+function bindPluginSelect() {
+    const $pluginExtInfo = $("#pluginExtInfo");
+    const $pluginId = $("#pluginId");
+    $pluginId.on('changed.bs.select',function(e){
+        if(isBlank($(this).selectpicker('val'))){
+            $pluginExtInfo.addClass("hidden");
+        }else{
+            $pluginExtInfo.removeClass("hidden");
+        }
+    });
+    if(!isBlank($pluginId.selectpicker('val'))){
+        $pluginExtInfo.removeClass("hidden");
+    }
+}
+
 $(function () {
     // 绑定同步方式切换事件
     bindMappingModelChange();
@@ -233,6 +249,8 @@ $(function () {
     bindMappingTableGroupDelClick();
     //绑定刷新数据表按钮点击事件
     bindRefreshTablesClick();
+    // 绑定插件下拉选择事件
+    bindPluginSelect();
 
     // 初始化select插件
     initSelectIndex($(".select-control-table"), -1);