Browse Source

Merge pull request #14277 in DESIGN/design from mss/2.0 to fbp-1.0

* commit '18a7bf34c1a4d63ecaddf340488472f279ac047f':
  无jira任务,修复打包报错
  无jira任务,修复打包报错
  REPORT-114392 FR-FBP版本本地设计适配 去除模板主题中的frm选项
  REPORT-114392 FR-FBP版本本地设计适配 修复数据连接预览
  REPORT-114392 FR-FBP版本本地设计适配 修复国际化
  REPORT-114392 FR-FBP版本本地设计适配 修复数据连接
  REPORT-114392 FR-FBP版本本地设计适配 修复数据连接保存
  REPORT-114392 FR-FBP版本本地设计适配 关闭环境监测
  REPORT-127453 frm问题处理
  REPORT-114391 【微服务适配】远程&本地设计器能够正常启动 修复序列化问题
  REPORT-114391 【微服务适配】远程&本地设计器能够正常启动 代码规范
  REPORT-114391 【微服务适配】远程&本地设计器能够正常启动 修复图表配置+优化环境切换
  REPORT-114391 【微服务适配】远程&本地设计器能够正常启动 优化断开提醒
  REPORT-114391 【微服务适配】远程&本地设计器能够正常启动 优化启动与切换
fbp-1.0
superman 7 months ago
parent
commit
283e6ee216
  1. 5
      designer-base/src/main/java/com/fr/design/ConfigHelper.java
  2. 159
      designer-base/src/main/java/com/fr/design/RPCConnectHandlerCenter.java
  3. 6
      designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java
  4. 43
      designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java
  5. 22
      designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java
  6. 5
      designer-base/src/main/java/com/fr/design/data/datapane/connect/LocalConnectionSource.java
  7. 129
      designer-base/src/main/java/com/fr/design/data/datapane/preview/ConnectionInfoBeanHelper.java
  8. 2
      designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java
  9. 8
      designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/MultiResultTableDataWrapper.java
  10. 8
      designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java
  11. 6
      designer-base/src/main/java/com/fr/design/env/HttpWorkspaceConnector.java
  12. 3
      designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java
  13. 6
      designer-base/src/main/java/com/fr/design/mainframe/share/collect/ComponentSender.java
  14. 14
      designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPagesPane.java
  15. 4
      designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java
  16. 12
      designer-base/src/main/java/com/fr/startup/ui/StartupPageModel.java
  17. 5
      designer-chart/src/main/java/com/fr/design/module/ChartPreStyleListPane.java
  18. 3
      designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java
  19. 2
      designer-realize/src/main/java/com/fanruan/boot/env/function/DesignComponent.java
  20. 2
      designer-realize/src/main/java/com/fanruan/boot/env/function/app/DesignAppComponent.java
  21. 10
      designer-realize/src/main/java/com/fanruan/boot/init/DesignPreLoadComponent.java
  22. 49
      designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java

5
designer-base/src/main/java/com/fr/design/ConfigHelper.java

