X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fruntime%2FCmsContextImpl.java;h=bd54b20594b5e7200d0a3e04f975e8cfc13ab354;hb=3b45f571938e0eb6803084aac3f2bd298e6026ba;hp=af45b74e31c7d640cb53c9136abc1b6fc7608da2;hpb=b1dabd7287b6c0d0c98dd98a806b2066a2c29cc4;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 af45b74e3..bd54b2059 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 @@ -6,19 +6,15 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import java.util.concurrent.Flow; -import java.util.concurrent.Flow.Subscription; -import java.util.concurrent.SubmissionPublisher; import javax.security.auth.Subject; import org.argeo.api.cms.CmsContext; import org.argeo.api.cms.CmsDeployment; -import org.argeo.api.cms.CmsEventSubscriber; +import org.argeo.api.cms.CmsEventBus; import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.CmsSession; import org.argeo.api.cms.CmsSessionId; @@ -29,18 +25,18 @@ import org.argeo.cms.internal.auth.CmsSessionImpl; import org.ietf.jgss.GSSCredential; import org.osgi.service.useradmin.UserAdmin; +/** Reference implementation of {@link CmsContext}. */ public class CmsContextImpl implements CmsContext { private final CmsLog log = CmsLog.getLog(getClass()); private static CompletableFuture instance = new CompletableFuture(); -// private static CmsContextImpl instance = null; private CmsState cmsState; private CmsDeployment cmsDeployment; private UserAdmin userAdmin; private UuidFactory uuidFactory; -// private ProvidedRepository contentRepository; + private CmsEventBus cmsEventBus; // i18n private Locale defaultLocale; @@ -52,10 +48,6 @@ public class CmsContextImpl implements CmsContext { private Map cmsSessionsByUuid = new HashMap<>(); private Map cmsSessionsByLocalId = new HashMap<>(); - // CMS events - private Map>> topics = new TreeMap<>(); -// private IdentityHashMap> subscriptions = new IdentityHashMap<>(); - public void start() { List codes = CmsStateImpl.getDeployProperties(cmsState, CmsDeployProperty.LOCALE); locales = getLocaleList(codes); @@ -71,9 +63,6 @@ public class CmsContextImpl implements CmsContext { } } }, "Check readiness").start(); - - // checkReadiness(); - setInstance(this); } @@ -185,19 +174,16 @@ public class CmsContextImpl implements CmsContext { this.uuidFactory = uuidFactory; } -// public ProvidedRepository getContentRepository() { -// return contentRepository; -// } -// -// public void setContentRepository(ProvidedRepository contentRepository) { -// this.contentRepository = contentRepository; -// } - @Override public Locale getDefaultLocale() { return defaultLocale; } + @Override + public UUID timeUUID() { + return uuidFactory.timeUUID(); + } + @Override public List getLocales() { return locales; @@ -212,11 +198,19 @@ public class CmsContextImpl implements CmsContext { return availableSince != null; } - @Override public CmsState getCmsState() { return cmsState; } + @Override + public CmsEventBus getCmsEventBus() { + return cmsEventBus; + } + + public void setCmsEventBus(CmsEventBus cmsEventBus) { + this.cmsEventBus = cmsEventBus; + } + /* * STATIC */ @@ -226,40 +220,24 @@ public class CmsContextImpl implements CmsContext { } /** Required by SPNEGO login module. */ - public static GSSCredential getAcceptorCredentials() { + public GSSCredential getAcceptorCredentials() { // TODO find a cleaner way - return ((CmsUserAdmin) getInstance().userAdmin).getAcceptorCredentials(); + return ((CmsUserAdmin) userAdmin).getAcceptorCredentials(); } private static void setInstance(CmsContextImpl cmsContextImpl) { -// if (cmsContextImpl != null) { -// if (instance != null) -// throw new IllegalStateException("CMS Context is already set"); -// instance = cmsContextImpl; -// } else { -// instance = null; -// } -// CmsContextImpl.class.notifyAll(); - if (cmsContextImpl != null) { if (instance.isDone()) throw new IllegalStateException("CMS Context is already set"); instance.complete(cmsContextImpl); } else { + if (!instance.isDone()) + instance.cancel(true); instance = new CompletableFuture(); } } private static CmsContextImpl getInstance() { -// while (instance == null) { -// try { -// CmsContextImpl.class.wait(); -// } catch (InterruptedException e) { -// throw new IllegalStateException("Cannot wait for CMS context instance", e); -// } -// } -// return instance; - try { return instance.get(); } catch (InterruptedException | ExecutionException e) { @@ -316,86 +294,4 @@ public class CmsContextImpl implements CmsContext { return cmsSessionsByLocalId.get(localId); } - /* - * CMS Events - */ - public void sendEvent(String topic, Map event) { - SubmissionPublisher> publisher = topics.get(topic); - if (publisher == null) - return; // no one is interested - publisher.submit(event); - } - - public void addEventSubscriber(String topic, CmsEventSubscriber subscriber) { - synchronized (topics) { - if (!topics.containsKey(topic)) - topics.put(topic, new SubmissionPublisher<>()); - } - SubmissionPublisher> publisher = topics.get(topic); - CmsEventFlowSubscriber flowSubscriber = new CmsEventFlowSubscriber(topic, subscriber); - publisher.subscribe(flowSubscriber); - } - - public void removeEventSubscriber(String topic, CmsEventSubscriber subscriber) { - SubmissionPublisher> publisher = topics.get(topic); - if (publisher == null) { - log.error("There should be an event topic " + topic); - return; - } - for (Flow.Subscriber> flowSubscriber : publisher.getSubscribers()) { - if (flowSubscriber instanceof CmsEventFlowSubscriber) - ((CmsEventFlowSubscriber) flowSubscriber).unsubscribe(); - } - synchronized (topics) { - if (!publisher.hasSubscribers()) { - publisher.close(); - topics.remove(topic); - } - } - } - - static class CmsEventFlowSubscriber implements Flow.Subscriber> { - private String topic; - private CmsEventSubscriber eventSubscriber; - - private Subscription subscription; - - public CmsEventFlowSubscriber(String topic, CmsEventSubscriber eventSubscriber) { - this.topic = topic; - this.eventSubscriber = eventSubscriber; - } - - @Override - public void onSubscribe(Subscription subscription) { - this.subscription = subscription; - subscription.request(Long.MAX_VALUE); - } - - @Override - public void onNext(Map item) { - eventSubscriber.onEvent(topic, item); - - } - - @Override - public void onError(Throwable throwable) { - // TODO Auto-generated method stub - - } - - @Override - public void onComplete() { - // TODO Auto-generated method stub - - } - - void unsubscribe() { - if (subscription != null) - subscription.cancel(); - else - throw new IllegalStateException("No subscription to cancel"); - } - - } - }