From: Bruno Sinou Date: Fri, 8 Apr 2016 18:48:00 +0000 (+0000) Subject: Fix invalid thread access X-Git-Tag: argeo-commons-2.1.36~4 X-Git-Url: https://git.argeo.org/?a=commitdiff_plain;h=f782539a48e6d4779767c5a511c25df1b9078667;p=lgpl%2Fargeo-commons.git Fix invalid thread access git-svn-id: https://svn.argeo.org/commons/trunk@8867 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminPerspective.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminPerspective.java index c65b00f9e..2334827c9 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminPerspective.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminPerspective.java @@ -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 index 000000000..98c983683 --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiUserAdminListener.java @@ -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); +} diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java index 47c96f632..f0b0ae7e1 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java @@ -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 columnDefs = new ArrayList(); 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(); diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java index 77621fe30..6b193f444 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java @@ -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; diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserEditor.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserEditor.java index 1ec321d6c..715d34310 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserEditor.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserEditor.java @@ -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(); } diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java index 1a4177727..b08a082b0 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java @@ -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); } diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java index ca5e6ab74..edafa2851 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java @@ -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;