Working multi RCP platform
[lgpl/argeo-commons.git] / swt / rcp / org.argeo.cms.swt.rcp / src / org / argeo / cms / ui / rcp / CmsRcpDisplayFactory.java
index 63a1fd84ebb76ce6dc7f9da3d9d924e807871143..96de08e10d6c5caedf23da78f819aa67567fe42f 100644 (file)
@@ -2,12 +2,15 @@ package org.argeo.cms.ui.rcp;
 
 import java.lang.System.Logger;
 import java.lang.System.Logger.Level;
+import java.net.InetSocketAddress;
 import java.nio.file.Path;
 
 import org.argeo.api.cms.CmsApp;
+import org.argeo.api.cms.CmsDeployment;
 import org.argeo.cms.util.OS;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.widgets.Display;
+import com.sun.net.httpserver.HttpsServer;
 
 /** Creates the SWT {@link Display} in a dedicated thread. */
 public class CmsRcpDisplayFactory {
@@ -17,12 +20,14 @@ public class CmsRcpDisplayFactory {
        private final static String ARGEO_RCP_URL = "argeo.rcp.url";
 
        /** There is only one display in RCP mode */
-       private static Display display;
+       private Display display;
 
        private CmsUiThread uiThread;
 
        private boolean shutdown = false;
 
+       private CmsDeployment cmsDeployment;
+
        public void init() {
                uiThread = new CmsUiThread();
                uiThread.start();
@@ -56,15 +61,18 @@ public class CmsRcpDisplayFactory {
                public void run() {
                        try {
                                display = Display.getDefault();
-                               display.setRuntimeExceptionHandler((e) -> e.printStackTrace());
-                               display.setErrorHandler((e) -> e.printStackTrace());
-
-                               while (!shutdown) {
-                                       if (!display.readAndDispatch())
-                                               display.sleep();
+                               boolean displayOwner = display.getThread() == this;
+                               if (displayOwner) {
+                                       display.setRuntimeExceptionHandler((e) -> e.printStackTrace());
+                                       display.setErrorHandler((e) -> e.printStackTrace());
+
+                                       while (!shutdown) {
+                                               if (!display.readAndDispatch())
+                                                       display.sleep();
+                                       }
+                                       display.dispose();
+                                       display = null;
                                }
-                               display.dispose();
-                               display = null;
                        } catch (UnsatisfiedLinkError e) {
                                logger.log(Level.ERROR,
                                                "Cannot load SWT, either because the SWT DLLs are no in the java.library.path,"
@@ -74,21 +82,39 @@ public class CmsRcpDisplayFactory {
                }
        }
 
-       public static Display getDisplay() {
+       @Deprecated
+       public Display getDisplay() {
                return display;
        }
 
-       public static void openCmsApp(CmsApp cmsApp, String uiName, DisposeListener disposeListener) {
-               CmsRcpDisplayFactory.getDisplay().syncExec(() -> {
-                       CmsRcpApp cmsRcpApp = new CmsRcpApp(uiName);
-                       cmsRcpApp.setCmsApp(cmsApp, null);
-                       cmsRcpApp.initRcpApp();
-                       if (disposeListener != null)
-                               cmsRcpApp.getShell().addDisposeListener(disposeListener);
+       public void openCmsApp(CmsApp cmsApp, String uiName, DisposeListener disposeListener) {
+               cmsDeployment.getHttpServer().thenAccept((httpServer) -> {
+                       getDisplay().syncExec(() -> {
+                               CmsRcpApp cmsRcpApp = new CmsRcpApp(uiName);
+                               cmsRcpApp.setCmsApp(cmsApp, null);
+                               if (httpServer != null) {
+                                       InetSocketAddress addr = httpServer.getAddress();
+                                       String scheme = "http";
+                                       if (httpServer instanceof HttpsServer httpsServer) {
+                                               if (httpsServer.getHttpsConfigurator() != null)
+                                                       scheme = "https";
+                                       }
+                                       String httpServerBase = scheme + "://" + addr.getHostString() + ":" + addr.getPort();
+                                       cmsRcpApp.setHttpServerBase(httpServerBase);
+                               }
+                               cmsRcpApp.initRcpApp();
+                               if (disposeListener != null)
+                                       cmsRcpApp.getShell().addDisposeListener(disposeListener);
+                       });
                });
        }
 
        public static Path getUrlRunFile() {
                return OS.getRunDir().resolve(CmsRcpDisplayFactory.ARGEO_RCP_URL);
        }
+
+       public void setCmsDeployment(CmsDeployment cmsDeployment) {
+               this.cmsDeployment = cmsDeployment;
+       }
+
 }