Browse Source

Merge pull request #13272 in DESIGN/design from final/11.0 to persist/11.0

* commit '84c606fd93e291df64b2d1f5d8036e9dbb653f63': (64 commits)
  REPORT-109335 回退原方案
  REPORT-109335 换个方案,英文下直接拉伸面板宽度
  REPORT-109043 11.0远程设计服务器列表图标高度异常
  REPORT-109335 国际化中,fr模板公式显示不全
  REPORT-108302 模板保存失败
  REPORT-109834 F0052,起始页触发报错,starting拿到的是false
  REPORT-108718 设计器偶现异常弹窗can not acceptnewurl
  REPORT-109834 F0052,起始页触发报错,starting拿到的是false
  漏了一个类
  REPORT-106823 代码回退-控件显示增强代码内置
  REPORT-106823 代码回退-控件显示增强代码内置
  REPORT-106823 代码回退-控件显示增强代码内置
  REPORT-109843 F0051,部分保存场景没有埋点
  回退REPORT-107652服务端代码
  无jira 补报错日志
  REPORT-109802 【控件显示增强】插件打包报错处理
  REPORT-109802 【控件显示增强】插件打包报错处理
  REPORT-107652 控件增强判断只有自定义按钮在用,还是放到它的实现里,做一些注释说明
  REPORT-109728 【控件显示增强代码内置】按钮控件-字体配置部分丢失
  REPORT-109711 F0051新建的模版触发保存没有数据
  ...
fix-lag
superman 12 months ago
parent
commit
40251da3ff
  1. 140
      designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
  2. 59
      designer-base/src/main/java/com/fr/design/data/datapane/connect/DBCPAttrPane.java
  3. 1
      designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java
  4. 16
      designer-base/src/main/java/com/fr/design/deeplink/DeepLinkCore.java
  5. 8
      designer-base/src/main/java/com/fr/design/formula/FormulaPane.java
  6. 3
      designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java
  7. 20
      designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
  8. 54
      designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java
  9. 22
      designer-base/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java
  10. 27
      designer-base/src/main/java/com/fr/design/mainframe/messagecollect/StartErrorMessageCollector.java
  11. 3
      designer-base/src/main/java/com/fr/design/utils/DesignUtils.java
  12. 3
      designer-base/src/main/java/com/fr/design/worker/save/CallbackSaveWorker.java
  13. 15
      designer-base/src/main/java/com/fr/startup/metric/DesignerStartupModel.java
  14. 9
      designer-base/src/main/java/com/fr/startup/ui/StartupPageWindow.java
  15. 2
      designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties
  16. 2
      designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties
  17. 2
      designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties
  18. 2
      designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties
  19. 2
      designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties
  20. 20
      designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java
  21. 94
      designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java
  22. 6
      designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxDefinePane.java
  23. 1
      designer-realize/src/main/java/com/fr/design/widget/ui/btn/FreeButtonDetailPane.java
  24. 63
      designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java
  25. 2
      designer-realize/src/main/java/com/fr/start/module/optimized/DesignerStartupPageActivator.java

140
designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java

