You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2016/04/21 13:32:48 UTC

[2/2] syncope git commit: [SYNCOPE-834] Consolidating in a single WebSocketBehavior

[SYNCOPE-834] Consolidating in a single WebSocketBehavior


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/c3441630
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/c3441630
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/c3441630

Branch: refs/heads/master
Commit: c34416301b17b148e937390e05a17122b848888e
Parents: c4be818
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Thu Apr 21 13:32:38 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Thu Apr 21 13:32:38 2016 +0200

----------------------------------------------------------------------
 .../client/console/SyncopeConsoleSession.java   | 24 ++++-
 .../syncope/client/console/pages/BasePage.java  | 27 ++++++
 .../client/console/widgets/ApprovalsWidget.java | 95 +++++++++-----------
 .../client/console/widgets/JobWidget.java       | 62 +++++--------
 .../console/widgets/ReconciliationWidget.java   | 87 +++++++-----------
 5 files changed, 149 insertions(+), 146 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/c3441630/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
index 67d1238..95ff320 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
@@ -54,6 +54,7 @@ import org.apache.wicket.authroles.authorization.strategies.role.Roles;
 import org.apache.wicket.request.Request;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean;
 
 public class SyncopeConsoleSession extends AuthenticatedWebSession {
 
@@ -61,20 +62,28 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
 
     private static final Logger LOG = LoggerFactory.getLogger(SyncopeConsoleSession.class);
 
+    private static final ThreadPoolExecutorFactoryBean THREAD_POOL_FACTORY;
+
     public static final String AUTHENTICATED = "AUTHENTICATED";
 
     public static final String MENU_COLLAPSE = "MENU_COLLAPSE";
 
+    static {
+        THREAD_POOL_FACTORY = new ThreadPoolExecutorFactoryBean();
+        THREAD_POOL_FACTORY.setThreadNamePrefix(SyncopeConsoleSession.class.getSimpleName());
+        THREAD_POOL_FACTORY.setDaemon(true);
+    }
+
     private final PlatformInfo platformInfo;
 
     private final List<String> domains;
 
     private String domain;
 
-    private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
-
     private final Map<Class<?>, Object> services = Collections.synchronizedMap(new HashMap<Class<?>, Object>());
 
+    private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5, THREAD_POOL_FACTORY);
+
     private SyncopeClient client;
 
     private String username;
@@ -89,6 +98,8 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
 
     private NotificationPanel notificationPanel;
 
+    private boolean checkReconciliationJob = false;
+
     public static SyncopeConsoleSession get() {
         return (SyncopeConsoleSession) Session.get();
     }
@@ -248,4 +259,13 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
         }
         return notificationPanel;
     }
