]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java
Improve ACR.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / runtime / CmsContextImpl.java
index 7ce2e8bd5dfa76a2a9546cfd56129795c8cd3ae5..10bda17fb79fbde5a579efbe383f8dddf0e99bab 100644 (file)
@@ -3,18 +3,28 @@ package org.argeo.cms.internal.runtime;
 import static java.util.Locale.ENGLISH;
 
 import java.lang.management.ManagementFactory;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 
+import javax.security.auth.Subject;
+
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.api.acr.spi.ProvidedRepository;
 import org.argeo.api.cms.CmsConstants;
 import org.argeo.api.cms.CmsContext;
 import org.argeo.api.cms.CmsDeployment;
 import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.CmsSession;
+import org.argeo.api.cms.CmsSessionId;
 import org.argeo.api.cms.CmsState;
+import org.argeo.api.uuid.UuidFactory;
 import org.argeo.cms.LocaleUtils;
-import org.argeo.cms.internal.osgi.NodeUserAdmin;
+import org.argeo.cms.internal.auth.CmsSessionImpl;
 import org.ietf.jgss.GSSCredential;
 import org.osgi.service.useradmin.UserAdmin;
 
@@ -28,6 +38,8 @@ public class CmsContextImpl implements CmsContext {
        private CmsState cmsState;
        private CmsDeployment cmsDeployment;
        private UserAdmin userAdmin;
+       private UuidFactory uuidFactory;
+       private ProvidedRepository contentRepository;
 
        // i18n
        private Locale defaultLocale;
@@ -35,11 +47,15 @@ public class CmsContextImpl implements CmsContext {
 
        private Long availableSince;
 
+       // CMS sessions
+       private Map<UUID, CmsSessionImpl> cmsSessionsByUuid = new HashMap<>();
+       private Map<String, CmsSessionImpl> cmsSessionsByLocalId = new HashMap<>();
+
 //     public CmsContextImpl() {
 //             initTrackers();
 //     }
 
-       public void init() {
+       public void start() {
                Object defaultLocaleValue = KernelUtils.getFrameworkProp(CmsConstants.I18N_DEFAULT_LOCALE);
                defaultLocale = defaultLocaleValue != null ? new Locale(defaultLocaleValue.toString())
                                : new Locale(ENGLISH.getLanguage());
@@ -70,7 +86,7 @@ public class CmsContextImpl implements CmsContext {
                setInstance(this);
        }
 
-       public void destroy() {
+       public void stop() {
                setInstance(null);
        }
 
@@ -141,6 +157,22 @@ public class CmsContextImpl implements CmsContext {
                this.userAdmin = userAdmin;
        }
 
+       public UuidFactory getUuidFactory() {
+               return uuidFactory;
+       }
+
+       public void setUuidFactory(UuidFactory uuidFactory) {
+               this.uuidFactory = uuidFactory;
+       }
+
+       public ProvidedRepository getContentRepository() {
+               return contentRepository;
+       }
+
+       public void setContentRepository(ProvidedRepository contentRepository) {
+               this.contentRepository = contentRepository;
+       }
+
        @Override
        public Locale getDefaultLocale() {
                return defaultLocale;
@@ -160,24 +192,29 @@ public class CmsContextImpl implements CmsContext {
                return availableSince != null;
        }
 
+       @Override
+       public CmsState getCmsState() {
+               return cmsState;
+       }
+
        /*
         * STATIC
         */
 
-       public synchronized static CmsContext getCmsContext() {
+       public synchronized static CmsContextImpl getCmsContext() {
                return getInstance();
        }
 
-       /** Required by USER login module. */
-       public synchronized static UserAdmin getUserAdmin() {
-               return getInstance().userAdmin;
-       }
+//     /** Required by USER login module. */
+//     public synchronized static UserAdmin getUserAdmin() {
+//             return getInstance().userAdmin;
+//     }
 
        /** Required by SPNEGO login module. */
        @Deprecated
        public synchronized static GSSCredential getAcceptorCredentials() {
                // FIXME find a cleaner way
-               return ((NodeUserAdmin) getInstance().userAdmin).getAcceptorCredentials();
+               return ((CmsUserAdmin) getInstance().userAdmin).getAcceptorCredentials();
        }
 
        private synchronized static void setInstance(CmsContextImpl cmsContextImpl) {
@@ -198,4 +235,53 @@ public class CmsContextImpl implements CmsContext {
                }
        }
 
+       public UserAdmin getUserAdmin() {
+               return userAdmin;
+       }
+
+       /*
+        * CMS Sessions
+        */
+
+       @Override
+       public synchronized CmsSession getCmsSession(Subject subject) {
+               if (subject.getPrivateCredentials(CmsSessionId.class).isEmpty())
+                       return null;
+               CmsSessionId cmsSessionId = subject.getPrivateCredentials(CmsSessionId.class).iterator().next();
+               return getCmsSessionByUuid(cmsSessionId.getUuid());
+       }
+
+       public synchronized void registerCmsSession(CmsSessionImpl cmsSession) {
+               if (cmsSessionsByUuid.containsKey(cmsSession.getUuid())
+                               || cmsSessionsByLocalId.containsKey(cmsSession.getLocalId()))
+                       throw new IllegalStateException("CMS session " + cmsSession + " is already registered.");
+               cmsSessionsByUuid.put(cmsSession.getUuid(), cmsSession);
+               cmsSessionsByLocalId.put(cmsSession.getLocalId(), cmsSession);
+       }
+
+       public synchronized void unregisterCmsSession(CmsSessionImpl cmsSession) {
+               if (!cmsSessionsByUuid.containsKey(cmsSession.getUuid())
+                               || !cmsSessionsByLocalId.containsKey(cmsSession.getLocalId()))
+                       throw new IllegalStateException("CMS session " + cmsSession + " is not registered.");
+               CmsSession removed = cmsSessionsByUuid.remove(cmsSession.getUuid());
+               assert removed == cmsSession;
+               cmsSessionsByLocalId.remove(cmsSession.getLocalId());
+       }
+
+       /**
+        * The {@link CmsSession} related to this UUID, or <code>null</null> if not
+        * registered.
+        */
+       public synchronized CmsSessionImpl getCmsSessionByUuid(UUID uuid) {
+               return cmsSessionsByUuid.get(uuid);
+       }
+
+       /**
+        * The {@link CmsSession} related to this local id, or <code>null</null> if not
+        * registered.
+        */
+       public synchronized CmsSessionImpl getCmsSessionByLocalId(String localId) {
+               return cmsSessionsByLocalId.get(localId);
+       }
+
 }