From 0dfdf66a8964c860a1343c52fb13b4bb85275050 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 9 Nov 2017 14:59:58 +0800 Subject: [PATCH 1/4] =?UTF-8?q?REPORT-5518=20[9.0=E4=B8=89=E8=BD=AE?= =?UTF-8?q?=E5=9B=9E=E5=BD=92]jdk1.7=E7=9A=84=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E8=B5=B7=E4=B8=8D=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/bbs/UserInfoLabel.java | 45 +++++++++++---- designer/src/com/fr/start/Designer.java | 41 +++++++++++--- .../com/fr/design/extra/LoginWebBridge.java | 2 +- .../com/fr/design/extra/PluginWebBridge.java | 19 +++++-- .../com/fr/design/extra/ShopManagerPane.java | 6 +- .../com/fr/design/extra/WebViewDlgHelper.java | 56 +++++++++++++------ 6 files changed, 126 insertions(+), 43 deletions(-) diff --git a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java index c1dd4c8763..2af6adc625 100644 --- a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java +++ b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java @@ -7,7 +7,11 @@ import com.fr.base.ConfigManager; import com.fr.base.FRContext; import com.fr.design.DesignerEnvManager; import com.fr.design.bbs.BBSLoginUtils; -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; @@ -18,17 +22,28 @@ import com.fr.general.DateUtils; import com.fr.general.Inter; import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; -import com.fr.stable.*; - -import javax.swing.*; -import java.awt.*; +import com.fr.stable.EncodeConstants; +import com.fr.stable.OperatingSystem; +import com.fr.stable.StringUtils; +import net.sf.ehcache.util.NamedThreadFactory; + +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.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * @author neil @@ -104,8 +119,12 @@ public class UserInfoLabel extends UILabel { * showBBSDialog 弹出BBS资讯框 */ public static void showBBSDialog() { - Thread showBBSThread = new Thread(new Runnable() { - + ThreadFactory namedThread = new NamedThreadFactory("bbs-dlg"); + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( + 1, 1, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue(1), namedThread); + threadPoolExecutor.execute(new Runnable() { @Override public void run() { // vito:最新mac10.12和javafx弹出框初始化时会有大几率卡死在native方法,这里先屏蔽一下。 @@ -127,18 +146,20 @@ 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) { } } }); - showBBSThread.start(); } private void sleep(long millis) { diff --git a/designer/src/com/fr/start/Designer.java b/designer/src/com/fr/start/Designer.java index 7f1a7b8cb6..71808c2b0f 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.alphafine.component.AlphaFinePane; import com.fr.design.mainframe.bbs.UserInfoLabel; import com.fr.design.mainframe.bbs.UserInfoPane; @@ -37,16 +42,24 @@ import com.fr.general.Inter; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; -import com.fr.stable.web.ServletContext; import com.fr.stable.xml.XMLTools; +import net.sf.ehcache.util.NamedThreadFactory; -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.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; public class Designer extends BaseDesigner { private static final int TOOLBARPANEVGAP = -4; @@ -147,6 +160,7 @@ public class Designer extends BaseDesigner { private JPanel generateEmptyGap(final int width) { JPanel panel = new JPanel() { + @Override public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); dim.width = width; @@ -163,6 +177,7 @@ public class Designer extends BaseDesigner { * * @return 按钮 */ + @Override public UIButton[] createUp() { return new UIButton[]{createSaveButton(), createUndoButton(), createRedoButton()}; } @@ -218,10 +233,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); } @@ -296,6 +313,7 @@ public class Designer extends BaseDesigner { * @param plus 对象 * @return 更新后的toolbar */ + @Override public JComponent resetToolBar(JComponent toolbarComponent, ToolBarMenuDockPlus plus) { //如果是处于权限编辑状态 if (BaseUtils.isAuthorityEditing()) { @@ -339,6 +357,7 @@ public class Designer extends BaseDesigner { * * @return 面板组件 */ + @Override public Component createBBSLoginPane() { if (userInfoPane == null) { userInfoPane = new UserInfoPane(); @@ -351,11 +370,13 @@ public class Designer extends BaseDesigner { * * @return 面板组件 */ + @Override public Component createAlphaFinePane() { return AlphaFinePane.getAlphaFinePane(); } + @Override protected SplashPane createSplashPane() { return new ReportSplashPane(); } @@ -363,6 +384,7 @@ public class Designer extends BaseDesigner { /** * 收集用户信息吗 */ + @Override protected void collectUserInformation() { //定制的就不弹出来了 if (!ComparatorUtils.equals(ProductConstants.APP_NAME, ProductConstants.DEFAULT_APP_NAME)) { @@ -395,14 +417,18 @@ public class Designer extends BaseDesigner { int status = envManager.getActiveKeyStatus(); //没有联网验证过 if (status != 0) { - Thread authThread = new Thread(new Runnable() { - + ThreadFactory namedThread = new NamedThreadFactory("net-verify"); + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( + 1, 1, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue(1), + namedThread); + threadPoolExecutor.execute(new Runnable() { @Override public void run() { ActiveKeyGenerator.onLineVerify(key); } }); - authThread.start(); } } @@ -443,6 +469,7 @@ public class Designer extends BaseDesigner { /** * 设计器退出时, 做的一些操作. */ + @Override public void shutDown() { InformationCollector collector = InformationCollector.getInstance(); collector.collectStopTime(); diff --git a/designer_base/src/com/fr/design/extra/LoginWebBridge.java b/designer_base/src/com/fr/design/extra/LoginWebBridge.java index eef13830e4..7d002572c3 100644 --- a/designer_base/src/com/fr/design/extra/LoginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/LoginWebBridge.java @@ -92,7 +92,7 @@ public class LoginWebBridge { return messageCount; } - public void setQqDialog(UIDialog qqDialog) { + public void setQQDialog(UIDialog qqDialog) { closeQQWindow(); this.qqDialog = qqDialog; } diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 8f40280b1f..3de329f26a 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -27,7 +27,9 @@ import javafx.concurrent.Task; import javafx.scene.web.WebEngine; import javafx.stage.FileChooser; import javafx.stage.Stage; +import net.sf.ehcache.util.NamedThreadFactory; import netscape.javascript.JSObject; + import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; @@ -41,25 +43,34 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * 开放给Web组件的接口,用于安装,卸载,更新以及更改插件可用状态 */ public class PluginWebBridge { + private static final String PREFIX = "pluginbridge-pool"; + private static final String ACTION = "action"; + private static final String KEYWORD = "keyword"; + private static final int COREPOOLSIZE = 3; + private static final int MAXPOOLSIZE = 5; private static PluginWebBridge helper; private UIDialog uiDialog; private ACTIONS action; - private String ACTION = "action"; - private String KEYWORD = "keyword"; + private Map config; private WebEngine webEngine; private UILabel uiLabel; - private ExecutorService threadPoolExecutor = Executors.newSingleThreadExecutor(); + private ExecutorService threadPoolExecutor = new ThreadPoolExecutor(COREPOOLSIZE, MAXPOOLSIZE, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue(COREPOOLSIZE), + new NamedThreadFactory(PREFIX)); /** * 动作枚举 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 c394e75197..30de87974b 100644 --- a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java @@ -17,23 +17,28 @@ import com.fr.plugin.PluginVerifyException; import com.fr.stable.EnvChangedListener; 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.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; +import java.lang.reflect.Constructor; import java.net.HttpURLConnection; import java.util.concurrent.ExecutionException; /** - * Created by vito on 2016/9/28. + * 在合适的 jre 环境下创建带有 WebView 的窗口 + * + * @author vito + * @date 2016/9/28 */ public class WebViewDlgHelper { private static final String LATEST = "latest"; private static final String SHOP_SCRIPTS = "shop_scripts"; private static final int VERSION_8 = 8; - // 调试时,使用installHome = ClassLoader.getSystemResource("").getPath()代替下面 private static String installHome = FRContext.getCurrentEnv().getWebReportPath(); private static final int BYTES_NUM = 1024; @@ -146,24 +151,43 @@ 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) { + } } 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) { + } } private static void showLoginDlg() { - LoginWebPane webPane = new LoginWebPane(installHome); - 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(installHome); + + UIDialog qqdlg = new LoginDialog(DesignerContext.getDesignerFrame(), webPane); + LoginWebBridge.getHelper().setDialogHandle(qqdlg); + qqdlg.setVisible(true); + } catch (Throwable ignored) { + } } private static Component initTraditionalStore() { From 01e46659d8b778b09a0d0b28a6bb994cf592d36d Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 9 Nov 2017 16:20:48 +0800 Subject: [PATCH 2/4] =?UTF-8?q?refact:=20=E5=A2=9E=E5=8A=A0ThreadFactoryBu?= =?UTF-8?q?ilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/bbs/UserInfoLabel.java | 7 +- designer/src/com/fr/start/Designer.java | 7 +- .../com/fr/design/extra/PluginWebBridge.java | 8 +- .../concurrent/ThreadFactoryBuilder.java | 177 ++++++++++++++++++ 4 files changed, 189 insertions(+), 10 deletions(-) create mode 100644 designer_base/src/com/fr/design/utils/concurrent/ThreadFactoryBuilder.java diff --git a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java index 2af6adc625..c985fc6e5d 100644 --- a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java +++ b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java @@ -16,6 +16,7 @@ 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; @@ -25,7 +26,6 @@ import com.fr.general.http.HttpClient; import com.fr.stable.EncodeConstants; import com.fr.stable.OperatingSystem; import com.fr.stable.StringUtils; -import net.sf.ehcache.util.NamedThreadFactory; import javax.swing.SwingConstants; import java.awt.Cursor; @@ -119,11 +119,12 @@ public class UserInfoLabel extends UILabel { * showBBSDialog 弹出BBS资讯框 */ public static void showBBSDialog() { - ThreadFactory namedThread = new NamedThreadFactory("bbs-dlg"); + ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() + .setNameFormat("bbs-dlg-thread-%s").build(); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, - new LinkedBlockingQueue(1), namedThread); + new LinkedBlockingQueue(1), namedThreadFactory); threadPoolExecutor.execute(new Runnable() { @Override public void run() { diff --git a/designer/src/com/fr/start/Designer.java b/designer/src/com/fr/start/Designer.java index 71808c2b0f..2f484553a0 100644 --- a/designer/src/com/fr/start/Designer.java +++ b/designer/src/com/fr/start/Designer.java @@ -36,6 +36,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; @@ -43,7 +44,6 @@ import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLTools; -import net.sf.ehcache.util.NamedThreadFactory; import javax.swing.JComponent; import javax.swing.JPanel; @@ -417,12 +417,13 @@ public class Designer extends BaseDesigner { int status = envManager.getActiveKeyStatus(); //没有联网验证过 if (status != 0) { - ThreadFactory namedThread = new NamedThreadFactory("net-verify"); + ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() + .setNameFormat("net-verify-thread-%s").build(); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(1), - namedThread); + namedThreadFactory); threadPoolExecutor.execute(new Runnable() { @Override public void run() { diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 3de329f26a..fed3c6855d 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -7,12 +7,13 @@ import com.fr.design.bbs.BBSLoginUtils; import com.fr.design.dialog.UIDialog; import com.fr.design.extra.exe.GetPluginCategoriesExecutor; import com.fr.design.extra.exe.GetPluginFromStoreExecutor; +import com.fr.design.extra.exe.GetPluginPrefixExecutor; import com.fr.design.extra.exe.PluginLoginExecutor; import com.fr.design.extra.exe.ReadUpdateOnlineExecutor; import com.fr.design.extra.exe.SearchOnlineExecutor; import com.fr.design.extra.exe.callback.JSCallback; -import com.fr.design.extra.exe.GetPluginPrefixExecutor; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.utils.concurrent.ThreadFactoryBuilder; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.general.SiteCenter; @@ -27,7 +28,6 @@ import javafx.concurrent.Task; import javafx.scene.web.WebEngine; import javafx.stage.FileChooser; import javafx.stage.Stage; -import net.sf.ehcache.util.NamedThreadFactory; import netscape.javascript.JSObject; import javax.swing.JDialog; @@ -51,7 +51,7 @@ import java.util.concurrent.TimeUnit; * 开放给Web组件的接口,用于安装,卸载,更新以及更改插件可用状态 */ public class PluginWebBridge { - private static final String PREFIX = "pluginbridge-pool"; + private static final String THREAD_NAME_TEMPLATE = "pluginbridge-thread-%s"; private static final String ACTION = "action"; private static final String KEYWORD = "keyword"; private static final int COREPOOLSIZE = 3; @@ -70,7 +70,7 @@ public class PluginWebBridge { private ExecutorService threadPoolExecutor = new ThreadPoolExecutor(COREPOOLSIZE, MAXPOOLSIZE, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(COREPOOLSIZE), - new NamedThreadFactory(PREFIX)); + new ThreadFactoryBuilder().setNameFormat(THREAD_NAME_TEMPLATE).build()); /** * 动作枚举 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..d7d2393e84 --- /dev/null +++ b/designer_base/src/com/fr/design/utils/concurrent/ThreadFactoryBuilder.java @@ -0,0 +1,177 @@ +/* + * 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() { + } + + /** + * 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); + } +} From aa3e7e1ce9e4dbbfc96e208ee8e67afefdad3c5f Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 10 Nov 2017 15:04:24 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20SonarQube?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer_base/src/com/fr/design/extra/LoginWebBridge.java | 6 +++--- designer_base/src/com/fr/design/extra/WebViewDlgHelper.java | 4 ++++ .../fr/design/utils/concurrent/ThreadFactoryBuilder.java | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/LoginWebBridge.java b/designer_base/src/com/fr/design/extra/LoginWebBridge.java index 7d002572c3..f946a7cc60 100644 --- a/designer_base/src/com/fr/design/extra/LoginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/LoginWebBridge.java @@ -63,7 +63,7 @@ public class LoginWebBridge { private UILabel uiLabel; private WebEngine webEngine; - public LoginWebBridge() { + private LoginWebBridge() { } public static LoginWebBridge getHelper() { @@ -298,13 +298,13 @@ public class LoginWebBridge { closeQQWindow(); try { Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("QQ_binding"))); - } catch (Exception exp) { + } catch (Exception ignored) { + // ignored } } } catch (Exception e) { FRContext.getLogger().error(e.getMessage()); } - } public void openUrlAtLocalWebBrowser(WebEngine eng, String url) { diff --git a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java index 30de87974b..16eb611921 100644 --- a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java @@ -160,6 +160,7 @@ public class WebViewDlgHelper { LoginWebBridge.getHelper().setQQDialog(qqLoginDialog); qqLoginDialog.setVisible(true); } catch (Throwable ignored) { + // ignored } } @@ -174,6 +175,7 @@ public class WebViewDlgHelper { PluginWebBridge.getHelper().setDialogHandle(dlg); dlg.setVisible(true); } catch (Throwable ignored) { + // ignored } } @@ -187,6 +189,7 @@ public class WebViewDlgHelper { LoginWebBridge.getHelper().setDialogHandle(qqdlg); qqdlg.setVisible(true); } catch (Throwable ignored) { + // ignored } } @@ -207,6 +210,7 @@ public class WebViewDlgHelper { PluginUtils.downloadShopScripts(scriptsId, new Process() { @Override public void process(Double integer) { + // 这个注释毫无意义,就是为了通过SonarQube } }); } 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 index d7d2393e84..3af213ac9e 100644 --- a/designer_base/src/com/fr/design/utils/concurrent/ThreadFactoryBuilder.java +++ b/designer_base/src/com/fr/design/utils/concurrent/ThreadFactoryBuilder.java @@ -45,6 +45,7 @@ public final class ThreadFactoryBuilder { * Creates a new {@link ThreadFactory} builder. */ public ThreadFactoryBuilder() { + // 这个注释毫无意义,就是为了通过SonarQube } /** From fba3595d78074ec212b7f56d25e2d86ab8b05194 Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 10 Nov 2017 15:10:14 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20SonarQube?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/fr/design/mainframe/bbs/UserInfoLabel.java | 5 +++++ designer_base/src/com/fr/design/extra/LoginWebBridge.java | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java index c985fc6e5d..940bc9b4f1 100644 --- a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java +++ b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java @@ -87,6 +87,10 @@ public class UserInfoLabel extends UILabel { } public UserInfoLabel(UserInfoPane userInfoPane) { + init(userInfoPane); + } + + private void init(UserInfoPane userInfoPane) { this.userInfoPane = userInfoPane; String userName = ConfigManager.getProviderInstance().getBbsUsername(); @@ -158,6 +162,7 @@ public class UserInfoLabel extends UILabel { showWindow.invoke(instance, SiteCenter.getInstance().acquireUrlByKind("bbs.popup")); DesignerEnvManager.getEnvManager().setLastShowBBSNewsTime(DateUtils.DATEFORMAT2.format(new Date())); } catch (Throwable ignored) { + // ignored } } }); diff --git a/designer_base/src/com/fr/design/extra/LoginWebBridge.java b/designer_base/src/com/fr/design/extra/LoginWebBridge.java index f946a7cc60..330b9fc033 100644 --- a/designer_base/src/com/fr/design/extra/LoginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/LoginWebBridge.java @@ -8,6 +8,7 @@ import com.fr.design.extra.exe.PluginLoginExecutor; 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.json.JSONObject; @@ -282,9 +283,9 @@ public class LoginWebBridge { try { JSONObject jo = new 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()); closeQQWindow(); loginSuccess(username); @@ -293,7 +294,7 @@ public class LoginWebBridge { list.add(username); list.add(StringUtils.EMPTY); BBSLoginUtils.bbsLogin(list); - } else if (status.equals(LOGIN_FAILED)) { + } else if (ComparatorUtils.equals(status, LOGIN_FAILED)) { //账号没有QQ授权 closeQQWindow(); try {