diff --git a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java index c671f0fdcd..40d99480fc 100644 --- a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java +++ b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java @@ -5,11 +5,16 @@ package com.fr.design.mainframe.bbs; import com.fr.base.FRContext; import com.fr.design.DesignerEnvManager; -import com.fr.design.extra.*; +import com.fr.design.extra.LoginContextListener; +import com.fr.design.extra.LoginWebBridge; +import com.fr.design.extra.PluginWebBridge; +import com.fr.design.extra.UserLoginContext; +import com.fr.design.extra.WebViewDlgHelper; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.utils.concurrent.ThreadFactoryBuilder; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.general.DateUtils; @@ -21,15 +26,22 @@ import com.fr.stable.OperatingSystem; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.SwingConstants; +import java.awt.Cursor; +import java.awt.Desktop; +import java.awt.Frame; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.UnsupportedEncodingException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; import java.net.URI; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * @author neil @@ -37,6 +49,7 @@ import java.util.Date; */ public class UserInfoLabel extends UILabel { + private static final int JRE_VERSION_8 = 8; //默认查询消息时间, 30s private static final long CHECK_MESSAGE_TIME = 30 * 1000L; //默认论坛检测到更新后的弹出延迟时间 @@ -73,6 +86,10 @@ public class UserInfoLabel extends UILabel { } public UserInfoLabel(UserInfoPane userInfoPane) { + init(userInfoPane); + } + + private void init(UserInfoPane userInfoPane) { this.userInfoPane = userInfoPane; String userName = DesignerEnvManager.getEnvManager().getBBSName(); @@ -83,22 +100,7 @@ public class UserInfoLabel extends UILabel { LoginWebBridge loginWebBridge = new LoginWebBridge(); loginWebBridge.setUserName(userName, UserInfoLabel.this); - LoginCheckContext.addLoginCheckListener(new LoginCheckListener() { - @Override - public void loginChecked() { - /* - if (bbsLoginDialog == null) { - bbsLoginDialog = new BBSLoginDialog(DesignerContext.getDesignerFrame(), UserInfoLabel.this); - } - bbsLoginDialog.clearLoginInformation(); - bbsLoginDialog.showTipForDownloadPluginWithoutLogin(); - bbsLoginDialog.setModal(true); - bbsLoginDialog.showWindow(); - */ - } - }); - - if (StableUtils.getMajorJavaVersion() == 8) { + if (StableUtils.getMajorJavaVersion() == JRE_VERSION_8) { PluginWebBridge.getHelper().setUILabel(UserInfoLabel.this); } LoginWebBridge.getHelper().setUILabelInPlugin(UserInfoLabel.this); @@ -125,12 +127,13 @@ public class UserInfoLabel extends UILabel { userInfoPane.markUnSignIn(); } - /** - * showBBSDialog 弹出BBS资讯框 - */ public static void showBBSDialog() { - Thread showBBSThread = new Thread(new Runnable() { - + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( + 1, 1, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue(1), + new ThreadFactoryBuilder().setNameFormat("bbs-dlg-thread-%s").build()); + threadPoolExecutor.execute(new Runnable() { @Override public void run() { // vito:最新mac10.12和javafx弹出框初始化时会有大几率卡死在native方法,这里先屏蔽一下。 @@ -152,18 +155,22 @@ public class UserInfoLabel extends UILabel { return; } String res = hc.getResponseText(); - if (res.indexOf(BBSConstants.UPDATE_KEY) == -1) { + if (!res.contains(BBSConstants.UPDATE_KEY)) { return; } try { - BBSDialog bbsLabel = new BBSDialog(DesignerContext.getDesignerFrame()); - bbsLabel.showWindow(SiteCenter.getInstance().acquireUrlByKind("bbs.popup")); + Class clazz = Class.forName("com.fr.design.mainframe.bbs.BBSDialog"); + Constructor constructor = clazz.getConstructor(Frame.class); + Object instance = constructor.newInstance(DesignerContext.getDesignerFrame()); + Method showWindow = clazz.getMethod("showWindow", String.class); + showWindow.invoke(instance, SiteCenter.getInstance().acquireUrlByKind("bbs.popup")); DesignerEnvManager.getEnvManager().setLastShowBBSNewsTime(DateUtils.DATEFORMAT2.format(new Date())); - } catch (Throwable e) { + } catch (Throwable ignored) { + // ignored } + } }); - showBBSThread.start(); } private void sleep(long millis) { @@ -230,6 +237,7 @@ public class UserInfoLabel extends UILabel { private MouseAdapter userInfoAdapter = new MouseAdapter() { + @Override public void mouseEntered(MouseEvent e) { UserInfoLabel.this.setCursor(new Cursor(Cursor.HAND_CURSOR)); } @@ -245,6 +253,7 @@ public class UserInfoLabel extends UILabel { //私人消息 UIMenuItem priviteMessage = new UIMenuItem(Inter.getLocText("FR-Designer-BBSLogin_Privite-Message")); priviteMessage.addMouseListener(new MouseAdapter() { + @Override public void mousePressed(MouseEvent e) { if (StringUtils.isNotEmpty(userName)) { try { @@ -261,6 +270,7 @@ public class UserInfoLabel extends UILabel { //切换账号 UIMenuItem closeOther = new UIMenuItem(Inter.getLocText("FR-Designer-BBSLogin_Switch-Account")); closeOther.addMouseListener(new MouseAdapter() { + @Override public void mousePressed(MouseEvent e) { UserLoginContext.fireLoginContextListener(); } diff --git a/designer/src/com/fr/start/Designer.java b/designer/src/com/fr/start/Designer.java index 526df8f096..69d2ca1a1e 100644 --- a/designer/src/com/fr/start/Designer.java +++ b/designer/src/com/fr/start/Designer.java @@ -20,7 +20,12 @@ import com.fr.design.gui.ibutton.UIPreviewButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.itoolbar.UILargeToolbar; -import com.fr.design.mainframe.*; +import com.fr.design.mainframe.ActiveKeyGenerator; +import com.fr.design.mainframe.BaseJForm; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.InformationCollector; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.JWorkBook; import com.fr.design.mainframe.bbs.UserInfoLabel; import com.fr.design.mainframe.bbs.UserInfoPane; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; @@ -30,6 +35,7 @@ import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ShortCut; import com.fr.design.module.DesignModuleFactory; import com.fr.design.module.DesignerModule; +import com.fr.design.utils.concurrent.ThreadFactoryBuilder; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.general.Inter; @@ -38,29 +44,36 @@ import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLTools; -import javax.swing.*; +import javax.swing.JComponent; +import javax.swing.JPanel; import javax.swing.border.MatteBorder; -import java.awt.*; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; public class Designer extends BaseDesigner { private static final int TOOLBARPANEVGAP = -4; private static final int PREVIEW_DOWN_X_GAP = 92; private static final int GAP = 7; - + private static final String OLD_ENV_FOLDER_71 = ".FineReport71"; private static final String OLD_ENV_FOLDER_70 = ".FineReport70"; private UserInfoPane userInfoPane; - + private UIButton saveButton; private UIButton undo; private UIButton redo; private UIPreviewButton run; - + /** * 设计器启动的Main方法 @@ -132,6 +145,7 @@ public class Designer extends BaseDesigner { UILargeToolbar largeToolbar = super.createLargeToolbar(); largeToolbar.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 4)); largeToolbar.add(new JPanel() { + @Override public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); dim.width = 1; @@ -141,6 +155,7 @@ public class Designer extends BaseDesigner { createRunButton(largeToolbar); largeToolbar.add(run); largeToolbar.add(new JPanel() { + @Override public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); dim.width = GAP; @@ -154,8 +169,10 @@ public class Designer extends BaseDesigner { /** * 创建上面一排的工具栏按钮 + * * @return 按钮 */ + @Override public UIButton[] createUp() { return new UIButton[]{createSaveButton(), createUndoButton(), createRedoButton()}; } @@ -176,7 +193,7 @@ public class Designer extends BaseDesigner { }); return saveButton; } - + private UIButton createUndoButton() { undo = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/undo.png")); undo.setToolTipText(KeySetUtils.UNDO.getMenuKeySetName()); @@ -211,10 +228,12 @@ public class Designer extends BaseDesigner { private void createRunButton(UILargeToolbar largeToolbar) { run = new UIPreviewButton(new UIButton(UIConstants.PAGE_BIG_ICON) { + @Override public Dimension getPreferredSize() { return new Dimension(34, 34); } }, new UIButton(UIConstants.PREVIEW_DOWN) { + @Override public Dimension getPreferredSize() { return new Dimension(34, 10); } @@ -284,10 +303,12 @@ public class Designer extends BaseDesigner { /** * 生成工具栏 + * * @param toolbarComponent 工具栏 * @param plus 对象 - * @return 更新后的toolbar + * @return 更新后的toolbar */ + @Override public JComponent resetToolBar(JComponent toolbarComponent, ToolBarMenuDockPlus plus) { //如果是处于权限编辑状态 if (BaseUtils.isAuthorityEditing()) { @@ -325,85 +346,90 @@ public class Designer extends BaseDesigner { public JTemplate createNewTemplate() { return new JWorkBook(); } - + /** - * 创建论坛登录面板, chart那边不需要 - * - * @return 面板组件 - * - */ - public Component createBBSLoginPane(){ - if (userInfoPane == null){ - userInfoPane = new UserInfoPane(); + * 创建论坛登录面板, chart那边不需要 + * + * @return 面板组件 + */ + @Override + public Component createBBSLoginPane() { + if (userInfoPane == null) { + userInfoPane = new UserInfoPane(); } return userInfoPane; } - + + @Override protected SplashPane createSplashPane() { return new ReportSplashPane(); } - + /** - * 收集用户信息吗 - * - */ + * 收集用户信息吗 + */ + @Override protected void collectUserInformation() { - //定制的就不弹出来了 - if (!ComparatorUtils.equals(ProductConstants.APP_NAME, ProductConstants.DEFAULT_APPNAME)) { - return; - } - - DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); - final String key = envManager.getActivationKey(); - //本地验证通过 - if(ActiveKeyGenerator.localVerify(key)){ - onLineVerify(envManager, key); - UserInfoLabel.showBBSDialog(); - return; - } - - if(StableUtils.checkDesignerActive(readOldKey())){ - //只要有老的key, 就不弹窗, 下次启动的时候, 在线验证下就行. - String newKey = ActiveKeyGenerator.generateActiveKey(); - envManager.setActivationKey(newKey); - UserInfoLabel.showBBSDialog(); - return; - } - + //定制的就不弹出来了 + if (!ComparatorUtils.equals(ProductConstants.APP_NAME, ProductConstants.DEFAULT_APPNAME)) { + return; + } + + DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); + final String key = envManager.getActivationKey(); + //本地验证通过 + if (ActiveKeyGenerator.localVerify(key)) { + onLineVerify(envManager, key); + UserInfoLabel.showBBSDialog(); + return; + } + + if (StableUtils.checkDesignerActive(readOldKey())) { + //只要有老的key, 就不弹窗, 下次启动的时候, 在线验证下就行. + String newKey = ActiveKeyGenerator.generateActiveKey(); + envManager.setActivationKey(newKey); + UserInfoLabel.showBBSDialog(); + return; + } + CollectUserInformationDialog activeDialog = new CollectUserInformationDialog( - DesignerContext.getDesignerFrame()); + DesignerContext.getDesignerFrame()); activeDialog.setVisible(true); } - - private void onLineVerify(DesignerEnvManager envManager, final String key){ - int status = envManager.getActiveKeyStatus(); - //没有联网验证过 - if (status != 0) { - Thread authThread = new Thread(new Runnable() { - - @Override - public void run() { - ActiveKeyGenerator.onLineVerify(key); - } - }); - authThread.start(); - } + + private void onLineVerify(DesignerEnvManager envManager, final String key) { + int status = envManager.getActiveKeyStatus(); + //没有联网验证过 + if (status != 0) { + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( + 1, 1, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue(1), + new ThreadFactoryBuilder().setNameFormat("net-verify-thread-%s").build()); + threadPoolExecutor.execute(new Runnable() { + + @Override + public void run() { + ActiveKeyGenerator.onLineVerify(key); + } + }); + } } - - private File getOldEnvFile(String folderName){ - String userHome = System.getProperty("user.home"); - if (userHome == null) { - userHome = System.getProperty("userHome"); - } - String filePath = StableUtils.pathJoin(userHome, folderName, ProductConstants.APP_NAME + "Env.xml"); + + private File getOldEnvFile(String folderName) { + String userHome = System.getProperty("user.home"); + if (userHome == null) { + userHome = System.getProperty("userHome"); + } + String filePath = StableUtils.pathJoin(userHome, folderName, ProductConstants.APP_NAME + "Env.xml"); return new File(filePath); } - - private String getOldActiveKeyFromFile(File envFile){ + + private String getOldActiveKeyFromFile(File envFile) { if (!envFile.exists()) { - return StringUtils.EMPTY; - } - + return StringUtils.EMPTY; + } + DesignerEnvManager temp = new DesignerEnvManager(); try { XMLTools.readFileXML(temp, envFile); @@ -412,26 +438,26 @@ public class Designer extends BaseDesigner { } return temp.getActivationKey(); } - + //默认只从7.0和711的设计器里读取key - private String readOldKey(){ - File file71 = getOldEnvFile(OLD_ENV_FOLDER_71); - if (!file71.exists()) { - File file70 = getOldEnvFile(OLD_ENV_FOLDER_70); - return getOldActiveKeyFromFile(file70); - } - - return getOldActiveKeyFromFile(file71); + private String readOldKey() { + File file71 = getOldEnvFile(OLD_ENV_FOLDER_71); + if (!file71.exists()) { + File file70 = getOldEnvFile(OLD_ENV_FOLDER_70); + return getOldActiveKeyFromFile(file70); + } + + return getOldActiveKeyFromFile(file71); } - + /** - * 设计器退出时, 做的一些操作. - * - */ - public void shutDown(){ - InformationCollector collector = InformationCollector.getInstance(); - collector.collectStopTime(); - collector.saveXMLFile(); + * 设计器退出时, 做的一些操作. + */ + @Override + public void shutDown() { + InformationCollector collector = InformationCollector.getInstance(); + collector.collectStopTime(); + collector.saveXMLFile(); Env currentEnv = FRContext.getCurrentEnv(); currentEnv.doWhenServerShutDown(); } diff --git a/designer_base/src/com/fr/design/extra/LoginWebBridge.java b/designer_base/src/com/fr/design/extra/LoginWebBridge.java index de0be5c91d..3190e431d1 100644 --- a/designer_base/src/com/fr/design/extra/LoginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/LoginWebBridge.java @@ -6,14 +6,16 @@ import com.fr.design.dialog.UIDialog; import com.fr.design.extra.ucenter.Client; import com.fr.design.extra.ucenter.XMLHelper; import com.fr.design.gui.ilable.UILabel; +import com.fr.general.ComparatorUtils; import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; import com.fr.stable.EncodeConstants; import com.fr.stable.StringUtils; import javafx.scene.web.WebEngine; -import javax.swing.*; -import java.awt.*; +import javax.swing.JDialog; +import javax.swing.SwingUtilities; +import java.awt.Desktop; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URLEncoder; @@ -55,6 +57,10 @@ public class LoginWebBridge { private String userName; public LoginWebBridge() { + init(); + } + + private void init() { String username = DesignerEnvManager.getEnvManager().getBBSName(); setUserName(username, uiLabel); } @@ -79,7 +85,7 @@ public class LoginWebBridge { this.pluginuiLabel = uiLabel; } - public void setQqDialog(UIDialog qqDialog) { + public void setQQDialog(UIDialog qqDialog) { closeQQWindow(); this.qqDialog = qqDialog; } @@ -216,7 +222,7 @@ public class LoginWebBridge { return NET_FAILED; } String loginResult = login(username, password); - if (loginResult.equals(LOGININ)) { + if (ComparatorUtils.equals(loginResult, LOGININ)) { updateUserInfo(username); loginSuccess(username, uiLabel); setUserName(username, uiLabel); @@ -271,24 +277,23 @@ public class LoginWebBridge { String result = uc.uc_user_login(username, password); result = new String(result.getBytes("iso-8859-1"), "gbk"); LinkedList list = XMLHelper.uc_unserialize(result); - if (list.size() > 0) { - int $uid = Integer.parseInt(list.get(0)); - if ($uid > 0) { - DesignerEnvManager.getEnvManager().setBbsUid($uid); - DesignerEnvManager.getEnvManager().setBBSName(username); - DesignerEnvManager.getEnvManager().setInShowBBsName(username); - DesignerEnvManager.getEnvManager().setBBSPassword(password); - return LOGININ;//登录成功,0 - } else if ($uid == -1) { - return USERNAME_NOT_EXSIT;//用户名不存在,-1 - } else if ($uid == -2) { - return PASSWORD_ERROR;//密码错误,-2 - } else { - return UNKNOWN_ERROR;//未知错误,-3 - } - } else { + if (list.size() == 0) { return NET_FAILED; } + int uid = Integer.parseInt(list.get(0)); + if (uid > 0) { + DesignerEnvManager.getEnvManager().setBbsUid(uid); + DesignerEnvManager.getEnvManager().setBBSName(username); + DesignerEnvManager.getEnvManager().setInShowBBsName(username); + DesignerEnvManager.getEnvManager().setBBSPassword(password); + return LOGININ;//登录成功,0 + } else if (uid == -1) { + return USERNAME_NOT_EXSIT;//用户名不存在,-1 + } else if (uid == -2) { + return PASSWORD_ERROR;//密码错误,-2 + } else { + return UNKNOWN_ERROR;//未知错误,-3 + } } catch (Exception e) { FRContext.getLogger().info(e.getMessage()); } @@ -313,21 +318,22 @@ public class LoginWebBridge { public void getLoginInfo(String userInfo) { org.json.JSONObject jo = new org.json.JSONObject(userInfo); String status = jo.get("status").toString(); - if (status.equals(LOGIN_SUCCESS)) { + if (ComparatorUtils.equals(status, LOGIN_SUCCESS)) { String username = jo.get("username").toString(); - int uid = Integer.parseInt(jo.get("uid") == null ? "" : jo.get("uid").toString()); + int uid = Integer.parseInt(jo.get("uid") == null ? StringUtils.EMPTY : jo.get("uid").toString()); closeWindow(); closeQQWindow(); pluginuiLabel.setText(username); DesignerEnvManager.getEnvManager().setBBSName(username); DesignerEnvManager.getEnvManager().setBbsUid(uid); DesignerEnvManager.getEnvManager().setInShowBBsName(username); - } else if (status.equals(LOGIN_FAILED)) { + } else if (ComparatorUtils.equals(status, LOGIN_FAILED)) { //账号没有QQ授权 closeQQWindow(); try { Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("QQ_binding"))); - } catch (Exception exp) { + } catch (Exception ignore) { + // ignored } } } diff --git a/designer_base/src/com/fr/design/extra/ShopManagerPane.java b/designer_base/src/com/fr/design/extra/ShopManagerPane.java index 857e96cc8d..49d89733db 100644 --- a/designer_base/src/com/fr/design/extra/ShopManagerPane.java +++ b/designer_base/src/com/fr/design/extra/ShopManagerPane.java @@ -2,9 +2,9 @@ package com.fr.design.extra; import com.fr.design.dialog.BasicPane; import com.fr.general.Inter; -import javafx.embed.swing.JFXPanel; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Component; /** * @author richie @@ -19,7 +19,7 @@ import java.awt.*; */ public class ShopManagerPane extends BasicPane { - public ShopManagerPane(JFXPanel webPane) { + public ShopManagerPane(Component webPane) { setLayout(new BorderLayout()); add(webPane, BorderLayout.CENTER); } diff --git a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java index 481498fc88..c9e0089e94 100644 --- a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java @@ -15,9 +15,12 @@ import com.fr.general.http.HttpClient; import com.fr.plugin.PluginVerifyException; import com.fr.stable.StableUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.JOptionPane; +import javax.swing.SwingWorker; +import java.awt.BorderLayout; +import java.awt.Component; import java.io.File; +import java.lang.reflect.Constructor; import java.net.HttpURLConnection; import java.util.concurrent.ExecutionException; @@ -97,24 +100,46 @@ public class WebViewDlgHelper { } public static void createQQLoginDialog() { - QQLoginWebPane webPane = new QQLoginWebPane(new File(installHome).getAbsolutePath()); - UIDialog qqlog = new QQLoginDialog(DesignerContext.getDesignerFrame(), webPane); - LoginWebBridge.getHelper().setQqDialog(qqlog); - qqlog.setVisible(true); + try { + Class clazz = Class.forName("com.fr.design.extra.QQLoginWebPane"); + Constructor constructor = clazz.getConstructor(String.class); + Component webPane = (Component) constructor.newInstance(new File(installHome).getAbsolutePath()); + + UIDialog qqLoginDialog = new QQLoginDialog(DesignerContext.getDesignerFrame(), webPane); + LoginWebBridge.getHelper().setQQDialog(qqLoginDialog); + qqLoginDialog.setVisible(true); + } catch (Throwable ignored) { + // ignored + } } private static void showPluginDlg(String mainJsPath) { - BasicPane managerPane = new ShopManagerPane(new PluginWebPane(mainJsPath)); - UIDialog dlg = new ShopDialog(DesignerContext.getDesignerFrame(), managerPane); - PluginWebBridge.getHelper().setDialogHandle(dlg); - dlg.setVisible(true); + try { + Class clazz = Class.forName("com.fr.design.extra.PluginWebPane"); + Constructor constructor = clazz.getConstructor(String.class); + Component webPane = (Component) constructor.newInstance(mainJsPath); + + BasicPane managerPane = new ShopManagerPane(webPane); + UIDialog dlg = new ShopDialog(DesignerContext.getDesignerFrame(), managerPane); + PluginWebBridge.getHelper().setDialogHandle(dlg); + dlg.setVisible(true); + } catch (Throwable ignored) { + // ignored + } } private static void showLoginDlg() { - LoginWebPane webPane = new LoginWebPane(new File(installHome).getAbsolutePath()); - UIDialog qqdlg = new LoginDialog(DesignerContext.getDesignerFrame(), webPane); - LoginWebBridge.getHelper().setDialogHandle(qqdlg); - qqdlg.setVisible(true); + try { + Class clazz = Class.forName("com.fr.design.extra.LoginWebPane"); + Constructor constructor = clazz.getConstructor(String.class); + Component webPane = (Component) constructor.newInstance(new File(installHome).getAbsolutePath()); + + UIDialog qqdlg = new LoginDialog(DesignerContext.getDesignerFrame(), webPane); + LoginWebBridge.getHelper().setDialogHandle(qqdlg); + qqdlg.setVisible(true); + } catch (Throwable ignored) { + // ignored + } } private static Component initTraditionalStore() { @@ -136,6 +161,7 @@ public class WebViewDlgHelper { PluginHelper.downloadPluginFile(scriptsId, username, password, new Process() { @Override public void process(Double integer) { + // ignored } }); } catch (PluginVerifyException e) { diff --git a/designer_base/src/com/fr/design/utils/concurrent/ThreadFactoryBuilder.java b/designer_base/src/com/fr/design/utils/concurrent/ThreadFactoryBuilder.java new file mode 100644 index 0000000000..3af213ac9e --- /dev/null +++ b/designer_base/src/com/fr/design/utils/concurrent/ThreadFactoryBuilder.java @@ -0,0 +1,178 @@ +/* + * Copyright (C) 2010 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package com.fr.design.utils.concurrent; + +import java.lang.Thread.UncaughtExceptionHandler; +import java.util.Locale; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicLong; + +/** + * A ThreadFactory builder, providing any combination of these features: + *
    + *
  • whether threads should be marked as {@linkplain Thread#setDaemon daemon} threads + *
  • a {@linkplain ThreadFactoryBuilder#setNameFormat naming format} + *
  • a {@linkplain Thread#setPriority thread priority} + *
  • an {@linkplain Thread#setUncaughtExceptionHandler uncaught exception handler} + *
  • a {@linkplain ThreadFactory#newThread backing thread factory} + *
+ *

If no backing thread factory is provided, a default backing thread factory is used as if by + * calling {@code setThreadFactory(}{@link Executors#defaultThreadFactory()}{@code )}. + * + * @author Kurt Alfred Kluever + * @since 4.0 + */ +public final class ThreadFactoryBuilder { + private String nameFormat = null; + private Boolean daemon = null; + private Integer priority = null; + private UncaughtExceptionHandler uncaughtExceptionHandler = null; + private ThreadFactory backingThreadFactory = null; + + /** + * Creates a new {@link ThreadFactory} builder. + */ + public ThreadFactoryBuilder() { + // 这个注释毫无意义,就是为了通过SonarQube + } + + /** + * Sets the naming format to use when naming threads ({@link Thread#setName}) which are created + * with this ThreadFactory. + * + * @param nameFormat a {@link String#format(String, Object...)}-compatible format String, to which + * a unique integer (0, 1, etc.) will be supplied as the single parameter. This integer will + * be unique to the built instance of the ThreadFactory and will be assigned sequentially. For + * example, {@code "rpc-pool-%d"} will generate thread names like {@code "rpc-pool-0"}, + * {@code "rpc-pool-1"}, {@code "rpc-pool-2"}, etc. + * @return this for the builder pattern + */ + public ThreadFactoryBuilder setNameFormat(String nameFormat) { + String unused = format(nameFormat, 0); // fail fast if the format is bad or null + this.nameFormat = nameFormat; + return this; + } + + /** + * Sets daemon or not for new threads created with this ThreadFactory. + * + * @param daemon whether or not new Threads created with this ThreadFactory will be daemon threads + * @return this for the builder pattern + */ + public ThreadFactoryBuilder setDaemon(boolean daemon) { + this.daemon = daemon; + return this; + } + + /** + * Sets the priority for new threads created with this ThreadFactory. + * + * @param priority the priority for new Threads created with this ThreadFactory + * @return this for the builder pattern + */ + public ThreadFactoryBuilder setPriority(int priority) { + // Thread#setPriority() already checks for validity. These error messages + // are nicer though and will fail-fast. + + if (priority < Thread.MIN_PRIORITY) { + throw new IllegalArgumentException(format("Thread priority (%s) must be >= %s", priority, Thread.MIN_PRIORITY)); + } + if (priority > Thread.MAX_PRIORITY) { + throw new IllegalArgumentException(format("Thread priority (%s) must be <= %s", priority, Thread.MAX_PRIORITY)); + } + this.priority = priority; + return this; + } + + /** + * Sets the {@link UncaughtExceptionHandler} for new threads created with this ThreadFactory. + * + * @param uncaughtExceptionHandler the uncaught exception handler for new Threads created with + * this ThreadFactory + * @return this for the builder pattern + */ + public ThreadFactoryBuilder setUncaughtExceptionHandler( + UncaughtExceptionHandler uncaughtExceptionHandler) { + if (uncaughtExceptionHandler == null) { + throw new NullPointerException(); + } + this.uncaughtExceptionHandler = uncaughtExceptionHandler; + return this; + } + + /** + * Sets the backing {@link ThreadFactory} for new threads created with this ThreadFactory. Threads + * will be created by invoking #newThread(Runnable) on this backing {@link ThreadFactory}. + * + * @param backingThreadFactory the backing {@link ThreadFactory} which will be delegated to during + * thread creation. + * @return this for the builder pattern + */ + public ThreadFactoryBuilder setThreadFactory(ThreadFactory backingThreadFactory) { + if (backingThreadFactory == null) { + throw new NullPointerException(); + } + this.backingThreadFactory = backingThreadFactory; + return this; + } + + /** + * Returns a new thread factory using the options supplied during the building process. After + * building, it is still possible to change the options used to build the ThreadFactory and/or + * build again. State is not shared amongst built instances. + * + * @return the fully constructed {@link ThreadFactory} + */ + public ThreadFactory build() { + return doBuild(this); + } + + // Split out so that the anonymous ThreadFactory can't contain a reference back to the builder. + // At least, I assume that's why. TODO(cpovirk): Check, and maybe add a test for this. + private static ThreadFactory doBuild(ThreadFactoryBuilder builder) { + final String nameFormat = builder.nameFormat; + final Boolean daemon = builder.daemon; + final Integer priority = builder.priority; + final UncaughtExceptionHandler uncaughtExceptionHandler = builder.uncaughtExceptionHandler; + final ThreadFactory backingThreadFactory = + (builder.backingThreadFactory != null) + ? builder.backingThreadFactory + : Executors.defaultThreadFactory(); + final AtomicLong count = (nameFormat != null) ? new AtomicLong(0) : null; + return new ThreadFactory() { + @Override + public Thread newThread(Runnable runnable) { + Thread thread = backingThreadFactory.newThread(runnable); + if (nameFormat != null) { + thread.setName(format(nameFormat, count.getAndIncrement())); + } + if (daemon != null) { + thread.setDaemon(daemon); + } + if (priority != null) { + thread.setPriority(priority); + } + if (uncaughtExceptionHandler != null) { + thread.setUncaughtExceptionHandler(uncaughtExceptionHandler); + } + return thread; + } + }; + } + + private static String format(String format, Object... args) { + return String.format(Locale.ROOT, format, args); + } +}