From c76e955f7441e185067ca5cac7d2dd1269c6988b Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 4 Sep 2024 12:00:57 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-133276=20=20fbp=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=AE=8C=E5=85=A8=E5=88=A0=E9=99=A4jxbrowser=206.x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 - .../fr/design/extra/PluginOperateUtils.java | 2 - .../com/fr/design/jxbrowser/JxUIPane.java | 47 +- .../DesignerLoginBrowserExecutor.java | 30 - .../main/java/com/fr/design/ui/Assistant.java | 91 ---- .../com/fr/design/ui/EmbProtocolHandler.java | 135 ----- .../java/com/fr/design/ui/ModernUIPane.java | 364 ------------- .../fr/design/ui/compatible/BuilderDiff.java | 55 -- .../ui/compatible/ModernUIPaneFactory.java | 45 -- .../java/com/fr/design/upm/UpmBridge.java | 515 ------------------ .../java/com/fr/design/upm/UpmBridgeV7.java | 122 ++++- .../design/upm/exec/UpmBrowserExecutor.java | 30 - .../mini/bridge/ComposedNativeBridges.java | 4 - .../online/mini/bridge/NativeAuthBridge.java | 3 - .../mini/bridge/NativeBrowserBridge.java | 2 - .../mini/bridge/NativeProductBridge.java | 21 +- .../online/mini/bridge/NativeTaskBridge.java | 5 - .../mini/bridge/SafeJSFunctionInvoker.java | 22 +- 18 files changed, 118 insertions(+), 1380 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/login/executor/DesignerLoginBrowserExecutor.java delete mode 100644 designer-base/src/main/java/com/fr/design/ui/Assistant.java delete mode 100644 designer-base/src/main/java/com/fr/design/ui/EmbProtocolHandler.java delete mode 100644 designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java delete mode 100644 designer-base/src/main/java/com/fr/design/ui/compatible/BuilderDiff.java delete mode 100644 designer-base/src/main/java/com/fr/design/ui/compatible/ModernUIPaneFactory.java delete mode 100644 designer-base/src/main/java/com/fr/design/upm/UpmBridge.java delete mode 100644 designer-base/src/main/java/com/fr/design/upm/exec/UpmBrowserExecutor.java diff --git a/build.gradle b/build.gradle index caf39d3644..5e9743fd1f 100644 --- a/build.gradle +++ b/build.gradle @@ -95,7 +95,6 @@ allprojects { // messenger implementation 'com.fr.messenger:fine-messenger:' + carinaVersion implementation 'com.install4j:install4j-runtime:8.0.4' - implementation 'com.fr.third:jxbrowser:6.23' implementation "com.fr.third:jxbrowser-v7:${jxBrowserVersion}" implementation "com.fr.third:jxbrowser-swing-v7:${jxBrowserVersion}" implementation 'com.fr.third.server:servlet-api:3.0' @@ -131,18 +130,14 @@ allprojects { // 目前开发工程适配 mac_x64, mac_aarch64, windows_x64 if (OperatingSystem.current().isMacOsX() && "aarch64".equals(System.getProperty("os.arch"))) { dependencies { - // jxbrowser 6.23不支持M1,因此没有本地库,但是6.23jar还是需要留着,用来兼容 - implementation 'com.fr.third:jxbrowser-mac:6.23' implementation "com.fr.third:jxbrowser-mac-arm-v7:${jxBrowserVersion}" } } else if (OperatingSystem.current().isMacOsX()) { dependencies { - implementation 'com.fr.third:jxbrowser-mac:6.23' implementation "com.fr.third:jxbrowser-mac-v7:${jxBrowserVersion}" } } else if (OperatingSystem.current().isWindows()) { dependencies { - implementation 'com.fr.third:jxbrowser-win64:6.23' implementation "com.fr.third:jxbrowser-win64-v7:${jxBrowserVersion}" } } diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java b/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java index aa506e679f..89110cb256 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java @@ -30,13 +30,11 @@ import com.fr.plugin.view.PluginView; import com.fr.plugin.xml.PluginElementName; import com.fr.plugin.xml.PluginXmlElement; import com.fr.stable.StringUtils; -import com.teamdev.jxbrowser.chromium.JSArray; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import java.io.File; import java.net.HttpURLConnection; -import java.util.ArrayList; import java.util.List; diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java b/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java index 09718d0c5e..9aea89d465 100644 --- a/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java @@ -2,19 +2,17 @@ package com.fr.design.jxbrowser; import com.fr.concurrent.NamedThreadFactory; import com.fr.design.DesignerEnvManager; +import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.i18n.Toolkit; import com.fr.design.ui.ModernUIConstants; -import com.fr.design.ui.ModernUIPane; import com.fr.stable.StringUtils; import com.fr.stable.collections.combination.Pair; import com.fr.stable.os.OperatingSystem; import com.fr.web.struct.AssembleComponent; import com.teamdev.jxbrowser.browser.Browser; import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; -import com.teamdev.jxbrowser.chromium.events.LoadListener; -import com.teamdev.jxbrowser.chromium.events.ScriptContextListener; import com.teamdev.jxbrowser.event.Observer; import com.teamdev.jxbrowser.frame.Frame; import com.teamdev.jxbrowser.js.JsObject; @@ -50,7 +48,7 @@ import static com.fr.design.ui.ModernUIConstants.WINDOW; * @since 11.0 * Created on 2023-06-12 */ -public class JxUIPane extends ModernUIPane { +public class JxUIPane extends BasicPane { public static final ExecutorService DEFAULT_EXECUTOR = Executors.newSingleThreadExecutor(new NamedThreadFactory("jx-simple", true)); @@ -68,11 +66,9 @@ public class JxUIPane extends ModernUIPane { private JxEngine jxEngine = JxEngine.getInstance(); private JxUIPane() { - super(); } private JxUIPane(JxEngine jxEngine) { - super(); this.jxEngine = jxEngine; } @@ -155,7 +151,6 @@ public class JxUIPane extends ModernUIPane { * * @param url 新的地址 */ - @Override public void redirect(String url) { browser.navigation().loadUrl(encodeWindowsPath(url)); } @@ -166,7 +161,6 @@ public class JxUIPane extends ModernUIPane { * @param url 新的地址 * @param map 初始化参数 */ - @Override public void redirect(String url, Map map) { setMap(map); browser.navigation().loadUrl(encodeWindowsPath(url)); @@ -186,7 +180,11 @@ public class JxUIPane extends ModernUIPane { } - @Override + /** + * 更新数据到界面 + * + * @param t 数据类 + */ public void populate(final T t) { setInjectJsCallback(params -> { executeJsObject(params.frame(), WINDOW + DOT + namespace) @@ -195,7 +193,6 @@ public class JxUIPane extends ModernUIPane { }); } - @Override @Nullable public T update() { if (browser.mainFrame().isPresent()) { @@ -283,7 +280,7 @@ public class JxUIPane extends ModernUIPane { * * @param 参数 */ - public static class Builder extends ModernUIPane.Builder { + public static class Builder { private JxEngine jxEngine; private String namespace; private String variable; @@ -302,8 +299,6 @@ public class JxUIPane extends ModernUIPane { private String html; public Builder() { - // 为了兼容继承关系,但又不允许创建,用这个方式先处理一下 - super((ModernUIPane) null); this.jxEngine = JxEngine.getInstance(); this.namespace = DEFAULT_NAMESPACE; this.variable = DEFAULT_VARIABLE; @@ -342,24 +337,14 @@ public class JxUIPane extends ModernUIPane { return this; } - @Override - public Builder prepareForV6(ScriptContextListener contextListener) { - return this; - } - - @Override - public Builder prepareForV6(LoadListener loadListener) { - return this; - } - - @Override - public JxUIPane.Builder prepareForV7(InjectJsCallback callback) { - prepare(callback); - return this; - } - - @Override - public JxUIPane.Builder prepareForV7(Class event, Observer listener) { + /** + * 注册一个监听器 + * + * @param event 事件 + * @param listener 监听器 + * @return builder + */ + public JxUIPane.Builder prepare(Class event, Observer listener) { listenerPair = new Pair<>(event, listener); return this; } diff --git a/designer-base/src/main/java/com/fr/design/login/executor/DesignerLoginBrowserExecutor.java b/designer-base/src/main/java/com/fr/design/login/executor/DesignerLoginBrowserExecutor.java deleted file mode 100644 index fa7fa6487e..0000000000 --- a/designer-base/src/main/java/com/fr/design/login/executor/DesignerLoginBrowserExecutor.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fr.design.login.executor; - -import com.fr.design.bridge.exec.JSExecutor; -import com.teamdev.jxbrowser.chromium.JSFunction; -import com.teamdev.jxbrowser.chromium.JSObject; - -/** - * @author richie - * @version 10.0 - * Created by richie on 2019-04-18 - */ -public class DesignerLoginBrowserExecutor implements JSExecutor { - - public static DesignerLoginBrowserExecutor create(JSObject window, JSFunction callback) { - return new DesignerLoginBrowserExecutor(window, callback); - } - - private JSObject window; - private JSFunction callback; - - private DesignerLoginBrowserExecutor(JSObject window, JSFunction callback) { - this.window = window; - this.callback = callback; - } - - @Override - public void executor(String newValue) { - callback.invoke(window, newValue); - } -} diff --git a/designer-base/src/main/java/com/fr/design/ui/Assistant.java b/designer-base/src/main/java/com/fr/design/ui/Assistant.java deleted file mode 100644 index 7bbc17a80d..0000000000 --- a/designer-base/src/main/java/com/fr/design/ui/Assistant.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.fr.design.ui; - -import com.fr.stable.StringUtils; -import com.teamdev.jxbrowser.chromium.Browser; -import com.teamdev.jxbrowser.chromium.BrowserContext; -import com.teamdev.jxbrowser.chromium.BrowserPreferences; -import com.teamdev.jxbrowser.chromium.ProtocolService; -import com.teamdev.jxbrowser.chromium.URLResponse; - -import java.io.DataInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collections; -import java.util.List; - -/** - * @author richie - * @version 10.0 - * Created by richie on 2019-03-07 - */ -public class Assistant { - - public static void addChromiumSwitches(String... switches) { - - List list = BrowserPreferences.getChromiumSwitches(); - Collections.addAll(list, switches); - - BrowserPreferences.setChromiumSwitches((list.toArray(new String[0]))); - } - - public static URLResponse inputStream2Response(InputStream inputStream, String filePath) throws Exception { - URLResponse response = new URLResponse(); - DataInputStream stream = new DataInputStream(inputStream); - byte[] data = new byte[stream.available()]; - stream.readFully(data); - response.setData(data); - String mimeType = getMimeType(filePath); - response.getHeaders().setHeader("Content-Type", mimeType); - return response; - } - - - private static String getMimeType(String path) { - if (StringUtils.isBlank(path)) { - return "text/html"; - } - if (path.endsWith(".html")) { - return "text/html"; - } - if (path.endsWith(".css")) { - return "text/css"; - } - if (path.endsWith(".js")) { - return "text/javascript"; - } - if (path.endsWith(".svg")) { - return "image/svg+xml"; - } - // upm 文件夹中的图片如果返回 Content-type 为 image/png 时会显示异常 - if (path.endsWith(".png") && !path.contains("/upm")) { - return "image/png"; - } - if (path.endsWith(".woff")) { - return "font/woff"; - } - if (path.endsWith(".ttf")) { - return "truetype"; - } - if (path.endsWith(".eot")) { - return "embedded-opentype"; - } - - Path file = new File(path).toPath(); - try { - return Files.probeContentType(file); - } catch (IOException e) { - return "text/html"; - } - } - - public static void setEmbProtocolHandler(Browser browser, EmbProtocolHandler handler) { - BrowserContext browserContext = browser.getContext(); - ProtocolService protocolService = browserContext.getProtocolService(); - // 支持读取jar包中文件的自定义协议————emb:/com/fr/design/images/bbs.png - protocolService.setProtocolHandler("emb", handler); - protocolService.setProtocolHandler("file", handler); - } -} diff --git a/designer-base/src/main/java/com/fr/design/ui/EmbProtocolHandler.java b/designer-base/src/main/java/com/fr/design/ui/EmbProtocolHandler.java deleted file mode 100644 index b6bed69ca1..0000000000 --- a/designer-base/src/main/java/com/fr/design/ui/EmbProtocolHandler.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.fr.design.ui; - -import com.fr.base.TemplateUtils; -import com.fr.general.IOUtils; -import com.fr.log.FineLoggerFactory; -import com.fr.stable.EncodeConstants; -import com.fr.stable.StringUtils; -import com.fr.third.org.apache.commons.codec.net.URLCodec; -import com.fr.third.org.apache.commons.io.FileUtils; -import com.fr.third.org.apache.commons.io.FilenameUtils; -import com.fr.web.struct.AssembleComponent; -import com.fr.web.struct.AtomBuilder; -import com.fr.web.struct.PathGroup; -import com.fr.web.struct.category.ScriptPath; -import com.fr.web.struct.category.StylePath; -import com.teamdev.jxbrowser.chromium.ProtocolHandler; -import com.teamdev.jxbrowser.chromium.URLRequest; -import com.teamdev.jxbrowser.chromium.URLResponse; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.util.Map; - -/** - * @author richie - * @version 10.0 - * Created by richie on 2019-03-07 - */ -public class EmbProtocolHandler implements ProtocolHandler { - - private AssembleComponent component; - private Map map; - - public EmbProtocolHandler() { - - } - - public EmbProtocolHandler(AssembleComponent component) { - this.component = component; - } - - public EmbProtocolHandler(AssembleComponent component, Map map) { - this.component = component; - this.map = map; - } - - public EmbProtocolHandler(Map map) { - this.map = map; - } - - @Override - public URLResponse onRequest(URLRequest req) { - InputStream inputStream = null; - try { - String path = req.getURL(); - if (path.startsWith("file:")) { - String url = new URLCodec().decode(path); - String filePath = TemplateUtils.renderParameter4Tpl(url, map); - File file = new File(URI.create(filePath).getPath()); - inputStream = IOUtils.readResource(file.getAbsolutePath()); - String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); - text = TemplateUtils.renderParameter4Tpl(text, map); - return Assistant.inputStream2Response(new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)), path); - } else if (path.startsWith("emb:dynamic")) { - URLResponse response = new URLResponse(); - response.setData(htmlText(map).getBytes()); - response.getHeaders().setHeader("Content-Type", "text/html"); - return response; - } else { - int index = path.indexOf("="); - if (index > 0) { - path = path.substring(index + 1); - } else { - path = path.substring(4); - } - inputStream = IOUtils.readResource(path); - if (path.endsWith(".html")) { - String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); - text = TemplateUtils.renderParameter4Tpl(text, map); - return Assistant.inputStream2Response(new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)), path); - } - return Assistant.inputStream2Response(inputStream, path); - } - } catch (Exception e) { - FineLoggerFactory.getLogger().info(e.getMessage()); - } finally { - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - } - return null; - } - - private String htmlText(Map map) { - PathGroup pathGroup = AtomBuilder.create().buildAssembleFilePath(ModernRequestClient.KEY, component); - StylePath[] stylePaths = pathGroup.toStylePathGroup(); - StringBuilder styleText = new StringBuilder(); - for (StylePath path : stylePaths) { - if (StringUtils.isNotBlank(path.toFilePath())) { - styleText.append(""); - } - } - String result = ModernUIConstants.HTML_TPL.replaceAll("##style##", styleText.toString()); - ScriptPath[] scriptPaths = pathGroup.toScriptPathGroup(); - StringBuilder scriptText = new StringBuilder(); - for (ScriptPath path : scriptPaths) { - if (StringUtils.isNotBlank(path.toFilePath())) { - scriptText.append(""); - } - } - result = result.replaceAll("##script##", scriptText.toString()); - if (map != null) { - for (Map.Entry entry : map.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - result = result.replaceAll("\\$\\{" + key + "}", value); - } - } - return result; - } -} diff --git a/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java b/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java deleted file mode 100644 index f3aceb8476..0000000000 --- a/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java +++ /dev/null @@ -1,364 +0,0 @@ -package com.fr.design.ui; - -import com.fr.design.DesignerEnvManager; -import com.fr.design.dialog.BasicPane; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.itoolbar.UIToolbar; -import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.compatible.BuilderDiff; -import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.web.struct.AssembleComponent; -import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; -import com.teamdev.jxbrowser.chromium.Browser; -import com.teamdev.jxbrowser.chromium.BrowserType; -import com.teamdev.jxbrowser.chromium.JSValue; -import com.teamdev.jxbrowser.chromium.events.LoadListener; -import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; -import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; -import com.teamdev.jxbrowser.chromium.events.ScriptContextListener; -import com.teamdev.jxbrowser.chromium.swing.BrowserView; -import com.teamdev.jxbrowser.event.Observer; - -import javax.swing.JDialog; -import javax.swing.SwingUtilities; -import javax.swing.WindowConstants; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.util.Map; - -/** - * @author richie - * @version 10.0 - * Created by richie on 2019-03-04 - * 用于加载html5的Swing容器,可以在设计选项设置中打开调试窗口,示例可查看:com.fr.design.ui.ModernUIPaneTest - * @see {@link com.fr.design.jxbrowser.JxUIPane} - * @deprecated 主要用于jxbrowser6,将在下个版本删除 - */ -@Deprecated -public class ModernUIPane extends BasicPane { - - private Browser browser; - private String namespace = "Pool"; - private String variable = "data"; - private String expression = "update()"; - - private ModernUIPane(BrowserType browserType) { - initialize(browserType); - } - - protected ModernUIPane() { - - } - - private void initialize(BrowserType browserType) { - if (browser == null) { - setLayout(new BorderLayout()); - Assistant.addChromiumSwitches("--disable-google-traffic"); - if (DesignerEnvManager.getEnvManager().isOpenDebug()) { - UIToolbar toolbar = new UIToolbar(); - add(toolbar, BorderLayout.NORTH); - UIButton openDebugButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Open_Debug_Window")); - toolbar.add(openDebugButton); - UIButton reloadButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Reload")); - toolbar.add(reloadButton); - UIButton closeButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Close_Window")); - toolbar.add(closeButton); - - openDebugButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - showDebuggerDialog(); - } - }); - - reloadButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - browser.reloadIgnoringCache(); - } - }); - - closeButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - SwingUtilities.getWindowAncestor(ModernUIPane.this).setVisible(false); - } - }); - Assistant.addChromiumSwitches("--remote-debugging-port=9222"); - initializeBrowser(browserType); - add(new BrowserView(browser), BorderLayout.CENTER); - } else { - initializeBrowser(browserType); - add(new BrowserView(browser), BorderLayout.CENTER); - } - } - } - - private void showDebuggerDialog() { - JDialog dialog = new JDialog(SwingUtilities.getWindowAncestor(this)); - Browser debugger = new Browser(); - BrowserView debuggerView = new BrowserView(debugger); - dialog.add(debuggerView, BorderLayout.CENTER); - dialog.setSize(new Dimension(800, 400)); - GUICoreUtils.centerWindow(dialog); - dialog.setVisible(true); - dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - debugger.loadURL(browser.getRemoteDebuggingURL()); - } - - private void initializeBrowser(BrowserType browserType) { - browser = new Browser(browserType); - // 初始化的时候,就把命名空间对象初始化好,确保window.a.b.c("a.b.c"为命名空间)对象都是初始化过的 - browser.addScriptContextListener(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - event.getBrowser().executeJavaScript(String.format(ModernUIConstants.SCRIPT_INIT_NAME_SPACE, namespace)); - } - }); - } - - /** - * 转向一个新的地址,相当于重新加载 - * - * @param url 新的地址 - */ - public void redirect(String url) { - browser.loadURL(url); - } - - /** - * 转向一个新的地址,相当于重新加载 - * - * @param url 新的地址 - * @param map 初始化参数 - */ - public void redirect(String url, Map map) { - Assistant.setEmbProtocolHandler(browser, new EmbProtocolHandler(map)); - browser.loadURL(url); - } - - @Override - protected String title4PopupWindow() { - return "Modern"; - } - - - public void populate(final T t) { - browser.addScriptContextListener(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - JSValue ns = event.getBrowser().executeJavaScriptAndReturnValue("window." + namespace); - ns.asObject().setProperty(variable, t); - } - }); - } - - public T update() { - JSValue jsValue = browser.executeJavaScriptAndReturnValue("window." + namespace + "." + expression); - if (jsValue.isObject()) { - return (T) jsValue.asJavaObject(); - } - return null; - } - - public void disposeBrowser() { - - if (browser != null) { - browser.dispose(); - browser = null; - } - - } - - public void clearCache() { - if (browser != null) { - browser.getCacheStorage().clearCache(); - File file = new File(browser.getContext().getCacheDir()); - if (file.exists()) { - file.delete(); - } - } - } - - public void executeJavaScript(String javaScript) { - if (browser != null) { - browser.executeJavaScript(javaScript); - } - } - - public JSValue executeJavaScriptAndReturnValue(String javaScript) { - if (browser != null) { - return browser.executeJavaScriptAndReturnValue(javaScript); - } - return null; - } - - - /** - * ModernUIPane 建造者 - * - * @param - */ - public static class Builder implements BuilderDiff { - - private ModernUIPane pane; - - public Builder() { - this(BrowserType.HEAVYWEIGHT); - } - - public Builder(BrowserType browserType) { - this.pane = new ModernUIPane<>(browserType); - } - - public Builder(ModernUIPane pane) { - this.pane = pane; - } - - public Builder prepare(ScriptContextListener contextListener) { - pane.browser.addScriptContextListener(contextListener); - return this; - } - - public Builder prepare(LoadListener loadListener) { - pane.browser.addLoadListener(loadListener); - return this; - } - - /** - * 加载jar包中的资源 - * - * @param path 资源路径 - */ - public Builder withEMB(final String path) { - Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler()); - pane.browser.loadURL("emb:" + path); - return this; - } - - /** - * 加载jar包中的资源 - * - * @param path 资源路径 - */ - public Builder withEMB(final String path, Map map) { - Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(map)); - pane.browser.loadURL("emb:" + path); - return this; - } - - /** - * 加载url指向的资源 - * - * @param url 文件的地址 - */ - public Builder withURL(final String url) { - Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler()); - pane.browser.loadURL(url); - return this; - } - - /** - * 加载url指向的资源 - * - * @param url 文件的地址 - */ - public Builder withURL(final String url, Map map) { - Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(map)); - pane.browser.loadURL(url); - return this; - } - - /** - * 加载Atom组件 - * - * @param component Atom组件 - */ - public Builder withComponent(AssembleComponent component) { - Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(component)); - pane.browser.loadURL("emb:dynamic"); - return this; - } - - /** - * 加载Atom组件 - * - * @param component Atom组件 - */ - public Builder withComponent(AssembleComponent component, Map map) { - Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(component, map)); - pane.browser.loadURL("emb:dynamic"); - return this; - } - - /** - * 加载html文本内容 - * - * @param html 要加载html文本内容 - */ - public Builder withHTML(String html) { - Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler()); - pane.browser.loadHTML(html); - return this; - } - - /** - * 设置该前端页面做数据交换所使用的对象 - * - * @param namespace 对象名 - */ - public Builder namespace(String namespace) { - pane.namespace = namespace; - return this; - } - - /** - * java端往js端传数据时使用的变量名字 - * - * @param name 变量的名字 - */ - public Builder variable(String name) { - pane.variable = name; - return this; - } - - /** - * js端往java端传数据时执行的函数表达式 - * - * @param expression 函数表达式 - */ - public Builder expression(String expression) { - pane.expression = expression; - return this; - } - - @Override - public Builder prepareForV6(ScriptContextListener contextListener) { - return prepare(contextListener); - } - - @Override - public Builder prepareForV6(LoadListener loadListener) { - return prepare(loadListener); - } - - @Override - public Builder prepareForV7(InjectJsCallback callback) { - // do nothing - return this; - } - - @Override - public Builder prepareForV7(Class event, Observer listener) { - // do nothing - return this; - } - - public ModernUIPane build() { - return pane; - } - } -} diff --git a/designer-base/src/main/java/com/fr/design/ui/compatible/BuilderDiff.java b/designer-base/src/main/java/com/fr/design/ui/compatible/BuilderDiff.java deleted file mode 100644 index 99daa4555a..0000000000 --- a/designer-base/src/main/java/com/fr/design/ui/compatible/BuilderDiff.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fr.design.ui.compatible; - -import com.fr.design.jxbrowser.JxUIPane; -import com.fr.design.ui.ModernUIPane; -import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; -import com.teamdev.jxbrowser.chromium.events.LoadListener; -import com.teamdev.jxbrowser.chromium.events.ScriptContextListener; -import com.teamdev.jxbrowser.event.Observer; - -/** - * 封装jxbrwoser v6/v7的构建方式的差异 - * - * @author hades - * @see {@link JxUIPane} - * @since 10.0 - * Created on 2021/6/13 - * @deprecated 6在下个版本弃用 - */ -@Deprecated -public interface BuilderDiff { - - /** - * v6准备工作 - * - * @param contextListener 上下文监听器 - * @return 构造器 - */ - ModernUIPane.Builder prepareForV6(ScriptContextListener contextListener); - - /** - * v6准备工作 - * - * @param loadListener 加载监听器 - * @return 构造器 - */ - ModernUIPane.Builder prepareForV6(LoadListener loadListener); - - /** - * v7准备工作 - * - * @param callback 注入js回调器 - * @return 构造器 - */ - ModernUIPane.Builder prepareForV7(InjectJsCallback callback); - - /** - * v7准备工作 - * - * @param event 事件 - * @param listener 监听器 - * @return 构造器 - */ - ModernUIPane.Builder prepareForV7(Class event, Observer listener); - -} diff --git a/designer-base/src/main/java/com/fr/design/ui/compatible/ModernUIPaneFactory.java b/designer-base/src/main/java/com/fr/design/ui/compatible/ModernUIPaneFactory.java deleted file mode 100644 index 31774e90c9..0000000000 --- a/designer-base/src/main/java/com/fr/design/ui/compatible/ModernUIPaneFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.fr.design.ui.compatible; - -import com.fr.design.jxbrowser.JxUIPane; -import com.fr.design.ui.ModernUIPane; - -/** - * 根据版本选择构造器 - * - * @author hades - * @see {@link JxUIPane} - * @since 10.0 - * Created on 2021/6/13 - * @deprecated 6在下个版本弃用 - */ -public class ModernUIPaneFactory { - - /** - * 获取一个 JxBrowser pane 的构造器 - * - * @param 参数 - * @return 构造器 - */ - public static ModernUIPane.Builder modernUIPaneBuilder() { - if (isV7()) { - return new JxUIPane.Builder<>(); - } else { - return new ModernUIPane.Builder<>(); - } - } - - /** - * 判断 JxBrowser 版本是否在7或之上 - * - * @return 是否7或之上 - */ - public static boolean isV7() { - boolean jxBrowserV7 = true; - try { - Class.forName("com.teamdev.jxbrowser.net.Scheme"); - } catch (ClassNotFoundException e) { - jxBrowserV7 = false; - } - return jxBrowserV7; - } -} diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java b/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java deleted file mode 100644 index 980ac2c8a8..0000000000 --- a/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java +++ /dev/null @@ -1,515 +0,0 @@ -package com.fr.design.upm; - -import com.fr.config.ServerPreferenceConfig; -import com.fr.decision.webservice.v10.plugin.helper.category.impl.UpmResourceLoader; -import com.fr.design.DesignerEnvManager; -import com.fr.design.bridge.exec.JSBridge; -import com.fr.design.bridge.exec.JSCallback; -import com.fr.design.extra.PluginOperateUtils; -import com.fr.design.extra.PluginUtils; -import com.fr.design.extra.exe.GetInstalledPluginsExecutor; -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.gui.ifilechooser.FileChooserArgs; -import com.fr.design.gui.ifilechooser.FileChooserFactory; -import com.fr.design.gui.ifilechooser.FileChooserProvider; -import com.fr.design.gui.ifilechooser.FileSelectionMode; -import com.fr.design.i18n.Toolkit; -import com.fr.design.locale.impl.BbsRegisterMark; -import com.fr.design.locale.impl.BbsResetMark; -import com.fr.design.locale.impl.BbsSpaceMark; -import com.fr.design.login.utils.DesignerLoginUtils; -import com.fr.design.ui.util.UIUtil; -import com.fr.design.upm.event.DownloadEvent; -import com.fr.design.upm.exec.UpmBrowserExecutor; -import com.fr.design.upm.task.UpmTaskWorker; -import com.fr.design.utils.BrowseUtils; -import com.fr.event.EventDispatcher; -import com.fr.general.GeneralUtils; -import com.fr.general.locale.LocaleCenter; -import com.fr.general.locale.LocaleMark; -import com.fr.json.JSONObject; -import com.fr.log.FineLoggerFactory; -import com.fr.plugin.context.PluginMarker; -import com.fr.stable.ArrayUtils; -import com.fr.stable.StringUtils; -import com.teamdev.jxbrowser.chromium.Browser; -import com.teamdev.jxbrowser.chromium.JSArray; -import com.teamdev.jxbrowser.chromium.JSFunction; -import com.teamdev.jxbrowser.chromium.JSObject; - -import javax.swing.JFileChooser; -import javax.swing.SwingUtilities; -import javax.swing.SwingWorker; -import javax.swing.filechooser.FileNameExtensionFilter; -import java.awt.Desktop; -import java.io.File; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.FutureTask; -import java.util.concurrent.RunnableFuture; - -/** - * @author richie - * @version 10.0 - * Created by richie on 2019-04-12 - * 桥接Java和JavaScript的类 - * @deprecated 用于jxbrowser6,下版本删除 - */ -@Deprecated -public class UpmBridge { - - public static UpmBridge getBridge(Browser browser) { - return new UpmBridge(browser); - } - - private JSObject window; - - private UpmBridge(Browser browser) { - this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); - } - - protected UpmBridge() { - - } - - /** - * 更新插件管理中心资源文件,这个方法仅仅是为了语义上的作用(更新) - * - * @param callback 安装完成后的回调函数 - */ - @JSBridge - public void update(final JSFunction callback) { - callback.invoke(window, "start", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); - try { - UpmResourceLoader.INSTANCE.download(); - UpmResourceLoader.INSTANCE.install(); - callback.invoke(window, "success", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); - EventDispatcher.fire(DownloadEvent.UPDATE, "success"); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - callback.invoke(window, "error", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); - } - } - - /** - * 下载并安装插件管理中心的资源文件 - * - * @param callback 安装完成后的回调函数 - */ - @JSBridge - public void startDownload(final JSFunction callback) { - callback.invoke(window, "start", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); - new SwingWorker() { - @Override - protected Void doInBackground() throws Exception { - UpmResourceLoader.INSTANCE.download(); - UpmResourceLoader.INSTANCE.install(); - return null; - } - - @Override - protected void done() { - try { - get(); - callback.invoke(window, "success", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); - EventDispatcher.fire(DownloadEvent.SUCCESS, "success"); - } catch (Exception e) { - callback.invoke(window, "error", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); - FineLoggerFactory.getLogger().error(e.getMessage(), e); - EventDispatcher.fire(DownloadEvent.ERROR, "error"); - } - } - }.execute(); - } - - /** - * 获取upm的版本信息 - * - * @return 版本信息 - */ - @JSBridge - public String getVersion() { - return ServerPreferenceConfig.getInstance().getOptimizedUPMVersion(); - } - - @JSBridge - public String i18nText(String key) { - return Toolkit.i18nText(key); - } - - @JSBridge - public void closeWindow() { - UIUtil.invokeLaterIfNeeded(UpmFinder::closeWindow); - } - - - @JSBridge - public boolean isDesigner() { - return true; - } - - @JSBridge - public void getPackInfo(final JSFunction callback) { - callback.invoke(window, StringUtils.EMPTY); - } - - @JSBridge - public void getPluginPrefix(final JSFunction callback) { - UpmTaskWorker task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetPluginPrefixExecutor()); - task.execute(); - } - - /** - * 在线获取插件分类 - * - * @param callback 回调函数 - */ - @JSBridge - public void getPluginCategories(final JSFunction callback) { - UpmTaskWorker task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetPluginCategoriesExecutor()); - task.execute(); - } - - /** - * 根据条件获取在线插件 - * - * @param info 插件信息 - * @param callback 回调函数 - */ - @JSBridge - public void getPluginFromStoreNew(String info, final JSFunction callback) { - UpmTaskWorker task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetPluginFromStoreExecutor(new JSONObject(info))); - task.execute(); - } - - /** - * 已安装插件检查更新 - */ - @JSBridge - public void readUpdateOnline(final JSFunction callback) { - UpmTaskWorker task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new ReadUpdateOnlineExecutor()); - task.execute(); - } - - /** - * 获取已经安装的插件的数组 - */ - @JSBridge - public void getInstalledPlugins(final JSFunction callback) { - UpmTaskWorker task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetInstalledPluginsExecutor()); - task.execute(); - } - - /** - * 从插件服务器上更新选中的插件 - * - * @param pluginIDs 插件集合 - */ - @JSBridge - public void updatePluginOnline(Object pluginIDs, final JSFunction callback) { - JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); - List pluginMarkerList = new ArrayList<>(); - if (pluginIDs instanceof String) { - pluginMarkerList.add(PluginUtils.createPluginMarker(pluginIDs.toString())); - } else if (pluginIDs instanceof JSArray) { - JSArray pluginInfos = (JSArray) pluginIDs; - for (int i = 0, len = pluginInfos.length(); i < len; i++) { - String value = pluginInfos.get(i).asString().getValue(); - pluginMarkerList.add(PluginUtils.createPluginMarker(value)); - } - } - PluginOperateUtils.updatePluginOnline(pluginMarkerList, jsCallback); - } - - /** - * 搜索在线插件 - * - * @param keyword 关键字 - */ - @JSBridge - public void searchPlugin(String keyword, final JSFunction callback) { - UpmTaskWorker worker = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new SearchOnlineExecutor(keyword)); - worker.execute(); - } - - /** - * 从磁盘上选择插件安装包进行安装 - * - * @param filePath 插件包的路径 - */ - @JSBridge - public void installPluginFromDisk(final String filePath, final JSFunction callback) { - JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); - File file = new File(filePath); - PluginOperateUtils.installPluginFromDisk(file, jsCallback); - } - - /** - * 卸载当前选中的插件 - * - * @param pluginInfo 插件信息 - */ - @JSBridge - public void uninstallPlugin(final String pluginInfo, final boolean isForce, final JSFunction callback) { - JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); - PluginOperateUtils.uninstallPlugin(pluginInfo, isForce, jsCallback); - } - - /** - * 从插件服务器上安装插件 - * - * @param pluginInfo 插件的ID - * @param callback 回调函数 - */ - @JSBridge - public void installPluginOnline(final String pluginInfo, final JSFunction callback) { - JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); - PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); - PluginOperateUtils.installPluginOnline(pluginMarker, jsCallback); - } - - /** - * 从磁盘上选择插件安装包进行插件升级 - * - * @param filePath 插件包的路径 - */ - public void updatePluginFromDisk(String filePath, final JSFunction callback) { - JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); - File file = new File(filePath); - PluginOperateUtils.updatePluginFromDisk(file, jsCallback); - } - - /** - * 修改选中的插件的活跃状态 - * - * @param pluginID 插件ID - */ - @JSBridge - public void setPluginActive(String pluginID, final JSFunction callback) { - JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); - PluginOperateUtils.setPluginActive(pluginID, jsCallback); - } - - /** - * 批量修改选中的插件的活跃状态 - * - * @param pluginIDs 要处理的插件ID - * @param callback 回调函数 - */ - @JSBridge - public void setAllPluginActive(JSArray pluginIDs, final JSFunction callback) { - JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); - List list = new ArrayList<>(); - int len = pluginIDs.length(); - for (int i = 0; i < len; i++) { - list.add(pluginIDs.get(i).asString().getValue()); - } - PluginOperateUtils.setPluginActive(list, jsCallback); - } - - /** - * 选择文件对话框 - * - * @return 选择的文件的路径 - */ - @JSBridge - public String showFileChooser() { - return showFileChooserWithFilter(StringUtils.EMPTY, StringUtils.EMPTY); - } - - /** - * 选择文件对话框 - * - * @param des 过滤文件描述 - * @param filter 文件的后缀 - * @return 选择的文件的路径 - * 这里换用JFileChooser会卡死,不知道为什么 - */ - @JSBridge - public String showFileChooserWithFilter(final String des, final String filter) { - RunnableFuture future = new FutureTask<>(new Callable() { - @Override - public String call() { - FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser( - FileChooserArgs.newBuilder(). - setFileSelectionMode(FileSelectionMode.FILE). - setFilter(des, filter).build()); - int result = fileChooserProvider.showDialog(UpmFinder.getDialog()); - if (result == JFileChooser.APPROVE_OPTION) { - return fileChooserProvider.getSelectedFile().getAbsolutePath(); - } - return null; - } - }); - SwingUtilities.invokeLater(future); - try { - return future.get(); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - return null; - } - - /** - * 选择文件对话框 - * - * @param des 过滤文件描述 - * @param args 文件的后缀 - * @return 选择的文件的路径 - */ - @JSBridge - public String showFileChooserWithFilters(final String des, final Object args) { - RunnableFuture future = new FutureTask<>(new Callable() { - @Override - public String call() { - JFileChooser fileChooser = new JFileChooser(); - List filterList = new ArrayList<>(); - if (args instanceof String) { - filterList.add(GeneralUtils.objectToString(args)); - } else if (args instanceof JSArray) { - JSArray array = (JSArray) args; - for (int i = 0, len = array.length(); i < len; i++) { - filterList.add(array.get(i).getStringValue()); - } - } - String[] filters = filterList.toArray(new String[0]); - if (ArrayUtils.isNotEmpty(filters)) { - FileNameExtensionFilter filter = new FileNameExtensionFilter(des, UpmUtils.findMatchedExtension(filters)); - fileChooser.setFileFilter(filter); - } - int result = fileChooser.showOpenDialog(UpmFinder.getDialog()); - if (result == JFileChooser.APPROVE_OPTION) { - return fileChooser.getSelectedFile().getAbsolutePath(); - } - return null; - } - }); - SwingUtilities.invokeLater(future); - try { - return future.get(); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - return null; - } - - ////////登录相关/////// - - /** - * 获取系统登录的用户名 - */ - @JSBridge - public String getLoginInfo(final JSFunction callback) { - registerLoginInfo(callback); - return DesignerEnvManager.getEnvManager().getDesignerLoginUsername(); - } - - /** - * 系统登录注册 - * - * @param callback 回调函数 - */ - @JSBridge - public void registerLoginInfo(final JSFunction callback) { - JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); - String username = DesignerEnvManager.getEnvManager().getDesignerLoginUsername(); - if (StringUtils.isEmpty(username)) { - jsCallback.execute(StringUtils.EMPTY); - } else { - jsCallback.execute(username); - } - } - - - /** - * 设计器端的用户登录 - * - * @param username 用户名 - * @param password 密码 - * @param callback 回调函数 - */ - @JSBridge - public void defaultLogin(String username, String password, final JSFunction callback) { - UpmTaskWorker worker = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new PluginLoginExecutor(username, password)); - worker.execute(); - } - - /** - * 清除用户信息 - */ - @JSBridge - public void clearUserInfo() { - - } - - /** - * 打开论坛消息界面 - */ - @JSBridge - public void getPriviteMessage() { - try { - LocaleMark spaceMark = LocaleCenter.getMark(BbsSpaceMark.class); - String ssoUrl = DesignerLoginUtils.generateDesignerSSOUrl(spaceMark.getValue()); - BrowseUtils.browser(ssoUrl); - } catch (Exception exp) { - FineLoggerFactory.getLogger().info(exp.getMessage()); - } - } - - /** - * 忘记密码 - */ - @JSBridge - public void forgetHref() { - try { - LocaleMark resetMark = LocaleCenter.getMark(BbsResetMark.class); - Desktop.getDesktop().browse(new URI(resetMark.getValue())); - } catch (Exception e) { - FineLoggerFactory.getLogger().info(e.getMessage()); - } - } - - /** - * 立即注册 - */ - @JSBridge - public void registerHref() { - try { - LocaleMark registerMark = LocaleCenter.getMark(BbsRegisterMark.class); - Desktop.getDesktop().browse(new URI(registerMark.getValue())); - } catch (Exception e) { - FineLoggerFactory.getLogger().info(e.getMessage()); - } - } - - /** - * 使用系统浏览器打开网页 - * - * @param url 要打开的网页 - */ - @JSBridge - public void openShopUrlAtWebBrowser(String url) { - if (Desktop.isDesktopSupported()) { - try { - //创建一个URI实例,注意不是URL - URI uri = URI.create(url); - //获取当前系统桌面扩展 - Desktop desktop = Desktop.getDesktop(); - //判断系统桌面是否支持要执行的功能 - if (desktop.isSupported(Desktop.Action.BROWSE)) { - //获取系统默认浏览器打开链接 - desktop.browse(uri); - } - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - } -} diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmBridgeV7.java b/designer-base/src/main/java/com/fr/design/upm/UpmBridgeV7.java index f35ed11ac0..fe753fe3b5 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmBridgeV7.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmBridgeV7.java @@ -1,5 +1,6 @@ package com.fr.design.upm; +import com.fr.config.ServerPreferenceConfig; import com.fr.decision.webservice.v10.plugin.helper.category.impl.UpmResourceLoader; import com.fr.design.DesignerEnvManager; import com.fr.design.bridge.exec.JSBridge; @@ -13,13 +14,25 @@ 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.gui.ifilechooser.FileChooserArgs; +import com.fr.design.gui.ifilechooser.FileChooserFactory; +import com.fr.design.gui.ifilechooser.FileChooserProvider; +import com.fr.design.gui.ifilechooser.FileSelectionMode; import com.fr.design.i18n.Toolkit; +import com.fr.design.locale.impl.BbsRegisterMark; +import com.fr.design.locale.impl.BbsResetMark; +import com.fr.design.locale.impl.BbsSpaceMark; +import com.fr.design.login.utils.DesignerLoginUtils; +import com.fr.design.ui.util.UIUtil; import com.fr.design.upm.event.CertificateEvent; import com.fr.design.upm.event.DownloadEvent; import com.fr.design.upm.exec.NewUpmBrowserExecutor; import com.fr.design.upm.task.UpmTaskWorker; +import com.fr.design.utils.BrowseUtils; import com.fr.event.EventDispatcher; import com.fr.general.GeneralUtils; +import com.fr.general.locale.LocaleCenter; +import com.fr.general.locale.LocaleMark; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.plugin.context.PluginMarker; @@ -29,24 +42,29 @@ import com.teamdev.jxbrowser.js.JsAccessible; import com.teamdev.jxbrowser.js.JsFunction; import com.teamdev.jxbrowser.js.JsObject; import com.teamdev.jxbrowser.js.internal.JsArrayImpl; + import javax.swing.JFileChooser; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.filechooser.FileNameExtensionFilter; +import java.awt.Desktop; import java.io.File; +import java.net.URI; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; import java.util.concurrent.RunnableFuture; /** - * @author richie - * @version 10.0 - * Created by richie on 2019-04-12 * 桥接Java和JavaScript的类 + * + * @author richie + * @since 10.0 + * Created on 2019-04-12 */ @JsAccessible -public class UpmBridgeV7 extends UpmBridge { +public class UpmBridgeV7 { public static UpmBridgeV7 getBridge(JsObject jsObject) { return new UpmBridgeV7(jsObject); @@ -117,30 +135,40 @@ public class UpmBridgeV7 extends UpmBridge { */ @JSBridge @JsAccessible - @Override public String getVersion() { - return super.getVersion(); + return ServerPreferenceConfig.getInstance().getOptimizedUPMVersion(); } + /** + * 国际化 + * + * @param key 国际化key + * @return 国际化文本 + */ @JSBridge @JsAccessible - @Override public String i18nText(String key) { - return super.i18nText(key); + return Toolkit.i18nText(key); } + /** + * 关闭窗口 + */ @JSBridge @JsAccessible - @Override public void closeWindow() { - super.closeWindow(); + UIUtil.invokeLaterIfNeeded(UpmFinder::closeWindow); } + /** + * 是否设计器 + * + * @return 是否设计器 + */ @JSBridge @JsAccessible - @Override public boolean isDesigner() { - return super.isDesigner(); + return true; } @JSBridge @@ -326,9 +354,8 @@ public class UpmBridgeV7 extends UpmBridge { */ @JSBridge @JsAccessible - @Override public String showFileChooser() { - return super.showFileChooser(); + return showFileChooserWithFilter(StringUtils.EMPTY, StringUtils.EMPTY); } /** @@ -341,9 +368,28 @@ public class UpmBridgeV7 extends UpmBridge { */ @JSBridge @JsAccessible - @Override public String showFileChooserWithFilter(final String des, final String filter) { - return super.showFileChooserWithFilter(des, filter); + RunnableFuture future = new FutureTask<>(new Callable() { + @Override + public String call() { + FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser( + FileChooserArgs.newBuilder(). + setFileSelectionMode(FileSelectionMode.FILE). + setFilter(des, filter).build()); + int result = fileChooserProvider.showDialog(UpmFinder.getDialog()); + if (result == JFileChooser.APPROVE_OPTION) { + return fileChooserProvider.getSelectedFile().getAbsolutePath(); + } + return null; + } + }); + SwingUtilities.invokeLater(future); + try { + return future.get(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return null; } /** @@ -469,9 +515,7 @@ public class UpmBridgeV7 extends UpmBridge { */ @JsAccessible @JSBridge - @Override public void clearUserInfo() { - super.clearUserInfo(); } /** @@ -479,9 +523,14 @@ public class UpmBridgeV7 extends UpmBridge { */ @JSBridge @JsAccessible - @Override public void getPriviteMessage() { - super.getPriviteMessage(); + try { + LocaleMark spaceMark = LocaleCenter.getMark(BbsSpaceMark.class); + String ssoUrl = DesignerLoginUtils.generateDesignerSSOUrl(spaceMark.getValue()); + BrowseUtils.browser(ssoUrl); + } catch (Exception exp) { + FineLoggerFactory.getLogger().info(exp.getMessage()); + } } /** @@ -489,9 +538,13 @@ public class UpmBridgeV7 extends UpmBridge { */ @JSBridge @JsAccessible - @Override public void forgetHref() { - super.forgetHref(); + try { + LocaleMark resetMark = LocaleCenter.getMark(BbsResetMark.class); + Desktop.getDesktop().browse(new URI(resetMark.getValue())); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + } } /** @@ -499,9 +552,13 @@ public class UpmBridgeV7 extends UpmBridge { */ @JSBridge @JsAccessible - @Override public void registerHref() { - super.registerHref(); + try { + LocaleMark registerMark = LocaleCenter.getMark(BbsRegisterMark.class); + Desktop.getDesktop().browse(new URI(registerMark.getValue())); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + } } /** @@ -511,8 +568,21 @@ public class UpmBridgeV7 extends UpmBridge { */ @JSBridge @JsAccessible - @Override public void openShopUrlAtWebBrowser(String url) { - super.openShopUrlAtWebBrowser(url); + if (Desktop.isDesktopSupported()) { + try { + //创建一个URI实例,注意不是URL + URI uri = URI.create(url); + //获取当前系统桌面扩展 + Desktop desktop = Desktop.getDesktop(); + //判断系统桌面是否支持要执行的功能 + if (desktop.isSupported(Desktop.Action.BROWSE)) { + //获取系统默认浏览器打开链接 + desktop.browse(uri); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } } } diff --git a/designer-base/src/main/java/com/fr/design/upm/exec/UpmBrowserExecutor.java b/designer-base/src/main/java/com/fr/design/upm/exec/UpmBrowserExecutor.java deleted file mode 100644 index 572f7b5f23..0000000000 --- a/designer-base/src/main/java/com/fr/design/upm/exec/UpmBrowserExecutor.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fr.design.upm.exec; - -import com.fr.design.bridge.exec.JSExecutor; -import com.teamdev.jxbrowser.chromium.JSFunction; -import com.teamdev.jxbrowser.chromium.JSObject; - -/** - * @author richie - * @version 10.0 - * Created by richie on 2019-04-18 - */ -public class UpmBrowserExecutor implements JSExecutor { - - public static UpmBrowserExecutor create(JSObject window, JSFunction callback) { - return new UpmBrowserExecutor(window, callback); - } - - private JSObject window; - private JSFunction callback; - - private UpmBrowserExecutor(JSObject window, JSFunction callback) { - this.window = window; - this.callback = callback; - } - - @Override - public void executor(String newValue) { - callback.invoke(window, newValue); - } -} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/ComposedNativeBridges.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/ComposedNativeBridges.java index 3a09774c53..4f76ce2846 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/ComposedNativeBridges.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/ComposedNativeBridges.java @@ -1,6 +1,5 @@ package com.fr.design.mainframe.share.ui.online.mini.bridge; -import com.teamdev.jxbrowser.chromium.JSAccessible; import com.teamdev.jxbrowser.js.JsAccessible; /** @@ -9,15 +8,12 @@ import com.teamdev.jxbrowser.js.JsAccessible; * Created by Starryi on 2021/12/20 */ public class ComposedNativeBridges { - @JSAccessible @JsAccessible public final Object Browser; - @JSAccessible @JsAccessible public final Object Auth; - @JSAccessible @JsAccessible public final Object Product; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeAuthBridge.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeAuthBridge.java index 42f3a6c655..03f181c4ed 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeAuthBridge.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeAuthBridge.java @@ -5,7 +5,6 @@ import com.fr.design.bridge.exec.JSBridge; import com.fr.design.login.DesignerLoginHelper; import com.fr.design.login.DesignerLoginSource; import com.fr.design.mainframe.share.ui.online.mini.MiniComponentShopDialog; -import com.teamdev.jxbrowser.chromium.JSAccessible; import com.teamdev.jxbrowser.js.JsAccessible; import java.awt.Window; @@ -17,14 +16,12 @@ import java.util.HashMap; * Created by Starryi on 2021/12/20 */ public class NativeAuthBridge { - @JSAccessible @JsAccessible @JSBridge public String getLoginUsername() { return DesignerEnvManager.getEnvManager().getDesignerLoginUsername(); } - @JSAccessible @JsAccessible @JSBridge public void goLogin() { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeBrowserBridge.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeBrowserBridge.java index ee77a8b95a..0d0c823afa 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeBrowserBridge.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeBrowserBridge.java @@ -2,7 +2,6 @@ package com.fr.design.mainframe.share.ui.online.mini.bridge; import com.fr.design.bridge.exec.JSBridge; import com.fr.design.mainframe.share.ui.online.mini.MiniComponentShopDialog; -import com.teamdev.jxbrowser.chromium.JSAccessible; import com.teamdev.jxbrowser.js.JsAccessible; import java.awt.Window; @@ -14,7 +13,6 @@ import java.awt.Window; */ public class NativeBrowserBridge { - @JSAccessible @JsAccessible @JSBridge public void dispose() { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java index 4cb985b5af..8313329954 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java @@ -20,7 +20,6 @@ import com.fr.form.share.bean.OnlineShareWidget; import com.fr.form.share.group.DefaultShareGroupManager; import com.fr.json.JSONObject; import com.fr.stable.StringUtils; -import com.teamdev.jxbrowser.chromium.JSAccessible; import com.teamdev.jxbrowser.js.JsAccessible; import javax.swing.JOptionPane; @@ -55,13 +54,12 @@ public class NativeProductBridge { this.window = window; } - @JSAccessible @JsAccessible @JSBridge public boolean isProductDownloaded(String uuid) { for (Group group : DefaultShareGroupManager.getInstance().getAllGroup()) { SharableWidgetProvider[] widgetProviderList = group.getAllBindInfoList(); - for (SharableWidgetProvider widget: widgetProviderList) { + for (SharableWidgetProvider widget : widgetProviderList) { if (StringUtils.equals(uuid, widget.getId())) { return true; } @@ -70,7 +68,6 @@ public class NativeProductBridge { return false; } - @JSAccessible @JsAccessible @JSBridge public void addProductDownloadTaskStartListener(String json, Object function) { @@ -91,7 +88,6 @@ public class NativeProductBridge { } - @JSAccessible @JsAccessible @JSBridge public void removeProductDownloadTaskStartListener(String json, Object function) { @@ -110,7 +106,6 @@ public class NativeProductBridge { downloadTaskGetters.put(uuid, startListeners); } - @JSAccessible @JsAccessible @JSBridge public Object getExecutingProductDownloadTask(String json) { @@ -128,7 +123,6 @@ public class NativeProductBridge { return task; } - @JSAccessible @JsAccessible @JSBridge public Object createProductDownloadTask(String json) { @@ -155,7 +149,6 @@ public class NativeProductBridge { } } - @JSAccessible @JsAccessible @JSBridge public void addThemeDownloadTaskStartListener(String themePath, Object function) { @@ -167,7 +160,6 @@ public class NativeProductBridge { themeDownloadTaskStartListeners.put(themePath, startListeners); } - @JSAccessible @JsAccessible @JSBridge public void removeThemeDownloadTaskStartListener(String themePath, Object function) { @@ -179,7 +171,6 @@ public class NativeProductBridge { themeDownloadTaskStartListeners.put(themePath, startListeners); } - @JSAccessible @JsAccessible @JSBridge public Object getExecutingThemeDownloadTask(String themePath) { @@ -190,7 +181,6 @@ public class NativeProductBridge { return task; } - @JSAccessible @JsAccessible @JSBridge public Object createTemplateThemeDownloadTask(String themePath) { @@ -236,7 +226,6 @@ public class NativeProductBridge { }); } - @JSAccessible @JsAccessible @JSBridge @Override @@ -256,7 +245,7 @@ public class NativeProductBridge { "", FineJOptionPane.OK_CANCEL_OPTION ); - allowedDownload = result == JOptionPane.OK_OPTION; + allowedDownload = result == JOptionPane.OK_OPTION; } if (allowedDownload) { fireStartEvent(null); @@ -268,7 +257,6 @@ public class NativeProductBridge { }); } - @JSAccessible @JsAccessible @JSBridge @Override @@ -341,7 +329,6 @@ public class NativeProductBridge { }); } - @JSAccessible @JsAccessible @JSBridge @Override @@ -370,7 +357,6 @@ public class NativeProductBridge { }); } - @JSAccessible @JsAccessible @JSBridge @Override @@ -412,6 +398,7 @@ public class NativeProductBridge { private final NativeProductBridge env; private final String themePath; private final TemplateThemeInstallation action; + public TemplateThemeInstallationTask(NativeProductBridge env, Object window, String themePath) { super(window); this.env = env; @@ -436,7 +423,6 @@ public class NativeProductBridge { }); } - @JSAccessible @JsAccessible @JSBridge @Override @@ -454,7 +440,6 @@ public class NativeProductBridge { }); } - @JSAccessible @JsAccessible @JSBridge @Override diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java index 2929a35408..1b013d06b8 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java @@ -3,7 +3,6 @@ package com.fr.design.mainframe.share.ui.online.mini.bridge; import com.fr.design.bridge.exec.JSBridge; import com.fr.design.mainframe.share.mini.MiniShopNativeTask; import com.fr.design.mainframe.share.mini.MiniShopNativeTaskManager; -import com.teamdev.jxbrowser.chromium.JSAccessible; import com.teamdev.jxbrowser.js.JsAccessible; import java.util.HashSet; @@ -32,21 +31,18 @@ public class NativeTaskBridge implements MiniShopNativeTask { } @JSBridge - @JSAccessible @JsAccessible public void addStatusCallback(Object cb) { this.statusCbs.add(cb); } @JSBridge - @JSAccessible @JsAccessible public void removeStatusCallback(Object cb) { this.statusCbs.remove(cb); } @JSBridge - @JSAccessible @JsAccessible @Override public void execute() { @@ -56,7 +52,6 @@ public class NativeTaskBridge implements MiniShopNativeTask { } @JSBridge - @JSAccessible @JsAccessible @Override public void cancel() { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/SafeJSFunctionInvoker.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/SafeJSFunctionInvoker.java index e5bf71da87..31ae0477a5 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/SafeJSFunctionInvoker.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/SafeJSFunctionInvoker.java @@ -1,7 +1,5 @@ package com.fr.design.mainframe.share.ui.online.mini.bridge; -import com.teamdev.jxbrowser.chromium.JSFunction; -import com.teamdev.jxbrowser.chromium.JSObject; import com.teamdev.jxbrowser.js.JsFunction; import com.teamdev.jxbrowser.js.JsObject; @@ -16,29 +14,15 @@ public class SafeJSFunctionInvoker { public static void invoke(Collection functions, Object instance, Object... args) { if (functions != null) { - for (Object function: functions) { + for (Object function : functions) { invoke(function, instance, args); } } } public static void invoke(Object function, Object instance, Object... args) { - if (function != null) { - if (function instanceof JSFunction && instance instanceof JSObject) { - invokeV6((JSFunction) function, (JSObject) instance, args); - } else if (function instanceof JsFunction && instance instanceof JsObject) { - invokeV7((JsFunction) function, (JsObject) instance, args); - } - } - } - - private static void invokeV6(JSFunction function, JSObject instance, Object... args) { - if (!function.getContext().isDisposed()) { - function.invoke(instance, args); + if (function instanceof JsFunction && instance instanceof JsObject) { + ((JsFunction) function).invoke((JsObject) instance, args); } } - - private static void invokeV7(JsFunction function, JsObject instance, Object... args) { - function.invoke(instance, args); - } }