Simplify CMS App deployment
[lgpl/argeo-commons.git] / rap / org.argeo.cms.ui.rap / src / org / argeo / cms / web / osgi / CmsWebAppFactory.java
diff --git a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/osgi/CmsWebAppFactory.java b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/osgi/CmsWebAppFactory.java
new file mode 100644 (file)
index 0000000..8380a85
--- /dev/null
@@ -0,0 +1,54 @@
+package org.argeo.cms.web.osgi;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.argeo.api.cms.CmsApp;
+import org.argeo.cms.web.CmsWebApp;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.event.EventAdmin;
+
+/** Publish a CmsApp as a RAP application. */
+public class CmsWebAppFactory {
+       private BundleContext bundleContext = FrameworkUtil.getBundle(CmsWebAppFactory.class).getBundleContext();
+       private final static String CONTEXT_NAME = "contextName";
+
+       private EventAdmin eventAdmin;
+
+       private Map<String, CmsWebApp> registrations = Collections.synchronizedMap(new HashMap<>());
+
+       public void addCmsApp(CmsApp cmsApp, Map<String, String> properties) {
+               String contextName = properties.get(CmsApp.CONTEXT_NAME_PROPERTY);
+               if (contextName != null) {
+                       CmsWebApp cmsWebApp = new CmsWebApp();
+                       cmsWebApp.setEventAdmin(eventAdmin);
+                       cmsWebApp.setCmsApp(cmsApp, properties);
+                       Hashtable<String, String> serviceProperties = new Hashtable<>();
+                       if (!contextName.equals(""))
+                               serviceProperties.put(CONTEXT_NAME, contextName);
+                       cmsWebApp.init(bundleContext, serviceProperties);
+                       registrations.put(contextName, cmsWebApp);
+               }
+       }
+
+       public void removeCmsApp(CmsApp cmsApp, Map<String, String> properties) {
+               String contextName = properties.get(CmsApp.CONTEXT_NAME_PROPERTY);
+               if (contextName != null) {
+                       CmsWebApp cmsWebApp = registrations.get(contextName);
+                       if (cmsWebApp != null) {
+                               cmsWebApp.destroy(bundleContext, new HashMap<>());
+                               cmsWebApp.unsetCmsApp(cmsApp, properties);
+                       } else {
+                               // TODO log warning
+                       }
+               }
+       }
+
+       public void setEventAdmin(EventAdmin eventAdmin) {
+               this.eventAdmin = eventAdmin;
+       }
+
+}