Fix invalid thread access
authorBruno Sinou <bsinou@argeo.org>
Fri, 8 Apr 2016 18:48:00 +0000 (18:48 +0000)
committerBruno Sinou <bsinou@argeo.org>
Fri, 8 Apr 2016 18:48:00 +0000 (18:48 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@8867 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminPerspective.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiUserAdminListener.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserEditor.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java

index c65b00f9e4988dba2073b9a2c899b587912c3fe1..2334827c9d4901fe86742fb13a2e6f022cee901e 100644 (file)
@@ -32,9 +32,5 @@ public class SecurityAdminPerspective implements IPerspectiveFactory {
                                0.25f, editorArea);
                left.addView(UsersView.ID);
                left.addView(GroupsView.ID);
-
-               // IFolderLayout right = layout.createFolder("right", IPageLayout.RIGHT,
-               // 0.70f, editorArea);
-               // right.addView(GroupsView.ID);
        }
 }
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiUserAdminListener.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiUserAdminListener.java
new file mode 100644 (file)
index 0000000..98c9836
--- /dev/null
@@ -0,0 +1,27 @@
+package org.argeo.security.ui.admin.internal;
+
+import org.eclipse.swt.widgets.Display;
+import org.osgi.service.useradmin.UserAdminEvent;
+import org.osgi.service.useradmin.UserAdminListener;
+
+/** Convenience class to insure the call to refresh is done in the UI thread */
+public abstract class UiUserAdminListener implements UserAdminListener {
+
+       private final Display display;
+
+       public UiUserAdminListener(Display display) {
+               this.display = display;
+       }
+
+       @Override
+       public void roleChanged(final UserAdminEvent event) {
+               display.asyncExec(new Runnable() {
+                       @Override
+                       public void run() {
+                               roleChangedToUiThread(event);
+                       }
+               });
+       }
+
+       public abstract void roleChangedToUiThread(UserAdminEvent event);
+}
index 47c96f63276a7467d87d3715261c71fb4a91fb8f..f0b0ae7e15b30ec6845a2196b861dff073ed287b 100644 (file)
@@ -131,7 +131,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                        @Override
                        public void initialize(IManagedForm form) {
                                super.initialize(form);
-                               listener = editor.new MainInfoListener(this);
+                               listener = editor.new MainInfoListener(parent.getDisplay(), this);
                                userAdminWrapper.addListener(listener);
                        }
 
@@ -175,14 +175,12 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                Section section = tk.createSection(parent, Section.TITLE_BAR);
                section.setLayoutData(EclipseUiUtils.fillAll());
 
-               // Composite body = tk.createComposite(section, SWT.NONE);
                Composite body = new Composite(section, SWT.NO_FOCUS);
                section.setClient(body);
                body.setLayoutData(EclipseUiUtils.fillAll());
 
                LdifUsersTable userTableViewerCmp = createMemberPart(body, group);
 
-               // create form part (controller)
                SectionPart part = new GroupMembersPart(section, userTableViewerCmp,
                                group);
                getManagedForm().addPart(part);
@@ -191,6 +189,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
 
        public LdifUsersTable createMemberPart(Composite parent, Group group) {
                parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+
                // Define the displayed columns
                List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
                columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
@@ -221,7 +220,6 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
        }
 
        // Local viewers
