Refactor CMS life cycle.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / runtime / CmsDeploymentImpl.java
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java
new file mode 100644 (file)
index 0000000..83f688a
--- /dev/null
@@ -0,0 +1,207 @@
+package org.argeo.cms.internal.runtime;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Dictionary;
+
+import org.argeo.api.cms.CmsDeployment;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.CmsState;
+import org.argeo.cms.internal.osgi.DeployConfig;
+import org.eclipse.equinox.http.jetty.JettyConfigurator;
+import org.osgi.service.http.HttpService;
+
+/** Implementation of a CMS deployment. */
+public class CmsDeploymentImpl implements CmsDeployment {
+       private final CmsLog log = CmsLog.getLog(getClass());
+//     private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext();
+
+//     private Long availableSince;
+
+       // Readiness
+//     private boolean nodeAvailable = false;
+//     private boolean userAdminAvailable = false;
+       private boolean httpExpected = false;
+//     private boolean httpAvailable = false;
+       private HttpService httpService;
+
+       private CmsState cmsState;
+       private DeployConfig deployConfig;
+
+       public CmsDeploymentImpl() {
+//             ServiceReference<NodeState> nodeStateSr = bc.getServiceReference(NodeState.class);
+//             if (nodeStateSr == null)
+//                     throw new CmsException("No node state available");
+
+//             NodeState nodeState = bc.getService(nodeStateSr);
+//             cleanState = nodeState.isClean();
+
+//             nodeHttp = new NodeHttp();
+               initTrackers();
+       }
+
+       private void initTrackers() {
+//             ServiceTracker<?, ?> httpSt = new ServiceTracker<HttpService, HttpService>(bc, HttpService.class, null) {
+//
+//                     @Override
+//                     public HttpService addingService(ServiceReference<HttpService> sr) {
+//                             httpAvailable = true;
+//                             Object httpPort = sr.getProperty("http.port");
+//                             Object httpsPort = sr.getProperty("https.port");
+//                             log.info(httpPortsMsg(httpPort, httpsPort));
+//                             checkReadiness();
+//                             return super.addingService(sr);
+//                     }
+//             };
+//             // httpSt.open();
+//             KernelUtils.asyncOpen(httpSt);
+
+//             ServiceTracker<?, ?> userAdminSt = new ServiceTracker<UserAdmin, UserAdmin>(bc, UserAdmin.class, null) {
+//                     @Override
+//                     public UserAdmin addingService(ServiceReference<UserAdmin> reference) {
+//                             UserAdmin userAdmin = super.addingService(reference);
+//                             addStandardSystemRoles(userAdmin);
+//                             userAdminAvailable = true;
+//                             checkReadiness();
+//                             return userAdmin;
+//                     }
+//             };
+//             // userAdminSt.open();
+//             KernelUtils.asyncOpen(userAdminSt);
+
+//             ServiceTracker<?, ?> confAdminSt = new ServiceTracker<ConfigurationAdmin, ConfigurationAdmin>(bc,
+//                             ConfigurationAdmin.class, null) {
+//                     @Override
+//                     public ConfigurationAdmin addingService(ServiceReference<ConfigurationAdmin> reference) {
+//                             ConfigurationAdmin configurationAdmin = bc.getService(reference);
+////                           boolean isClean;
+////                           try {
+////                                   Configuration[] confs = configurationAdmin
+////                                                   .listConfigurations("(service.factoryPid=" + CmsConstants.NODE_USER_ADMIN_PID + ")");
+////                                   isClean = confs == null || confs.length == 0;
+////                           } catch (Exception e) {
+////                                   throw new IllegalStateException("Cannot analyse clean state", e);
+////                           }
+//                             deployConfig = new DeployConfig(configurationAdmin, isClean);
+//                             Activator.registerService(CmsDeployment.class, CmsDeploymentImpl.this, null);
+////                           JcrInitUtils.addToDeployment(CmsDeployment.this);
+//                             httpExpected = deployConfig.getProps(KernelConstants.JETTY_FACTORY_PID, "default") != null;
+//                             try {
+//                                     Configuration[] configs = configurationAdmin
+//                                                     .listConfigurations("(service.factoryPid=" + CmsConstants.NODE_USER_ADMIN_PID + ")");
+//
+//                                     boolean hasDomain = false;
+//                                     for (Configuration config : configs) {
+//                                             Object realm = config.getProperties().get(UserAdminConf.realm.name());
+//                                             if (realm != null) {
+//                                                     log.debug("Found realm: " + realm);
+//                                                     hasDomain = true;
+//                                             }
+//                                     }
+//                                     if (hasDomain) {
+//                                             loadIpaJaasConfiguration();
+//                                     }
+//                             } catch (Exception e) {
+//                                     throw new IllegalStateException("Cannot initialize config", e);
+//                             }
+//                             return super.addingService(reference);
+//                     }
+//             };
+//             // confAdminSt.open();
+//             KernelUtils.asyncOpen(confAdminSt);
+       }
+
+       public void init() {
+               httpExpected = deployConfig.getProps(KernelConstants.JETTY_FACTORY_PID, "default") != null;
+               if (deployConfig.hasDomain()) {
+                       loadIpaJaasConfiguration();
+               }
+
+//             while (!isHttpAvailableOrNotExpected()) {
+//                     try {
+//                             Thread.sleep(100);
+//                     } catch (InterruptedException e) {
+//                             log.error("Interrupted while waiting for http");
+//                     }
+//             }
+       }
+
+       public void addFactoryDeployConfig(String factoryPid, Dictionary<String, Object> props) {
+               deployConfig.putFactoryDeployConfig(factoryPid, props);
+               deployConfig.save();
+               try {
+                       deployConfig.loadConfigs();
+               } catch (IOException e) {
+                       throw new IllegalStateException(e);
+               }
+       }
+
+       public Dictionary<String, Object> getProps(String factoryPid, String cn) {
+               return deployConfig.getProps(factoryPid, cn);
+       }
+
+//     private void addStandardSystemRoles(UserAdmin userAdmin) {
+//             // we assume UserTransaction is already available (TODO make it more robust)
+//             WorkTransaction userTransaction = bc.getService(bc.getServiceReference(WorkTransaction.class));
+//             try {
+//                     userTransaction.begin();
+//                     Role adminRole = userAdmin.getRole(CmsConstants.ROLE_ADMIN);
+//                     if (adminRole == null) {
+//                             adminRole = userAdmin.createRole(CmsConstants.ROLE_ADMIN, Role.GROUP);
+//                     }
+//                     if (userAdmin.getRole(CmsConstants.ROLE_USER_ADMIN) == null) {
+//                             Group userAdminRole = (Group) userAdmin.createRole(CmsConstants.ROLE_USER_ADMIN, Role.GROUP);
+//                             userAdminRole.addMember(adminRole);
+//                     }
+//                     userTransaction.commit();
+//             } catch (Exception e) {
+//                     try {
+//                             userTransaction.rollback();
+//                     } catch (Exception e1) {
+//                             // silent
+//                     }
+//                     throw new IllegalStateException("Cannot add standard system roles", e);
+//             }
+//     }
+
+       public boolean isHttpAvailableOrNotExpected() {
+               return (httpExpected ? httpService != null : true);
+       }
+
+       private void loadIpaJaasConfiguration() {
+               if (System.getProperty(KernelConstants.JAAS_CONFIG_PROP) == null) {
+                       String jaasConfig = KernelConstants.JAAS_CONFIG_IPA;
+                       URL url = getClass().getClassLoader().getResource(jaasConfig);
+                       KernelUtils.setJaasConfiguration(url);
+                       log.debug("Set IPA JAAS configuration.");
+               }
+       }
+
+       public void destroy() {
+//             if (nodeHttp != null)
+//                     nodeHttp.destroy();
+
+               try {
+                       JettyConfigurator.stopServer(KernelConstants.DEFAULT_JETTY_SERVER);
+               } catch (Exception e) {
+                       log.error("Cannot stop default Jetty server.", e);
+               }
+
+               if (deployConfig != null) {
+                       new Thread(() -> deployConfig.save(), "Save Argeo Deploy Config").start();
+               }
+       }
+
+       public void setDeployConfig(DeployConfig deployConfig) {
+               this.deployConfig = deployConfig;
+       }
+
+       public void setCmsState(CmsState cmsState) {
+               this.cmsState = cmsState;
+       }
+
+       public void setHttpService(HttpService httpService) {
+               this.httpService = httpService;
+       }
+
+}