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=09b1e41b4f82b9aa5f4f4f9e03c593f7e7e1f39b;hb=8c6e16aa43d9523e1ec57a41a06b3ceba7d23fdb;hp=7c24f87d9b02964098f7320e3ce2850c6b3f5465;hpb=79c14508549e1af042485b4f888a3c54f5a68833;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..09b1e41b4 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,22 @@ 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 HttpServer httpServer; +// private BundleContext bundleContext = FrameworkUtil.getBundle(CmsRcpServletFactory.class).getBundleContext(); +// +// private Map> registrations = Collections.synchronizedMap(new HashMap<>()); public void init() { @@ -51,33 +44,40 @@ 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.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); +// CmsRcpServlet servlet = new CmsRcpServlet(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); } } 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.removeContext("/" + contextName); +// ServiceRegistration sr = registrations.get(contextName); +// sr.unregister(); } } - 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) { + this.httpServer = httpServer; + Integer httpPort = httpServer.getAddress().getPort(); String baseUrl = "http://localhost:" + httpPort + "/"; Path runFile = CmsRcpDisplayFactory.getUrlRunFile(); try { @@ -99,7 +99,7 @@ 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); } protected boolean isPortAvailable(int port) {