--- /dev/null
+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;
+ }
+
+}