@ -1,9 +1,6 @@
package com.fr.design; package com.fr.design;
import com.fr.common.report.ReportState; 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.data.DesignTableDataManager;
import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter; 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.DesignerWorkspaceType;
import com.fr.design.env.RemoteDesignerWorkspaceInfo; import com.fr.design.env.RemoteDesignerWorkspaceInfo;
import com.fr.design.env.RemoteWorkspace; import com.fr.design.env.RemoteWorkspace;
import com.fr.design.env.processor.RemoteDesignerWorkspaceInfoProcessor;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.SaveSomeTemplatePane; import com.fr.design.file.SaveSomeTemplatePane;
import com.fr.design.file.TemplateTreePane; import com.fr.design.file.TemplateTreePane;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplate;
import com.fr.design.mainframe.manager.clip.TemplateTreeClipboard;
import com.fr.design.notification.NotificationCenter; import com.fr.design.notification.NotificationCenter;
import com.fr.design.plugin.remind.PluginErrorDesignReminder;
import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignUtils;
import com.fr.design.versioncheck.VersionCheckUtils; import com.fr.design.versioncheck.VersionCheckUtils;
import com.fr.env.EnvListPane; import com.fr.env.EnvListPane;
@ -31,6 +31,7 @@ import com.fr.invoke.Reflect;
import com.fr.json.JSONArray; import com.fr.json.JSONArray;
import com.fr.locale.InterProviderFactory; import com.fr.locale.InterProviderFactory;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import com.fr.performance.profile.PerformancePoint;
import com.fr.process.ProcessEventPipe; import com.fr.process.ProcessEventPipe;
import com.fr.process.engine.core.CarryMessageEvent; import com.fr.process.engine.core.CarryMessageEvent;
import com.fr.process.engine.core.FineProcessContext; 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.WorkContext;
import com.fr.workspace.WorkContextCallback; import com.fr.workspace.WorkContextCallback;
import com.fr.workspace.Workspace; import com.fr.workspace.Workspace;
import com.fr.workspace.WorkspaceSwitchProcess;
import com.fr.workspace.base.WorkspaceAPI; import com.fr.workspace.base.WorkspaceAPI;
import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.connect.WorkspaceConnectionInfo;
import com.fr.workspace.engine.base.FineObjectPool; import com.fr.workspace.engine.base.FineObjectPool;
import com.fr.workspace.engine.channel.http.FunctionalHttpRequest; import com.fr.workspace.engine.channel.http.FunctionalHttpRequest;
import com.fr.workspace.engine.exception.WorkspaceConnectionException; import com.fr.workspace.engine.exception.WorkspaceConnectionException;
import com.fr.workspace.engine.rpc.WorkspaceProxyPool; import com.fr.workspace.engine.rpc.WorkspaceProxyPool;
import static javax.swing.JOptionPane.QUESTION_MESSAGE;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
@ -58,12 +61,11 @@ import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.HashSet;
import static javax.swing.JOptionPane.QUESTION_MESSAGE;
public class EnvChangeEntrance { public class EnvChangeEntrance {
private static final String BRANCH_TAG = "#"; private static final String BRANCH_TAG = "#";
@ -125,48 +127,111 @@ public class EnvChangeEntrance {
} }
} }
/** /**
* 切换到新环境 * 切换到新环境
* *
* @param envName 新工作环境名称 * @param envName 新工作环境名称
* @param strategy 提示策略
* @return 是否成功 * @return 是否成功
*/ */
private boolean switch2Env(final String envName, PopTipStrategy strategy) { 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;
}
/**
* 由云端运维触发切换埋点
* 内部空实现
* <a href="https://kms.fineres.com/pages/viewpage.action?pageId=945327503">实现</a>
*/
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 { try {
Workspace workspace = DesignerWorkspaceGenerator.generate(selectedEnv); Workspace workspace = DesignerWorkspaceGenerator.generate(selectedEnv);
boolean checkValid = workspace != null && selectedEnv.checkValid(); if (notValid(workspace, selectedEnv)) {
if (!checkValid) {
return false; return false;
} }
//如果是相同环境 doSwitchAction(envName, workspace);
if (isSameEnv(workspace)) { afterSwitchWithEx();
//目前切换到相同环境需要更新一下名字,后续如果有别的操作直接往里面加就行了
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();
} catch (Exception exception) { } catch (Exception exception) {
// 失败的处理 // 失败的处理
WorkspaceExceptionHandler.getInstance().handleInSwitch(exception, selectedEnv); WorkspaceExceptionHandler.getInstance().handleInSwitch(exception, selectedEnv);
return false; 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(); TemplateTreePane.getInstance().refreshDockingView();
DesignModelAdapter<?, ?> model = DesignModelAdapter.getCurrentModelAdapter(); DesignModelAdapter<?, ?> model = DesignModelAdapter.getCurrentModelAdapter();
if (model != null) { if (model != null) {
@ -175,7 +240,18 @@ public class EnvChangeEntrance {
NotificationCenter.getInstance().clearAllNotifications(); NotificationCenter.getInstance().clearAllNotifications();
//切换环境后,清空粘贴板里面的内容 //切换环境后,清空粘贴板里面的内容
TemplateTreeClipboard.getInstance().reset(); 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);
});
});
} }
/** /**

59
designer-base/src/main/java/com/fr/design/data/datapane/connect/DBCPAttrPane.java

@ -1,6 +1,7 @@
package com.fr.design.data.datapane.connect; package com.fr.design.data.datapane.connect;
import com.fr.base.GraphHelper; import com.fr.base.GraphHelper;
import com.fr.data.core.db.dialect.DialectFactory;
import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.impl.JDBCDatabaseConnection;
import com.fr.data.pool.DBCPConnectionPoolAttr; import com.fr.data.pool.DBCPConnectionPoolAttr;
import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicDialog;
@ -31,6 +32,7 @@ import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; import java.awt.event.KeyListener;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -43,7 +45,7 @@ public class DBCPAttrPane extends BasicPane {
private static final int ORACLE_DEFAULT_FETCHSIZE = 128; private static final int ORACLE_DEFAULT_FETCHSIZE = 128;
private static final int DB2_DEFAULT_FETCHSIZE = 50; private static final int DB2_DEFAULT_FETCHSIZE = 50;
private static final int POSTGRE_DEFAULT_FETCHSIZE = 10000; private static final int POSTGRE_DEFAULT_FETCHSIZE = 10000;
private static final int EMPTY_FETCHSIZE = -2; private static final int INVALID_FETCHSIZE = -1;
// carl:DBCP的一些属性 // carl:DBCP的一些属性
private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor(); private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor();
private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor(); private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor();
@ -114,12 +116,25 @@ public class DBCPAttrPane extends BasicPane {
this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE); this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE);
this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun()); this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun());
this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis()); this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis());
Integer fetchSize = DEFAULT_FETCHSIZE_MAP.get(JDBCConnectionDef.getInstance().getDatabaseName());
if (fetchSize != null) { /*
if (jdbcDatabase.getFetchSize() == EMPTY_FETCHSIZE) { * 填充FetchSize输入框逻辑
this.FETCHSIZE.setText(StringUtils.EMPTY); *
* 1. 如果JDBCDatabaseConnection里的fetchSize是有效值>0则显示该有效值
* 2. 如果JDBCDatabaseConnection里的fetchSize是无效值<=0
* 2.1 如果我们对这种数据库有默认值如oracledb2pgsql就显示对应数据库的默认值因为要避免性能问题这几种数据库不支持关闭fetchSize
* 2.2 如果我们对这种数据库无默认值就显示-1
*/
int fetchSize = jdbcDatabase.getFetchSize();
String databaseName = JDBCConnectionDef.getInstance().getDatabaseName();
if (DialectFactory.isValidFetchSize(fetchSize)) {
this.FETCHSIZE.setText(String.valueOf(fetchSize));
} else {
if (DEFAULT_FETCHSIZE_MAP.containsKey(databaseName)) {
this.FETCHSIZE.setText(String.valueOf(DEFAULT_FETCHSIZE_MAP.get(databaseName)));
} else { } else {
this.FETCHSIZE.setText(jdbcDatabase.getFetchSize() == -1 ? String.valueOf(fetchSize) : String.valueOf(jdbcDatabase.getFetchSize())); this.FETCHSIZE.setText(String.valueOf(INVALID_FETCHSIZE));
} }
} }
} }
@ -137,12 +152,34 @@ public class DBCPAttrPane extends BasicPane {
dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE); dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE);
dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue()); dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue());
dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue()); dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue());
Integer fetchSize = DEFAULT_FETCHSIZE_MAP.get(JDBCConnectionDef.getInstance().getDatabaseName());
if (fetchSize != null) { /*
if (StringUtils.isEmpty(this.FETCHSIZE.getText())) { * FetchSize设置逻辑
jdbcDatabase.setFetchSize(EMPTY_FETCHSIZE); *
* 1. 如果客户界面上的fetchSize框留空
* 1.1 如果我们对这种数据库有默认值如oracledb2pgsql就存对应数据库的默认值否则会有性能问题这几种数据库我们是不支持关闭fetchSize的
* 1.2 如果我们对这种数据库没有默认值就置为-1
* 2. 如果客户界面上的fetchSize框非空
* 2.1 如果fetchSize是个有效值>0就使用该值
* 2.2 如果fetchSize是个无效值<=0)就置为-1
*
* -1带来的结果就是我们Dialect不会putExecutor最终不会执行java.sql.Statement.setFetchSize
*/
String fetchSizeText = this.FETCHSIZE.getText();
String databaseName = JDBCConnectionDef.getInstance().getDatabaseName();
if (StringUtils.isEmpty(fetchSizeText)) {
if (DEFAULT_FETCHSIZE_MAP.containsKey(databaseName)) {
Optional.ofNullable(DEFAULT_FETCHSIZE_MAP.get(databaseName)).ifPresent(jdbcDatabase::setFetchSize);
} else {
jdbcDatabase.setFetchSize(INVALID_FETCHSIZE);
}
} else {
int fetchSizeSet = Integer.parseInt(fetchSizeText);
if (DialectFactory.isValidFetchSize(fetchSizeSet)) {
jdbcDatabase.setFetchSize(fetchSizeSet);
} else { } else {
jdbcDatabase.setFetchSize(Integer.parseInt(this.FETCHSIZE.getText())); jdbcDatabase.setFetchSize(INVALID_FETCHSIZE);
} }
} }
} }

