OSGI-INF/defaultCallbackHandler.xml
Bundle-ActivationPolicy: lazy
-Import-Package: org.eclipse.swt,\
+Import-Package: \
+org.argeo.api.acr,\
+org.eclipse.swt,\
org.eclipse.swt.widgets;version="0.0.0",\
org.eclipse.e4.ui.model.application.ui,\
org.eclipse.e4.ui.model.application,\
package org.argeo.cms.swt.acr;
import org.argeo.api.acr.Content;
-import org.argeo.api.cms.MvcProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
@FunctionalInterface
-public interface SwtUiProvider extends MvcProvider<Composite, Content, Control> {
-
+public interface SwtUiProvider {
+ Control createUiPart(Composite parent, Content context);
}
<property name="acr.mount.path" type="String" value="/sys"/>
<service>
<provide interface="org.argeo.api.acr.spi.ContentProvider"/>
+ <provide interface="org.argeo.cms.jcr.acr.JcrContentProvider"/>
</service>
</scr:component>
import org.argeo.api.acr.NamespaceUtils;
import org.argeo.api.acr.spi.AbstractContent;
import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.api.cms.CmsConstants;
import org.argeo.jcr.Jcr;
import org.argeo.jcr.JcrException;
import org.argeo.jcr.JcrUtils;
// }
//
// }
+ /*
+ * STATIC UTLITIES
+ */
+ public static Content nodeToContent(Node node) {
+ if (node == null)
+ return null;
+ try {
+ ProvidedSession contentSession = (ProvidedSession) node.getSession()
+ .getAttribute(ProvidedSession.class.getName());
+ if (contentSession == null)
+ throw new IllegalArgumentException(
+ "Cannot adapt " + node + " to content, because it was not loaded from a content session");
+ return contentSession.get(CmsConstants.SYS_WORKSPACE + node.getPath());
+ } catch (RepositoryException e) {
+ throw new JcrException("Cannot adapt " + node + " to a content", e);
+ }
+ }
+
}
public Session getJcrSession(ProvidedSession contentSession, String jcrWorkspace) {
JcrSessionAdapter sessionAdapter = sessionAdapters.get(contentSession);
if (sessionAdapter == null) {
- final JcrSessionAdapter newSessionAdapter = new JcrSessionAdapter(jcrRepository,
+ final JcrSessionAdapter newSessionAdapter = new JcrSessionAdapter(jcrRepository, contentSession,
contentSession.getSubject());
sessionAdapters.put(contentSession, newSessionAdapter);
contentSession.onClose().thenAccept((s) -> newSessionAdapter.close());
import javax.jcr.Session;
import javax.security.auth.Subject;
+import org.apache.jackrabbit.core.SessionImpl;
+import org.argeo.api.acr.spi.ProvidedSession;
import org.argeo.jcr.JcrException;
import org.argeo.jcr.JcrUtils;
private Repository repository;
private Subject subject;
+ private ProvidedSession contentSession;
+
private Map<Thread, Map<String, Session>> threadSessions = Collections.synchronizedMap(new HashMap<>());
private boolean closed = false;
private Thread lastRetrievingThread = null;
- public JcrSessionAdapter(Repository repository, Subject subject) {
+ public JcrSessionAdapter(Repository repository, ProvidedSession contentSession, Subject subject) {
this.repository = repository;
+ this.contentSession = contentSession;
this.subject = subject;
}
if (session == null) {
session = Subject.doAs(subject, (PrivilegedAction<Session>) () -> {
try {
+// String username = CurrentUser.getUsername(subject);
+// SimpleCredentials credentials = new SimpleCredentials(username, new char[0]);
+// credentials.setAttribute(ProvidedSession.class.getName(), contentSession);
Session sess = repository.login(workspace);
+ // Jackrabbit specific:
+ ((SessionImpl)sess).setAttribute(ProvidedSession.class.getName(), contentSession);
return sess;
} catch (RepositoryException e) {
throw new IllegalStateException("Cannot log in to " + workspace, e);
import javax.jcr.Node;
import javax.jcr.RepositoryException;
-import org.argeo.api.cms.MvcProvider;
+import org.argeo.api.acr.Content;
+import org.argeo.cms.jcr.acr.JcrContent;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.jcr.JcrException;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/** Stateless factory building an SWT user interface given a JCR context. */
@FunctionalInterface
-public interface CmsUiProvider extends MvcProvider<Composite, Node, Control> {
+public interface CmsUiProvider extends SwtUiProvider {
/**
* Initialises a user interface.
*
*/
Control createUi(Composite parent, Node context) throws RepositoryException;
- @Override
default Control createUiPart(Composite parent, Node context) {
try {
return createUi(parent, context);
} catch (RepositoryException e) {
- throw new IllegalStateException("Cannot create UI for context " + context, e);
+ throw new JcrException("Cannot create UI for context " + context, e);
+ }
+ }
+
+ @Override
+ default Control createUiPart(Composite parent, Content context) {
+ if (context instanceof JcrContent) {
+ Node node = ((JcrContent) context).getJcrNode();
+ return createUiPart(parent, node);
+ } else {
+ throw new IllegalArgumentException("Content " + context + " is not compatible with JCR");
}
}
* are relevant for all created UI part.
*/
@FunctionalInterface
+@Deprecated
public interface MvcProvider<V, M, W> extends BiFunction<V, M, W> {
W createUiPart(V parent, M context);
--- /dev/null
+package org.argeo.cms.ux;
+
+import org.argeo.api.acr.ContentRepository;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.cms.CmsView;
+import org.argeo.cms.auth.CurrentUser;
+
+public class CmsUxUtils {
+ public static ContentSession getContentSession(ContentRepository contentRepository, CmsView cmsView) {
+ return CurrentUser.callAs(cmsView.getCmsSession().getSubject(), () -> contentRepository.get());
+ }
+
+ /** singleton */
+ private CmsUxUtils() {
+
+ }
+}
--- /dev/null
+package org.argeo.cms.ux.widgets;
+
+public interface HierarchicalPart {
+
+}
import java.util.Locale;
import java.util.Set;
import java.util.UUID;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletionException;
import javax.security.auth.Subject;
import javax.security.auth.x500.X500Principal;
return true;
}
+ /*
+ * PREPARE EVOLUTION OF JAVA APIs INTRODUCED IN JDK 18
+ * The following static methods will be added to Subject
+ */
+ public Subject current() {
+ return currentSubject();
+ }
+
+ public static <T> T callAs(Subject subject, Callable<T> action) {
+ try {
+ return Subject.doAs(subject, new PrivilegedExceptionAction<T>() {
+
+ @Override
+ public T run() throws Exception {
+ return action.call();
+ }
+
+ });
+ } catch (PrivilegedActionException e) {
+ throw new CompletionException("Failed to execute action for " + subject, e.getCause());
+ }
+ }
+
private CurrentUser() {
}
}
Import-Package:\
+org.argeo.api.acr,\
org.eclipse.swt,\
org.argeo.eclipse.ui,\
javax.jcr.nodetype,\