From 72c0dbcc1e1c5641191fb83c68ed00e923756045 Mon Sep 17 00:00:00 2001 From: Maksim Date: Tue, 11 Feb 2020 13:04:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E8=AE=BE=E8=AE=A1=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E5=8F=8A=E6=9C=8D=E5=8A=A1=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/EnvChangeEntrance.java | 95 +++++++++++++++++ .../com/fr/design/env/RemoteWorkspace.java | 19 ++++ .../write/submit/CheckServiceDialog.java | 97 ++++++++++++++++++ .../fr/design/images/warnings/warning4.png | Bin 0 -> 2553 bytes 4 files changed, 211 insertions(+) create mode 100644 designer-base/src/main/java/com/fr/design/write/submit/CheckServiceDialog.java create mode 100644 designer-base/src/main/resources/com/fr/design/images/warnings/warning4.png diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java index c1c11553f..b7c572650 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -6,32 +6,45 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.env.DesignerWorkspaceGenerator; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.env.DesignerWorkspaceType; +import com.fr.design.env.RemoteWorkspace; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.TemplateTreePane; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.DesignUtils; +import com.fr.design.write.submit.CheckServiceDialog; import com.fr.env.EnvListPane; import com.fr.general.GeneralContext; +import com.fr.general.GeneralUtils; +import com.fr.invoke.Reflect; +import com.fr.json.JSONArray; import com.fr.license.exception.RegistEditionException; import com.fr.log.FineLoggerFactory; +import com.fr.rpc.Result; import com.fr.stable.AssistUtils; import com.fr.stable.EnvChangedListener; import com.fr.start.server.ServerTray; import com.fr.workspace.WorkContext; import com.fr.workspace.WorkContextCallback; import com.fr.workspace.Workspace; +import com.fr.workspace.base.WorkspaceAPI; import com.fr.workspace.connect.WorkspaceConnectionInfo; +import com.fr.workspace.engine.base.FineObjectPool; import com.fr.workspace.engine.channel.http.FunctionalHttpRequest; import com.fr.workspace.engine.exception.WorkspaceAuthException; +import com.fr.workspace.engine.exception.WorkspaceConnectionException; +import com.fr.workspace.engine.rpc.WorkspaceProxyPool; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Set; +import java.util.HashSet; import static javax.swing.JOptionPane.ERROR_MESSAGE; import static javax.swing.JOptionPane.QUESTION_MESSAGE; @@ -83,6 +96,7 @@ public class EnvChangeEntrance { private boolean switch2Env(final String envName, PopTipStrategy strategy) { DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName); + WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection(); try { Workspace workspace = DesignerWorkspaceGenerator.generate(selectedEnv); @@ -121,6 +135,33 @@ public class EnvChangeEntrance { template.refreshToolArea(); } + String localBranch; + String remoteBranch; + localBranch = GeneralUtils.readFullBuildNO(); + try { + remoteBranch = new FunctionalHttpRequest(connectionInfo).getServerBranch(); + } catch (WorkspaceConnectionException e){ + remoteBranch = Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Branch_Is_Old") + formatBranch(localBranch); + } + //通过是否包含#来避免当前版本为非安装版本(主要是内部开发版本) + if(localBranch.contains("#") && localBranch.equals(remoteBranch)){ + //说明版本一致,仅做日志记录 + FineLoggerFactory.getLogger().info("Remote Designer version consistency"); + }else { + localBranch = formatBranch(localBranch); + remoteBranch = formatBranch(remoteBranch); + Set noExistServiceSet = getNoExistServiceSet(connectionInfo); + StringBuilder textBuilder = new StringBuilder(); + for(Class clazz : noExistServiceSet){ + WorkspaceAPI workspaceAPI = (WorkspaceAPI) clazz.getAnnotation(WorkspaceAPI.class); + String descriptionOfCN = Toolkit.i18nText(workspaceAPI.description()); + textBuilder.append(descriptionOfCN).append("\n"); + } + String areaText = textBuilder.toString(); + CheckServiceDialog dialog = new CheckServiceDialog(DesignerContext.getDesignerFrame(),areaText,localBranch,remoteBranch); + dialog.setVisible(true); + } + } catch (WorkspaceAuthException | RegistEditionException e) { // String title = Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Auth_Failed"); // String title = Toolkit.i18nText("Fine-Design_Basic_Lic_Does_Not_Support_Remote"); @@ -196,6 +237,60 @@ public class EnvChangeEntrance { return true; } + public Set getNoExistServiceSet(WorkspaceConnectionInfo info){ + Set noExistServiceSet = new HashSet(); + Set remoteServiceSet = new HashSet(); + Set localServiceSet = FineObjectPool.getInstance().getServerPool().keySet(); + + try { + JSONArray serviceArray = new FunctionalHttpRequest(info).getServiceList(); + for(int i = 0; i < serviceArray.size(); i++){ + try{ + Class clazz = Class.forName((String) serviceArray.get(i)); + remoteServiceSet.add(clazz); + } catch (Exception e){ + continue; + } + } + noExistServiceSet.addAll(localServiceSet); + noExistServiceSet.removeAll(remoteServiceSet); + return noExistServiceSet; + } catch (WorkspaceConnectionException e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + //根据本地的服务列表做逐一检测 + for(Class clazz : localServiceSet) { + Method testMethod = Reflect.on(Method.class).create(clazz, "connectTest", new Class[0], String.class, new Class[0], 1025, 8, null, null, null, null).get(); + WorkspaceProxyPool proxyPool = (WorkspaceProxyPool) (((RemoteWorkspace) WorkContext.getCurrent()).getClient()).getPool(); + Result result = proxyPool.testInvoker(testMethod); + Exception invokeException = (Exception) result.getException(); + if(invokeException != null){ + Exception cause = (Exception) invokeException.getCause(); + //获取被包装最底层的异常 + while (cause != null) { + invokeException = cause; + cause = (Exception) invokeException.getCause(); + } + //该异常表示服务不存在 + if(invokeException instanceof ClassNotFoundException){ + noExistServiceSet.add(clazz); + } + } + } + return noExistServiceSet; + } catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + private String formatBranch(String branch){ + if(branch.contains("#")){ + return branch.substring(branch.lastIndexOf("#") + 1, branch.length() - 13); + } + return branch; + } + + /** * 编辑items * diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java index 36d8e7f7a..4abd7e63c 100644 --- a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java +++ b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java @@ -8,6 +8,9 @@ import com.fr.workspace.connect.WorkspaceClient; import com.fr.workspace.connect.WorkspaceConnection; import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.server.authority.decision.DecisionOperator; +import com.fr.workspace.engine.rpc.WorkspaceProxyPool; +import com.fr.workspace.pool.WorkObjectPool; +import java.lang.reflect.Method; /** * Created by juhaoyu on 2018/6/14. @@ -78,6 +81,18 @@ public class RemoteWorkspace implements Workspace { return client.getPool().get(type); } + + public T get(Class type, Method defaultMethod){ + if(defaultMethod != null) { + WorkObjectPool objectPool = client.getPool(); + if (objectPool instanceof WorkspaceProxyPool) { + return ((WorkspaceProxyPool) objectPool).get(type, defaultMethod); + }else { + return client.getPool().get(type); + } + } + return client.getPool().get(type); + } @Override public void close() { @@ -96,4 +111,8 @@ public class RemoteWorkspace implements Workspace { return obj instanceof RemoteWorkspace && AssistUtils.equals(((RemoteWorkspace) obj).connection, this.connection); } + + public WorkspaceClient getClient(){ + return client; + } } diff --git a/designer-base/src/main/java/com/fr/design/write/submit/CheckServiceDialog.java b/designer-base/src/main/java/com/fr/design/write/submit/CheckServiceDialog.java new file mode 100644 index 000000000..e55de3fe2 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/write/submit/CheckServiceDialog.java @@ -0,0 +1,97 @@ +package com.fr.design.write.submit; + +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.FRFont; +import com.fr.general.IOUtils; + +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * @author: Maksim + * @Date: Created in 2020/2/3 + * @Description: 远程连接时,服务检测提醒对话框 + */ +public class CheckServiceDialog extends JDialog implements ActionListener { + private JPanel topPanel; + private JPanel centerPanel; + private JPanel bottomPanel; + + public CheckServiceDialog(Frame parent, String areaText, String localBranch, String remoteBranch){ + super(parent,true); + //上面的标签面板 + topPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); + JPanel imagePanel = new JPanel(); + ImageIcon icon = (ImageIcon) IOUtils.readIcon("com/fr/design/images/warnings/warning4.png"); + + JLabel imageLabel = new JLabel(); + imageLabel.setIcon(icon); + imagePanel.add(imageLabel); + imagePanel.setPreferredSize(new Dimension(100,80)); + + JPanel verticalPanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); + FRFont font = FRFont.getInstance(); + font = font.applySize(15).applyStyle(1); + JLabel label = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Branch_Inconsistency")); + label.setFont(font); + label.setPreferredSize(new Dimension(500,30)); + JLabel label2 = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Local_Designer") + + localBranch + "/" + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Remote_Server") + remoteBranch); + label2.setPreferredSize(new Dimension(500,20)); + JLabel label3 = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Branch_Need_Update")); + label3.setPreferredSize(new Dimension(500,20)); + + verticalPanel.add(label); + verticalPanel.add(label2); + verticalPanel.add(label3); + + topPanel.add(imagePanel,BorderLayout.WEST); + topPanel.add(verticalPanel,BorderLayout.CENTER); + + //中间的文本域面板 + centerPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); + centerPanel.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); + centerPanel.setPreferredSize(new Dimension(480,320)); + + JLabel titleLabel = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Affected_Function")); + titleLabel.setPreferredSize(new Dimension(400,40)); + JTextArea checkArea = new JTextArea(areaText); + checkArea.setEnabled(false); + centerPanel.add(titleLabel,BorderLayout.NORTH); + centerPanel.add(checkArea,BorderLayout.CENTER); + + //下面的按钮面板 + UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Button_Confirm")); + JPanel buttonPanel = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + buttonPanel.add(okButton); + okButton.addActionListener(this ); + bottomPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); + bottomPanel.add(buttonPanel); + + this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Title_Hint")); + this.setResizable(false); + + this.add(topPanel,BorderLayout.NORTH); + this.add(centerPanel, BorderLayout.CENTER); + this.add(buttonPanel,BorderLayout.SOUTH); + this.setSize(new Dimension(600, 500)); + + GUICoreUtils.centerWindow(this); + } + @Override + public void actionPerformed(ActionEvent e) { + this.dispose(); + } +} diff --git a/designer-base/src/main/resources/com/fr/design/images/warnings/warning4.png b/designer-base/src/main/resources/com/fr/design/images/warnings/warning4.png new file mode 100644 index 0000000000000000000000000000000000000000..a982ee864b9660acc8396576ed34cadb3fdb3b14 GIT binary patch literal 2553 zcmVQwD5no84<_$=)R$n%mde*oKhY-TwCLa#M4E z=AP$ypZB@V-RW2awU z)c8>k@pUURQ(|tXfe#Shk3T4y@gd)=hzX+}Vlkh2fSGR&+7}Tok(0RxgYu)`jcSN? zSLPCu_^FVMO!ci7Smth_;zo zMZ}SRS#}&}K~r<*7V-9@LDoD(`*3TT9LK#1-xf^^Z&7(#(Tq!C(5)(2^AHPG=0Siz z9ap2wyj)G?9*9f7oNi4+ESQ-qK>YhS8)U{SNK9x`)t&h`>kRu~t5qqWU}m;~__7*Q zyj#(XuhpQ=K#7`NiN$juTeAEK4n0Pv?o4fY)?otZpq z_rXed+tL>j@M}>$fNxQ>-1o)t{*keU*wd9+AW8gNQCp(R{xRw-HiMZONe&YYzI|1j2I%e>7s+QX* ziuZf_$iOC5GZu>K`@zK$Vy~6H+W~#mj}ZyDHlZ299~eQl75vr^^&feN#eC~~mAr|uKN5J$+|0a2hqU9Ed z@`{#jGoXm#2XTZIO49hAZ(bEbq#@d7>or8qV?hiOVV|5d-XX$0YPO!+NX}jn>~IVb z4oQtpcGBd|*MjiNaUu<|Xz9-~@PVM_olI~GPSbcnX4ZzAC1VN49+nu=yLSJSe)(yb)X%MsOcU$~XBX51A< zFI0%VR{B~8^s6uihI3^qHBoZ6T}iX2OTS8z@S6y0b~|r4*{128dxB~P4v`rR#k}s` znFuceh?r!DXQ|D(U6rr}Q~xpu_ljtVVwkZ`O&QBX@xyU}LoDReE5LM5(885?1in(% za$74sZ=31+iRg1t*KLq+>7=Pfpb51=A@+5hKf{q4+$I02?_WV0CFbRFmCg64CdtZp zds5Mi`GGtKAr&qCJ_bG?gzL#6d{;>tw^jakPQM7E*`7MV0E-pP@I9&K`%1L)Ef*0> zo_7_&dKg&Esk-i0$m`u;oE}u)gSShjQnuO$TRFb}5Ka9FB78KaCII4pD9K#e538f* ztaBQv6zgFi(S4qw{rd{BV5V;X(a&QGaA12B-HN6)6Ft*EyiUPPUk0LWan=W+hx?IL zrx_ihb%aA?K6_#@pK!m@yh~I(D6XHSndOe3^;r6130NOg*9Y$*MKgpa*Mvi~t@KI) zeanZDz)*H*p4!~;r{My{d}bAM^uwVQ-sk4an(?Ga6G9;#%eS1@??~;S*xt~Gd%a1~ zjGqnvqitn=LSWAY3X#S=F@)_((h!sv8>RC7`Ft!#)VR*&5!e>KW{ytD|sL)LOtw_JM;v`mr4ONYI*B7dInXC-Nrop37~V!_fM z0&r90Myd!BP;g3kzsT)YA+KK#M(7PDzx_$T7ZRE=V$y9yh_74e`3<1o`7ID0PwN%U zd#CSYoyd0ld>AL-RR*$(W^@gujR>(|>f1q>=R-RZC=))bCJo^u8d2;$2Qpq}z4I+0 z+NQpY2tNuW9+E^PEs&GDgbz0stjt<>9y?^&0CXxzCC(MP!^o3stRS)8Lg@wDfl~!(FAB5K)alGVa2In)3e9prV!8z&?(31Ty16VxV2s zjDaE3fq&;hUcU#76>${vt4YLX$jRKHN<3f3FZ>qwiDzJusu_dvLca#zG94spIgHu@IvOv8OAuM3QRu zvjQP4*B{*-1*D#X=S`)CM)#-pX4ap@`gX*O$JCVZiT{1sKCI7!gYETgx$fLO@4Vq$ z-ZZ_l`^^Oiv!$(pq+1z?A>J^-%vgKP|L-TXdw~a2T%%x z6u3UW=!VI`2iHAAc!