Improve IPA
[lgpl/argeo-commons.git] / org.argeo.cms.ui / src / org / argeo / cms / ui / AbstractCmsEntryPoint.java
index 4729c5b75d200dc07d3f87536f54af956821eee8..22a2ba3e1dbec9f6c74fe922b822c9845eb0256d 100644 (file)
@@ -12,7 +12,6 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 import javax.security.auth.Subject;
-import javax.security.auth.login.CredentialNotFoundException;
 import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
 import javax.servlet.http.HttpServletRequest;
@@ -20,11 +19,11 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.auth.AuthConstants;
 import org.argeo.cms.auth.HttpRequestCallbackHandler;
 import org.argeo.eclipse.ui.specific.UiContext;
 import org.argeo.jcr.JcrUtils;
-import org.argeo.node.NodeAuthenticated;
+import org.argeo.node.NodeConstants;
+import org.argeo.node.security.NodeAuthenticated;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.application.AbstractEntryPoint;
 import org.eclipse.rap.rwt.client.WebClient;
@@ -38,9 +37,11 @@ import org.eclipse.swt.widgets.Shell;
 
 /** Manages history and navigation */
 public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements CmsView {
+       private static final long serialVersionUID = 906558779562569784L;
+
        private final Log log = LogFactory.getLog(AbstractCmsEntryPoint.class);
 
-       private final Subject subject;
+       // private final Subject subject;
        private LoginContext loginContext;
 
        private final Repository repository;
@@ -66,22 +67,20 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
                this.workspace = workspace;
                this.defaultPath = defaultPath;
                this.factoryProperties = new HashMap<String, String>(factoryProperties);
-               subject = new Subject();
+               // subject = new Subject();
 
                // Initial login
                try {
-                       loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER, subject,
-                                       new HttpRequestCallbackHandler(UiContext.getHttpRequest()));
+                       loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER,
+                                       new HttpRequestCallbackHandler(UiContext.getHttpRequest(), UiContext.getHttpResponse()));
                        loginContext.login();
-               } catch (CredentialNotFoundException e) {
+               } catch (LoginException e) {
                        try {
-                               loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_ANONYMOUS, subject);
+                               loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER);
                                loginContext.login();
                        } catch (LoginException e1) {
-                               throw new CmsException("Cannot log as anonymous", e);
+                               throw new CmsException("Cannot log in as anonymous", e1);
                        }
-               } catch (LoginException e) {
-                       throw new CmsException("Cannot initialize subject", e);
                }
                authChange(loginContext);
 
@@ -110,7 +109,7 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
        @Override
        protected final void createContents(final Composite parent) {
                UiContext.setData(NodeAuthenticated.KEY, this);
-               Subject.doAs(subject, new PrivilegedAction<Void>() {
+               Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Void>() {
                        @Override
                        public Void run() {
                                try {
@@ -135,7 +134,8 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
         */
        protected Node getDefaultNode(Session session) throws RepositoryException {
                if (!session.hasPermission(defaultPath, "read")) {
-                       if (session.getUserID().equals(AuthConstants.ROLE_ANONYMOUS))
+                       String userId = session.getUserID();
+                       if (userId.equals(NodeConstants.ROLE_ANONYMOUS))
                                // TODO throw a special exception
                                throw new CmsException("Login required");
                        else
@@ -156,9 +156,14 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
                        browserNavigation.pushState(state, title);
        }
 
+       // @Override
+       // public synchronized Subject getSubject() {
+       // return subject;
+       // }
+
        @Override
-       public synchronized Subject getSubject() {
-               return subject;
+       public LoginContext getLoginContext() {
+               return loginContext;
        }
 
        @Override
@@ -167,11 +172,11 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
                        throw new CmsException("Login context should not be null");
                try {
                        loginContext.logout();
-                       LoginContext anonymousLc = new LoginContext(AuthConstants.LOGIN_CONTEXT_ANONYMOUS, subject);
+                       LoginContext anonymousLc = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER);
                        anonymousLc.login();
                        authChange(anonymousLc);
                } catch (LoginException e) {
-                       throw new CmsException("Cannot logout", e);
+                       log.error("Cannot logout", e);
                }
        }
 
@@ -191,10 +196,7 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
                                                try {
                                                        node = session.getNode(nodePath);
                                                } catch (PathNotFoundException e) {
-                                                       // logout();
-                                                       // session = repository.login(workspace);
                                                        navigateTo("~");
-                                                       // throw e;
                                                }
 
                                        // refresh UI
@@ -217,7 +219,7 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
        }
 
        protected synchronized void doRefresh() {
-               Subject.doAs(subject, new PrivilegedAction<Void>() {
+               Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Void>() {
                        @Override
                        public Void run() {
                                refresh();
@@ -239,10 +241,7 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
                try {
                        int firstSlash = state.indexOf('/');
                        if (firstSlash == 0) {
-                               if (session.nodeExists(state))
-                                       node = session.getNode(state);
-                               else
-                                       throw new CmsException("Data " + state + " does not exist");
+                               node = session.getNode(state);
                                page = "";
                        } else if (firstSlash > 0) {
                                String prefix = state.substring(0, firstSlash);
@@ -265,6 +264,8 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
                        return title;
                } catch (Exception e) {
                        log.error("Cannot set state '" + state + "'", e);
+                       if (state.equals("") || newState.equals("~") || newState.equals(previousState))
+                               return "Unrecoverable exception : " + e.getClass().getSimpleName();
                        if (previousState.equals(""))
                                previousState = "~";
                        navigateTo(previousState);