Browser navigation
[gpl/argeo-suite.git] / org.argeo.suite.e4.rap / src / org / argeo / suite / e4 / rap / ArgeoSuiteLoginLifecycle.java
diff --git a/org.argeo.suite.e4.rap/src/org/argeo/suite/e4/rap/ArgeoSuiteLoginLifecycle.java b/org.argeo.suite.e4.rap/src/org/argeo/suite/e4/rap/ArgeoSuiteLoginLifecycle.java
new file mode 100644 (file)
index 0000000..3262311
--- /dev/null
@@ -0,0 +1,66 @@
+package org.argeo.suite.e4.rap;
+
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
+import javax.inject.Inject;
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.security.auth.Subject;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.cms.e4.rap.CmsLoginLifecycle;
+import org.argeo.connect.ui.SystemWorkbenchService;
+import org.argeo.jcr.JcrUtils;
+
+public class ArgeoSuiteLoginLifecycle extends CmsLoginLifecycle {
+       private final static Log log = LogFactory.getLog(ArgeoSuiteLoginLifecycle.class);
+       @Inject
+       SystemWorkbenchService systemWorkbenchService;
+
+       @Inject
+       Repository repository;
+
+       @Override
+       protected void startupComplete() {
+               loadState();
+       }
+
+       @Override
+       protected void stateChanged() {
+               loadState();
+       }
+
+       private void loadState() {
+               String state = getState();
+               if (state != null && state.startsWith("/")) {
+                       Session session = null;
+                       try {
+                               Subject subject = getSubject();
+                               session = Subject.doAs(subject, new PrivilegedExceptionAction<Session>() {
+
+                                       @Override
+                                       public Session run() throws PrivilegedActionException {
+                                               try {
+                                                       return repository.login();
+                                               } catch (RepositoryException e) {
+                                                       throw new PrivilegedActionException(e);
+                                               }
+                                       }
+
+                               });
+                               if (state.startsWith("/")) {
+                                       Node node = session.getNode(state);
+                                       systemWorkbenchService.openEntityEditor(node);
+                               }
+                       } catch (RepositoryException | PrivilegedActionException e) {
+                               log.error("Cannot load state " + state, e);
+                       } finally {
+                               JcrUtils.logoutQuietly(session);
+                       }
+               }
+       }
+}