+
+    public boolean isCheckReconciliationJob() {
+        return checkReconciliationJob;
+    }
+
+    public void setCheckReconciliationJob(final boolean checkReconciliationJob) {
+        this.checkReconciliationJob = checkReconciliationJob;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/c3441630/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
index 334b095..d504cef 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
@@ -20,6 +20,7 @@ package org.apache.syncope.client.console.pages;
 
 import java.io.Serializable;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
 import org.apache.syncope.client.console.SyncopeConsoleApplication;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
@@ -31,6 +32,8 @@ import org.apache.syncope.client.console.topology.Topology;
 import org.apache.syncope.client.console.wicket.markup.head.MetaHeaderItem;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.widgets.ApprovalsWidget;
+import org.apache.syncope.client.console.widgets.JobWidget;
+import org.apache.syncope.client.console.widgets.ReconciliationWidget;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
@@ -52,6 +55,8 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
+import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -83,6 +88,28 @@ public class BasePage extends WebPage implements IAjaxIndicatorAware {
     public BasePage(final PageParameters parameters) {
         super(parameters);
 
+        // Native WebSocket
+        add(new WebSocketBehavior() {
+
+            private static final long serialVersionUID = 3109256773218160485L;
+
+            @Override
+            protected void onConnect(final ConnectedMessage message) {
+                super.onConnect(message);
+
+                SyncopeConsoleSession.get().scheduleAtFixedRate(
+                        new ApprovalsWidget.ApprovalInfoUpdater(message), 0, 30, TimeUnit.SECONDS);
+
+                if (BasePage.this instanceof Dashboard) {
+                    SyncopeConsoleSession.get().scheduleAtFixedRate(
+                            new JobWidget.JobInfoUpdater(message), 0, 10, TimeUnit.SECONDS);
+                    SyncopeConsoleSession.get().scheduleAtFixedRate(
+                            new ReconciliationWidget.ReconciliationJobInfoUpdater(message), 0, 10, TimeUnit.SECONDS);
+                }
+            }
+
+        });
+
         body = new WebMarkupContainer("body");
         Serializable leftMenuCollapse = SyncopeConsoleSession.get().getAttribute(SyncopeConsoleSession.MENU_COLLAPSE);
         if ((leftMenuCollapse instanceof Boolean) && ((Boolean) leftMenuCollapse)) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/c3441630/client/console/src/main/java/org/apache/syncope/client/console/widgets/ApprovalsWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ApprovalsWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ApprovalsWidget.java
index fd19e97..3e704c3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ApprovalsWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ApprovalsWidget.java
@@ -22,14 +22,13 @@ import java.io.Serializable;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.pages.Approvals;
-import org.apache.syncope.client.console.rest.UserWorkflowRestClient;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.syncope.common.rest.api.service.UserWorkflowService;
 import org.apache.wicket.Application;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ThreadContext;
@@ -48,7 +47,6 @@ import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
-import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
 import org.apache.wicket.protocol.ws.api.WebSocketPushBroadcaster;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
@@ -63,7 +61,13 @@ public class ApprovalsWidget extends Panel {
 
     private static final Logger LOG = LoggerFactory.getLogger(ApprovalsWidget.class);
 
-    private static final int UPDATE_PERIOD = 30;
+    private static List<WorkflowFormTO> getLastApprovals() {
+        if (SyncopeConsoleSession.get().owns(StandardEntitlement.WORKFLOW_FORM_LIST)) {
+            return SyncopeConsoleSession.get().getService(UserWorkflowService.class).getForms();
+        } else {
+            return Collections.<WorkflowFormTO>emptyList();
+        }
+    }
 
     private final Label linkApprovalsNumber;
 
@@ -175,51 +179,35 @@ public class ApprovalsWidget extends Panel {
         BookmarkablePageLink<Object> approvals = BookmarkablePageLinkBuilder.build("approvalsLink", Approvals.class);
         add(approvals);
         MetaDataRoleAuthorizationStrategy.authorize(approvals, WebPage.ENABLE, StandardEntitlement.WORKFLOW_FORM_LIST);
-
-        add(new WebSocketBehavior() {
-
-            private static final long serialVersionUID = 7944352891541344021L;
-
-            @Override
-            protected void onConnect(final ConnectedMessage message) {
-                super.onConnect(message);
-                SyncopeConsoleSession.get().scheduleAtFixedRate(
-                        new ApprovalInfoUpdater(message), 0, UPDATE_PERIOD, TimeUnit.SECONDS);
-            }
-        });
-    }
-
-    private List<WorkflowFormTO> getLastApprovals() {
-        if (SyncopeConsoleSession.get().owns(StandardEntitlement.WORKFLOW_FORM_LIST)) {
-            return new UserWorkflowRestClient().getForms();
-        } else {
-            return Collections.<WorkflowFormTO>emptyList();
-        }
     }
 
     @Override
     public void onEvent(final IEvent<?> event) {
         if (event.getPayload() instanceof WebSocketPushPayload) {
             WebSocketPushPayload wsEvent = (WebSocketPushPayload) event.getPayload();
-            if (wsEvent.getMessage() instanceof UpdateMessage) {
+            if (wsEvent.getMessage() instanceof ApprovalsWidgetMessage) {
+                List<WorkflowFormTO> updatedApprovals =
+                        ((ApprovalsWidgetMessage) wsEvent.getMessage()).getUpdatedApprovals();
+                if (!lastApprovals.equals(updatedApprovals)) {
+                    lastApprovals.clear();
+                    lastApprovals.addAll(updatedApprovals);
 
-                ApprovalsWidget.this.linkApprovalsNumber.
-                        setDefaultModelObject(ApprovalsWidget.this.lastApprovals.size());
-                wsEvent.getHandler().add(ApprovalsWidget.this.linkApprovalsNumber);
+                    ApprovalsWidget.this.linkApprovalsNumber.
+                            setDefaultModelObject(ApprovalsWidget.this.lastApprovals.size());
+                    wsEvent.getHandler().add(ApprovalsWidget.this.linkApprovalsNumber);
 
-                ApprovalsWidget.this.headerApprovalsNumber.
-                        setDefaultModelObject(ApprovalsWidget.this.lastApprovals.size());
-                wsEvent.getHandler().add(ApprovalsWidget.this.headerApprovalsNumber);
+                    ApprovalsWidget.this.headerApprovalsNumber.
+                            setDefaultModelObject(ApprovalsWidget.this.lastApprovals.size());
+                    wsEvent.getHandler().add(ApprovalsWidget.this.headerApprovalsNumber);
 
-                ApprovalsWidget.this.lastFive.removeAll();
-                wsEvent.getHandler().add(ApprovalsWidget.this.lastApprovalsList);
+                    ApprovalsWidget.this.lastFive.removeAll();
+                    wsEvent.getHandler().add(ApprovalsWidget.this.lastApprovalsList);
+                }
             }
-        } else {
-            super.onEvent(event);
         }
     }
 
-    protected final class ApprovalInfoUpdater implements Runnable {
+    public static final class ApprovalInfoUpdater implements Runnable {
 
         private final Application application;
 
@@ -239,20 +227,15 @@ public class ApprovalsWidget extends Panel {
                 ThreadContext.setApplication(application);
                 ThreadContext.setSession(session);
 
-                final List<WorkflowFormTO> actual = getLastApprovals();
-                Collections.sort(actual, new WorkflowFormComparator());
-
-                if (!actual.equals(lastApprovals)) {
-                    LOG.debug("Update approvals");
-
-                    lastApprovals.clear();
-                    lastApprovals.addAll(actual);
+                List<WorkflowFormTO> updatedApprovals = getLastApprovals();
+                Collections.sort(updatedApprovals, new WorkflowFormComparator());
 
-                    WebSocketSettings settings = WebSocketSettings.Holder.get(application);
-                    WebSocketPushBroadcaster broadcaster =
-                            new WebSocketPushBroadcaster(settings.getConnectionRegistry());
-                    broadcaster.broadcast(new ConnectedMessage(application, session.getId(), key), new UpdateMessage());
-                }
+                WebSocketSettings settings = WebSocketSettings.Holder.get(application);
+                WebSocketPushBroadcaster broadcaster =
+                        new WebSocketPushBroadcaster(settings.getConnectionRegistry());
+                broadcaster.broadcast(
+                        new ConnectedMessage(application, session.getId(), key),
+                        new ApprovalsWidgetMessage(updatedApprovals));
             } catch (Throwable t) {
                 LOG.error("Unexpected error while checking for updated approval info", t);
             } finally {
@@ -261,13 +244,23 @@ public class ApprovalsWidget extends Panel {
         }
     }
 
-    private static class UpdateMessage implements IWebSocketPushMessage, Serializable {
+    private static class ApprovalsWidgetMessage implements IWebSocketPushMessage, Serializable {
 
         private static final long serialVersionUID = -824793424112532838L;
 
+        private final List<WorkflowFormTO> updatedApprovals;
+
+        ApprovalsWidgetMessage(final List<WorkflowFormTO> updatedApprovals) {
+            this.updatedApprovals = updatedApprovals;
+        }
+
+        public List<WorkflowFormTO> getUpdatedApprovals() {
+            return updatedApprovals;
+        }
+
     }
 
-    private class WorkflowFormComparator implements Comparator<WorkflowFormTO> {
+    private static class WorkflowFormComparator implements Comparator<WorkflowFormTO> {
 
         @Override
         public int compare(final WorkflowFormTO o1, final WorkflowFormTO o2) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/c3441630/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
index 5a50ebf..c91d7de 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
@@ -25,7 +25,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.DirectoryDataProvider;
@@ -62,7 +61,6 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
-import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
 import org.apache.wicket.protocol.ws.api.WebSocketPushBroadcaster;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
@@ -115,17 +113,6 @@ public class JobWidget extends BaseWidget {
         recent = getRecent(SyncopeConsoleSession.get());
 
         add(new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef)));
-
-        add(new WebSocketBehavior() {
-
-            private static final long serialVersionUID = 7944352891541344021L;
-
-            @Override
-            protected void onConnect(final ConnectedMessage message) {
-                super.onConnect(message);
-                SyncopeConsoleSession.get().scheduleAtFixedRate(new JobInfoUpdater(message), 0, 10, TimeUnit.SECONDS);
-            }
-        });
     }
 
     private List<ITab> buildTabList(final PageReference pageRef) {
@@ -163,19 +150,24 @@ public class JobWidget extends BaseWidget {
         if (event.getPayload() instanceof WebSocketPushPayload) {
             WebSocketPushPayload wsEvent = (WebSocketPushPayload) event.getPayload();
             if (wsEvent.getMessage() instanceof JobWidgetMessage) {
-                available.clear();
-                available.addAll(((JobWidgetMessage) wsEvent.getMessage()).getUpdatedAvailable());
-
-                recent.clear();
-                recent.addAll(((JobWidgetMessage) wsEvent.getMessage()).getUpdatedRecent());
-
-                if (availableJobsPanel != null) {
-                    availableJobsPanel.modelChanged();
-                    wsEvent.getHandler().add(availableJobsPanel);
+                List<JobTO> updatedAvailable = ((JobWidgetMessage) wsEvent.getMessage()).getUpdatedAvailable();
+                if (!updatedAvailable.equals(available)) {
+                    available.clear();
+                    available.addAll(updatedAvailable);
+                    if (availableJobsPanel != null) {
+                        availableJobsPanel.modelChanged();
+                        wsEvent.getHandler().add(availableJobsPanel);
+                    }
                 }
-                if (recentExecPanel != null) {
-                    recentExecPanel.modelChanged();
-                    wsEvent.getHandler().add(recentExecPanel);
+
+                List<ExecTO> updatedRecent = ((JobWidgetMessage) wsEvent.getMessage()).getUpdatedRecent();
+                if (!updatedRecent.equals(recent)) {
+                    recent.clear();
+                    recent.addAll(updatedRecent);
+                    if (recentExecPanel != null) {
+                        recentExecPanel.modelChanged();
+                        wsEvent.getHandler().add(recentExecPanel);
+                    }
                 }
             }
         } else if (event.getPayload() instanceof JobActionPanel.JobActionPayload) {
@@ -374,7 +366,7 @@ public class JobWidget extends BaseWidget {
         }
     }
 
-    protected final class JobInfoUpdater implements Runnable {
+    public static final class JobInfoUpdater implements Runnable {
 
         private final Application application;
 
@@ -394,18 +386,12 @@ public class JobWidget extends BaseWidget {
                 ThreadContext.setApplication(application);
                 ThreadContext.setSession(session);
 
-                List<JobTO> updatedAvailable = getAvailable(session);
-                List<ExecTO> updatedRecent = getRecent(session);
-                if (!updatedAvailable.equals(available) || !updatedRecent.equals(recent)) {
-                    LOG.debug("Updated Job info found");
-
-                    WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(application);
-                    WebSocketPushBroadcaster broadcaster =
-                            new WebSocketPushBroadcaster(webSocketSettings.getConnectionRegistry());
-                    broadcaster.broadcast(
-                            new ConnectedMessage(application, session.getId(), key),
-                            new JobWidgetMessage(updatedAvailable, updatedRecent));
-                }
+                WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(application);
+                WebSocketPushBroadcaster broadcaster =
+                        new WebSocketPushBroadcaster(webSocketSettings.getConnectionRegistry());
+                broadcaster.broadcast(
+                        new ConnectedMessage(application, session.getId(), key),
+                        new JobWidgetMessage(getAvailable(session), getRecent(session)));
             } catch (Throwable t) {
                 LOG.error("Unexpected error while checking for updated Job info", t);
             } finally {

http://git-wip-us.apache.org/repos/asf/syncope/blob/c3441630/client/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
index 743d321..fc2f270 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
@@ -30,7 +30,6 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.concurrent.TimeUnit;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
@@ -59,6 +58,7 @@ import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.JobTO;
 import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ReportExecExportFormat;
 import org.apache.syncope.common.rest.api.service.ReportService;
 import org.apache.wicket.Application;
@@ -84,7 +84,6 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
-import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
 import org.apache.wicket.protocol.ws.api.WebSocketPushBroadcaster;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
@@ -111,8 +110,6 @@ public class ReconciliationWidget extends BaseWidget {
 
     private final WebMarkupContainer overlay;
 
-    private boolean checkReconciliationJob = false;
-
     public ReconciliationWidget(final String id, final PageReference pageRef) {
         super(id);
         this.pageRef = pageRef;
@@ -140,21 +137,6 @@ public class ReconciliationWidget extends BaseWidget {
         reportResult.setOutputMarkupId(true);
         add(reportResult);
 
-        if (reconciliationReport != null) {
-            add(new WebSocketBehavior() {
-
-                private static final long serialVersionUID = 3507933905864454312L;
-
-                @Override
-                protected void onConnect(final ConnectedMessage message) {
-                    super.onConnect(message);
-
-                    SyncopeConsoleSession.get().scheduleAtFixedRate(
-                            new ReconciliationJobInfoUpdater(message), 0, 10, TimeUnit.SECONDS);
-                }
-            });
-        }
-
         add(new IndicatorAjaxLink<Void>("refresh") {
 
             private static final long serialVersionUID = -7978723352517770644L;
@@ -167,9 +149,7 @@ public class ReconciliationWidget extends BaseWidget {
                     overlay.setVisible(true);
                     target.add(ReconciliationWidget.this);
 
-                    synchronized (this) {
-                        checkReconciliationJob = true;
-                    }
+                    SyncopeConsoleSession.get().setCheckReconciliationJob(true);
 
                     info(getString(Constants.OPERATION_SUCCEEDED));
                 } catch (Exception e) {
@@ -205,7 +185,7 @@ public class ReconciliationWidget extends BaseWidget {
                 return new ProgressesPanel(panelId, report.getRun(), progressBeans);
             }
         });
-        tabs.add(new AbstractTab(new ResourceModel("users")) {
+        tabs.add(new AbstractTab(Model.of(AnyTypeKind.USER.name())) {
 
             private static final long serialVersionUID = -6815067322125799251L;
 
@@ -214,7 +194,7 @@ public class ReconciliationWidget extends BaseWidget {
                 return new AnysReconciliationPanel(panelId, report.getUsers(), pageRef);
             }
         });
-        tabs.add(new AbstractTab(new ResourceModel("groups")) {
+        tabs.add(new AbstractTab(Model.of(AnyTypeKind.GROUP.name())) {
 
             private static final long serialVersionUID = -6815067322125799251L;
 
@@ -306,9 +286,7 @@ public class ReconciliationWidget extends BaseWidget {
 
                 wsEvent.getHandler().add(ReconciliationWidget.this);
 
-                synchronized (this) {
-                    checkReconciliationJob = false;
-                }
+                SyncopeConsoleSession.get().setCheckReconciliationJob(false);
             }
         }
     }
@@ -485,7 +463,7 @@ public class ReconciliationWidget extends BaseWidget {
         }
     }
 
-    protected final class ReconciliationJobInfoUpdater implements Runnable {
+    public static final class ReconciliationJobInfoUpdater implements Runnable {
 
         private final String applicationName;
 
@@ -501,37 +479,36 @@ public class ReconciliationWidget extends BaseWidget {
 
         @Override
         public void run() {
-            synchronized (ReconciliationWidget.this) {
-                if (ReconciliationWidget.this.checkReconciliationJob) {
-                    try {
-                        Application application = Application.get(applicationName);
-                        ThreadContext.setApplication(application);
-                        ThreadContext.setSession(session);
+            if (session.isCheckReconciliationJob()) {
+                try {
+                    final Application application = Application.get(applicationName);
+                    ThreadContext.setApplication(application);
+                    ThreadContext.setSession(session);
 
-                        JobTO reportJobTO = IterableUtils.find(session.getService(ReportService.class).listJobs(),
-                                new Predicate<JobTO>() {
+                    JobTO reportJobTO = IterableUtils.find(session.getService(ReportService.class).listJobs(),
+                            new Predicate<JobTO>() {
 
-                            @Override
-                            public boolean evaluate(final JobTO jobTO) {
-                                return SyncopeConsoleApplication.get().
-                                        getReconciliationReportKey().equals(jobTO.getRefKey());
-                            }
-                        });
-                        if (reportJobTO != null && !reportJobTO.isRunning()) {
-                            LOG.debug("Report {} is not running", reconciliationReportKey);
-
-                            WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(application);
-                            WebSocketPushBroadcaster broadcaster =
-                                    new WebSocketPushBroadcaster(webSocketSettings.getConnectionRegistry());
-                            broadcaster.broadcast(
-                                    new ConnectedMessage(application, session.getId(), key),
-                                    new ReconciliationJobNotRunningMessage());
+                        @Override
+                        public boolean evaluate(final JobTO jobTO) {
+                            return SyncopeConsoleApplication.class.cast(application).
+                                    getReconciliationReportKey().equals(jobTO.getRefKey());
                         }
-                    } catch (Throwable t) {
-                        LOG.error("Unexpected error while checking for updated reconciliation job info", t);
-                    } finally {
-                        ThreadContext.detach();
+                    });
+                    if (reportJobTO != null && !reportJobTO.isRunning()) {
+                        LOG.debug("Report {} is not running",
+                                SyncopeConsoleApplication.class.cast(application).getReconciliationReportKey());
+
+                        WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(application);
+                        WebSocketPushBroadcaster broadcaster =
+                                new WebSocketPushBroadcaster(webSocketSettings.getConnectionRegistry());
+                        broadcaster.broadcast(
+                                new ConnectedMessage(application, session.getId(), key),
+                                new ReconciliationJobNotRunningMessage());
                     }
+                } catch (Throwable t) {
+                    LOG.error("Unexpected error while checking for updated reconciliation job info", t);
+                } finally {
+                    ThreadContext.detach();
                 }
             }
         }