Make CMS login UI more extensible
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 14 Oct 2015 09:30:28 +0000 (09:30 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 14 Oct 2015 09:30:28 +0000 (09:30 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@8480 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java
org.argeo.eclipse.ui.workbench/pom.xml
org.argeo.security.ui.rap/plugin.xml
org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapLoginEntryPoint.java [deleted file]
org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapWorkbenchLogin.java [new file with mode: 0644]
org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/WorkbenchLogin.java [new file with mode: 0644]
org.argeo.security.ui/src/org/argeo/security/ui/login/WorkbenchLogin.java [deleted file]

index 366e80c2b9e1ba5663360ed343b76980b4fd523e..3f784407a3f99598152c4241c10a359bec650994 100644 (file)
@@ -49,7 +49,11 @@ public class CmsLogin implements CmsStyles, CallbackHandler {
                return CurrentUser.isAnonymous(cmsView.getSubject());
        }
 
-       protected void createContents(Composite parent) {
+       public void createContents(Composite parent) {
+               defaultCreateContents(parent);
+       }
+
+       public final void defaultCreateContents(Composite parent) {
                parent.setLayout(CmsUtils.noSpaceGridLayout());
                Composite credentialsBlock = createCredentialsBlock(parent);
                if (parent instanceof Shell) {
@@ -58,7 +62,7 @@ public class CmsLogin implements CmsStyles, CallbackHandler {
                }
        }
 
-       protected final Composite createCredentialsBlock(Composite parent) {
+       public final Composite createCredentialsBlock(Composite parent) {
                if (isAnonymous()) {
                        return anonymousUi(parent);
                } else {
index a16c5f9dff556afce0b5623038995b7fdb1d2383..0b49fe37da900f3be196f7ed995e328597992c0a 100644 (file)
                        <artifactId>org.argeo.eclipse.ui</artifactId>
                        <version>2.1.29-SNAPSHOT</version>
                </dependency>
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
-                       <version>2.1.29-SNAPSHOT</version>
-                       <scope>provided</scope>
-               </dependency>
        </dependencies>
 </project>
\ No newline at end of file
index d383dbf39dcc3ad7ebc278e9984a5e1829886685..f2fae3c50bf31b8347441495d3af080c02943c1d 100644 (file)
@@ -17,7 +17,7 @@
       </entrypoint>
       <entrypoint
             brandingId="org.argeo.security.ui.rap.defaultBranding"
-            class="org.argeo.security.ui.rap.RapLoginEntryPoint"
+            class="org.argeo.security.ui.rap.RapWorkbenchLogin"
             id="org.argeo.security.ui.rap.secureEntryPoint"
             path="/login">
       </entrypoint>
diff --git a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapLoginEntryPoint.java b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapLoginEntryPoint.java
deleted file mode 100644 (file)
index bc66b16..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.argeo.security.ui.rap;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.argeo.security.ui.login.WorkbenchLogin;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-public class RapLoginEntryPoint extends WorkbenchLogin {
-
-       @Override
-       protected int createAndRunWorkbench(Display display, String username) {
-               RapWorkbenchAdvisor workbenchAdvisor = createRapWorkbenchAdvisor(username);
-               return PlatformUI.createAndRunWorkbench(display, workbenchAdvisor);
-       }
-
-       /** Override to provide an application specific workbench advisor */
-       protected RapWorkbenchAdvisor createRapWorkbenchAdvisor(String username) {
-               return new RapWorkbenchAdvisor(username);
-       }
-
-       protected HttpServletRequest getRequest() {
-               return RWT.getRequest();
-       }
-
-       @Override
-       public int createUI() {
-               JavaScriptExecutor jsExecutor = RWT.getClient().getService(
-                               JavaScriptExecutor.class);
-               int returnCode = super.createUI();
-               jsExecutor.execute("location.reload()");
-               return returnCode;
-       }
-
-}
diff --git a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapWorkbenchLogin.java b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapWorkbenchLogin.java
new file mode 100644 (file)
index 0000000..1f4914a
--- /dev/null
@@ -0,0 +1,30 @@
+package org.argeo.security.ui.rap;
+
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+public class RapWorkbenchLogin extends WorkbenchLogin {
+
+       @Override
+       protected int createAndRunWorkbench(Display display, String username) {
+               RapWorkbenchAdvisor workbenchAdvisor = createRapWorkbenchAdvisor(username);
+               return PlatformUI.createAndRunWorkbench(display, workbenchAdvisor);
+       }
+
+       /** Override to provide an application specific workbench advisor */
+       protected RapWorkbenchAdvisor createRapWorkbenchAdvisor(String username) {
+               return new RapWorkbenchAdvisor(username);
+       }
+
+       @Override
+       public int createUI() {
+               JavaScriptExecutor jsExecutor = RWT.getClient().getService(
+                               JavaScriptExecutor.class);
+               int returnCode = super.createUI();
+               jsExecutor.execute("location.reload()");
+               return returnCode;
+       }
+
+}
diff --git a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/WorkbenchLogin.java b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/WorkbenchLogin.java
new file mode 100644 (file)
index 0000000..e7a5c0c
--- /dev/null
@@ -0,0 +1,137 @@
+package org.argeo.security.ui.rap;
+
+import java.security.PrivilegedAction;
+
+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;
+
+import org.argeo.ArgeoException;
+import org.argeo.cms.CmsException;
+import org.argeo.cms.CmsImageManager;
+import org.argeo.cms.CmsView;
+import org.argeo.cms.auth.AuthConstants;
+import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.auth.HttpRequestCallbackHandler;
+import org.argeo.cms.widgets.auth.CmsLogin;
+import org.argeo.cms.widgets.auth.CmsLoginShell;
+import org.argeo.eclipse.ui.specific.UiContext;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.rap.rwt.application.EntryPoint;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+abstract class WorkbenchLogin implements EntryPoint, CmsView {
+       // private final static Log log = LogFactory.getLog(WorkbenchLogin.class);
+       private final Subject subject = new Subject();
+       private LoginContext loginContext;
+
+       @Override
+       public int createUI() {
+               final Display display = PlatformUI.createDisplay();
+               UiContext.setData(CmsView.KEY, this);
+               try {
+                       // try pre-auth
+                       loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
+                                       subject, new HttpRequestCallbackHandler(getRequest()));
+                       loginContext.login();
+               } catch (CredentialNotFoundException e) {
+                       CmsLoginShell loginShell = createCmsLoginShell();
+                       loginShell.open();
+                       while (!loginShell.getShell().isDisposed()) {
+                               if (!display.readAndDispatch()) {
+                                       display.sleep();
+                               }
+                       }
+               } catch (LoginException e) {
+                       throw new ArgeoException("Cannot log in", e);
+               }
+               //
+               // RUN THE WORKBENCH
+               //
+               Integer returnCode = null;
+               try {
+                       returnCode = Subject.doAs(subject, new PrivilegedAction<Integer>() {
+                               public Integer run() {
+                                       int result = createAndRunWorkbench(display,
+                                                       CurrentUser.getUsername(subject));
+                                       return new Integer(result);
+                               }
+                       });
+                       // explicit workbench closing
+                       logout();
+               } finally {
+                       display.dispose();
+               }
+               return returnCode;
+       }
+
+       protected abstract int createAndRunWorkbench(Display display,
+                       String username);
+
+       protected HttpServletRequest getRequest() {
+               return RWT.getRequest();
+       }
+
+       protected CmsLoginShell createCmsLoginShell() {
+               return new CmsLoginShell(this) {
+
+                       @Override
+                       public void createContents(Composite parent) {
+                               createLoginPage(parent, this);
+                       }
+               };
+       }
+
+       /**
+        * To be overridden. CmsLogin#createCredentialsBlock() should be called at
+        * some point in order to create the credentials composite. In order to use
+        * the default layout, call CmsLogin#defaultCreateContents() but <b>not</b>
+        * CmsLogin#createContent(), since it would lead to a stack overflow.
+        */
+       protected void createLoginPage(Composite parent, CmsLogin login) {
+               login.defaultCreateContents(parent);
+       }
+
+       @Override
+       public void navigateTo(String state) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public void authChange(LoginContext loginContext) {
+               this.loginContext = loginContext;
+       }
+
+       @Override
+       public void logout() {
+               if (loginContext == null)
+                       throw new CmsException("Login context should not bet null");
+               try {
+                       loginContext.logout();
+               } catch (LoginException e) {
+                       throw new CmsException("Cannot log out", e);
+               }
+       }
+
+       @Override
+       public final Subject getSubject() {
+               return subject;
+       }
+
+       @Override
+       public void exception(Throwable e) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public CmsImageManager getImageManager() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+}
diff --git a/org.argeo.security.ui/src/org/argeo/security/ui/login/WorkbenchLogin.java b/org.argeo.security.ui/src/org/argeo/security/ui/login/WorkbenchLogin.java
deleted file mode 100644 (file)
index 2baedaf..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.argeo.security.ui.login;
-
-import java.security.PrivilegedAction;
-
-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;
-
-import org.argeo.ArgeoException;
-import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsImageManager;
-import org.argeo.cms.CmsView;
-import org.argeo.cms.auth.AuthConstants;
-import org.argeo.cms.auth.CurrentUser;
-import org.argeo.cms.auth.HttpRequestCallbackHandler;
-import org.argeo.cms.widgets.auth.CmsLoginShell;
-import org.argeo.eclipse.ui.specific.UiContext;
-import org.eclipse.rap.rwt.application.EntryPoint;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-public abstract class WorkbenchLogin implements EntryPoint, CmsView {
-       // private final static Log log = LogFactory.getLog(WorkbenchLogin.class);
-       private final Subject subject = new Subject();
-       private LoginContext loginContext;
-
-       @Override
-       public int createUI() {
-               final Display display = PlatformUI.createDisplay();
-               UiContext.setData(CmsView.KEY, this);
-               try {
-                       // try pre-auth
-                       loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
-                                       subject, new HttpRequestCallbackHandler(getRequest()));
-                       loginContext.login();
-               } catch (CredentialNotFoundException e) {
-                       CmsLoginShell loginShell = createCmsLoginShell();
-                       loginShell.open();
-                       while (!loginShell.getShell().isDisposed()) {
-                               if (!display.readAndDispatch()) {
-                                       display.sleep();
-                               }
-                       }
-               } catch (LoginException e) {
-                       throw new ArgeoException("Cannot log in", e);
-               }
-               //
-               // RUN THE WORKBENCH
-               //
-               Integer returnCode = null;
-               try {
-                       returnCode = Subject.doAs(subject, new PrivilegedAction<Integer>() {
-                               public Integer run() {
-                                       int result = createAndRunWorkbench(display,
-                                                       CurrentUser.getUsername(subject));
-                                       return new Integer(result);
-                               }
-                       });
-                       // explicit workbench closing
-                       logout();
-               } finally {
-                       display.dispose();
-               }
-               return returnCode;
-       }
-
-       protected abstract int createAndRunWorkbench(Display display,
-                       String username);
-
-       protected HttpServletRequest getRequest() {
-               return UiContext.getHttpRequest();
-       }
-
-       protected CmsLoginShell createCmsLoginShell() {
-               return new CmsLoginShell(this);
-       }
-
-       @Override
-       public void navigateTo(String state) {
-               // TODO Auto-generated method stub
-
-       }
-
-       @Override
-       public void authChange(LoginContext loginContext) {
-               this.loginContext = loginContext;
-       }
-
-       @Override
-       public void logout() {
-               if (loginContext == null)
-                       throw new CmsException("Login context should not bet null");
-               try {
-                       loginContext.logout();
-               } catch (LoginException e) {
-                       throw new CmsException("Cannot log out", e);
-               }
-       }
-
-       @Override
-       public final Subject getSubject() {
-               return subject;
-       }
-
-       @Override
-       public void exception(Throwable e) {
-               // TODO Auto-generated method stub
-
-       }
-
-       @Override
-       public CmsImageManager getImageManager() {
-               // TODO Auto-generated method stub
-               return null;
-       }
-}