X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=swt%2Frcp%2Forg.argeo.cms.swt.rcp%2Fsrc%2Forg%2Fargeo%2Fcms%2Fui%2Frcp%2Fservlet%2FCmsRcpServletFactory.java;h=9c2f3095cb5dc987f6055e66ded44bce0eb28e52;hb=0a0a90e832a2fe24dc55d1cf67d75e276ad61b2c;hp=7c24f87d9b02964098f7320e3ce2850c6b3f5465;hpb=7b242851c0094d13cbaca5b68261ad92c873a59f;p=lgpl%2Fargeo-commons.git diff --git a/swt/rcp/org.argeo.cms.swt.rcp/src/org/argeo/cms/ui/rcp/servlet/CmsRcpServletFactory.java b/swt/rcp/org.argeo.cms.swt.rcp/src/org/argeo/cms/ui/rcp/servlet/CmsRcpServletFactory.java index 7c24f87d9..9c2f3095c 100644 --- a/swt/rcp/org.argeo.cms.swt.rcp/src/org/argeo/cms/ui/rcp/servlet/CmsRcpServletFactory.java +++ b/swt/rcp/org.argeo.cms.swt.rcp/src/org/argeo/cms/ui/rcp/servlet/CmsRcpServletFactory.java @@ -1,5 +1,7 @@ package org.argeo.cms.ui.rcp.servlet; +import static java.lang.System.Logger.Level.DEBUG; + import java.io.IOException; import java.lang.System.Logger; import java.lang.System.Logger.Level; @@ -9,31 +11,20 @@ import java.net.URI; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collections; -import java.util.HashMap; -import java.util.Hashtable; import java.util.Map; import java.util.concurrent.CompletableFuture; -import javax.servlet.Servlet; - import org.argeo.api.cms.CmsApp; import org.argeo.cms.ui.rcp.CmsRcpDisplayFactory; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceRegistration; -import org.osgi.service.event.EventAdmin; -import org.osgi.service.http.HttpService; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; /** Publishes one {@link CmsRcpServlet} per {@link CmsApp}. */ public class CmsRcpServletFactory { private final static Logger logger = System.getLogger(CmsRcpServletFactory.class.getName()); - - private BundleContext bundleContext = FrameworkUtil.getBundle(CmsRcpServletFactory.class).getBundleContext(); - - private CompletableFuture eventAdmin = new CompletableFuture<>(); - - private Map> registrations = Collections.synchronizedMap(new HashMap<>()); + private CompletableFuture httpServer =new CompletableFuture<>(); public void init() { @@ -51,33 +42,36 @@ public class CmsRcpServletFactory { } public void addCmsApp(CmsApp cmsApp, Map properties) { - String contextName = properties.get(CmsApp.CONTEXT_NAME_PROPERTY); + final String contextName = properties.get(CmsApp.CONTEXT_NAME_PROPERTY); if (contextName != null) { - eventAdmin.thenAccept((eventAdmin) -> { - CmsRcpServlet servlet = new CmsRcpServlet(eventAdmin, cmsApp); - Hashtable serviceProperties = new Hashtable<>(); - serviceProperties.put("osgi.http.whiteboard.servlet.pattern", "/" + contextName + "/*"); - ServiceRegistration sr = bundleContext.registerService(Servlet.class, servlet, - serviceProperties); - registrations.put(contextName, sr); + httpServer.thenAcceptAsync((httpServer) -> { + httpServer.createContext("/" + contextName, new HttpHandler() { + + @Override + public void handle(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String uiName = path != null ? path.substring(path.lastIndexOf('/') + 1) : ""; + CmsRcpDisplayFactory.openCmsApp(cmsApp, uiName, null); + exchange.sendResponseHeaders(200, -1); + logger.log(Level.DEBUG, "Opened RCP UI " + uiName + " of CMS App /" + contextName); + } + }); }); + logger.log(Level.DEBUG, "Registered RCP CMS APP /" + contextName); } } public void removeCmsApp(CmsApp cmsApp, Map properties) { String contextName = properties.get(CmsApp.CONTEXT_NAME_PROPERTY); if (contextName != null) { - ServiceRegistration sr = registrations.get(contextName); - sr.unregister(); + httpServer.thenAcceptAsync((httpServer) -> { + httpServer.removeContext("/" + contextName); + }); } } - public void setEventAdmin(EventAdmin eventAdmin) { - this.eventAdmin.complete(eventAdmin); - } - - public void setHttpService(HttpService httpService, Map properties) { - Integer httpPort = Integer.parseInt(properties.get("http.port").toString()); + public void setHttpServer(HttpServer httpServer) { + Integer httpPort = httpServer.getAddress().getPort(); String baseUrl = "http://localhost:" + httpPort + "/"; Path runFile = CmsRcpDisplayFactory.getUrlRunFile(); try { @@ -99,7 +93,8 @@ public class CmsRcpServletFactory { } catch (IOException e) { throw new RuntimeException("Cannot write run file to " + runFile, e); } - logger.log(Level.DEBUG, "RCP available under " + baseUrl + ", written to " + runFile); + logger.log(DEBUG, "RCP available under " + baseUrl + ", written to " + runFile); + this.httpServer.complete(httpServer); } protected boolean isPortAvailable(int port) {