X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FCmsDeployment.java;h=30d283c580583ed090df96b2694ad093bd414b89;hb=d9ff37f84e799028a1a0300850eccae77ced2024;hp=c4dee903fb4513946a6dee37ce0fb07d67808330;hpb=8e9b429428549d18c14e6ccfab31d9c88fca68bc;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java index c4dee903f..30d283c58 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java @@ -45,6 +45,7 @@ import org.osgi.framework.wiring.BundleWiring; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.cm.ManagedService; +import org.osgi.service.useradmin.Group; import org.osgi.service.useradmin.Role; import org.osgi.service.useradmin.UserAdmin; import org.osgi.util.tracker.ServiceTracker; @@ -160,10 +161,14 @@ public class CmsDeployment implements NodeDeployment { UserTransaction userTransaction = bc.getService(bc.getServiceReference(UserTransaction.class)); try { userTransaction.begin(); - if (userAdmin.getRole(NodeConstants.ROLE_ADMIN) == null) - userAdmin.createRole(NodeConstants.ROLE_ADMIN, Role.GROUP); - if (userAdmin.getRole(NodeConstants.ROLE_USER_ADMIN) == null) - userAdmin.createRole(NodeConstants.ROLE_USER_ADMIN, Role.GROUP); + Role adminRole = userAdmin.getRole(NodeConstants.ROLE_ADMIN); + if (adminRole == null) { + adminRole = userAdmin.createRole(NodeConstants.ROLE_ADMIN, Role.GROUP); + } + if (userAdmin.getRole(NodeConstants.ROLE_USER_ADMIN) == null) { + Group userAdminRole = (Group) userAdmin.createRole(NodeConstants.ROLE_USER_ADMIN, Role.GROUP); + userAdminRole.addMember(adminRole); + } userTransaction.commit(); } catch (Exception e) { try { @@ -187,11 +192,18 @@ public class CmsDeployment implements NodeDeployment { public void shutdown() { if (nodeHttp != null) nodeHttp.destroy(); - if (deployConfig != null) - deployConfig.save(); + if (deployConfig != null) { + new Thread(() -> deployConfig.save(), "Save Argeo Deploy Config").start(); + } } - private void checkReadiness() { + /** + * Checks whether the deployment is available according to expectations, and + * mark it as available. + */ + private synchronized void checkReadiness() { + if (isAvailable()) + return; if (nodeAvailable && userAdminAvailable && (httpExpected ? httpAvailable : true)) { String data = KernelUtils.getFrameworkProp(KernelUtils.OSGI_INSTANCE_AREA); String state = KernelUtils.getFrameworkProp(KernelUtils.OSGI_CONFIGURATION_AREA); @@ -358,15 +370,19 @@ public class CmsDeployment implements NodeDeployment { properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE); LocalRepository localRepository = new LocalRepository(repository, dataModelName); bc.registerService(Repository.class, localRepository, properties); - if (log.isDebugEnabled()) - log.debug("Published data model " + dataModelName); + if (log.isTraceEnabled()) + log.trace("Published data model " + dataModelName); } @Override - public Long getAvailableSince() { + public synchronized Long getAvailableSince() { return availableSince; } + public synchronized boolean isAvailable() { + return availableSince != null; + } + private class RepositoryContextStc extends ServiceTracker { public RepositoryContextStc() {