X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fruntime%2FCmsContextImpl.java;h=93ed319f153d61df8af7650c504b7b9336b0a373;hb=85015a7cbfe5343c88477d828fa2f8fb754a65cd;hp=7ce2e8bd5dfa76a2a9546cfd56129795c8cd3ae5;hpb=f4da6777015da3fc392138f0c01cea2f2add9ed3;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java index 7ce2e8bd5..93ed319f1 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java @@ -3,18 +3,25 @@ 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.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.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; @@ -35,11 +42,15 @@ public class CmsContextImpl implements CmsContext { private Long availableSince; + // CMS sessions + private Map cmsSessionsByUuid = new HashMap<>(); + private Map 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 +81,7 @@ public class CmsContextImpl implements CmsContext { setInstance(this); } - public void destroy() { + public void stop() { setInstance(null); } @@ -164,20 +175,20 @@ public class CmsContextImpl implements CmsContext { * 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 +209,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 null if not + * registered. + */ + public synchronized CmsSessionImpl getCmsSessionByUuid(UUID uuid) { + return cmsSessionsByUuid.get(uuid); + } + + /** + * The {@link CmsSession} related to this local id, or null if not + * registered. + */ + public synchronized CmsSessionImpl getCmsSessionByLocalId(String localId) { + return cmsSessionsByLocalId.get(localId); + } + }