From 74037b9b0f3191845667f612329165ffa16477e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Fri, 31 Mar 2023 10:46:10 +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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/lock/LockInfoDialog.java | 2 +- .../com/fr/design/utils/TemplateUtils.java | 140 ++++++++++++++---- 2 files changed, 114 insertions(+), 28 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java b/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java index 003215ca6c..44c95c44c2 100644 --- a/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java +++ b/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java @@ -99,7 +99,7 @@ public class LockInfoDialog extends JDialog { return; } final String selectedFilePath = StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, TemplateTreePane.getInstance().getFilePath()); - TemplateUtils.createAndOpenTemplate( + TemplateUtils.createAndReOpenTemplate( Toolkit.i18nText("Fine_Design_Template_Lock_Copy"), new FileNodeFILE(new FileNode(selectedFilePath, false)), false, 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 9fb1e632af..1c9f90ab95 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 @@ -16,8 +16,10 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; import com.fr.stable.CoreConstants; import com.fr.stable.ProductConstants; +import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.lock.TplOperator; +import org.jetbrains.annotations.Nullable; import javax.swing.SwingWorker; import java.io.OutputStream; @@ -33,22 +35,63 @@ public class TemplateUtils { /** * 创建新的模板文件并打开模板 - * @param prefix 模板文件名称前缀 - * @param file 模板文件 + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 * 为true时以CurrentEditingTemplate为准创建新模板 * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 - * @param openNewTemplate 是否需要在创建后打开模板 + * @param openNewTemplate 是否需要在创建后打开模板 */ public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { - String fileName = file.getName(); + createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, () -> {}); + } + + /** + * 创建新的模板文件并并判断新的模板文件是否之前已经被开打,如果已经打开需要reOpen + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 + * 为true时以CurrentEditingTemplate为准创建新模板 + * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 + * @param openNewTemplate 是否需要在创建后打开模板 + */ + public static void createAndReOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { String oldPath = file.getPath(); + file = getSavedFile(prefix, file); + if (file == null) { + return; + } + 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); + } + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); + } + + + /** + * 返回值可以为null, 为null表示点击保存按钮或者传递进来的文件file本身不满足格式要求 + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @return 最后选择的要保存的文件 + */ + @Nullable + private static FILE getSavedFile(String prefix, FILE file) { + String fileName = file.getName(); int indexOfLastDot = fileName.lastIndexOf(CoreConstants.DOT); if (indexOfLastDot < 0) { - return; + return null; } String suffix = fileName.substring(indexOfLastDot + 1); - FILEChooserPane fileChooserPane = FILEChooserPane.getInstance(true, true); + FILEChooserPane fileChooserPane = FILEChooserPane.getInstance(true, true); fileChooserPane.setFileNameTextField(prefix + fileName, suffix); FileExtension fileExtension = FileExtension.parse(suffix); fileChooserPane.addChooseFILEFilter(new ChooseFileFilter(fileExtension, ProductConstants.APP_NAME + Toolkit.i18nText("Fine-Design_Report_Template_File"))); @@ -57,36 +100,52 @@ public class TemplateUtils { fileChooserPane.enableFileNameTextFiled(); if (isCancel(result)) { - return; + return null; } if (isOk(result)) { - file = fileChooserPane.getSelectedFILE(); - _createAndOpenTemplate(file, oldPath, createByEditingTemplate, openNewTemplate); + return fileChooserPane.getSelectedFILE(); } + + return null; } + /** + * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 + * 为true时以CurrentEditingTemplate为准创建新模板 + * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 + * @param openNewTemplate 是否需要在创建后打开模板 + * @param doAfterCreateTemplate 创建备份模板成功后调用 + */ + 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; + } - private static void _createAndOpenTemplate(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate){ - new SwingWorker() { + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); + } + + private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { + new SwingWorker() { @Override - protected Void doInBackground() throws Exception { - byte[] content = new byte[0]; - if (createByEditingTemplate) { - // 从当前编辑模板中生成备份文件 - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - content = template.exportData(); - } else { - content = WorkContext.getWorkResource().readFully(oldPath); - } - if (ArrayUtils.isEmpty(content)) { - throw new Exception(oldPath + " content is empty" ); - } + protected Boolean doInBackground() throws Exception { + // 读取模板数据 + byte[] content = getTemplateData(createByEditingTemplate, oldPath); OutputStream out = null; try { // 加锁 - WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); + boolean saveAsLock = WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); + if (!saveAsLock) { + // 加锁失败时,直接返回 + return false; + } out = file.asOutputStream(); out.write(content); } finally { @@ -98,15 +157,18 @@ public class TemplateUtils { // 解锁 WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); } - } - return null; + return true; } @Override protected void done() { try { - get(); + if (!get()) { + throw new Exception("[RemoteDesign] back up template file failed"); + } + // 创建备份成功后,关闭原模板 + doAfterCreateTemplate.run(); if (openNewTemplate) { DesignerContext.getDesignerFrame().openTemplate(file); } @@ -118,7 +180,31 @@ public class TemplateUtils { } } }.execute(); + } + /** + * 读取模板文件数据 + * + * @param readCurrentEditingTemplate 是否读取当前编辑模板 + * @param path 模板路径 + * @return 模板文件数据 + */ + private static byte[] getTemplateData(boolean readCurrentEditingTemplate, String path) throws Exception { + byte[] content = new byte[0]; + if (readCurrentEditingTemplate) { + // 从当前编辑模板中读取模板文件数据 + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (JTemplate.isValid(template)) { + content = template.exportData(); + } + } else { + // 从给定的模板路径中读取模板文件数据 + content = WorkContext.getWorkResource().readFully(path); + } + if (ArrayUtils.isEmpty(content)) { + throw new Exception(StringUtils.messageFormat("{} content is empty", path)); + } + return content; } private static boolean isCancel(int result) {