--- /dev/null
+package org.argeo.cms.acr;
+
+import java.util.Locale;
+import java.util.Objects;
+
+import javax.security.auth.Subject;
+
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.acr.spi.ProvidedRepository;
+
+/**
+ * A standalone {@link ProvidedRepository} with a single {@link Subject} (which
+ * also provides the system session).
+ */
+public class SingleUserContentRepository extends AbstractContentRepository {
+ private final Subject subject;
+ private final Locale locale;
+
+ // the single session
+ private CmsContentSession contentSession;
+
+ public SingleUserContentRepository(Subject subject) {
+ this(subject, Locale.getDefault());
+
+ initRootContentProvider(null);
+ }
+
+ public SingleUserContentRepository(Subject subject, Locale locale) {
+ Objects.requireNonNull(subject);
+ Objects.requireNonNull(locale);
+
+ this.subject = subject;
+ this.locale = locale;
+ }
+
+ @Override
+ public void start() {
+ Objects.requireNonNull(subject);
+ Objects.requireNonNull(locale);
+
+ super.start();
+ if (contentSession != null)
+ throw new IllegalStateException("Repository is already started, stop it first.");
+ contentSession = new CmsContentSession(this, subject, locale);
+ }
+
+ @Override
+ public void stop() {
+ if (contentSession != null)
+ contentSession.close();
+ contentSession = null;
+ super.stop();
+ }
+
+ @Override
+ public ContentSession get(Locale locale) {
+ if (!this.locale.equals(locale))
+ throw new UnsupportedOperationException("This repository does not support multi-locale sessions");
+ return contentSession;
+ }
+
+ @Override
+ public ContentSession get() {
+ return contentSession;
+ }
+
+ @Override
+ protected CmsContentSession newSystemSession() {
+ return new CmsContentSession(this, subject, Locale.getDefault());
+ }
+
+}