From 5e649c47577891a76edd63c8207842c71bf3568b Mon Sep 17 00:00:00 2001
From: "Destiny.Lin" <destiny.lin@fanruan.com>
Date: Sun, 8 Sep 2024 23:51:33 +0800
Subject: [PATCH] =?UTF-8?q?REPORT-133186=20=E3=80=90fr-fbp=E5=9B=9E?=
 =?UTF-8?q?=E5=BD=92=E3=80=91=E3=80=90=E6=95=B0=E6=8D=AE=E9=9B=86=E3=80=91?=
 =?UTF-8?q?fbp=E8=AE=BE=E8=AE=A1=E5=99=A8=E8=BF=9C=E7=A8=8B=E8=AE=BE?=
 =?UTF-8?q?=E8=AE=A1=EF=BC=8C=E6=96=B0=E5=BB=BAmysql=E6=95=B0=E6=8D=AE?=
 =?UTF-8?q?=E8=BF=9E=E6=8E=A5=EF=BC=8C=E5=BC=80=E5=90=AFSSL=E9=80=9A?=
 =?UTF-8?q?=E9=81=93=E5=90=8E=E8=AF=BB=E4=B8=8D=E5=88=B0CA=E8=AF=81?=
 =?UTF-8?q?=E4=B9=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../design/data/datapane/connect/SslPane.java |   2 +-
 .../data/tabledata/LocalTableDataSource.java  |   9 ++
 .../java/com/fr/file/FILEChooserPane.java     |  46 ++++++
 .../src/main/java/com/fr/file/FileCAFILE.java | 151 ++++++++++++++++++
 4 files changed, 207 insertions(+), 1 deletion(-)
 create mode 100644 designer-base/src/main/java/com/fr/file/FileCAFILE.java

diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java
index 10cd4e5e2f..62e6666acd 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java
@@ -146,7 +146,7 @@ public class SslPane extends BasicPane {
 
         @Override
         public void actionPerformed(ActionEvent e) {
-            FILEChooserPane fileChooser = FILEChooserPane.getInstanceWithDesignatePath(SslUtils.PREFIX, new ChooseFileFilter(true), SslUtils.CERTIFICATES);
+            FILEChooserPane fileChooser = FILEChooserPane.getFileCAChoosePane(new ChooseFileFilter(true));
             int type = fileChooser.showOpenDialog(SslPane.this, StringUtils.EMPTY);
             if (type == FILEChooserPane.OK_OPTION) {
                 final FILE file = fileChooser.getSelectedFILE();
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/LocalTableDataSource.java b/designer-base/src/main/java/com/fr/design/data/tabledata/LocalTableDataSource.java
index 5c70a87536..25acc3da90 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/LocalTableDataSource.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/LocalTableDataSource.java
@@ -7,9 +7,12 @@ import com.fr.decision.webservice.bean.dataset.FileDataSetBean;
 import com.fr.decision.webservice.bean.dataset.ServerDataSetBean;
 import com.fr.decision.webservice.bean.entry.FileNodeBean;
 import com.fr.decision.webservice.v10.datasource.dataset.processor.impl.FileProcessor;
+import com.fr.decision.webservice.v10.file.FileNodeService;
 import com.fr.design.data.datapane.preview.TableDataBeanHelper;
 import com.fr.log.FineLoggerFactory;
+import com.fr.stable.CommonUtils;
 import com.fr.stable.StringUtils;
+import com.fr.stable.project.ProjectConstants;
 import com.fr.workspace.server.repository.tabledata.BaseTableDataSource;
 
 import java.util.ArrayList;
@@ -67,6 +70,12 @@ public class LocalTableDataSource extends BaseTableDataSource {
         }
     }
 
+    @Override
+    public List<FileNodeBean> getCertificatesFile(String keyword) throws Exception {
+        String pPath = CommonUtils.pathJoin(ProjectConstants.RESOURCES_NAME, ProjectConstants.CERTIFICATES_DIRECTORY);
+        return FileNodeService.getInstance().getAllRecursiveFileNodes(pPath, ProjectConstants.RESOURCES_NAME, keyword);
+    }
+
 
     @Override
     public List<ServerDataSetBean> getAllTableData() {
diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java
index 9d21751c28..5018f37349 100644
--- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java
+++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java
@@ -252,6 +252,21 @@ public class FILEChooserPane extends BasicPane {
         return chooserPane;
     }
 
+    /**
+     * 获取CA证书的文件选择面板
+     */
+    public static FILEChooserPane getFileCAChoosePane(FILEFilter filter) {
+        FILEChooserPane chooserPane = new FILEChooserPane();
+        chooserPane.showEnv = true;
+        chooserPane.showLoc = false;
+        chooserPane.showWebReport = false;
+        // 替换掉 PlaceListModel
+        chooserPane.setFileCAPlaceListModel();
+        chooserPane.removeAllFilter();
+        chooserPane.addChooseFILEFilter(filter, 0);
+        return chooserPane;
+    }
+
 
     /**
      * @param showEnv
@@ -1128,6 +1143,13 @@ public class FILEChooserPane extends BasicPane {
         setPlaceListModel(new FileDataPlaceListModel(type));
     }
 
+    protected void setFileCAPlaceListModel() {
+        if (placesList == null) {
+            return;
+        }
+        setPlaceListModel(new FileCAPlaceListModel());
+    }
+
     /*
      * 选中文件
      */
@@ -1385,6 +1407,30 @@ public class FILEChooserPane extends BasicPane {
 
     }
 
+    private class FileCAPlaceListModel extends AbstractPlaceListModel {
+        private FileCAFILE envFILE;
+        FileCAPlaceListModel() {
+            envFILE = new FileCAFILE(new FileNode(StableUtils.pathJoin(ProjectConstants.RESOURCES_NAME, ProjectConstants.CERTIFICATES_DIRECTORY), true), false, StableUtils.pathJoin(ProjectConstants.ASSETS_NAME, FileDataFILE.FILE_DATASET_NAME)) {
+                @Override
+                public String getName() {
+                    return getEnvProjectName();
+                }
+            };
+        }
+
+        @Override
+        public FILE getElementAt(int index) {
+            return envFILE;
+        }
+
+        @Override
+        public int getSize() {
+            return 1 + filesOfSystem.size();
+        }
+
+    }
+
+
     private class MultiLocalEnvPlaceListModel extends AbstractPlaceListModel {
 
         private static final long serialVersionUID = 6300018896958532154L;
diff --git a/designer-base/src/main/java/com/fr/file/FileCAFILE.java b/designer-base/src/main/java/com/fr/file/FileCAFILE.java
new file mode 100644
index 0000000000..78ea400447
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/file/FileCAFILE.java
@@ -0,0 +1,151 @@
+package com.fr.file;
+
+import com.fr.decision.webservice.bean.entry.FileNodeBean;
+import com.fr.file.filetree.FileNode;
+import com.fr.general.ComparatorUtils;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.CoreConstants;
+import com.fr.stable.StableUtils;
+import com.fr.stable.StringUtils;
+import com.fr.workspace.server.repository.tabledata.TableDataRepository;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * CA证书文件相关
+ *
+ * @author Destiny.Lin
+ * @since 11.0
+ * Created on 2024/9/8
+ */
+public class FileCAFILE extends FileNodeFILE{
+    private List<FileCAFILE> children = new ArrayList<>();
+    private boolean builded = false;
+    private String id = StringUtils.EMPTY;
+
+    public FileCAFILE(FileNode node) {
+        super(node);
+    }
+
+    public FileCAFILE(FileNode node, boolean builded, String id) {
+        super(node);
+        this.builded = builded;
+        this.id = id;
+    }
+
+    /**
+     * 添加子
+     */
+    private void addChild(FileCAFILE file) {
+        children.add(file);
+    }
+
+    public List<FileCAFILE> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<FileCAFILE> children) {
+        this.children = children;
+    }
+
+    public boolean isBuilded() {
+        return builded;
+    }
+
+    public void setBuilded(boolean builded) {
+        this.builded = builded;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public FILE[] listFiles() {
+
+        if (ComparatorUtils.equals(node, null)) {
+            node = new FileNode(CoreConstants.SEPARATOR, true);
+        }
+        if (!node.isDirectory()) {
+            return new FILE[]{this};
+        }
+        try {
+            FileCAFILE root = null;
+            if (!this.builded) {
+                root = buildTree();
+                FileCAFILE dataFILE = root.getFileCAFILE(this.id);
+                this.setChildren(dataFILE.getChildren());
+                this.builded = true;
+            }
+            return this.getChildren().toArray(new FILE[0]);
+        } catch (Exception e) {
+            FineLoggerFactory.getLogger().error(e.getMessage(), e);
+            return new FILE[0];
+        }
+    }
+
+    private List<FileNodeBean> getBeans() {
+        try {
+            return TableDataRepository.getInstance().getCertificatesFile(StringUtils.EMPTY);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 递归获取指定id的文件
+     */
+    public FileCAFILE getFileCAFILE(String id) {
+        if (StringUtils.equals(this.id, id) || StringUtils.equals(StableUtils.pathJoin(this.id, StringUtils.EMPTY), id)) {
+            return this;
+        }
+        for (FileCAFILE file : getChildren()) {
+            return file.getFileCAFILE(id);
+        }
+        return null;
+    }
+
+    private FileCAFILE buildTree() {
+        List<FileNodeBean> beans = getBeans();
+        Map<String, FileCAFILE> tree = new HashMap<>();
+        FileCAFILE root = null;
+        // id , 父
+        for (FileNodeBean bean : beans) {
+            FileNode fileNode = new FileNode();
+            fileNode.setEnvPath(bean.getPath());
+            fileNode.setDirectory(bean.getIsParent());
+            tree.putIfAbsent(bean.getId(), new FileCAFILE(fileNode, true, bean.getId()));
+            if (StringUtils.isEmpty(bean.getpId())) {
+                root = tree.get(bean.getId());
+            } else {
+                tree.putIfAbsent(bean.getpId(), createParent(bean.getpId(), beans));
+                FileCAFILE file = tree.get(bean.getpId());
+                if (file != null) {
+                    file.addChild(tree.get(bean.getId()));
+                }
+            }
+        }
+        return root;
+    }
+
+    private FileCAFILE createParent(String s, List<FileNodeBean> beans) {
+        for (FileNodeBean bean : beans) {
+            if (StringUtils.equals(bean.getId(), s)) {
+                FileNode fileNode = new FileNode();
+                fileNode.setEnvPath(bean.getPath());
+                fileNode.setDirectory(bean.getIsParent());
+                return new FileCAFILE(fileNode, true, bean.getId());
+            }
+        }
+        return null;
+    }
+
+
+}