diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java index 1f3055d40a..8eb4a9afb7 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -1,9 +1,6 @@ package com.fr.design; import com.fr.common.report.ReportState; -import com.fr.design.env.processor.RemoteDesignerWorkspaceInfoProcessor; -import com.fr.design.mainframe.manager.clip.TemplateTreeClipboard; -import com.fr.design.plugin.remind.PluginErrorDesignReminder; import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; @@ -14,13 +11,16 @@ import com.fr.design.env.DesignerWorkspaceInfoContext; import com.fr.design.env.DesignerWorkspaceType; import com.fr.design.env.RemoteDesignerWorkspaceInfo; import com.fr.design.env.RemoteWorkspace; +import com.fr.design.env.processor.RemoteDesignerWorkspaceInfoProcessor; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.SaveSomeTemplatePane; import com.fr.design.file.TemplateTreePane; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.manager.clip.TemplateTreeClipboard; import com.fr.design.notification.NotificationCenter; +import com.fr.design.plugin.remind.PluginErrorDesignReminder; import com.fr.design.utils.DesignUtils; import com.fr.design.versioncheck.VersionCheckUtils; import com.fr.env.EnvListPane; @@ -31,6 +31,7 @@ import com.fr.invoke.Reflect; import com.fr.json.JSONArray; import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; +import com.fr.performance.profile.PerformancePoint; import com.fr.process.ProcessEventPipe; import com.fr.process.engine.core.CarryMessageEvent; import com.fr.process.engine.core.FineProcessContext; @@ -41,12 +42,14 @@ import com.fr.start.server.ServerTray; import com.fr.workspace.WorkContext; import com.fr.workspace.WorkContextCallback; import com.fr.workspace.Workspace; +import com.fr.workspace.WorkspaceSwitchProcess; import com.fr.workspace.base.WorkspaceAPI; import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.engine.base.FineObjectPool; import com.fr.workspace.engine.channel.http.FunctionalHttpRequest; import com.fr.workspace.engine.exception.WorkspaceConnectionException; import com.fr.workspace.engine.rpc.WorkspaceProxyPool; +import static javax.swing.JOptionPane.QUESTION_MESSAGE; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; @@ -58,12 +61,11 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Optional; import java.util.Set; -import java.util.HashSet; - -import static javax.swing.JOptionPane.QUESTION_MESSAGE; public class EnvChangeEntrance { private static final String BRANCH_TAG = "#"; @@ -125,48 +127,111 @@ public class EnvChangeEntrance { } } + /** * 切换到新环境 * * @param envName 新工作环境名称 + * @param strategy 提示策略 * @return 是否成功 */ private boolean switch2Env(final String envName, PopTipStrategy strategy) { - DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); - DesignerWorkspaceInfo selectedEnv = customUserName(envManager.getWorkspaceInfo(envName)); - DesignerWorkspaceInfoContext.setWorkspaceInfo(selectedEnv); - WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection(); + WorkspaceSwitchProcess lastProcess = WorkContext.getSwitcher().getProcess(); + PerformancePoint performancePoint = PerformancePoint.create(); + + boolean switchStatus = doSwitch2Env(envName, strategy); + + WorkspaceSwitchProcess currentProcess = WorkContext.getSwitcher().getProcess(); + // 如果相同,代表根本没切换 == + if (lastProcess != currentProcess) { + // 记录切换耗时 + recordSwitchInfos(performancePoint, switchStatus); + // 触发切换埋点 + triggerSwitchMetric(); + } + return switchStatus; + } + + /** + * 由云端运维,触发切换埋点 + * 内部空实现 + * 见 实现 + */ + private void triggerSwitchMetric() { + } + + /** + * 切换到新环境 + * 1. 先获取选中的环境 + * 2. 生成工作目录 + * 3. 验证工作目录 + * 4. 触发切换操作 + * 5. 触发可能存在异常的切换后动作 + * 6. 触发切换后动作 + * + * @param envName 新工作环境名称 + * @return 是否成功 + */ + private boolean doSwitch2Env(final String envName, PopTipStrategy strategy) { + + DesignerWorkspaceInfo selectedEnv = getSelectedEnv(envName); try { Workspace workspace = DesignerWorkspaceGenerator.generate(selectedEnv); - boolean checkValid = workspace != null && selectedEnv.checkValid(); - if (!checkValid) { + if (notValid(workspace, selectedEnv)) { return false; } - //如果是相同环境 - if (isSameEnv(workspace)) { - //目前切换到相同环境需要更新一下名字,后续如果有别的操作直接往里面加就行了 - switch2SameEnv(envName); - } else { - //切换到新环境,做下封装 - switch2OtherEnv(workspace, envName); - } - // REPORT-25688如果是war包部署的服务器,给与提示 - if (WorkContext.getCurrent().isWarDeploy()) { - FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Basic_War_Deploy_Tip"), - Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.INFORMATION_MESSAGE); - } - //REPORT-13810如果只是添加了工作目录,没有切换,这里ToolArea也是要显示新建的工作目录 - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if (JTemplate.isValid(template)) { - template.refreshToolArea(); - } - PluginErrorDesignReminder.getInstance().remindStartFailedPlugins(); + doSwitchAction(envName, workspace); + afterSwitchWithEx(); } catch (Exception exception) { // 失败的处理 WorkspaceExceptionHandler.getInstance().handleInSwitch(exception, selectedEnv); return false; } + afterSwitch(); + return true; + } + + private DesignerWorkspaceInfo getSelectedEnv(String envName) { + + DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); + DesignerWorkspaceInfo selectedEnv = customUserName(envManager.getWorkspaceInfo(envName)); + DesignerWorkspaceInfoContext.setWorkspaceInfo(selectedEnv); + return selectedEnv; + } + + private static boolean notValid(Workspace workspace, DesignerWorkspaceInfo selectedEnv) throws Exception { + boolean checkValid = workspace != null && selectedEnv.checkValid(); + return !checkValid; + } + + private void doSwitchAction(String envName, Workspace workspace) { + + //如果是相同环境 + if (isSameEnv(workspace)) { + //目前切换到相同环境需要更新一下名字,后续如果有别的操作直接往里面加就行了 + switch2SameEnv(envName); + } else { + //切换到新环境,做下封装 + switch2OtherEnv(workspace, envName); + } + } + + private static void afterSwitchWithEx() { + // REPORT-25688如果是war包部署的服务器,给与提示 + if (WorkContext.getCurrent().isWarDeploy()) { + FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Basic_War_Deploy_Tip"), + Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.INFORMATION_MESSAGE); + } + //REPORT-13810如果只是添加了工作目录,没有切换,这里ToolArea也是要显示新建的工作目录 + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (JTemplate.isValid(template)) { + template.refreshToolArea(); + } + PluginErrorDesignReminder.getInstance().remindStartFailedPlugins(); + } + + private static void afterSwitch() { TemplateTreePane.getInstance().refreshDockingView(); DesignModelAdapter model = DesignModelAdapter.getCurrentModelAdapter(); if (model != null) { @@ -175,7 +240,18 @@ public class EnvChangeEntrance { NotificationCenter.getInstance().clearAllNotifications(); //切换环境后,清空粘贴板里面的内容 TemplateTreeClipboard.getInstance().reset(); - return true; + } + + private static void recordSwitchInfos(PerformancePoint performancePoint, boolean switchSuccess) { + + performancePoint.end(elapsed -> { + WorkspaceSwitchProcess process = WorkContext.getSwitcher().getProcess(); + Optional.ofNullable(process) + .ifPresent((e) -> { + e.recordSwitchElapsed(elapsed); + e.setSwitchSuccess(switchSuccess); + }); + }); } /** diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java index 858eca4977..2fd4a532c8 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java @@ -6,10 +6,15 @@ import com.fr.design.file.HistoryTemplateListCache; import com.fr.event.Event; import com.fr.event.Listener; import com.fr.module.Activator; +import com.fr.module.ModuleContext; +import com.fr.module.engine.FineModule; import com.fr.start.server.FineEmbedServer; +import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; +import com.fr.workspace.WorkspaceSwitchProcess; +import java.util.Optional; import java.util.concurrent.ExecutorService; /** @@ -17,6 +22,46 @@ import java.util.concurrent.ExecutorService; */ public class DesignerWorkspaceActivator extends Activator { + private final Listener stopModuleAction = new Listener(Integer.MIN_VALUE) { + + @Override + public void on(Event event, Workspace current) { + + stopSub(EnvBasedModule.class); + recordModuleStop(); + } + + private void recordModuleStop() { + + WorkspaceSwitchProcess process = WorkContext.getSwitcher().getProcess(); + Optional.ofNullable(process) + .ifPresent((e) -> e.recordModuleStopUsed(() -> { + FineModule module = (FineModule) ModuleContext.getModule(EnvBasedModule.class); + return module.profileStop(); + })); + } + }; + + private final Listener startModuleAction = new Listener(Integer.MAX_VALUE) { + + @Override + public void on(Event event, Workspace current) { + + startSub(EnvBasedModule.class); + recordModuleStart(); + } + + private void recordModuleStart() { + + WorkspaceSwitchProcess process = WorkContext.getSwitcher().getProcess(); + Optional.ofNullable(process) + .ifPresent((e) -> e.recordModuleStartUsed(() -> { + FineModule module = (FineModule) ModuleContext.getModule(EnvBasedModule.class); + return module.profile(); + })); + } + }; + @Override public void start() { @@ -29,23 +74,9 @@ public class DesignerWorkspaceActivator extends Activator { private void registerEnvListener() { /*切换环境前,关闭所有相关模块,最后执行*/ - listenEvent(WorkspaceEvent.BeforeSwitch, new Listener(Integer.MIN_VALUE) { - - @Override - public void on(Event event, Workspace current) { - - stopSub(EnvBasedModule.class); - } - }); + listenEvent(WorkspaceEvent.BeforeSwitch, stopModuleAction); /*切换环境后,重新启动所有相关模块,最先执行*/ - listenEvent(WorkspaceEvent.AfterSwitch, new Listener(Integer.MAX_VALUE) { - - @Override - public void on(Event event, Workspace current) { - - startSub(EnvBasedModule.class); - } - }); + listenEvent(WorkspaceEvent.AfterSwitch, startModuleAction); /*切换环境前,存储一下打开的所有文件对象,要先于 关闭相关模块部分 被触发*/ listenEvent(WorkspaceEvent.BeforeSwitch, new Listener(Integer.MAX_VALUE) {