From 7d36e6f0454b78931c14430b0170cda5222da672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 6 Apr 2023 18:58:44 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A=E7=9A=84?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6=E5=AD=98?= =?UTF-8?q?=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D=E6=9B=B4?= =?UTF-8?q?=E6=96=B0--=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/utils/TemplateUtils.java | 102 ++++++++++++------ 1 file changed, 70 insertions(+), 32 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index f3d062946d..9e48ae137e 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -24,6 +24,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.SwingWorker; import java.io.OutputStream; import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -44,7 +46,7 @@ public class TemplateUtils { * @param openNewTemplate 是否需要在创建后打开模板 */ public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { - createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, () -> {}); + createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, null); } /** @@ -66,15 +68,33 @@ public class TemplateUtils { Runnable doAfterCreateTemplate; //判断一下要保存的文件是否已打开 int index = HistoryTemplateListCache.getInstance().contains(file); - if (index == -1) { - doAfterCreateTemplate = () -> {}; - } else { - JTemplate template = HistoryTemplateListCache.getInstance().getHistoryList().get(index); - doAfterCreateTemplate = () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template); + JTemplate template = null; + if (index != -1) { + template = HistoryTemplateListCache.getInstance().getHistoryList().get(index); } - createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, template); } + /** + * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 + * 为true时以CurrentEditingTemplate为准创建新模板 + * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 + * @param openNewTemplate 是否需要在创建后打开模板 + * @param template 备份成功后需要关闭的模板 + */ + public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { + String oldPath = file.getPath(); + file = getSavedFile(prefix, file); + if (file == null) { + return; + } + + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, template); + } /** * 返回值可以为null, 为null表示没有点击保存按钮或者传递进来的文件file本身不满足格式要求 @@ -113,29 +133,15 @@ public class TemplateUtils { /** * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate * - * @param prefix 模板文件名称前缀 - * @param file 模板文件 + * @param file saveAs的模板文件 * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 * 为true时以CurrentEditingTemplate为准创建新模板 * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 - * @param openNewTemplate 是否需要在创建后打开模板 - * @param doAfterCreateTemplate 创建备份模板成功后调用 + * @param oldPath 被saveAs的文件路径 */ - public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { - String oldPath = file.getPath(); - file = getSavedFile(prefix, file); - if (file == null) { - return; - } - - createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); - } - - private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { - new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { + private static CompletableFuture createTemplate(FILE file, String oldPath, boolean createByEditingTemplate) { + return CompletableFuture.supplyAsync(() -> { + try { // 读取模板数据 byte[] content = getTemplateData(createByEditingTemplate, oldPath); OutputStream out = null; @@ -144,7 +150,7 @@ public class TemplateUtils { boolean saveAsLock = WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); if (!saveAsLock) { // 加锁失败时,直接返回 - return false; + throw new RuntimeException("[RemoteDesign] back up template file failed"); } out = file.asOutputStream(); out.write(content); @@ -159,20 +165,43 @@ public class TemplateUtils { } } return true; + } catch (Exception e) { + SaveFailureHandler.getInstance().process(e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return false; } + }); + } + /** + * 打开新saveAs的新模板并关闭指定的旧模板 + * + * @param file 模板文件 + * @param openNewTemplate 是否需要打开新模板 + * @param template 需要关闭的模板 + */ + private static void openNewTemplateAndCloseOldTemplate(FILE file, boolean openNewTemplate, @Nullable JTemplate template) { + new SwingWorker() { + @Override + protected Boolean doInBackground() throws Exception { + if (JTemplate.isValid(template)) { + //给要关闭的模板解锁 + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(template.getPath()); + return true; + } + return false; + } @Override protected void done() { try { - if (!get()) { - throw new Exception("[RemoteDesign] back up template file failed"); + if (get()) { + //模板释放锁成功后关闭该模板 + HistoryTemplateListCache.getInstance().closeSelectedReport(template); } - // 创建备份成功后,关闭原模板 - doAfterCreateTemplate.run(); if (openNewTemplate) { DesignerContext.getDesignerFrame().openTemplate(file); } - // 备份成功刷新下目录树 展示出来备份的模板 + // 刷新下目录树 TemplateTreePane.getInstance().refresh(); } catch (Exception e) { SaveFailureHandler.getInstance().process(e); @@ -182,6 +211,15 @@ public class TemplateUtils { }.execute(); } + private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { + createTemplate(file, oldPath, createByEditingTemplate).thenApply((Function) aBoolean -> { + if (aBoolean) { + openNewTemplateAndCloseOldTemplate(file, openNewTemplate, template); + } + return null; + }); + } + /** * 读取模板文件数据 *