package com.fanruan.api.design.work; import com.fanruan.api.conf.ConfigurationKit; import com.fanruan.api.data.ConnectionKit; import com.fanruan.api.data.open.BaseConnection; import com.fanruan.api.design.DesignKit; import com.fanruan.api.design.macro.DataSourceConstants; import com.fanruan.api.generic.Runner; import com.fanruan.api.util.AssistKit; import com.fanruan.api.util.StringKit; import com.fr.base.svg.IconUtils; import com.fr.data.impl.Connection; import com.fr.design.DesignerEnvManager; import com.fr.design.data.datapane.connect.ConnectionListPane; import com.fr.design.data.datapane.connect.ConnectionShowPane; import com.fr.design.data.datapane.connect.ItemEditableComboBoxPanel; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.editlock.ConnectionLockChangeChecker; import com.fr.design.editlock.EditLockUtils; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UILockButton; import com.fr.file.ConnectionConfig; import com.fr.report.LockItem; import com.fr.stable.NameReference; import com.fr.stable.StringUtils; import com.fr.transaction.WorkerCallBack; import com.fr.workspace.WorkContext; import com.fr.workspace.server.connection.DBConnectAuth; import org.jetbrains.annotations.Nullable; import javax.swing.SwingUtilities; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; /** * 选择数据连接的下拉框 */ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel { private static final long serialVersionUID = 1L; private Class cls; private List nameList = new ArrayList<>(); public ConnectionComboBoxPanel(Class cls) { super(); this.cls = cls; this.itemComboBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { String selected = ConnectionComboBoxPanel.this.getSelectedItem(); if (StringKit.isNotBlank(selected)) { DesignerEnvManager.getEnvManager().setRecentSelectedConnection(selected); } } }); refreshItems(); } @Override protected UIButton initEditButton(UIButton editButton, Dimension buttonSize) { editButton = new UILockButton( EditLockUtils.CONNECTION_LOCKED_ICON, IconUtils.readIcon("/com/fr/design/images/m_web/connection"), EditLockUtils.CONNECTION_LOCKED_TOOLTIPS, StringUtils.EMPTY ); editButton.setPreferredSize(buttonSize); editButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { editItems(); } }); ConnectionLockChangeChecker.getInstance().addEditLockChangeListener((UILockButton) editButton); return editButton; } protected Iterator items() { nameList = new ArrayList<>(); Iterator nameIt = ConnectionKit.getConnections().keySet().iterator(); Collection noAuthConnections = WorkContext.getCurrent().get(DBConnectAuth.class).getNoAuthConnections(); if (noAuthConnections == null) { return nameList.iterator(); } while (nameIt.hasNext()) { String conName = nameIt.next(); if (noAuthConnections.contains(conName)) { continue; } Connection connection = ConnectionKit.getConnection(conName); filterConnection(connection, conName, nameList); } return nameList.iterator(); } protected void filterConnection(@Nullable Connection connection, String conName, List nameList) { if (connection != null) { connection.addConnection(nameList, conName, new Class[]{BaseConnection.class}); } } public int getConnectionSize() { return nameList.size(); } private boolean isEmptyConnection() { return nameList.isEmpty(); } public String getConnection(int i) { return nameList.get(i); } protected void editItems() { // 尝试为数据连接加锁 boolean actionLock = EditLockUtils.lock(LockItem.CONNECTION); if (!actionLock) { // 锁定失败,代表已经被其他用户锁定,跳出弹窗提示 EditLockUtils.showLockMessage(); return; } // 锁定成功,执行后续操作 final ConnectionListPane connectionListPane = new ConnectionListPane(); final ConnectionConfig connectionConfig = ConnectionConfig.getInstance(); ConnectionConfig cloned = connectionConfig.mirror(); connectionListPane.populate(cloned); final BasicDialog connectionListDialog = connectionListPane.showLargeWindow( SwingUtilities.getWindowAncestor(ConnectionComboBoxPanel.this), null); connectionListDialog.addDialogActionListener(new DialogActionAdapter() { public void doOk() { if (!connectionListPane.isNamePermitted()) { connectionListDialog.setDoOKSucceed(false); return; } ConfigurationKit.modify(ConnectionConfig.class, new Runner() { @Override public void run() { connectionListPane.update(connectionConfig); } }, new WorkerCallBack() { @Override public boolean beforeCommit() { //如果更新失败,则不关闭对话框,也不写xml文件,并且将对话框定位在请重命名的那个对象页面 return doWithDatasourceManager(connectionConfig, connectionListPane, connectionListDialog); } @Override public void afterCommit() { DesignKit.getDesignerBean("databasename").refreshBeanElement(); // 关闭定义数据连接页面,为其解锁 EditLockUtils.unlock(LockItem.CONNECTION); } @Override public void afterRollback() { } }); } @Override public void doCancel() { super.doCancel(); // 关闭定义数据连接页面,为其解锁 EditLockUtils.unlock(LockItem.CONNECTION); } }); connectionListDialog.setVisible(true); refreshItems(); } /** * @param connection 数据库链接 */ public void populate(Connection connection) { editButton.setEnabled(WorkContext.getCurrent().isRoot()); if (connection instanceof NameReference) { this.setSelectedItem(((NameReference) connection).getName()); } else { String s = DesignerEnvManager.getEnvManager().getRecentSelectedConnection(); if (StringKit.isNotBlank(s)) { for (int i = 0; i < this.getConnectionSize(); i++) { String t = this.getConnection(i); if (AssistKit.equals(s, t)) { this.setSelectedItem(s); break; } } } if (StringKit.isBlank(this.getSelectedItem()) && !isEmptyConnection()) { this.setSelectedItem(this.getConnection(0)); } } } private boolean doWithDatasourceManager(ConnectionConfig datasourceManager, ConnectionShowPane connectionShowPane, BasicDialog databaseListDialog) { boolean isFailed = false; //存在请重命名则不能更新 int index = isConnectionMapContainsRename(datasourceManager); if (index != -1) { isFailed = true; connectionShowPane.setSelectedIndex(index); } databaseListDialog.setDoOKSucceed(!isFailed); return !isFailed; } private int isConnectionMapContainsRename(ConnectionConfig datasourceManager) { Map tableDataMap = datasourceManager.getConnections(); if (tableDataMap.containsKey(DataSourceConstants.ILLEGAL_NAME_HOLDER)) { return datasourceManager.getConnectionIndex(DataSourceConstants.ILLEGAL_NAME_HOLDER); } return -1; } }