From 97d28ac6d24a52e4e36bae5b1cabc4bc120c05ff Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com.> Date: Wed, 11 Dec 2024 21:54:05 +0000 Subject: [PATCH] Windows UI .exe --- .github/workflows/releaseArtifacts.yml | 58 ++- .gitignore | 1 + build.gradle | 28 +- .../software/SPDF/SPdfApplication.java | 65 ++-- .../stirling/software/SPDF/UI/WebBrowser.java | 7 + .../software/SPDF/UI/impl/DesktopBrowser.java | 358 ++++++++++++++++++ .../software/SPDF/UI/impl/LoadingWindow.java | 115 ++++++ .../SPDF/config/EndpointConfiguration.java | 3 + .../config/security/InitialSecuritySetup.java | 1 - 9 files changed, 597 insertions(+), 39 deletions(-) create mode 100644 src/main/java/stirling/software/SPDF/UI/WebBrowser.java create mode 100644 src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java create mode 100644 src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java diff --git a/.github/workflows/releaseArtifacts.yml b/.github/workflows/releaseArtifacts.yml index 8adfa0fe..9d34d3fa 100644 --- a/.github/workflows/releaseArtifacts.yml +++ b/.github/workflows/releaseArtifacts.yml @@ -35,6 +35,7 @@ jobs: run: ./gradlew clean createExe env: DOCKER_ENABLE_SECURITY: ${{ matrix.enable_security }} + STIRLING_PDF_DESKTOP_UI: false - name: Get version number id: versionNumber @@ -42,13 +43,13 @@ jobs: - name: Rename binarie if: matrix.file_suffix != '' - run: cp ./build/launch4j/Stirling-PDF.exe ./build/launch4j/Stirling-PDF${{ matrix.file_suffix }}.exe + run: cp ./build/launch4j/Stirling-PDF.exe ./build/launch4j/Stirling-PDF-Server${{ matrix.file_suffix }}.exe - name: Upload Assets binarie uses: actions/upload-artifact@v4 with: - path: ./build/launch4j/Stirling-PDF${{ matrix.file_suffix }}.exe - name: Stirling-PDF${{ matrix.file_suffix }}.exe + path: ./build/launch4j/Stirling-PDF-Server${{ matrix.file_suffix }}.exe + name: Stirling-PDF-Server${{ matrix.file_suffix }}.exe overwrite: true retention-days: 1 if-no-files-found: error @@ -58,13 +59,13 @@ jobs: files: ./build/launch4j/Stirling-PDF${{ matrix.file_suffix }}.exe - name: Rename jar binaries - run: cp ./build/libs/Stirling-PDF-${{ steps.versionNumber.outputs.versionNumber }}.jar ./build/libs/Stirling-PDF${{ matrix.file_suffix }}.jar + run: cp ./build/libs/Stirling-PDF-${{ steps.versionNumber.outputs.versionNumber }}.jar ./build/libs/Stirling-PDF-Server${{ matrix.file_suffix }}.jar - name: Upload Assets jar binaries uses: actions/upload-artifact@v4 with: - path: ./build/libs/Stirling-PDF${{ matrix.file_suffix }}.jar - name: Stirling-PDF${{ matrix.file_suffix }}.jar + path: ./build/libs/Stirling-PDF-Server${{ matrix.file_suffix }}.jar + name: Stirling-PDF-Server${{ matrix.file_suffix }}.jar overwrite: true retention-days: 1 if-no-files-found: error @@ -72,4 +73,47 @@ jobs: - name: Upload jar binaries to release uses: softprops/action-gh-release@v2 with: - files: ./build/libs/Stirling-PDF${{ matrix.file_suffix }}.jar + files: ./build/libs/Stirling-PDF-Server${{ matrix.file_suffix }}.jar + + + push-ui: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "temurin" + + - uses: gradle/actions/setup-gradle@v4 + with: + gradle-version: 8.7 + + - name: Generate exe + run: ./gradlew clean createExe + env: + DOCKER_ENABLE_SECURITY: false + STIRLING_PDF_DESKTOP_UI: true + + - name: Get version number + id: versionNumber + run: echo "versionNumber=$(./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT + + - name: Rename binarie + run: cp ./build/launch4j/Stirling-PDF.exe ./build/launch4j/Stirling-PDF.exe + + - name: Upload Assets binarie + uses: actions/upload-artifact@v4 + with: + path: ./build/launch4j/Stirling-PDF.exe + name: Stirling-PDF.exe + overwrite: true + retention-days: 1 + if-no-files-found: error + + - name: Upload binaries to release + uses: softprops/action-gh-release@v2 + with: + files: ./build/launch4j/Stirling-PDF.exe diff --git a/.gitignore b/.gitignore index b0bbfb9d..a79a2712 100644 --- a/.gitignore +++ b/.gitignore @@ -161,3 +161,4 @@ out/ .pytest_cache .ipynb_checkpoints +**/jcef-bundle/ \ No newline at end of file diff --git a/build.gradle b/build.gradle index eb9c3c92..6034b9f9 100644 --- a/build.gradle +++ b/build.gradle @@ -32,6 +32,9 @@ version = "0.36.0" java { // 17 is lowest but we support and recommend 21 sourceCompatibility = JavaVersion.VERSION_17 + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } } repositories { @@ -41,6 +44,10 @@ repositories { maven { url 'https://build.shibboleth.net/maven/releases' } + maven { url "https://build.shibboleth.net/maven/releases" } + // Add Maven repository for JCEF + maven { url "https://maven.pkg.github.com/jcefmaven/jcefmaven" } + } licenseReport { @@ -64,6 +71,12 @@ sourceSets { exclude "stirling/software/SPDF/model/User.java" exclude "stirling/software/SPDF/repository/**" } + + if (System.getenv("STIRLING_PDF_DESKTOP_UI") == "false") { + exclude "stirling/software/SPDF/UI/impl/**" + } + + } } } @@ -78,12 +91,16 @@ launch4j { icon = "${projectDir}/src/main/resources/static/favicon.ico" outfile="Stirling-PDF.exe" - headerType="console" + if(System.getenv("STIRLING_PDF_DESKTOP_UI") == 'true') { + headerType = "gui" + } else { + headerType = "console" + } jarTask = tasks.bootJar errTitle="Encountered error, Do you have Java 21?" downloadUrl="https://download.oracle.com/java/21/latest/jdk-21_windows-x64_bin.exe" - variables=["BROWSER_OPEN=true"] + variables=["BROWSER_OPEN=true", "STIRLING_PDF_DESKTOP_UI=true"] jreMinVersion="17" mutexName="Stirling-PDF" @@ -123,6 +140,13 @@ configurations.all { exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat" } dependencies { + + if (System.getenv("STIRLING_PDF_DESKTOP_UI") != "false") { + implementation "me.friwi:jcefmaven:127.3.1" + implementation "org.openjfx:javafx-controls:21" + implementation "org.openjfx:javafx-swing:21" + } + //security updates implementation "org.springframework:spring-webmvc:6.2.0" diff --git a/src/main/java/stirling/software/SPDF/SPdfApplication.java b/src/main/java/stirling/software/SPDF/SPdfApplication.java index eddf7306..191086a4 100644 --- a/src/main/java/stirling/software/SPDF/SPdfApplication.java +++ b/src/main/java/stirling/software/SPDF/SPdfApplication.java @@ -1,5 +1,6 @@ package stirling.software.SPDF; +import java.awt.*; import java.io.IOException; import java.net.ServerSocket; import java.nio.file.Files; @@ -8,6 +9,9 @@ import java.nio.file.Paths; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Properties; + +import javax.swing.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,14 +22,16 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.env.Environment; import org.springframework.scheduling.annotation.EnableScheduling; -import io.github.pixee.security.SystemCommand; - import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import lombok.extern.slf4j.Slf4j; +import stirling.software.SPDF.UI.WebBrowser; import stirling.software.SPDF.config.ConfigInitializer; import stirling.software.SPDF.model.ApplicationProperties; @SpringBootApplication @EnableScheduling +@Slf4j public class SPdfApplication { private static final Logger logger = LoggerFactory.getLogger(SPdfApplication.class); @@ -67,36 +73,12 @@ public class SPdfApplication { } } - @PostConstruct - public void init() { - baseUrlStatic = this.baseUrl; - // Check if the BROWSER_OPEN environment variable is set to true - String browserOpenEnv = env.getProperty("BROWSER_OPEN"); - boolean browserOpen = browserOpenEnv != null && "true".equalsIgnoreCase(browserOpenEnv); - if (browserOpen) { - try { - String url = baseUrl + ":" + getStaticPort(); - - String os = System.getProperty("os.name").toLowerCase(); - Runtime rt = Runtime.getRuntime(); - if (os.contains("win")) { - // For Windows - SystemCommand.runCommand(rt, "rundll32 url.dll,FileProtocolHandler " + url); - } else if (os.contains("mac")) { - SystemCommand.runCommand(rt, "open " + url); - } else if (os.contains("nix") || os.contains("nux")) { - SystemCommand.runCommand(rt, "xdg-open " + url); - } - } catch (Exception e) { - logger.error("Error opening browser: {}", e.getMessage()); - } - } - logger.info("Running configs {}", applicationProperties.toString()); - } - public static void main(String[] args) throws IOException, InterruptedException { + System.setProperty("java.awt.headless", "false"); + SpringApplication app = new SpringApplication(SPdfApplication.class); + app.setHeadless(false); app.setAdditionalProfiles("default"); app.addInitializers(new ConfigInitializer()); Map propertyFiles = new HashMap<>(); @@ -128,6 +110,11 @@ public class SPdfApplication { propertyFiles.get("spring.config.additional-location"))); } + Properties props = new Properties(); + props.put("java.awt.headless", "false"); + props.put("spring.main.web-application-type", "servlet"); + app.setDefaultProperties(props); + app.run(args); // Ensure directories are created @@ -147,6 +134,26 @@ public class SPdfApplication { logger.info("Navigate to {}", url); } + @Autowired(required = false) + private WebBrowser webBrowser; + + @PostConstruct + public void init() { + baseUrlStatic = this.baseUrl; + String url = baseUrl + ":" + getStaticPort(); + if (webBrowser != null && "true".equals(System.getenv("STIRLING_PDF_DESKTOP_UI"))) { + + webBrowser.initWebUI(url); + } + } + + @PreDestroy + public void cleanup() { + if (webBrowser != null) { + webBrowser.cleanup(); + } + } + public static String getStaticBaseUrl() { return baseUrlStatic; } diff --git a/src/main/java/stirling/software/SPDF/UI/WebBrowser.java b/src/main/java/stirling/software/SPDF/UI/WebBrowser.java new file mode 100644 index 00000000..b884888f --- /dev/null +++ b/src/main/java/stirling/software/SPDF/UI/WebBrowser.java @@ -0,0 +1,7 @@ +package stirling.software.SPDF.UI; + +public interface WebBrowser { + void initWebUI(String url); + + void cleanup(); +} diff --git a/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java b/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java new file mode 100644 index 00000000..835c36a9 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java @@ -0,0 +1,358 @@ +package stirling.software.SPDF.UI.impl; + +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.Frame; +import java.awt.Image; +import java.awt.MenuItem; +import java.awt.PopupMenu; +import java.awt.SystemTray; +import java.awt.TrayIcon; +import java.awt.event.WindowEvent; +import java.awt.event.WindowStateListener; +import java.io.File; +import java.io.InputStream; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; + +import javax.imageio.ImageIO; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.Timer; + +import org.cef.CefApp; +import org.cef.CefClient; +import org.cef.CefSettings; +import org.cef.browser.CefBrowser; +import org.cef.callback.CefBeforeDownloadCallback; +import org.cef.callback.CefDownloadItem; +import org.cef.callback.CefDownloadItemCallback; +import org.cef.handler.CefDownloadHandlerAdapter; +import org.cef.handler.CefLoadHandlerAdapter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +import jakarta.annotation.PreDestroy; +import lombok.extern.slf4j.Slf4j; +import me.friwi.jcefmaven.CefAppBuilder; +import me.friwi.jcefmaven.EnumProgress; +import me.friwi.jcefmaven.MavenCefAppHandlerAdapter; +import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler; +import stirling.software.SPDF.UI.WebBrowser; + +@Component +@Slf4j +@ConditionalOnProperty( + name = "STIRLING_PDF_DESKTOP_UI", + havingValue = "true", + matchIfMissing = false) +public class DesktopBrowser implements WebBrowser { + private static CefApp cefApp; + private static CefClient client; + private static CefBrowser browser; + private static JFrame frame; + private static LoadingWindow loadingWindow; + private static volatile boolean browserInitialized = false; + private static TrayIcon trayIcon; + private static SystemTray systemTray; + + public DesktopBrowser() { + SwingUtilities.invokeLater( + () -> { + loadingWindow = new LoadingWindow(null, "Initializing..."); + loadingWindow.setVisible(true); + }); + } + + public void initWebUI(String url) { + CompletableFuture.runAsync( + () -> { + try { + CefAppBuilder builder = new CefAppBuilder(); + configureCefSettings(builder); + + builder.setProgressHandler(createProgressHandler()); + + // Build and initialize CEF + cefApp = builder.build(); + client = cefApp.createClient(); + + // Set up download handler + setupDownloadHandler(); + + // Create browser and frame on EDT + SwingUtilities.invokeAndWait( + () -> { + browser = client.createBrowser(url, false, false); + setupMainFrame(); + setupLoadHandler(); + + // Show the frame immediately but transparent + frame.setVisible(true); + }); + + } catch (Exception e) { + log.error("Error initializing JCEF browser: ", e); + cleanup(); + } + }); + } + + private void configureCefSettings(CefAppBuilder builder) { + CefSettings settings = builder.getCefSettings(); + settings.cache_path = new File("jcef-bundle").getAbsolutePath(); + settings.root_cache_path = new File("jcef-bundle").getAbsolutePath(); + settings.persist_session_cookies = true; + settings.windowless_rendering_enabled = false; + settings.log_severity = CefSettings.LogSeverity.LOGSEVERITY_INFO; + + builder.setAppHandler( + new MavenCefAppHandlerAdapter() { + @Override + public void stateHasChanged(org.cef.CefApp.CefAppState state) { + log.info("CEF state changed: " + state); + if (state == CefApp.CefAppState.TERMINATED) { + System.exit(0); + } + } + }); + } + + private void setupDownloadHandler() { + client.addDownloadHandler( + new CefDownloadHandlerAdapter() { + @Override + public boolean onBeforeDownload( + CefBrowser browser, + CefDownloadItem downloadItem, + String suggestedName, + CefBeforeDownloadCallback callback) { + callback.Continue("", true); + return true; + } + + @Override + public void onDownloadUpdated( + CefBrowser browser, + CefDownloadItem downloadItem, + CefDownloadItemCallback callback) { + if (downloadItem.isComplete()) { + log.info("Download completed: " + downloadItem.getFullPath()); + } else if (downloadItem.isCanceled()) { + log.info("Download canceled: " + downloadItem.getFullPath()); + } + } + }); + } + + private ConsoleProgressHandler createProgressHandler() { + return new ConsoleProgressHandler() { + @Override + public void handleProgress(EnumProgress state, float percent) { + Objects.requireNonNull(state, "state cannot be null"); + SwingUtilities.invokeLater( + () -> { + if (loadingWindow != null) { + switch (state) { + case LOCATING: + loadingWindow.setStatus("Locating Chromium..."); + loadingWindow.setProgress(0); + break; + case DOWNLOADING: + if (percent >= 0) { + loadingWindow.setStatus( + String.format( + "Downloading Chromium: %.0f%%", + percent)); + loadingWindow.setProgress((int) percent); + } + break; + case EXTRACTING: + loadingWindow.setStatus("Extracting Chromium..."); + loadingWindow.setProgress(60); + break; + case INITIALIZING: + loadingWindow.setStatus("Initializing browser..."); + loadingWindow.setProgress(80); + break; + case INITIALIZED: + loadingWindow.setStatus("Finalising startup..."); + loadingWindow.setProgress(90); + break; + } + } + }); + } + }; + } + + private void setupMainFrame() { + frame = new JFrame("Stirling-PDF"); + frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + frame.setUndecorated(true); + frame.setOpacity(0.0f); + + JPanel contentPane = new JPanel(new BorderLayout()); + contentPane.setDoubleBuffered(true); + contentPane.add(browser.getUIComponent(), BorderLayout.CENTER); + frame.setContentPane(contentPane); + + frame.addWindowListener( + new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent windowEvent) { + cleanup(); + System.exit(0); + } + }); + + frame.setSize(1280, 768); + frame.setLocationRelativeTo(null); + + loadIcon(); + } + + private void setupLoadHandler() { + client.addLoadHandler( + new CefLoadHandlerAdapter() { + @Override + public void onLoadingStateChange( + CefBrowser browser, + boolean isLoading, + boolean canGoBack, + boolean canGoForward) { + log.info("Loading state changed: " + isLoading); + if (!isLoading && !browserInitialized) { + browserInitialized = true; + SwingUtilities.invokeLater( + () -> { + if (loadingWindow != null) { + Timer timer = + new Timer( + 500, + e -> { + loadingWindow.dispose(); + loadingWindow = null; + + frame.dispose(); + frame.setOpacity(1.0f); + frame.setUndecorated(false); + frame.pack(); + frame.setSize(1280, 800); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + frame.requestFocus(); + frame.toFront(); + browser.getUIComponent() + .requestFocus(); + }); + timer.setRepeats(false); + timer.start(); + } + }); + } + } + }); + } + + private void setupTrayIcon(Image icon) { + if (!SystemTray.isSupported()) { + log.warn("System tray is not supported"); + return; + } + + try { + systemTray = SystemTray.getSystemTray(); + + // Create popup menu + PopupMenu popup = new PopupMenu(); + + // Create menu items + MenuItem showItem = new MenuItem("Show"); + showItem.addActionListener( + e -> { + frame.setVisible(true); + frame.setState(Frame.NORMAL); + }); + + MenuItem exitItem = new MenuItem("Exit"); + exitItem.addActionListener( + e -> { + cleanup(); + System.exit(0); + }); + + // Add menu items to popup menu + popup.add(showItem); + popup.addSeparator(); + popup.add(exitItem); + + // Create tray icon + trayIcon = new TrayIcon(icon, "Stirling-PDF", popup); + trayIcon.setImageAutoSize(true); + + // Add double-click behavior + trayIcon.addActionListener( + e -> { + frame.setVisible(true); + frame.setState(Frame.NORMAL); + }); + + // Add tray icon to system tray + systemTray.add(trayIcon); + + // Modify frame behavior to minimize to tray + frame.addWindowStateListener( + new WindowStateListener() { + public void windowStateChanged(WindowEvent e) { + if (e.getNewState() == Frame.ICONIFIED) { + frame.setVisible(false); + } + } + }); + + } catch (AWTException e) { + log.error("Error setting up system tray icon", e); + } + } + + private void loadIcon() { + try { + Image icon = null; + String[] iconPaths = {"/static/favicon.ico"}; + + for (String path : iconPaths) { + if (icon != null) break; + try { + try (InputStream is = getClass().getResourceAsStream(path)) { + if (is != null) { + icon = ImageIO.read(is); + break; + } + } + } catch (Exception e) { + log.debug("Could not load icon from " + path, e); + } + } + + if (icon != null) { + frame.setIconImage(icon); + setupTrayIcon(icon); + log.info("Successfully set frame icon"); + } else { + log.warn("Could not load icon from any source"); + } + } catch (Exception e) { + log.error("Error loading icon", e); + } + } + + @PreDestroy + public void cleanup() { + if (browser != null) browser.close(true); + if (client != null) client.dispose(); + if (cefApp != null) cefApp.dispose(); + if (loadingWindow != null) loadingWindow.dispose(); + } +} diff --git a/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java b/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java new file mode 100644 index 00000000..87b253f8 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java @@ -0,0 +1,115 @@ +package stirling.software.SPDF.UI.impl; + +import java.awt.*; +import java.io.InputStream; + +import javax.imageio.ImageIO; +import javax.swing.*; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class LoadingWindow extends JDialog { + private final JProgressBar progressBar; + private final JLabel statusLabel; + private final JPanel mainPanel; + private final JLabel brandLabel; + + public LoadingWindow(Frame parent, String initialUrl) { + super(parent, "Initializing Stirling-PDF", true); + + // Initialize components + mainPanel = new JPanel(); + mainPanel.setBackground(Color.WHITE); + mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 30, 20, 30)); + mainPanel.setLayout(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + + // Configure GridBagConstraints + gbc.gridwidth = GridBagConstraints.REMAINDER; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.insets = new Insets(5, 5, 5, 5); + gbc.weightx = 1.0; // Add horizontal weight + gbc.weighty = 0.0; // Add vertical weight + + // Add icon + try { + try (InputStream is = getClass().getResourceAsStream("/static/favicon.ico")) { + if (is != null) { + Image img = ImageIO.read(is); + if (img != null) { + Image scaledImg = img.getScaledInstance(48, 48, Image.SCALE_SMOOTH); + JLabel iconLabel = new JLabel(new ImageIcon(scaledImg)); + iconLabel.setHorizontalAlignment(SwingConstants.CENTER); + gbc.gridy = 0; + mainPanel.add(iconLabel, gbc); + } + } + } + } catch (Exception e) { + log.error("Failed to load icon", e); + } + // URL Label with explicit size + brandLabel = new JLabel(initialUrl); + brandLabel.setHorizontalAlignment(SwingConstants.CENTER); + brandLabel.setPreferredSize(new Dimension(300, 25)); + brandLabel.setText("Stirling-PDF"); + gbc.gridy = 1; + mainPanel.add(brandLabel, gbc); + + // Status label with explicit size + statusLabel = new JLabel("Initializing..."); + statusLabel.setHorizontalAlignment(SwingConstants.CENTER); + statusLabel.setPreferredSize(new Dimension(300, 25)); + gbc.gridy = 2; + mainPanel.add(statusLabel, gbc); + // Progress bar with explicit size + progressBar = new JProgressBar(0, 100); + progressBar.setStringPainted(true); + progressBar.setPreferredSize(new Dimension(300, 25)); + gbc.gridy = 3; + mainPanel.add(progressBar, gbc); + + // Set dialog properties + setContentPane(mainPanel); + setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); + setResizable(false); + setUndecorated(false); + + // Set size and position + setSize(400, 200); + setLocationRelativeTo(parent); + setAlwaysOnTop(true); + setProgress(0); + setStatus("Starting..."); + } + + public void setProgress(final int progress) { + SwingUtilities.invokeLater( + () -> { + try { + progressBar.setValue(Math.min(Math.max(progress, 0), 100)); + progressBar.setString(progress + "%"); + log.info(progress + "%"); + mainPanel.revalidate(); + mainPanel.repaint(); + } catch (Exception e) { + log.error("Error updating progress", e); + } + }); + } + + public void setStatus(final String status) { + log.info(status); + SwingUtilities.invokeLater( + () -> { + try { + statusLabel.setText(status != null ? status : ""); + mainPanel.revalidate(); + mainPanel.repaint(); + } catch (Exception e) { + log.error("Error updating status", e); + } + }); + } +} diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index 3ce6f2bb..c144007b 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -260,6 +260,9 @@ public class EndpointConfiguration { // Pdftohtml dependent endpoints addEndpointToGroup("Pdftohtml", "pdf-to-html"); + + // disabled for now while we resolve issues + disableEndpoint("pdf-to-pdfa"); } private void processEnvironmentConfigs() { diff --git a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java index 2fcebcad..3291021c 100644 --- a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java +++ b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java @@ -76,6 +76,5 @@ public class InitialSecuritySetup { log.info("Internal API user created: " + Role.INTERNAL_API_USER.getRoleId()); } userService.syncCustomApiUser(applicationProperties.getSecurity().getCustomGlobalAPIKey()); - System.out.println(applicationProperties.getSecurity().getCustomGlobalAPIKey()); } }