@ -94,7 +94,10 @@ public class ConfigHelper {
return properties;
}
private static boolean createFile(File file) throws ResourceIOException {
/**
* 创建配置文件
*/
public static boolean createFile(File file) throws ResourceIOException {
String parent = file.getParent();
if (StringUtils.isNotEmpty(parent)) {
createDirectory(parent);

159
designer-base/src/main/java/com/fr/design/RPCConnectHandlerCenter.java

@ -0,0 +1,159 @@
package com.fr.design;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.ui.util.UIUtil;
import com.fr.event.Event;
import com.fr.event.EventDispatcher;
import com.fr.event.Listener;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StableUtils;
import com.fr.third.org.apache.http.client.config.RequestConfig;
import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse;
import com.fr.third.org.apache.http.client.methods.HttpGet;
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient;
import com.fr.third.org.apache.http.impl.client.HttpClients;
import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace;
import com.fr.workspace.WorkspaceEvent;
import com.fr.workspace.base.WorkspaceConstants;
import com.fr.workspace.connect.WorkspaceConnectionInfo;
import com.fr.workspace.engine.channel.WorkspaceChannelFactory;
import com.fr.workspace.engine.exception.WorkspaceConnectionException;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
/**
* RPC连接处理中心
*
* @author Roger
* @since 11.0
* Created on 2023/12/13
*/
public class RPCConnectHandlerCenter {
private static volatile boolean alerting = false;
private static final int TIMEOUT = 5000;
private static Listener<Workspace> listener = new Listener<Workspace>() {
@Override
public void on(Event event, Workspace workspace) {
//暂时先不做重连处理,3次RPC连接失败后提示切换工作目录
showRPCDisconnectDialog();
}
};
/**
* 开启事件监听
*/
public static void startListener() {
if (!WorkContext.getCurrent().isLocal()) {
EventDispatcher.listen(WorkspaceEvent.LostConnect, listener);
}
}
/**
* 弹窗提示连接断开
*/
public static void showRPCDisconnectDialog() {
UIUtil.invokeLaterIfNeeded(RPCConnectHandlerCenter::showDialog);
}
/**
* RPC连接测试
*
* @param info 连接信息
* @return 是否连接成功
*/
public static boolean checkRPCConnect(WorkspaceConnectionInfo info) {
try {
return WorkspaceChannelFactory.testConnection(info);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e, e.getMessage());
return false;
}
}
/**
* http连接检测从DesignerSocketIO中移过来的先保留着
*
* @param info 连接信息
* @return 是否连接成功
*/
public static boolean checkHttpConnect(WorkspaceConnectionInfo info) {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(StableUtils.pathJoin(info.getUrl(), WorkspaceConstants.CONTROLLER_PREFIX, WorkspaceConstants.VT));
RequestConfig requestConfig = RequestConfig
.custom()
.setConnectTimeout(TIMEOUT)
.setConnectionRequestTimeout(TIMEOUT)
.build();
httpGet.setConfig(requestConfig);
try {
CloseableHttpResponse response = httpclient.execute(httpGet);
if (isErrorStatus(response.getStatusLine().getStatusCode())) {
//这边nginx做负载,服务器被kill掉,返回的是502,不会抛错,导致checkRPCConnect通过
//针对500-600的错误码加个判断,其他类型的状态码暂不考虑,如果有遇到再处理,不然怕影响范围大
throw new WorkspaceConnectionException("Response " + response.getStatusLine().toString());
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e, e.getMessage());
return false;
}
return true;
}
/**
* 提示连接已经断开如果已经在提示中了就直接返回
*/
private static void showDialog() {
if (alerting) {
return;
}
synchronized (RPCConnectHandlerCenter.class) {
if (alerting) {
return;
}
alerting = true;
try {
FineJOptionPane.showMessageDialog(
DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Basic_Remote_Disconnected"),
UIManager.getString("OptionPane.messageDialogTitle"),
JOptionPane.ERROR_MESSAGE,
UIManager.getIcon("OptionPane.errorIcon"));
EnvChangeEntrance.getInstance().chooseEnv();
} finally {
alerting = false;
}
}
}
/**
* 错误状态码
* 5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误 这些错误可能是服务器本身的错误而不是请求出错代码 说明
* 500 (服务器内部错误) 服务器遇到错误无法完成请求
* 501 (尚未实施) 服务器不具备完成请求的功能 例如服务器无法识别请求方法时可能会返回此代码
* 502 (错误网关) 服务器作为网关或代理从上游服务器收到无效响应
* 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护) 通常这只是暂时状态
* 504 (网关超时) 服务器作为网关或代理但是没有及时从上游服务器收到请求
* 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本
*
* @param status 错误状态码
* @return 是否是错误状态码
*/
private static boolean isErrorStatus(int status) {
return status >= 500 && status <= 600;
}
/**
* 停止事件监听
*/
public static void stopListener() {
if (!WorkContext.getCurrent().isLocal()) {
EventDispatcher.stopListen(listener);
}
}
}

6
designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java

@ -14,6 +14,7 @@ import com.fr.design.DesignerEnvManager;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.datapane.RefreshLabel.Refreshable;
import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper;
import com.fr.design.data.datapane.preview.PreviewLabel;
import com.fr.design.data.datapane.preview.PreviewLabel.Previewable;
import com.fr.design.data.datapane.preview.PreviewTablePane;
@ -39,6 +40,7 @@ import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.connection.DBConnectAuth;
import com.fr.workspace.server.repository.connection.ConnectionRepository;
import javax.swing.JList;
import javax.swing.JOptionPane;
@ -442,8 +444,10 @@ public class ChoosePane extends BasicBeanPane<DataBaseItems> implements Refresha
return TableData.EMPTY_TABLEDATA;
}
try {
connect = DataOperator.getInstance().testConnection(database);
ConnectionRepository.getInstance().testConnection(ConnectionInfoBeanHelper.createConnectionInfoBean(database));
connect = true;
} catch (Exception ignored) {
connect= false;
}
if (!connect) {
DesignerFrame designerFrame = DesignerContext.getDesignerFrame();

43
designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java

@ -3,13 +3,28 @@ package com.fr.design.data.datapane.connect;
import com.fanruan.config.impl.data.ConnectionConfigProviderFactory;
import com.fanruan.config.impl.data.ConnectionConfigWriterFactory;
import com.fr.config.remote.RemoteConfigEvent;
import com.fr.data.auth.AuthenticationType;
import com.fr.data.auth.kerberos.KerberosAuthentication;
import com.fr.data.auth.kerberos.KerberosUtils;
import com.fr.data.impl.Connection;
import com.fr.data.impl.JDBCDatabaseConnection;
import com.fr.data.impl.JNDIDatabaseConnection;
import com.fr.data.pool.DBCPConnectionPoolAttr;
import com.fr.data.security.ssh.BaseSsh;
import com.fr.data.security.ssh.SshType;
import com.fr.data.security.ssh.impl.KeyVerifySsh;
import com.fr.data.security.ssl.BaseSsl;
import com.fr.data.security.ssl.SslType;
import com.fr.data.security.ssl.impl.NormalSsl;
import com.fr.decision.privilege.TransmissionTool;
import com.fr.decision.webservice.bean.datasource.ConnectionInfoBean;
import com.fr.decision.webservice.bean.datasource.JDBCConnectionBean;
import com.fr.decision.webservice.utils.DecisionServiceConstants;
import com.fr.decision.webservice.v10.datasource.connection.processor.impl.ConnectionProcessorFactory;
import com.fr.decision.webservice.v10.datasource.connection.processor.impl.JDBCConnectionProcessor;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.data.MapCompareUtils;
import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.fun.ConnectionProvider;
import com.fr.design.gui.controlpane.JListControlPane;
@ -24,10 +39,12 @@ import com.fr.license.database.DBTypes;
import com.fr.license.database.DataBaseTypePointManager;
import com.fr.license.exception.DataBaseNotSupportedException;
import com.fr.log.FineLoggerFactory;
import com.fr.security.encryption.transmission.TransmissionEncryptors;
import com.fr.stable.ArrayUtils;
import com.fr.stable.Nameable;
import com.fr.stable.StringUtils;
import com.fr.stable.core.PropertyChangeAdapter;
import com.fr.third.fasterxml.jackson.databind.ObjectMapper;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.database.DataBaseTypeOperator;
import com.fr.workspace.server.entity.connection.BatchConnectionModifyBean;
@ -220,6 +237,7 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh
List<String> removedConnNames = new ArrayList<>();
List<ConnectionInfoBean> addConnections = new ArrayList<>();
List<ConnectionInfoBean> updateConnection = new ArrayList<>();
List<Connection> validConnection = new ArrayList<>();
MapCompareUtils.contrastMapEntries(populatedConnectionsSnapshot, updatedMap, (entryEventKind, s, connection) -> {
try {
switch (entryEventKind) {
@ -227,10 +245,12 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh
removedConnNames.add(s);
break;
case ADDED:
addConnections.add(ConnectionProcessorFactory.createConnectionInfoBean(s, connection));
addConnections.add(ConnectionInfoBeanHelper.createConnectionInfoBean(s, connection, true));
validConnection.add(connection);
break;
case UPDATED:
updateConnection.add(ConnectionProcessorFactory.createConnectionInfoBean(s, connection));
updateConnection.add(ConnectionInfoBeanHelper.createConnectionInfoBean(s, connection, true));
validConnection.add(connection);
break;
default:
break;
@ -265,22 +285,18 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh
return connection instanceof JDBCDatabaseConnection || connection instanceof JNDIDatabaseConnection;
}
});
List<ConnectionInfoBean> validateBeans = new ArrayList<>();
validateBeans.addAll(addConnections);
validateBeans.addAll(updateConnection);
this.validateDatabaseType(validateBeans);
/// 先不管
//this.validateDatabaseType(validConnection);
this.alterConnections(addConnections, removedConnNames, updateConnection);
}
/**
* 校验是否支持所有新增和修改数据连接的数据库类型
*/
public void validateDatabaseType(@NotNull List<ConnectionInfoBean> addedOrUpdatedConnections) throws Exception {
public void validateDatabaseType(@NotNull List<Connection> addedOrUpdatedConnections) throws Exception {
Set<String> notSupportedConnections = new HashSet<>();
if (!addedOrUpdatedConnections.isEmpty()) {
for (ConnectionInfoBean bean : addedOrUpdatedConnections) {
Connection connection = ConnectionProcessorFactory.createConnection(bean);
for (Connection connection : addedOrUpdatedConnections) {
// 仅校验jdbc连接,其他插件数据连接不进行校验;
if (connection instanceof JDBCDatabaseConnection) {
DBTypes dataBaseTypePoint = DataBaseTypePointManager.getInstance().getDataBaseTypePoint(connection.getDriver(), connection.feature());
@ -360,7 +376,11 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh
}
public static void showDialog(Window parent) {
Map<String, Connection> connectionMap = ConnectionConfigProviderFactory.getConfigProvider().getConnections();
List<ConnectionBean> beans = ConnectionRepository.getInstance().getAll();
Map<String, Connection> connectionMap = new HashMap<>();
for (ConnectionBean bean : beans) {
connectionMap.put(bean.getName(), bean.getConnection());
}
final ConnectionManagerPane connectionManagerPane = new ConnectionManagerPane() {
@Override
public void complete() {
@ -385,4 +405,5 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh
}
}
}
}

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

@ -14,6 +14,7 @@ import com.fr.data.solution.entity.DriverPage;
import com.fr.data.solution.processor.ClassNotFoundExceptionSolutionProcessor;
import com.fr.data.solution.processor.SolutionProcessor;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.icontainer.UIScrollPane;
@ -29,6 +30,7 @@ import com.fr.stable.ArrayUtils;
import com.fr.stable.EncodeConstants;
import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.repository.connection.ConnectionRepository;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
@ -429,25 +431,7 @@ public abstract class DatabaseConnectionPane<E extends com.fr.data.impl.Connecti
// 返回连接结果
DriverPage.updateCache();
final Exception[] exception = new Exception[1];
WorkContext.getCurrent().get(DataOperatorProvider.class, new ExceptionHandler() {
@Override
public Object callHandler(RPCInvokerExceptionInfo exceptionInfo) {
// 正常调用发生的异常也会被捕获,因此需要对异常类型进行判断,如果是NoSuchMethodException 就要去调用 testConnection
// 如果不是 NoSuchMethodException 保存下异常上下文
// 两种情况下异常都需要抛出
if (exceptionInfo.getException() instanceof NoSuchMethodException) {
if (!WorkContext.getCurrent().get(DataOperatorProvider.class).testConnection(database)) {
exception[0] = new Exception(Toolkit.i18nText("Fine-Design_Description_Of_Test_Connection"));
}
} else {
exception[0] = exceptionInfo.getException();
}
return null;
}
}).testConnectionWithException(database);
if (exception[0] != null) {
throw exception[0];
}
ConnectionRepository.getInstance().testConnection(ConnectionInfoBeanHelper.createConnectionInfoBean(database));
return null;
}

5
designer-base/src/main/java/com/fr/design/data/datapane/connect/LocalConnectionSource.java

@ -18,6 +18,11 @@ import java.sql.SQLException;
*/
public class LocalConnectionSource extends BaseConnectionSource {
@Override
public void testConnection(ConnectionInfoBean database) throws Exception {
dataOperator.testConnectionWithException(ConnectionProcessorFactory.createConnection(database));
}
@Override
public void add(ConnectionInfoBean bean) throws Exception {
Connection connection = ConnectionProcessorFactory.createConnection(bean);

129
designer-base/src/main/java/com/fr/design/data/datapane/preview/ConnectionInfoBeanHelper.java

@ -0,0 +1,129 @@
package com.fr.design.data.datapane.preview;
import com.fr.data.auth.AuthenticationType;
import com.fr.data.auth.kerberos.KerberosAuthentication;
import com.fr.data.auth.kerberos.KerberosUtils;
import com.fr.data.impl.Connection;
import com.fr.data.impl.JDBCDatabaseConnection;
import com.fr.data.impl.NameDatabaseConnection;
import com.fr.data.pool.DBCPConnectionPoolAttr;
import com.fr.data.security.ssh.BaseSsh;
import com.fr.data.security.ssh.SshType;
import com.fr.data.security.ssh.impl.KeyVerifySsh;
import com.fr.data.security.ssl.BaseSsl;
import com.fr.data.security.ssl.SslType;
import com.fr.data.security.ssl.impl.NormalSsl;
import com.fr.decision.privilege.TransmissionTool;
import com.fr.decision.webservice.bean.datasource.ConnectionInfoBean;
import com.fr.decision.webservice.bean.datasource.JDBCConnectionBean;
import com.fr.decision.webservice.utils.DecisionServiceConstants;
import com.fr.decision.webservice.v10.datasource.connection.processor.impl.ConnectionProcessorFactory;
import com.fr.decision.webservice.v10.datasource.connection.processor.impl.JDBCConnectionProcessor;
import com.fr.security.encryption.transmission.TransmissionEncryptors;
import com.fr.stable.StringUtils;
import com.fr.third.fasterxml.jackson.databind.ObjectMapper;
/**
* 数据连接传输工具类
*
* @author Destiny.Lin
* @since 11.0
* Created on 2024/7/25
*/
public class ConnectionInfoBeanHelper {
private static ObjectMapper objectMapper = new ObjectMapper();
/**
* 创建数据连接Bean可自定义是否携带密码
*/
public static ConnectionInfoBean createConnectionInfoBean(String name, Connection connection, boolean withPassword) throws Exception {
if (connection instanceof NameDatabaseConnection) {
name = ((NameDatabaseConnection) connection).getName();
connection = ((NameDatabaseConnection) connection).createDatabase();
}
if (JDBCConnectionProcessor.KEY.acceptConnections().contains(connection.getClass())) {
ConnectionInfoBean bean = new ConnectionInfoBean();
bean.setConnectionData(objectMapper.writeValueAsString(convertToJDBCConnectionBean(connection, withPassword)));
bean.setConnectionType(JDBCConnectionProcessor.CONNECTION_TYPE);
bean.setConnectionType(JDBCConnectionProcessor.KEY.getConnectionType(connection));
bean.setConnectionName(name);
bean.setCreator(connection.getCreator());
return bean;
} else {
return ConnectionProcessorFactory.createConnectionInfoBean(name, connection);
}
}
/**
* 创建数据连接Bean默认携带密码
*/
public static ConnectionInfoBean createConnectionInfoBean(String name, Connection connection) throws Exception {
return createConnectionInfoBean(name, connection, true);
}
/**
* 创建数据连接bean
*/
public static ConnectionInfoBean createConnectionInfoBean(Connection connection) throws Exception {
return createConnectionInfoBean(connection.getConnectionName(), connection, true);
}
/**
* jdbc的特殊处理
*/
private static JDBCConnectionBean convertToJDBCConnectionBean(Connection connection, boolean withPassword) {
JDBCDatabaseConnection jdbcConnection = (JDBCDatabaseConnection) connection;
JDBCConnectionBean jdbcConnectionBean = new JDBCConnectionBean();
DBCPConnectionPoolAttr poolAttr = new DBCPConnectionPoolAttr();
try {
poolAttr = (DBCPConnectionPoolAttr) jdbcConnection.getDbcpAttr().clone();
} catch (CloneNotSupportedException ignore) {
}
poolAttr.setValidationQuery(TransmissionTool.encrypt(poolAttr.getValidationQuery()));
KerberosAuthentication kerberosAuthentication = null;
if (jdbcConnection.getAuthentication().type() == AuthenticationType.KERBEROS) {
//获取数据连接信息的时候,做一下兼容处理(兼容旧的kerberos形式)
KerberosUtils.compatibilityProcess(((KerberosAuthentication) jdbcConnection.getAuthentication()));
kerberosAuthentication = ((KerberosAuthentication) jdbcConnection.getAuthentication());
}
//因为设计器创建连接时database属性为空,所以这里直接取数据库保存的fetchSize值,默认值为-1
return jdbcConnectionBean
.newCharsetName(jdbcConnection.getNewCharsetName())
.originalCharsetName(jdbcConnection.getOriginalCharsetName())
.database(jdbcConnection.getDatabase())
.user(jdbcConnection.getUser())
.driver(jdbcConnection.getDriver())
// 关键中的关键,由设计器发出的请求如果要携带密码,不能传明文,必须必须必须传加密后的密码
.password(withPassword ? TransmissionEncryptors.getInstance().encrypt(jdbcConnection.getPassword()) : DecisionServiceConstants.DEFAULT_PASSWORD)
.schema(jdbcConnection.getSchema())
.url(jdbcConnection.getURL())
.creator(jdbcConnection.getCreator())
.source(jdbcConnection.getDriverSource())
.connectionPoolAttr(poolAttr.create())
.authType(kerberosAuthentication != null ? "kerberos" : StringUtils.EMPTY)
.principal(kerberosAuthentication != null ? kerberosAuthentication.getPrincipal() : StringUtils.EMPTY)
.keyPath(kerberosAuthentication != null ? kerberosAuthentication.getKeyPath() : StringUtils.EMPTY)
.krb5Path(kerberosAuthentication != null ? KerberosUtils.getKrb5Path(kerberosAuthentication.getKeyPath(), kerberosAuthentication.getPrincipal()) : StringUtils.EMPTY)
.useJaas(jdbcConnection.getAuthentication().type() == AuthenticationType.KERBEROS && ((KerberosAuthentication) jdbcConnection.getAuthentication()).getUseJaas())
.fetchSize(jdbcConnection.getFetchSize()).identity(connection.getIdentity())
.sshType(jdbcConnection.getSsh().getSshType().toString())
.sshIp(((BaseSsh) jdbcConnection.getSsh()).getIp())
.usingSsh(jdbcConnection.getSsh().isUsingSsh())
.sshUser(((BaseSsh) jdbcConnection.getSsh()).getUser())
.sshPort(((BaseSsh) jdbcConnection.getSsh()).getPort())
.redirectPort(jdbcConnection.getSsh().getRedirectPort())
.redirectIp((jdbcConnection.getSsh()).getRedirectIp())
.sshTimeOut(((BaseSsh) jdbcConnection.getSsh()).getTimeOut())
.sshSecret(withPassword ? ((BaseSsh) jdbcConnection.getSsh()).getSecret() : DecisionServiceConstants.DEFAULT_PASSWORD)
.sshPrivateKeyPath(jdbcConnection.getSsh().getSshType() == SshType.KEY ? ((KeyVerifySsh) jdbcConnection.getSsh()).getPrivateKeyPath() : StringUtils.EMPTY)
.usingSsl((jdbcConnection.getSsl()).isUsingSsl())
.sslType(jdbcConnection.getSsl().getSslType().toString())
.sslClientCertificate(((BaseSsl) jdbcConnection.getSsl()).getClientCertificate())
.sslClientPrivateKey(((BaseSsl) jdbcConnection.getSsl()).getClientPrivateKey())
.caCertificate(((BaseSsl) jdbcConnection.getSsl()).getCaCertificate())
.properties(jdbcConnection.getProperties())
.verifyCa(jdbcConnection.getSsl().getSslType() == SslType.NORMAL && ((NormalSsl) jdbcConnection.getSsl()).isVerifyCa());
}
}

2
designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java

@ -590,7 +590,7 @@ public class PreviewTablePane extends BasicPane {
private void testDBTableDataConnection(TableData tableData) throws Exception {
if (tableData instanceof DBTableData) {
try {
ConnectionRepository.getInstance().testConnection(new ConnectionBean(((DBTableData) tableData).getDatabase()));
ConnectionRepository.getInstance().testConnection(ConnectionInfoBeanHelper.createConnectionInfoBean(tableData.getName(), ((DBTableData) tableData).getDatabase()));
} catch (Exception e) {
throw new Exception(Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed"), e);
}

8
designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/MultiResultTableDataWrapper.java

@ -6,6 +6,7 @@ import com.fr.data.impl.NameDataModel;
import com.fr.data.impl.storeproc.StoreProcedure;
import com.fr.data.operator.DataOperator;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper;
import com.fr.design.data.datapane.preview.PreviewTablePane;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.iprogressbar.AutoProgressBar;
@ -14,6 +15,7 @@ import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.workspace.server.repository.connection.ConnectionRepository;
import javax.swing.Icon;
import javax.swing.JFrame;
@ -192,10 +194,10 @@ public final class MultiResultTableDataWrapper implements TableDataWrapper {
if (tableData instanceof StoreProcedure) {
try {
connectionBar.start();
boolean success = DataOperator.getInstance().testConnection(((StoreProcedure) getTableData()).getDatabaseConnection());
if (!success) {
ConnectionRepository.getInstance().testConnection(ConnectionInfoBeanHelper.createConnectionInfoBean(((StoreProcedure) getTableData()).getDatabaseConnection()));
} catch (Exception e){
FineLoggerFactory.getLogger().error(e.getMessage(), e);
throw new Exception(Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed"));
}
} finally {
connectionBar.close();
}

8
designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java

@ -6,6 +6,7 @@ import com.fr.data.impl.storeproc.ProcedureDataModel;
import com.fr.data.impl.storeproc.StoreProcedure;
import com.fr.data.operator.DataOperator;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper;
import com.fr.design.data.datapane.preview.PreviewTablePane;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.iprogressbar.AutoProgressBar;
@ -14,6 +15,7 @@ import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.workspace.server.repository.connection.ConnectionRepository;
import javax.swing.Icon;
import javax.swing.JFrame;
@ -178,8 +180,10 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper {
loadingBar.close();
PreviewTablePane.resetPreviewTable();
connectionBar.start();
boolean status = DataOperator.getInstance().testConnection(((StoreProcedure) getTableData()).getDatabaseConnection());
if (!status) {
try {
ConnectionRepository.getInstance().testConnection(ConnectionInfoBeanHelper.createConnectionInfoBean(((StoreProcedure) getTableData()).getDatabaseConnection()));
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
connectionBar.close();
throw new Exception(Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed"));
}

6
designer-base/src/main/java/com/fr/design/env/HttpWorkspaceConnector.java vendored

@ -53,17 +53,21 @@ public class HttpWorkspaceConnector implements WorkspaceConnector {
FineWorkspaceHttpClient client = FineWorkspaceHttpClient.create("Http-Client", connectionInfo);
try {
LoginResponseInfoBean bean = RemoteAuthorityRepository.getInstance().login(createLoginBean(connectionInfo));
// 服务器如果没返回token,肯定是出问题了,直接抛出异常
if (StringUtils.isEmpty(bean.getAccessToken())) {
throw new RuntimeException("Empty token, try connect again and check server");
}
WorkspaceConnection connection = new WorkspaceConnection(
UUID.randomUUID().toString(),
connectionInfo.getUserName(),
HttpConstants.AUTHORIZATION_PREFIX + bean.getAccessToken(),
InetAddress.getLocalHost().getHostAddress());
client.updateConnection(connection);
client.startHeartBeat();
} catch (Exception e) {
client.closePool();
throw e;
}
client.startHeartBeat();
CompatibleRegister.registerCompatibleEnv();
RepositoryManager.getInstance().clearLastPool();
return client;

3
designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java

@ -10,6 +10,7 @@ import com.fr.data.impl.Connection;
import com.fr.data.operator.DataOperator;
import com.fr.design.DesignerEnvManager;
import com.fr.design.constants.UIConstants;
import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper;
import com.fr.design.mainframe.dnd.SerializableTransferable;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
@ -103,7 +104,7 @@ public class TableViewList extends UIList {
//总共给3次连接的机会
while (!status && count > 0) {
try {
ConnectionRepository.getInstance().testConnection(new ConnectionBean(datasource));
ConnectionRepository.getInstance().testConnection(ConnectionInfoBeanHelper.createConnectionInfoBean(databaseName, datasource));
status = true;
break;
} catch (Exception e) {

6
designer-base/src/main/java/com/fr/design/mainframe/share/collect/ComponentSender.java

@ -17,8 +17,10 @@ public class ComponentSender {
private static final String CLOUD_REUSE_URL = "https://cloud.fanruan.com/api/monitor/record_of_reusePlugin/single";
public static boolean send() {
String content = ComponentCollector.getInstance().generateTotalInfo();
return sendInfo(CLOUD_REUSE_URL, content);
/// frm可能不用了,先关掉信息收集,后面处理
//String content = ComponentCollector.getInstance().generateTotalInfo();
//return sendInfo(CLOUD_REUSE_URL, content);
return true;
}
private static boolean sendInfo(String url, String content) {

14
designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPagesPane.java

@ -284,29 +284,25 @@ public class TemplateThemeGridPagesPane extends JPanel {
tabbedPane = new UITabbedPane();
tabbedPane.setTabBorderColor(new Color(0xE0E0E1));
add(tabbedPane, BorderLayout.CENTER);
TemplateThemeGridControlPane<FormTheme> formThemesManagerPane = TemplateThemeGridControlPane.createFormThemesManagerPane(window);
/// 去除frm
//TemplateThemeGridControlPane<FormTheme> formThemesManagerPane = TemplateThemeGridControlPane.createFormThemesManagerPane(window);
TemplateThemeGridControlPane<ReportTheme> reportThemesManagerPane = TemplateThemeGridControlPane.createReportThemesManagerPane(window);
tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Form_Tab"), formThemesManagerPane);
/// 去除frm
//tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Form_Tab"), formThemesManagerPane);
tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Report_Tab"), reportThemesManagerPane);
tabbedPane.setSelectedIndex(0);
JTemplate<?,?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
TemplateThemeConfig<? extends TemplateTheme> config = template.getUsingTemplateThemeConfig();
if (config == reportThemesManagerPane.getConfig()) {
tabbedPane.setSelectedIndex(1);
tabbedPane.setSelectedIndex(0);
}
}
@Override
public TemplateThemeConfig<? extends TemplateTheme> getConfig() {
if (tabbedPane.getSelectedIndex() == 0) {
return FormThemeConfig.getInstance();
} else {
return ReportThemeConfig.getInstance();
}
}
@Override
protected String title4PopupWindow() {

4
designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java

@ -572,8 +572,8 @@ public abstract class ToolBarMenuDock {
if (AlphaFineConfigManager.isALPHALicAvailable()) {
shortCuts.add(new AlphaFineAction());
}
shortCuts.add(new EnvDetectorAction());
/// fbp本地和远程都暂时不使用环境监测
//shortCuts.add(new EnvDetectorAction());
//服务平台(仅针对中国大陆)
if (GeneralContext.getLocale().equals(Locale.CHINA)) {
shortCuts.add(new ServicePlatformAction());

12
designer-base/src/main/java/com/fr/startup/ui/StartupPageModel.java

@ -1,5 +1,6 @@
package com.fr.startup.ui;
import com.fr.base.extension.FileExtension;
import com.fr.design.DesignerEnvManager;
import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.env.DesignerWorkspaceType;
@ -19,7 +20,8 @@ import java.util.stream.Collectors;
* created by Harrison on 2022/07/06
**/
public class StartupPageModel {
private static final String FRM = "frm";
private static final String FORM = "form";
private StartupWorkspaceBean selectWorkspaceInfo;
private List<StartupWorkspaceBean> workspaceInfos = new ArrayList<>();
@ -57,7 +59,13 @@ public class StartupPageModel {
for (StartupWorkspaceBean info : infos) {
String name = info.getName();
List<String> recentFiles = envManager.getRecentOpenedFilePathList4Env(name);
recentFileMap.put(name, recentFiles);
List<String> checkFiles = new ArrayList<>();
for (String s : recentFiles) {
if (!s.endsWith(FRM) && !s.endsWith(FORM)) {
checkFiles.add(s);
}
}
recentFileMap.put(name, checkFiles);
}
return new StartupPageModel(infos, recentFileMap);
}

5
designer-chart/src/main/java/com/fr/design/module/ChartPreStyleListPane.java

@ -118,7 +118,10 @@ public class ChartPreStyleListPane extends JListControlPane {
while (keys.hasNext()) {
Object key = keys.next();
ChartColorMatching value = (ChartColorMatching) config.getPreStyle(key);
// 新配置框架不再使用mirror后 原先mirror的地方需要手动清理下namespace
if(!StringUtils.isEmpty(value.getNameSpace())) {
value.reset();
}
list.add(new NameObject(Utils.objectToString(key), value));
}

3
designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java vendored

@ -402,7 +402,8 @@ public class DesignEnvComponent {
}
private void startEnvPrepare() {
EnvDetectorCenter.getInstance().init();
/// 环境检测、资源升级都暂不支持
//EnvDetectorCenter.getInstance().init();
if (WorkContext.getCurrent().isLocal()) {
// 如果是切回本地,要初始化成本地仓库
// 如果是切回远程,会在用户创建的时候就同步初始化远程仓库

2
designer-realize/src/main/java/com/fanruan/boot/env/function/DesignComponent.java vendored

@ -23,6 +23,7 @@ import com.fr.decision.webservice.v10.plugin.helper.category.impl.PluginResource
import com.fr.decision.webservice.v10.plugin.helper.category.impl.UpmResourceLoader;
import com.fr.design.DesignerEnvManager;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.RPCConnectHandlerCenter;
import com.fr.design.actions.NewFormAction;
import com.fr.design.actions.core.ActionFactory;
import com.fr.design.actions.insert.cell.BiasCellAction;
@ -218,6 +219,7 @@ public class DesignComponent {
DesignerWorkspaceLoader.init();
storePassport();
AlphaFineHelper.switchConfig4Locale();
RPCConnectHandlerCenter.startListener();
RecoverManager.register(new RecoverForDesigner());
}

2
designer-realize/src/main/java/com/fanruan/boot/env/function/app/DesignAppComponent.java vendored

@ -56,6 +56,6 @@ public class DesignAppComponent {
*/
@Supplemental
public void prepare() {
Carina.getApplicationContext().group(AppGroup.class).addAll(new CptApp(), new CptxApp(), new FormApp(), new XlsApp(), new XlsxApp());
Carina.getApplicationContext().group(AppGroup.class).addAll(new CptApp(), new CptxApp(), new XlsApp(), new XlsxApp());
}
}

10
designer-realize/src/main/java/com/fanruan/boot/init/DesignPreLoadComponent.java

@ -12,9 +12,9 @@ import com.fanruan.plugin.autonomy.AutonomyClassManagerGroup;
import com.fanruan.product.BuildContext;
import com.fanruan.product.ProductConstants;
import com.fr.base.OptimizeUtil;
import com.fr.concurrent.FineExecutors;
import com.fr.config.dao.DaoSelectorFactory;
import com.fr.config.dao.PropertiesConstants;
import com.fr.decision.service.context.ServiceContext;
import com.fr.decision.webservice.v10.encryption.EncryptionConstants;
import com.fr.design.DesignerEnvManager;
import com.fr.design.RestartHelper;
@ -33,7 +33,6 @@ import com.fr.general.CloudCenter;
import com.fr.general.FRLogger;
import com.fr.general.FrontProviderImpl;
import com.fr.general.GeneralContext;
import com.fr.general.I18nActivator;
import com.fr.general.I18nResource;
import com.fr.general.Inter;
import com.fr.general.InterProviderImpl;
@ -71,7 +70,6 @@ import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@ -226,6 +224,12 @@ public class DesignPreLoadComponent {
try {
beforeAllStart();
//清空临时文件
FineExecutors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
TmpFileUtils.cleanUpInnerTmpFiles();
}
}, 10, 10, TimeUnit.MINUTES);
Runtime.getRuntime().addShutdownHook(new Thread(TmpFileUtils::cleanUpInnerTmpFiles));
RestartHelper.deleteRecordFilesWhenStart();
CloudCenter.getInstance();

49
designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java

@ -1,5 +1,10 @@
package com.fanruan.boot.pre;
import com.fanruan.boot.FSProperties;
import com.fanruan.fs.FileServer;
import com.fanruan.fs.RepositoryFactory;
import com.fanruan.fs.repository.local.LocalFileRepository;
import com.fanruan.product.ProductConstants;
import com.fr.design.ConfigHelper;
import com.fanruan.boot.key.StartupArgsShell;
import com.fanruan.carina.Carina;
@ -31,11 +36,17 @@ import com.fr.event.EventDispatcher;
import com.fr.event.Listener;
import com.fr.general.CommonIOUtils;
import com.fr.general.GeneralUtils;
import com.fr.io.base.ResourcePaths;
import com.fr.io.repository.ResourceRepository;
import com.fr.io.repository.ResourceRepositoryWrapper;
import com.fr.io.utils.ResourceIOUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.module.engine.event.LifecycleErrorEvent;
import com.fr.runtime.FineRuntime;
import com.fr.stable.CommonCodeUtils;
import com.fr.stable.CommonUtils;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.lifecycle.FineLifecycleFatalError;
import com.fr.stable.project.ProjectConstants;
import com.fr.stable.resource.ResourceLoader;
@ -56,6 +67,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
@ -72,6 +84,9 @@ public class DesignPreStartComponent {
private static final String SEPARATOR = "/";
private static final String CPT = ".cpt";
private static final String XML = ".xml";
private static final String PRE_FILE_ROOT = ProductConstants.getEnvHome() + File.separator + "prefile";
private static final String PRE_FILE = PRE_FILE_ROOT + File.separator + "check";
/**
* 启动
@ -84,10 +99,38 @@ public class DesignPreStartComponent {
startTenant();
// 3.pluginPrepare,注册插件的反向依赖
startPluginPrepare();
// 4.正式启动
startPre();
// 5.mq
// 4.mq
startMq();
// 5.基础fs
startBasicFs();
// 6.正式启动
startPre();
}
private void startBasicFs() throws Exception {
// 启动的时候无关环境信息的写缓存里
checkFile(PRE_FILE);
LocalFileRepository.getSingleton().setWorkRoot(PRE_FILE_ROOT);
ResourceRepository realRepo = RepositoryFactory.getRepo();
FSProperties fsProperties = Carina.properties(FSProperties.class);
FileServer.init(
new ResourceRepositoryWrapper(LocalFileRepository.getSingleton(), StringUtils.EMPTY),
new ResourceRepositoryWrapper(realRepo, StringUtils.EMPTY),
new ResourceRepositoryWrapper(realRepo, StringUtils.EMPTY),
new ResourceRepositoryWrapper(realRepo.generateTenantsSharedRepo(fsProperties.getTenantsSharedNamespace()), StringUtils.EMPTY));
ResourceIOUtils.setUnderlying(FileServer.local());
ResourceIOUtils.setIsolationMode(false);
ResourcePaths.register(ProjectConstants.ASSETS_NAME, true);
ResourcePaths.register(ProjectConstants.SCHEDULE_NAME, false);
}
private void checkFile(String path) {
File file = new File(path);
if (!file.exists()) {
ConfigHelper.createFile(file);
}
}
private void startMq() throws Exception {

Loading…
Cancel
Save