1
designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java

@ -462,6 +462,7 @@ public abstract class DatabaseConnectionPane<E extends com.fr.data.impl.Connecti
} catch (InterruptedException e) { } catch (InterruptedException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e); FineLoggerFactory.getLogger().error(e.getMessage(), e);
} catch (ExecutionException e) { } catch (ExecutionException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
dealWithException(e); dealWithException(e);
} }
} }

16
designer-base/src/main/java/com/fr/design/deeplink/DeepLinkCore.java

@ -167,6 +167,22 @@ public class DeepLinkCore {
markPendingURLConsumed(); markPendingURLConsumed();
} }
/**
* 符合条件的url才处理
*
* @param url 接收到的url
* @return true:处理; false:不处理
*/
public boolean accept(String url) {
UrlBean urlBean = UrlBean.create(url);
for (DeepLink deepLink: deepLinkList) {
if (deepLink.accept(urlBean.getUrl(), urlBean.getHost(), urlBean.getPath(), urlBean.getParams())) {
return true;
}
}
return false;
}
private void performDeepLinks(String url, String host, String path, Map<String, Object> params) { private void performDeepLinks(String url, String host, String path, Map<String, Object> params) {
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override

8
designer-base/src/main/java/com/fr/design/formula/FormulaPane.java

@ -34,6 +34,7 @@ import com.fr.design.gui.itextarea.UITextArea;
import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea;
import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants;
import com.fr.design.i18n.DesignSizeI18nManager;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
@ -742,7 +743,8 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
} }
public BasicDialog showLargeWindow(Window window, DialogActionListener l) { public BasicDialog showLargeWindow(Window window, DialogActionListener l) {
BasicDialog basicDialog = super.showWindowWithCustomSize(window, l, new Dimension(900, 600)); Dimension dimension = DesignSizeI18nManager.getInstance().i18nDimension(this.getClass().getName());
BasicDialog basicDialog = super.showWindowWithCustomSize(window, l, dimension);
basicDialog.setMinimumSize(new Dimension(900, 600)); basicDialog.setMinimumSize(new Dimension(900, 600));
basicDialog.setResizable(true); basicDialog.setResizable(true);
return basicDialog; return basicDialog;
@ -1196,7 +1198,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
private void initDescriptionTextArea() { private void initDescriptionTextArea() {
// Description // Description
descriptionTextArea = new UITextArea(DESCRIPTION_TEXT_AREA_ROW,DESCRIPTION_TEXT_AREA_COLUMN); descriptionTextArea = new UITextArea(DESCRIPTION_TEXT_AREA_ROW, DESCRIPTION_TEXT_AREA_COLUMN);
descriptionTextArea.setBackground(Color.white); descriptionTextArea.setBackground(Color.white);
descriptionTextArea.setLineWrap(true); descriptionTextArea.setLineWrap(true);
descriptionTextArea.setWrapStyleWord(true); descriptionTextArea.setWrapStyleWord(true);
@ -1282,7 +1284,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
desScrollPane.setBorder(null); desScrollPane.setBorder(null);
panel.add(this.createNamePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Formula_Description") + ":", desScrollPane), BorderLayout.CENTER); panel.add(this.createNamePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Formula_Description") + ":", desScrollPane), BorderLayout.CENTER);
initVariablesTreeSelectionListener(); initVariablesTreeSelectionListener();
this.add(panel,BorderLayout.CENTER); this.add(panel, BorderLayout.CENTER);
} }
private void initComponents() { private void initComponents() {

3
designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java

@ -17,6 +17,7 @@ import com.fr.stable.Nameable;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.stable.core.PropertyChangeAdapter; import com.fr.stable.core.PropertyChangeAdapter;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel; import javax.swing.DefaultListModel;
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.JLabel; import javax.swing.JLabel;
@ -359,6 +360,8 @@ public abstract class JListControlPane extends JControlPane implements ListContr
setLayout(new BorderLayout()); setLayout(new BorderLayout());
this.textLabel = new JLabel(); this.textLabel = new JLabel();
this.iconLabel = new JLabel(); this.iconLabel = new JLabel();
this.textLabel.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 1));
this.iconLabel.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 0));
add(this.textLabel, BorderLayout.CENTER); add(this.textLabel, BorderLayout.CENTER);
add(this.iconLabel, BorderLayout.WEST); add(this.iconLabel, BorderLayout.WEST);
this.iconLabel.setBackground(Color.WHITE); this.iconLabel.setBackground(Color.WHITE);

20
designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java