-
        private class MyUserTableViewer extends LdifUsersTable {
                private static final long serialVersionUID = 8467999509931900367L;
 
@@ -330,7 +328,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                @Override
                public void initialize(IManagedForm form) {
                        super.initialize(form);
-                       listener = editor.new GroupChangeListener(GroupMembersPart.this);
+                       listener = editor.new GroupChangeListener(userViewer.getDisplay(), GroupMembersPart.this);
                        userAdminWrapper.addListener(listener);
                }
 
@@ -382,7 +380,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
 
                @Override
                public void drop(DropTargetEvent event) {
-                       // TODO Is there an opportunity to perform ceck before?
+                       // TODO Is there an opportunity to perform the check before?
 
                        String newUserName = (String) event.data;
                        UserAdmin myUserAdmin = userAdminWrapper.getUserAdmin();
index 77621fe30c80cce0b98162b8156c8ff64b9c596d..6b193f4441551b2e195e2e28527081bbefa09069 100644 (file)
@@ -29,6 +29,7 @@ import org.argeo.eclipse.ui.parts.LdifUsersTable;
 import org.argeo.jcr.ArgeoNames;
 import org.argeo.osgi.useradmin.LdifName;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
+import org.argeo.security.ui.admin.internal.UiUserAdminListener;
 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.argeo.security.ui.admin.internal.providers.CommonNameLP;
 import org.argeo.security.ui.admin.internal.providers.DomainNameLP;
@@ -46,6 +47,7 @@ import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.part.ViewPart;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Role;
@@ -111,17 +113,34 @@ public class GroupsView extends ViewPart implements ArgeoNames {
                userViewer.addDragSupport(operations, tt, new UserDragListener(
                                userViewer));
 
+               // // Register a useradmin listener
+               // listener = new UserAdminListener() {
+               // @Override
+               // public void roleChanged(UserAdminEvent event) {
+               // if (userViewer != null && !userViewer.getTable().isDisposed())
+               // refresh();
+               // }
+               // };
+               // userAdminWrapper.addListener(listener);
+               // }
+
                // Register a useradmin listener
-               listener = new UserAdminListener() {
-                       @Override
-                       public void roleChanged(UserAdminEvent event) {
-                               if (userViewer != null && !userViewer.getTable().isDisposed())
-                                       refresh();
-                       }
-               };
+               listener = new MyUiUAListener(parent.getDisplay());
                userAdminWrapper.addListener(listener);
        }
 
+       private class MyUiUAListener extends UiUserAdminListener {
+               public MyUiUAListener(Display display) {
+                       super(display);
+               }
+
+               @Override
+               public void roleChangedToUiThread(UserAdminEvent event) {
+                       if (userViewer != null && !userViewer.getTable().isDisposed())
+                               refresh();
+               }
+       }
+
        private class MyUserTableViewer extends LdifUsersTable {
                private static final long serialVersionUID = 8467999509931900367L;
 
index 1ec321d6c79833e1482b532573d7e692e8ee4124..715d343105f302c580b0d6e26f98176775aaf85a 100644 (file)
@@ -22,11 +22,13 @@ import org.argeo.ArgeoException;
 import org.argeo.cms.util.useradmin.UserAdminUtils;
 import org.argeo.osgi.useradmin.LdifName;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
+import org.argeo.security.ui.admin.internal.UiUserAdminListener;
 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.PartInitException;
@@ -37,7 +39,6 @@ import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
 import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.service.useradmin.UserAdminEvent;
-import org.osgi.service.useradmin.UserAdminListener;
 
 /** Editor for a user, might be a user or a group. */
 public class UserEditor extends FormEditor {
@@ -64,7 +65,7 @@ public class UserEditor extends FormEditor {
                username = ((UserEditorInput) getEditorInput()).getUsername();
                user = (User) userAdmin.getRole(username);
 
-               listener = new NameChangeListener(user);
+               listener = new NameChangeListener(site.getShell().getDisplay(), user);
                userAdminWrapper.addListener(listener);
                updateEditorTitle(null);
        }
@@ -142,46 +143,49 @@ public class UserEditor extends FormEditor {
 
        // CONTROLERS FOR THIS EDITOR AND ITS PAGES
 
-       private class NameChangeListener implements UserAdminListener {
+       private class NameChangeListener extends UiUserAdminListener {
 
                private final User user;
 
-               public NameChangeListener(User user) {
+               public NameChangeListener(Display display, User user) {
+                       super(display);
                        this.user = user;
                }
 
                @Override
-               public void roleChanged(UserAdminEvent event) {
+               public void roleChangedToUiThread(UserAdminEvent event) {
                        Role changedRole = event.getRole();
                        if (changedRole == null || changedRole.equals(user))
                                updateEditorTitle(null);
                }
        }
 
-       class MainInfoListener implements UserAdminListener {
+       class MainInfoListener extends UiUserAdminListener {
                private final AbstractFormPart part;
 
-               public MainInfoListener(AbstractFormPart part) {
+               public MainInfoListener(Display display, AbstractFormPart part) {
+                       super(display);
                        this.part = part;
                }
 
                @Override
-               public void roleChanged(UserAdminEvent event) {
+               public void roleChangedToUiThread(UserAdminEvent event) {
                        // Rollback
                        if (event.getRole() == null)
                                part.markStale();
                }
        }
 
-       class GroupChangeListener implements UserAdminListener {
+       class GroupChangeListener extends UiUserAdminListener {
                private final AbstractFormPart part;
 
-               public GroupChangeListener(AbstractFormPart part) {
+               public GroupChangeListener(Display display, AbstractFormPart part) {
+                       super(display);
                        this.part = part;
                }
 
                @Override
-               public void roleChanged(UserAdminEvent event) {
+               public void roleChangedToUiThread(UserAdminEvent event) {
                        // always mark as stale
                        part.markStale();
                }
index 1a41777272ea0f03cd49038c85b8e639aa7372de..b08a082b09a27161f729937f2bd7dc10abdd66d2 100644 (file)
@@ -142,7 +142,8 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        @Override
                        public void initialize(IManagedForm form) {
                                super.initialize(form);
-                               listener = editor.new MainInfoListener(this);
+                               listener = editor.new MainInfoListener(parent.getDisplay(),
+                                               this);
                                userAdminWrapper.addListener(listener);
                        }
 
@@ -295,7 +296,8 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        @Override
                        public void initialize(IManagedForm form) {
                                super.initialize(form);
-                               listener = editor.new GroupChangeListener(this);
+                               listener = editor.new GroupChangeListener(parent.getDisplay(),
+                                               this);
                                userAdminWrapper.addListener(listener);
                        }
 
index ca5e6ab741d2dcd92370d27f953cec213bffe03d..edafa28511d34c993a326b5ba84b7cec6a378780 100644 (file)
@@ -27,6 +27,7 @@ import org.argeo.eclipse.ui.parts.LdifUsersTable;
 import org.argeo.jcr.ArgeoNames;
 import org.argeo.osgi.useradmin.LdifName;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
+import org.argeo.security.ui.admin.internal.UiUserAdminListener;
 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.argeo.security.ui.admin.internal.providers.CommonNameLP;
 import org.argeo.security.ui.admin.internal.providers.DomainNameLP;
@@ -40,6 +41,7 @@ import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.TextTransfer;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.part.ViewPart;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Role;
@@ -100,16 +102,22 @@ public class UsersView extends ViewPart implements ArgeoNames {
                                userViewer));
 
                // Register a useradmin listener
-               listener = new UserAdminListener() {
-                       @Override
-                       public void roleChanged(UserAdminEvent event) {
-                               if (userViewer != null && !userViewer.getTable().isDisposed())
-                                       refresh();
-                       }
-               };
+               listener = new MyUiUAListener(parent.getDisplay());
                userAdminWrapper.addListener(listener);
        }
 
+       private class MyUiUAListener extends UiUserAdminListener {
+               public MyUiUAListener(Display display) {
+                       super(display);
+               }
+
+               @Override
+               public void roleChangedToUiThread(UserAdminEvent event) {
+                       if (userViewer != null && !userViewer.getTable().isDisposed())
+                               refresh();
+               }
+       }
+
        private class MyUserTableViewer extends LdifUsersTable {
                private static final long serialVersionUID = 8467999509931900367L;