diff --git a/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java b/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java index d204f06..a628f50 100644 --- a/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java +++ b/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java @@ -44,6 +44,7 @@ import java.awt.event.WindowEvent; import java.io.*; import java.lang.instrument.Instrumentation; import java.lang.management.*; +import java.lang.reflect.InvocationTargetException; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.List; @@ -83,7 +84,7 @@ public class AxisInnovatorsBox { private final boolean isDebug; private static DebugWindow debugWindow; - private LoginData loginData; + private static LoginData loginData; public AxisInnovatorsBox(String[] args, boolean isDebug) { this.args = args; @@ -92,9 +93,12 @@ public class AxisInnovatorsBox { organizingCrashReports(throwable instanceof Exception ? (Exception) throwable : new Exception(throwable)); }); - + // 初始化,这里为了能够在登录窗口使用主题,特意将初始化放在构造函数中 + main.initLog4j2(); + main.setTopic(); // 加载登录信息,如果没有,弹出登录弹窗,后续可以删掉默认弹出 - // TODO: login window + // TODO: login window should not be show when AxisInnovatorsBox initialize, + // it should be show when user click login button. try { StateManager stateManager = new StateManager(); String token = stateManager.getState("loginToken"); @@ -107,22 +111,29 @@ public class AxisInnovatorsBox { } else if (loginResult.success()) { loginData = loginResult.loginData(); stateManager.saveState("loginToken", loginResult.token()); - logger.info("Login result: token: " + loginResult.token() + ", user: " + loginResult.user()); + logger.info( + "Login result: token: " + loginResult.token() + ", user: " + loginResult.user()); JOptionPane.showMessageDialog(null, "登录成功", "登录", JOptionPane.INFORMATION_MESSAGE); } else { // 登录失败,弹出错误提醒,这里只是输出登录错误信息 logger.error("Login error: " + loginResult.message()); - JOptionPane.showMessageDialog(null, "登录失败: \n" + loginResult.message(), "登录失败", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(null, "登录失败: \n" + loginResult.message(), "登录失败", + JOptionPane.ERROR_MESSAGE); } } else { CasdoorServer casdoorServer = new CasdoorServer(); User user = casdoorServer.parseJwtToken(token); loginData = new LoginData(token, user); } + } catch (InterruptedException e) { + logger.error("InterruptedException: Failed to load login information", e); + } catch (InvocationTargetException e) { + logger.error("InvocationTargetException: Failed to load login information", e); } catch (Exception e) { - logger.error("Failed to load login information", e); - } + logger.error("Exception: Failed to load login information", e); + } // 添加了更详细的异常处理 + } /** @@ -978,8 +989,6 @@ public class AxisInnovatorsBox { main = new AxisInnovatorsBox(args,isDebug); try { - main.initLog4j2(); - main.setTopic(); List> validFiles = ArgsParser.parseArgs(args); for (Map fileInfo : validFiles) { @@ -993,6 +1002,7 @@ public class AxisInnovatorsBox { } main.thread = new Thread(() -> { + try { // 主任务1:加载插件 logger.info("Loaded plugins Started"); diff --git a/src/main/java/com/axis/innovators/box/window/CasdoorLoginWindow.java b/src/main/java/com/axis/innovators/box/window/CasdoorLoginWindow.java index 70de0ca..3fbaab2 100644 --- a/src/main/java/com/axis/innovators/box/window/CasdoorLoginWindow.java +++ b/src/main/java/com/axis/innovators/box/window/CasdoorLoginWindow.java @@ -91,6 +91,37 @@ public class CasdoorLoginWindow { } private void initUI() { + if (browser == null) { + try { + // 初始化浏览器 + CefApp cefApp = CefAppManager.getInstance(); + CefClient client = cefApp.createClient(); + browser = client.createBrowser( + casdoorServer.getSigninUrl(), + false, + false); + } catch (Throwable e) { + logger.error("Failed to initialize CefBrowser", e); + // 浏览器初始化失败,弹出默认浏览器替代,并提示用户 + // 如果浏览器初始化失败,改为在默认浏览器打开登录页面 + openCasdoorLoginPageInDefaultBrowser(); + // JOptionPane.showMessageDialog(dialog, + // "浏览器初始化失败,已在默认浏览器打开登录页面,请手动完成登录。", + // "内嵌浏览器初始化失败", + // JOptionPane.WARNING_MESSAGE + // ); + String message = "浏览器初始化失败,已在默认浏览器打开登录页面,请手动完成登录。\n或者手动复制下面链接在浏览器打开进行登录:\n" + + casdoorServer.getSigninUrl(); + JTextArea textArea = new JTextArea(message); + textArea.setEditable(false); + textArea.setLineWrap(true); + textArea.setWrapStyleWord(true); + textArea.setBackground(null); + textArea.setSize(600, 400); + JOptionPane.showMessageDialog(dialog, new JScrollPane(textArea), "内嵌浏览器初始化失败", JOptionPane.WARNING_MESSAGE); + } + } + dialog = new JDialog(); dialog.setTitle("AXIS 认证"); dialog.setSize(500, 750); @@ -100,42 +131,40 @@ public class CasdoorLoginWindow { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); - JPanel buttonPanel = new JPanel(); - buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); + if (browser != null) { + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); - JButton backButton = new JButton(""); - backButton.setIcon(LoadIcon.loadIcon("back.png", 24)); - backButton.addActionListener(e -> browser.goBack()); - backButton.setFocusPainted(false); - backButton.setBorderPainted(false); - JButton forwardButton = new JButton(""); - forwardButton.setIcon(LoadIcon.loadIcon("forward.png", 24)); - forwardButton.addActionListener(e -> browser.goForward()); - forwardButton.setFocusPainted(false); - forwardButton.setBorderPainted(false); - JButton refreshButton = new JButton(""); - refreshButton.setIcon(LoadIcon.loadIcon("refresh.png", 24)); - refreshButton.addActionListener(e -> browser.reload()); - refreshButton.setFocusPainted(false); - refreshButton.setBorderPainted(false); - // 将按钮面板添加到主panel顶部 - buttonPanel.add(backButton); - buttonPanel.add(forwardButton); - buttonPanel.add(refreshButton); - panel.add(buttonPanel, 0); + JButton homeButton = new JButton(""); + homeButton.setIcon(LoadIcon.loadIcon("material-symbols-home.png", 24)); + homeButton.addActionListener(e -> browser.loadURL(casdoorServer.getSigninUrl())); + homeButton.setFocusPainted(false); + homeButton.setBorderPainted(false); + JButton backButton = new JButton(""); + backButton.setIcon(LoadIcon.loadIcon("material-symbols-back.png", 24)); + backButton.addActionListener(e -> browser.goBack()); + backButton.setFocusPainted(false); + backButton.setBorderPainted(false); + JButton forwardButton = new JButton(""); + forwardButton.setIcon(LoadIcon.loadIcon("material-symbols-forward.png", 24)); + forwardButton.addActionListener(e -> browser.goForward()); + forwardButton.setFocusPainted(false); + forwardButton.setBorderPainted(false); + JButton refreshButton = new JButton(""); + refreshButton.setIcon(LoadIcon.loadIcon("material-symbols-refresh.png", 24)); + refreshButton.addActionListener(e -> browser.reload()); + refreshButton.setFocusPainted(false); + refreshButton.setBorderPainted(false); + // 将按钮面板添加到主panel顶部 + buttonPanel.add(homeButton); + buttonPanel.add(backButton); + buttonPanel.add(forwardButton); + buttonPanel.add(refreshButton); + panel.add(buttonPanel, 0); - if (browser == null) { - // 初始化浏览器 - CefApp cefApp = CefAppManager.getInstance(); - CefClient client = cefApp.createClient(); - browser = client.createBrowser( - casdoorServer.getSigninUrl(), - false, - false); + panel.add(browser.getUIComponent()); } - - panel.add(browser.getUIComponent()); dialog.add(panel); dialog.addWindowListener(new java.awt.event.WindowAdapter() { @Override @@ -152,7 +181,9 @@ public class CasdoorLoginWindow { if (server == null) { startLocalCallbackServer(); } - browser.loadURL(casdoorServer.getSigninUrl()); + if (browser != null) { + browser.loadURL(casdoorServer.getSigninUrl()); + } } /** diff --git a/src/main/resources/icons/material-symbols-back.png b/src/main/resources/icons/material-symbols-back.png new file mode 100644 index 0000000..9503541 Binary files /dev/null and b/src/main/resources/icons/material-symbols-back.png differ diff --git a/src/main/resources/icons/material-symbols-forward.png b/src/main/resources/icons/material-symbols-forward.png new file mode 100644 index 0000000..e30aa63 Binary files /dev/null and b/src/main/resources/icons/material-symbols-forward.png differ diff --git a/src/main/resources/icons/material-symbols-home.png b/src/main/resources/icons/material-symbols-home.png new file mode 100644 index 0000000..b075c92 Binary files /dev/null and b/src/main/resources/icons/material-symbols-home.png differ diff --git a/src/main/resources/icons/material-symbols-refresh.png b/src/main/resources/icons/material-symbols-refresh.png new file mode 100644 index 0000000..9b968a3 Binary files /dev/null and b/src/main/resources/icons/material-symbols-refresh.png differ