@ -3,6 +3,7 @@ package com.fr.design.mainframe;
import com.fr.base.Parameter; import com.fr.base.Parameter;
import com.fr.base.TRL; import com.fr.base.TRL;
import com.fr.base.extension.FileExtension; import com.fr.base.extension.FileExtension;
import com.fr.base.info.TemplateSaveInfoContext;
import com.fr.base.io.BaseBook; import com.fr.base.io.BaseBook;
import com.fr.base.iofile.attr.DesignBanCopyAttrMark; import com.fr.base.iofile.attr.DesignBanCopyAttrMark;
import com.fr.base.iofile.attr.TemplateIdAttrMark; import com.fr.base.iofile.attr.TemplateIdAttrMark;
@ -877,7 +878,10 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
return saveAsTemplate(isShowLoc); return saveAsTemplate(isShowLoc);
} }
collectInfo(); collectInfo();
return this.saveFile(); TemplateSaveInfoContext.getInstance().startCollect(template);
boolean result = this.saveFile();
TemplateSaveInfoContext.getInstance().stopCollect(result);
return result;
} }
private boolean isCancelOperation(int operation) { private boolean isCancelOperation(int operation) {
@ -966,7 +970,9 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
generateNewTemplateIdForSaveAs(); generateNewTemplateIdForSaveAs();
this.editingFILE = editingFILE; this.editingFILE = editingFILE;
TemplateSaveInfoContext.getInstance().startCollect(template);
boolean result = this.saveToNewFile(oldName); boolean result = this.saveToNewFile(oldName);
TemplateSaveInfoContext.getInstance().stopCollect(result);
if (result) { if (result) {
DesignerFrameFileDealerPane.getInstance().refresh(); DesignerFrameFileDealerPane.getInstance().refresh();
collectInfoWhenSaveAs(originID); collectInfoWhenSaveAs(originID);
@ -1120,7 +1126,6 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
//查找替换 //查找替换
tplMenu.addShortCut(new NameSeparator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Replace_Name_Separate"))); tplMenu.addShortCut(new NameSeparator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Replace_Name_Separate")));
tplMenu.addShortCut((ShortCut) DesignModuleFactory.getITReplaceAction()); tplMenu.addShortCut((ShortCut) DesignModuleFactory.getITReplaceAction());
return new MenuDef[]{tplMenu}; return new MenuDef[]{tplMenu};
} }
@ -1781,6 +1786,8 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
CallbackSaveWorker worker = new CallbackSaveWorker(new Callable<Boolean>() { CallbackSaveWorker worker = new CallbackSaveWorker(new Callable<Boolean>() {
@Override @Override
public Boolean call() throws Exception { public Boolean call() throws Exception {
TemplateSaveInfoContext.getInstance().startRecord();
TemplateSaveInfoContext.getInstance().collectInfo(template.suffix());
return saveAs(finalEditingFILE, sourceFile, oldName); return saveAs(finalEditingFILE, sourceFile, oldName);
} }
}, this); }, this);
@ -1884,6 +1891,8 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
CallbackSaveWorker worker = new CallbackSaveWorker(new Callable<Boolean>() { CallbackSaveWorker worker = new CallbackSaveWorker(new Callable<Boolean>() {
@Override @Override
public Boolean call() throws Exception { public Boolean call() throws Exception {
TemplateSaveInfoContext.getInstance().startRecord();
TemplateSaveInfoContext.getInstance().collectInfo(template.suffix());
return saveRealFileByWorker(); return saveRealFileByWorker();
} }
}, this); }, this);
@ -1942,6 +1951,13 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
@Override @Override
public void saveDirectly() { public void saveDirectly() {
if (isSaving()) {
// 处理连按ctrl+s触发多线程保存的问题
// 这里为什么可以不用加锁而直接判断isSaving:
// 实测actionPerformed有线程安全的特性,同一时间只有一个AWT线程走到这里,setSaving是线程安全的(SaveTemplateAction.actionPerformed)
// 多线程场景是因为我们用了SwingWorker子线程处理保存
return;
}
new SaveTypeWorker(getSaveTypeCallable(), this) { new SaveTypeWorker(getSaveTypeCallable(), this) {
@Override @Override
protected void done() { protected void done() {

54
designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java

@ -7,6 +7,7 @@ import com.fr.chartx.config.info.constant.ConfigType;
import com.fr.design.mainframe.burying.point.AbstractPointCollector; import com.fr.design.mainframe.burying.point.AbstractPointCollector;
import com.fr.design.mainframe.template.info.TemplateProcessInfo; import com.fr.design.mainframe.template.info.TemplateProcessInfo;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader; import com.fr.stable.xml.XMLableReader;
@ -184,33 +185,44 @@ public class ChartInfoCollector extends AbstractPointCollector<ChartInfo> {
*/ */
@Override @Override
public void collectInfo(String templateId, String originID, TemplateProcessInfo processInfo, int timeConsume) { public void collectInfo(String templateId, String originID, TemplateProcessInfo processInfo, int timeConsume) {
if (!shouldCollectInfo()) { // 捕获RuntimeException,不中断保存模板核心逻辑,避免出现保存失败弹窗
return; try {
} if (!shouldCollectInfo()) {
if (StringUtils.isEmpty(originID)) { return;
originID = templateId; }
} if (StringUtils.isEmpty(originID)) {
boolean testTemplate = isTestTemplate(processInfo); originID = templateId;
}
boolean testTemplate = isTestTemplate(processInfo);
for (ChartInfo chartInfo : pointInfoMap.values()) { for (ChartInfo chartInfo : pointInfoMap.values()) {
if (originID.equals(chartInfo.getTemplateId())) { if (chartInfo != null && originID.equals(chartInfo.getTemplateId())) {
chartInfo.setTemplateId(templateId); chartInfo.setTemplateId(templateId);
chartInfo.setTestTemplate(testTemplate); chartInfo.setTestTemplate(testTemplate);
}
} }
}
for (ChartInfo chartInfo : chartInfoCacheMap.values()) { for (ChartInfo chartInfo : chartInfoCacheMap.values()) {
BaseBook book = chartInfo.getBook(); if (chartInfo == null) {
if ((book != null && templateId.equals(book.getTemplateID())) || continue;
originID.equals(chartInfo.getTemplateId())) { }
chartInfo.setTemplateId(templateId); BaseBook book = chartInfo.getBook();
chartInfo.setTestTemplate(testTemplate); if (accept(templateId, originID, chartInfo, book)) {
pointInfoMap.put(chartInfo.getChartId(), chartInfo); chartInfo.setTemplateId(templateId);
chartInfo.setTestTemplate(testTemplate);
pointInfoMap.put(chartInfo.getChartId(), chartInfo);
}
} }
// 每次更新之后,都同步到暂存文件中
saveInfo();
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
} }
}
// 每次更新之后,都同步到暂存文件中 private static boolean accept(String templateId, String originID, ChartInfo chartInfo, BaseBook book) {
saveInfo(); return (book != null && templateId.equals(book.getTemplateID())) ||
originID.equals(chartInfo.getTemplateId());
} }
private boolean isTestTemplate(TemplateProcessInfo processInfo) { private boolean isTestTemplate(TemplateProcessInfo processInfo) {

22
designer-base/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java

@ -33,6 +33,10 @@ public class ErrorInfo {
private String log; private String log;
private String stackTrace; private String stackTrace;
private boolean starting;
private boolean remote;
public ErrorInfo(String username, String uuid, String activekey) { public ErrorInfo(String username, String uuid, String activekey) {
this.username = username; this.username = username;
this.uuid = uuid; this.uuid = uuid;
@ -51,6 +55,22 @@ public class ErrorInfo {
this.username = username; this.username = username;
} }
public boolean isStarting() {
return starting;
}
public void setStarting(boolean starting) {
this.starting = starting;
}
public boolean isRemote() {
return remote;
}
public void setRemote(boolean remote) {
this.remote = remote;
}
public String getUuid() { public String getUuid() {
return uuid; return uuid;
} }
@ -126,6 +146,8 @@ public class ErrorInfo {
jo.put("logid", logid); jo.put("logid", logid);
jo.put("log", log); jo.put("log", log);
jo.put("stacktrace", stackTrace); jo.put("stacktrace", stackTrace);
jo.put("starting", starting);
jo.put("remote", remote);
saveFileToCache(jo); saveFileToCache(jo);
} }

27
designer-base/src/main/java/com/fr/design/mainframe/messagecollect/StartErrorMessageCollector.java

@ -1,9 +1,15 @@
package com.fr.design.mainframe.messagecollect; package com.fr.design.mainframe.messagecollect;
import com.fr.concurrent.NamedThreadFactory;
import com.fr.design.DesignerEnvManager; import com.fr.design.DesignerEnvManager;
import com.fr.design.mainframe.errorinfo.ErrorInfo; import com.fr.design.mainframe.errorinfo.ErrorInfo;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.start.common.DesignerStartupContext;
import com.fr.workspace.WorkContext;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/** /**
* *
@ -15,9 +21,11 @@ public class StartErrorMessageCollector {
private static final StartErrorMessageCollector INSTANCE = new StartErrorMessageCollector(); private static final StartErrorMessageCollector INSTANCE = new StartErrorMessageCollector();
private ExecutorService executorService = Executors.newSingleThreadExecutor(new NamedThreadFactory(StartErrorMessageCollector.this.getClass()));
private String uuid; private String uuid;
private String activeKey; private String activeKey;
private boolean extraJudgeStart = false;
public static StartErrorMessageCollector getInstance() { public static StartErrorMessageCollector getInstance() {
return INSTANCE; return INSTANCE;
@ -35,10 +43,29 @@ public class StartErrorMessageCollector {
errorInfo.setLogid(id); errorInfo.setLogid(id);
errorInfo.setLog(msg); errorInfo.setLog(msg);
errorInfo.setStackTrace(detail); errorInfo.setStackTrace(detail);
errorInfo.setStarting(DesignerStartupContext.getInstance().isOnStartup() || extraJudgeStart);
errorInfo.setRemote(!WorkContext.getCurrent().isLocal());
errorInfo.saveAsJSON(); errorInfo.saveAsJSON();
} }
/**
* 异步记录
*/
public void asyncRecord(String id, String msg, String detail) {
executorService.submit(() -> {
record(id, msg, detail);
StartErrorMessageCollector.getInstance().setExtraJudgeStart(false);
});
}
public void record(String id, String msg) { public void record(String id, String msg) {
record(id, msg, StringUtils.EMPTY); record(id, msg, StringUtils.EMPTY);
} }
public void setExtraJudgeStart(boolean extraJudgeStart) {
this.extraJudgeStart = extraJudgeStart;
}
} }

3
designer-base/src/main/java/com/fr/design/utils/DesignUtils.java

@ -27,7 +27,6 @@ import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.stable.bridge.ObjectHolder; import com.fr.stable.bridge.ObjectHolder;
import com.fr.stable.os.OperatingSystem; import com.fr.stable.os.OperatingSystem;
import com.fr.stable.plugin.ExtraDesignClassManagerProvider;
import com.fr.start.ServerStarter; import com.fr.start.ServerStarter;
import com.fr.start.common.DesignerStartupContext; import com.fr.start.common.DesignerStartupContext;
import com.fr.start.common.DesignerStartupUtil; import com.fr.start.common.DesignerStartupUtil;
@ -238,7 +237,7 @@ public class DesignUtils {
DesignerContext.getDesignerFrame().openTemplate(new FileFILE(f)); DesignerContext.getDesignerFrame().openTemplate(new FileFILE(f));
} }
}); });
} else { } else if (DeepLinkCore.getInstance().accept(line)) {
String url = line; String url = line;
UIUtil.invokeLaterIfNeeded(new Runnable() { UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override @Override

3
designer-base/src/main/java/com/fr/design/worker/save/CallbackSaveWorker.java

@ -1,5 +1,6 @@
package com.fr.design.worker.save; package com.fr.design.worker.save;
import com.fr.base.info.TemplateSaveInfoContext;
import com.fr.common.util.Collections; import com.fr.common.util.Collections;
import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplate;
import java.util.LinkedList; import java.util.LinkedList;
@ -34,6 +35,8 @@ public class CallbackSaveWorker extends SaveWorker {
} }
successRunnableList = null; successRunnableList = null;
failRunnableList = null; failRunnableList = null;
TemplateSaveInfoContext.getInstance().stopRecord();
TemplateSaveInfoContext.getInstance().setSaveCompleted(success);
} }
private void fireRunnable(List<Runnable> list) { private void fireRunnable(List<Runnable> list) {

15
designer-base/src/main/java/com/fr/startup/metric/DesignerStartupModel.java

@ -40,6 +40,11 @@ public class DesignerStartupModel {
*/ */
private int mode; private int mode;
/**
* jdkVersion:JDK版本
*/
private String jdkVersion;
public DesignerStartupModel() { public DesignerStartupModel() {
} }
@ -74,6 +79,14 @@ public class DesignerStartupModel {
this.info = info; this.info = info;
} }
public String getJdkVersion() {
return jdkVersion;
}
public void setJdkVersion(String jdkVersion) {
this.jdkVersion = jdkVersion;
}
public int getMode() { public int getMode() {
return mode; return mode;
} }
@ -83,7 +96,7 @@ public class DesignerStartupModel {
} }
private void fillInfo() { private void fillInfo() {
this.setJdkVersion(System.getProperty("java.runtime.version"));
MachineInfo info = new MachineInfo(); MachineInfo info = new MachineInfo();
AbstractOperatingSystem operatingSystem = OperatingSystem.getOperatingSystem(); AbstractOperatingSystem operatingSystem = OperatingSystem.getOperatingSystem();
info.setSystem(operatingSystem.getDisplayString()); info.setSystem(operatingSystem.getDisplayString());

9
designer-base/src/main/java/com/fr/startup/ui/StartupPageWindow.java

@ -1,6 +1,7 @@
package com.fr.startup.ui; package com.fr.startup.ui;
import com.fr.base.svg.IconUtils; import com.fr.base.svg.IconUtils;
import com.fr.concurrent.NamedThreadFactory;
import com.fr.design.DesignerEnvManager; import com.fr.design.DesignerEnvManager;
import com.fr.design.dialog.UIExpandDialog; import com.fr.design.dialog.UIExpandDialog;
import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.icontainer.UIScrollPane;
@ -8,6 +9,8 @@ import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.VerticalFlowLayout; import com.fr.design.layout.VerticalFlowLayout;
import com.fr.design.mainframe.messagecollect.StartErrorMessageCollector;
import com.fr.design.mainframe.messagecollect.entity.DesignerErrorMessage;
import com.fr.design.ui.util.UIUtil; import com.fr.design.ui.util.UIUtil;
import com.fr.design.utils.ColorUtils; import com.fr.design.utils.ColorUtils;
import com.fr.design.utils.ThemeUtils; import com.fr.design.utils.ThemeUtils;
@ -49,6 +52,8 @@ import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/** /**
* 启动页 * 启动页
@ -253,6 +258,7 @@ public class StartupPageWindow extends JFrame {
try { try {
Void result = get(); Void result = get();
setVisible(false); setVisible(false);
StartErrorMessageCollector.getInstance().setExtraJudgeStart(false);
} catch (Exception e) { } catch (Exception e) {
// 处理错误 // 处理错误
UIUtil.invokeLaterIfNeeded(() -> { UIUtil.invokeLaterIfNeeded(() -> {
@ -269,6 +275,9 @@ public class StartupPageWindow extends JFrame {
setEnabled(true); setEnabled(true);
}); });
FineLoggerFactory.getLogger().error(e.getMessage(), e); FineLoggerFactory.getLogger().error(e.getMessage(), e);
StartErrorMessageCollector.getInstance().asyncRecord(DesignerErrorMessage.UNEXCEPTED_START_FAILED.getId(),
DesignerErrorMessage.UNEXCEPTED_START_FAILED.getMessage(),
e.getMessage());
} finally { } finally {
loadingPanel.hide(); loadingPanel.hide();
} }

2
designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties

@ -25,3 +25,5 @@ com.fr.design.plugin.remind.PluginInvalidateRemindDialog.centerPane=580*369
com.fr.design.report.WatermarkSettingPane=720*600 com.fr.design.report.WatermarkSettingPane=720*600
com.fr.design.file.MultiTemplateTabPane.popUpMenu=350*65 com.fr.design.file.MultiTemplateTabPane.popUpMenu=350*65
com.fr.design.data.datapane.preview.desensitization.view.rule.DesensitizationRuleChoosePane.ruleEditPane=800*600 com.fr.design.data.datapane.preview.desensitization.view.rule.DesensitizationRuleChoosePane.ruleEditPane=800*600
com.fr.design.formula.FormulaPane=900*600
com.fr.design.formula.FormulaPaneWhenReserveFormula=1200*600

2
designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties

@ -24,3 +24,5 @@ com.fr.design.plugin.remind.PluginInvalidateRemindDialog.centerPane=580*369
com.fr.design.report.WatermarkSettingPane=720*600 com.fr.design.report.WatermarkSettingPane=720*600
com.fr.design.file.MultiTemplateTabPane.popUpMenu=240*65 com.fr.design.file.MultiTemplateTabPane.popUpMenu=240*65
com.fr.design.data.datapane.preview.desensitization.view.rule.DesensitizationRuleChoosePane.ruleEditPane=800*600 com.fr.design.data.datapane.preview.desensitization.view.rule.DesensitizationRuleChoosePane.ruleEditPane=800*600
com.fr.design.formula.FormulaPane=900*600
com.fr.design.formula.FormulaPaneWhenReserveFormula=900*600

2
designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties

@ -24,3 +24,5 @@ com.fr.design.plugin.remind.PluginInvalidateRemindDialog.centerPane=580*369
com.fr.design.report.WatermarkSettingPane=720*600 com.fr.design.report.WatermarkSettingPane=720*600
com.fr.design.file.MultiTemplateTabPane.popUpMenu=240*65 com.fr.design.file.MultiTemplateTabPane.popUpMenu=240*65
com.fr.design.data.datapane.preview.desensitization.view.rule.DesensitizationRuleChoosePane.ruleEditPane=800*600 com.fr.design.data.datapane.preview.desensitization.view.rule.DesensitizationRuleChoosePane.ruleEditPane=800*600
com.fr.design.formula.FormulaPane=900*600
com.fr.design.formula.FormulaPaneWhenReserveFormula=900*600

2
designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties

@ -24,3 +24,5 @@ com.fr.design.plugin.remind.PluginInvalidateRemindDialog.dialog=600*500
com.fr.design.plugin.remind.PluginInvalidateRemindDialog.centerPane=580*369 com.fr.design.plugin.remind.PluginInvalidateRemindDialog.centerPane=580*369
com.fr.design.report.WatermarkSettingPane=720*600 com.fr.design.report.WatermarkSettingPane=720*600
com.fr.design.file.MultiTemplateTabPane.popUpMenu=170*65 com.fr.design.file.MultiTemplateTabPane.popUpMenu=170*65
com.fr.design.formula.FormulaPane=900*600
com.fr.design.formula.FormulaPaneWhenReserveFormula=900*600

2
designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties

@ -23,3 +23,5 @@ com.fr.design.plugin.remind.PluginInvalidateRemindDialog.dialog=600*500
com.fr.design.plugin.remind.PluginInvalidateRemindDialog.centerPane=580*369 com.fr.design.plugin.remind.PluginInvalidateRemindDialog.centerPane=580*369
com.fr.design.report.WatermarkSettingPane=720*600 com.fr.design.report.WatermarkSettingPane=720*600
com.fr.design.file.MultiTemplateTabPane.popUpMenu=170*65 com.fr.design.file.MultiTemplateTabPane.popUpMenu=170*65
com.fr.design.formula.FormulaPane=900*600
com.fr.design.formula.FormulaPaneWhenReserveFormula=900*600

20
designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java

@ -57,6 +57,10 @@ public class InformationCollector implements XMLReadable, XMLWriter {
*/ */
private static final long DELTA = 24 * 3600 * 1000L; private static final long DELTA = 24 * 3600 * 1000L;
private static final long SEND_DELAY = 300 * 1000L; private static final long SEND_DELAY = 300 * 1000L;
/**
* 10分钟后再收集信息
*/
private static final long SEND_DELAY_4_ERROR_INFO = 300 * 1000L * 2;
private static final String FILE_NAME = "fr.info"; private static final String FILE_NAME = "fr.info";
private static final String XML_START_STOP_LIST = "StartStopList"; private static final String XML_START_STOP_LIST = "StartStopList";
private static final String XML_START_STOP = "StartStop"; private static final String XML_START_STOP = "StartStop";
@ -64,6 +68,8 @@ public class InformationCollector implements XMLReadable, XMLWriter {
private static final String ATTR_START = "start"; private static final String ATTR_START = "start";
private static final String ATTR_STOP = "stop"; private static final String ATTR_STOP = "stop";
private static final String THREAD_NAME = "ErrorInfoCollector";
private static InformationCollector collector; private static InformationCollector collector;
/** /**
@ -143,9 +149,22 @@ public class InformationCollector implements XMLReadable, XMLWriter {
*/ */
public void collectStartTime() { public void collectStartTime() {
this.current.setStartDate(dateToString()); this.current.setStartDate(dateToString());
dealWithErrorInfo();
sendInfo(); sendInfo();
} }
private void dealWithErrorInfo() {
ScheduledExecutorService service = Executors
.newSingleThreadScheduledExecutor(new NamedThreadFactory(THREAD_NAME));
service.schedule(() -> {
ErrorInfoUploader.getInstance().dealErrorInfo(false);
}, SEND_DELAY_4_ERROR_INFO, TimeUnit.MILLISECONDS);
service.shutdown();
}
/**
* 目前来看这些数据好像没啥用了但是还是先留着吧单独把错误信息拿出来用云端运维统一提交
*/
private void sendInfo() { private void sendInfo() {
if (!DesignerEnvManager.getEnvManager().isJoinProductImprove() || !FRContext.isChineseEnv()) { if (!DesignerEnvManager.getEnvManager().isJoinProductImprove() || !FRContext.isChineseEnv()) {
return; return;
@ -157,7 +176,6 @@ public class InformationCollector implements XMLReadable, XMLWriter {
SolidCollector.getInstance().sendToCloudCenterAndDeleteFile(); SolidCollector.getInstance().sendToCloudCenterAndDeleteFile();
FocusPointMessageUploader.getInstance().sendToCloudCenter(); FocusPointMessageUploader.getInstance().sendToCloudCenter();
ChartInfoCollector.getInstance().sendPointInfo(); ChartInfoCollector.getInstance().sendPointInfo();
ErrorInfoUploader.getInstance().sendErrorInfo();
sendInfoSuccessCallback(); sendInfoSuccessCallback();
}, SEND_DELAY, TimeUnit.MILLISECONDS); }, SEND_DELAY, TimeUnit.MILLISECONDS);
service.shutdown(); service.shutdown();

94
designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java

@ -20,9 +20,10 @@ import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -37,6 +38,8 @@ public class ErrorInfoUploader {
public static final String SUFFIX = ".json"; public static final String SUFFIX = ".json";
public static final String FOLDER_NAME = "errorInfo"; public static final String FOLDER_NAME = "errorInfo";
private static final String CLOUD_KEY = "design.error";
private static ErrorInfoUploader collector; private static ErrorInfoUploader collector;
// 在一台不能上网的电脑里发现了10w个errorinfo... // 在一台不能上网的电脑里发现了10w个errorinfo...
private static final int MAX_ERROR_SIZE = 2000; private static final int MAX_ERROR_SIZE = 2000;
@ -148,6 +151,15 @@ public class ErrorInfoUploader {
// 判断更新解决方案缓存. // 判断更新解决方案缓存.
checkUpdateSolution(); checkUpdateSolution();
dealErrorInfo(true);
}
/**
* 处理错误信息
*
* @param needSend2Cloud 是否需要上传到云中心
*/
public void dealErrorInfo(boolean needSend2Cloud) {
//读取文件夹里的json, 加入上传队列中. //读取文件夹里的json, 加入上传队列中.
File folder = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FOLDER_NAME)); File folder = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FOLDER_NAME));
if (!folder.exists()) { if (!folder.exists()) {
@ -164,41 +176,65 @@ public class ErrorInfoUploader {
} }
try { try {
if (ArrayUtils.isNotEmpty(files)) { dealFiles(files, needSend2Cloud);
JSONArray jsonArray = new JSONArray(); } catch (Exception ignore) {
List<File> tempFiles = new ArrayList<>();
int count = 0; }
for (File file : files) { }
count++;
String filePath = file.getPath(); private void dealFiles(File[] files, boolean needSend2Cloud) throws IOException {
String suffix = filePath.substring(filePath.lastIndexOf(".")); if (ArrayUtils.isNotEmpty(files)) {
JSONArray jsonArray = new JSONArray();
if (suffix.endsWith(SUFFIX)) { List<File> tempFiles = new ArrayList<>();
String content = IOUtils.inputStream2String(new FileInputStream(file)); int count = 0;
if (content.length() > MAX_ERROR_SIZE) { for (File file : files) {
CommonIOUtils.deleteFile(file); count++;
continue; String filePath = file.getPath();
} String suffix = filePath.substring(filePath.lastIndexOf("."));
jsonArray.put(new JSONObject(content));
tempFiles.add(file); if (suffix.endsWith(SUFFIX)) {
if (jsonArray.length() == MAX_ITEMS || count == files.length) { String content = IOUtils.inputStream2String(Files.newInputStream(file.toPath()));
String url = CloudCenter.getInstance().acquireUrlByKind("design.error"); if (content.length() > MAX_ERROR_SIZE) {
if (StringUtils.isBlank(url)) { CommonIOUtils.deleteFile(file);
return; continue;
} }
if (sendErrorInfo(url, jsonArray)) { jsonArray.put(new JSONObject(content));
deleteFiles(tempFiles); tempFiles.add(file);
} if (jsonArray.length() == MAX_ITEMS || count == files.length) {
jsonArray = new JSONArray(); processInfos(jsonArray, needSend2Cloud, tempFiles);
}
} }
} }
} }
} catch (Exception ignore) { }
}
private void processInfos(JSONArray jsonArray, boolean needSend2Cloud, List<File> tempFiles) {
if (needSend2Cloud) {
String url = CloudCenter.getInstance().acquireUrlByKind(CLOUD_KEY);
if (StringUtils.isBlank(url)) {
return;
}
if (sendErrorInfo(url, jsonArray)) {
deleteFiles(tempFiles);
}
jsonArray = new JSONArray();
} else {
sendInfos4AnalysisAndClearFiles(jsonArray, tempFiles);
} }
} }
/**
* 提供给云端运维监听的方法(beforeExecute)
*
* @param jsonArray 要提交的信息
* @param tempFiles 要删除的文件
*/
private void sendInfos4AnalysisAndClearFiles(JSONArray jsonArray, List<File> tempFiles) {
deleteFiles(tempFiles);
}
private void deleteFiles(List<File> files) { private void deleteFiles(List<File> files) {
for (File file : files) { for (File file : files) {
CommonIOUtils.deleteFile(file); CommonIOUtils.deleteFile(file);

6
designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxDefinePane.java

@ -15,7 +15,6 @@ import com.fr.general.GeneralContext;
import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEvent;
import com.fr.plugin.observer.PluginEventListener; import com.fr.plugin.observer.PluginEventListener;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.JPanel; import javax.swing.JPanel;
import java.awt.Component; import java.awt.Component;
@ -30,6 +29,7 @@ public class CheckBoxDefinePane extends AbstractDataModify<CheckBox> {
protected static double F = TableLayout.FILL; protected static double F = TableLayout.FILL;
protected static double P = TableLayout.PREFERRED; protected static double P = TableLayout.PREFERRED;
public CheckBoxDefinePane() { public CheckBoxDefinePane() {
this.iniComponents(); this.iniComponents();
} }
@ -89,8 +89,8 @@ public class CheckBoxDefinePane extends AbstractDataModify<CheckBox> {
/** /**
* 插入配置项面板 * 插入配置项面板
* *
* @param index 插入的位置 * @param index 插入的位置
* @param pane 配置项面板 * @param pane 配置项面板
*/ */
protected void insertShortCut(int index, BasicBeanPane<CheckBox> pane) { protected void insertShortCut(int index, BasicBeanPane<CheckBox> pane) {
int size = extraPaneList.size(); int size = extraPaneList.size();

1
designer-realize/src/main/java/com/fr/design/widget/ui/btn/FreeButtonDetailPane.java

@ -41,5 +41,4 @@ public class FreeButtonDetailPane extends AbstractExtraButtonPane<FreeButton> {
public Class classType() { public Class classType() {
return FreeButton.class; return FreeButton.class;
} }
} }

63
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.Event;
import com.fr.event.Listener; import com.fr.event.Listener;
import com.fr.module.Activator; 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.start.server.FineEmbedServer;
import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace; import com.fr.workspace.Workspace;
import com.fr.workspace.WorkspaceEvent; import com.fr.workspace.WorkspaceEvent;
import com.fr.workspace.WorkspaceSwitchProcess;
import java.util.Optional;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
/** /**
@ -17,6 +22,46 @@ import java.util.concurrent.ExecutorService;
*/ */
public class DesignerWorkspaceActivator extends Activator { public class DesignerWorkspaceActivator extends Activator {
private final Listener<Workspace> stopModuleAction = new Listener<Workspace>(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<Workspace> startModuleAction = new Listener<Workspace>(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 @Override
public void start() { public void start() {
@ -29,23 +74,9 @@ public class DesignerWorkspaceActivator extends Activator {
private void registerEnvListener() { private void registerEnvListener() {
/*切换环境前,关闭所有相关模块,最后执行*/ /*切换环境前,关闭所有相关模块,最后执行*/
listenEvent(WorkspaceEvent.BeforeSwitch, new Listener<Workspace>(Integer.MIN_VALUE) { listenEvent(WorkspaceEvent.BeforeSwitch, stopModuleAction);
@Override
public void on(Event event, Workspace current) {
stopSub(EnvBasedModule.class);
}
});
/*切换环境后,重新启动所有相关模块,最先执行*/ /*切换环境后,重新启动所有相关模块,最先执行*/
listenEvent(WorkspaceEvent.AfterSwitch, new Listener<Workspace>(Integer.MAX_VALUE) { listenEvent(WorkspaceEvent.AfterSwitch, startModuleAction);
@Override
public void on(Event event, Workspace current) {
startSub(EnvBasedModule.class);
}
});
/*切换环境前,存储一下打开的所有文件对象,要先于 关闭相关模块部分 被触发*/ /*切换环境前,存储一下打开的所有文件对象,要先于 关闭相关模块部分 被触发*/
listenEvent(WorkspaceEvent.BeforeSwitch, new Listener<Workspace>(Integer.MAX_VALUE) { listenEvent(WorkspaceEvent.BeforeSwitch, new Listener<Workspace>(Integer.MAX_VALUE) {

2
designer-realize/src/main/java/com/fr/start/module/optimized/DesignerStartupPageActivator.java

@ -2,6 +2,7 @@ package com.fr.start.module.optimized;
import com.fr.design.DesignerEnvManager; import com.fr.design.DesignerEnvManager;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.messagecollect.StartErrorMessageCollector;
import com.fr.design.ui.util.UIUtil; import com.fr.design.ui.util.UIUtil;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import com.fr.module.Activator; import com.fr.module.Activator;
@ -164,6 +165,7 @@ public class DesignerStartupPageActivator extends Activator {
UIUtil.invokeLaterIfNeeded(() -> { UIUtil.invokeLaterIfNeeded(() -> {
// 换到 awt 线程中关闭,不然异步会出现问题。 // 换到 awt 线程中关闭,不然异步会出现问题。
DesignerStartupContext.getInstance().setOnStartup(false); DesignerStartupContext.getInstance().setOnStartup(false);
StartErrorMessageCollector.getInstance().setExtraJudgeStart(true);
recordStartupEnd(stopWatch); recordStartupEnd(stopWatch);
}); });
markComplete(); markComplete();

Loading…
Cancel
Save