syncope-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ilgro...@apache.org
Subject [2/2] syncope git commit: [SYNCOPE-744][SYNCOPE-750] Job widget almost done
Date Tue, 01 Mar 2016 19:14:37 GMT
[SYNCOPE-744][SYNCOPE-750] Job widget almost done


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

Branch: refs/heads/master
Commit: 6306562fde0b345b6ff944bb98f275901c675be8
Parents: 6da4eec
Author: Francesco Chicchiriccò <ilgrosso@apache.org>
Authored: Tue Mar 1 20:14:21 2016 +0100
Committer: Francesco Chicchiriccò <ilgrosso@apache.org>
Committed: Tue Mar 1 20:14:21 2016 +0100

----------------------------------------------------------------------
 .../commands/report/ReportResultManager.java    |   4 +-
 .../report/ReportSyncopeOperations.java         |   2 +-
 .../cli/commands/task/TaskResultManager.java    |   4 +-
 .../commands/task/TaskSyncopeOperations.java    |   2 +-
 .../client/console/SyncopeConsoleSession.java   |  25 ++
 .../client/console/commons/Constants.java       |   6 +-
 .../init/ClassPathScanImplementationLookup.java |  18 +-
 .../client/console/pages/AbstractExtPage.java   |  34 ---
 .../client/console/pages/BaseExtPage.java       |  34 +++
 .../syncope/client/console/pages/BasePage.java  |   8 +-
 .../syncope/client/console/pages/Dashboard.java | 149 ++++++++++--
 .../console/panels/AnyTypeClassesPanel.java     |   4 +-
 .../client/console/panels/AnyTypesPanel.java    |   4 +-
 .../client/console/panels/ParametersPanel.java  |   4 +-
 .../console/panels/RelationshipTypePanel.java   |   4 +-
 .../console/panels/ResourceMappingPanel.java    |  17 +-
 .../client/console/panels/SchemaTypePanel.java  |   4 +-
 .../console/panels/SecurityQuestionsPanel.java  |   4 +-
 .../panels/search/SearchClausePanel.java        |   4 +-
 .../client/console/topology/Topology.java       |   5 +-
 .../topology/TopologyWebSocketBehavior.java     |  21 +-
 .../wicket/ajax/IndicatorAjaxEventBehavior.java |  40 +++
 .../wicket/ajax/IndicatorAjaxTimerBehavior.java |  41 ++++
 ...AjaxFormChoiceComponentUpdatingBehavior.java |   3 +
 .../console/widgets/AnyByRealmWidget.java       |  66 ++++-
 .../console/widgets/CompletenessWidget.java     | 152 ++++++++----
 .../client/console/widgets/JobActionPanel.java  | 139 +++++++++++
 .../client/console/widgets/JobWidget.java       | 242 +++++++++++++++++--
 .../client/console/widgets/LoadWidget.java      |  13 +-
 .../client/console/widgets/NumberWidget.java    |  18 +-
 .../console/widgets/UsersByStatusWidget.java    |  22 +-
 .../syncope/client/console/pages/Dashboard.html |  40 +--
 .../client/console/widgets/JobActionPanel.html  |  33 +++
 .../client/console/widgets/JobWidget.html       |   2 +-
 .../client/console/widgets/JobWidget.properties |   2 +-
 .../console/widgets/JobWidget_it.properties     |  12 +-
 .../console/widgets/JobWidget_pt_BR.properties  |  12 +-
 .../apache/syncope/common/lib/to/ExecTO.java    |  31 ++-
 .../org/apache/syncope/common/lib/to/JobTO.java |  31 ++-
 .../syncope/common/lib/types/JobType.java       |  29 +++
 .../common/rest/api/service/ReportService.java  |   3 +-
 .../common/rest/api/service/TaskService.java    |   3 +-
 .../syncope/core/logic/AbstractJobLogic.java    |  56 +----
 .../syncope/core/logic/NotificationLogic.java   |  11 +-
 .../apache/syncope/core/logic/ReportLogic.java  |  16 +-
 .../apache/syncope/core/logic/TaskLogic.java    |  16 +-
 .../provisioning/api/data/ReportDataBinder.java |   2 +-
 .../provisioning/api/data/TaskDataBinder.java   |   2 +-
 .../java/data/ReportDataBinderImpl.java         |   7 +-
 .../java/data/TaskDataBinderImpl.java           |  11 +-
 .../rest/cxf/service/ReportServiceImpl.java     |   4 +-
 .../core/rest/cxf/service/TaskServiceImpl.java  |   4 +-
 .../client/console/pages/CamelRoutes.java       |   2 +-
 .../syncope/fit/core/SchedTaskITCase.java       |  10 +-
 .../apache/syncope/fit/core/SyncTaskITCase.java |   2 +-
 55 files changed, 1104 insertions(+), 330 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportResultManager.java
index a7234b1..7fd2a93 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportResultManager.java
@@ -71,13 +71,13 @@ public class ReportResultManager extends CommonsResultManager {
             System.out.println("       message: " + reportExecTO.getMessage());
             System.out.println("       start date: " + reportExecTO.getStart());
             System.out.println("       end date: " + reportExecTO.getEnd());
-            System.out.println("       report: " + reportExecTO.getReference());
+            System.out.println("       report: " + reportExecTO.getRefDesc());
         }
     }
 
     public void printJobs(final List<JobTO> jobTOs) {
         for (final JobTO jobTO : jobTOs) {
-            System.out.println("       REPORT: " + jobTO.getReference());
+            System.out.println("       REPORT: " + jobTO.getRefDesc());
             System.out.println("       status: " + jobTO.getStatus());
             System.out.println("       start date: " + jobTO.getStart());
             System.out.println("       running: " + jobTO.isRunning());

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportSyncopeOperations.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportSyncopeOperations.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportSyncopeOperations.java
index 8a8814a..5c90069 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportSyncopeOperations.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportSyncopeOperations.java
@@ -41,7 +41,7 @@ public class ReportSyncopeOperations {
     }
 
     public List<JobTO> listJobs() {
-        return reportService.listJobs(10);
+        return reportService.listJobs();
     }
 
     public List<ReportTO> list() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskResultManager.java
index 1072deb..ed5b977 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskResultManager.java
@@ -199,7 +199,7 @@ public class TaskResultManager extends CommonsResultManager {
         for (final ExecTO taskExecTO : taskExecTOs) {
             System.out.println("     EXECUTIONS: ");
             System.out.println("     - task execution key: " + taskExecTO.getKey());
-            System.out.println("       task: " + taskExecTO.getReference());
+            System.out.println("       task: " + taskExecTO.getRefDesc());
             System.out.println("       message: ");
             System.out.println("       ###############     <BEGIN MESSAGE>     ###############");
             System.out.println("       message: " + taskExecTO.getMessage());
@@ -213,7 +213,7 @@ public class TaskResultManager extends CommonsResultManager {
 
     public void printJobs(final List<JobTO> jobTOs) {
         for (final JobTO jobTO : jobTOs) {
-            System.out.println("       TASK: " + jobTO.getReference());
+            System.out.println("       TASK: " + jobTO.getRefDesc());
             System.out.println("       status: " + jobTO.getStatus());
             System.out.println("       start date: " + jobTO.getStart());
             System.out.println("       running: " + jobTO.isRunning());

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskSyncopeOperations.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskSyncopeOperations.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskSyncopeOperations.java
index a1651ca..5cee290 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskSyncopeOperations.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskSyncopeOperations.java
@@ -33,7 +33,7 @@ public class TaskSyncopeOperations {
     private final TaskService taskService = SyncopeServices.get(TaskService.class);
 
     public List<JobTO> listJobs() {
-        return taskService.listJobs(10);
+        return taskService.listJobs();
     }
 
     public <T extends AbstractTaskTO> T read(final String taskKey) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/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 f08e1cd..d383e4c 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
@@ -26,6 +26,10 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
 import javax.ws.rs.core.EntityTag;
 import javax.ws.rs.core.MediaType;
 import org.apache.commons.collections4.CollectionUtils;
@@ -67,6 +71,8 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
 
     private String domain;
 
+    private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
+
     private final Map<Class<?>, Object> services = Collections.synchronizedMap(new HashMap<Class<?>, Object>());
 
     private SyncopeClient client;
@@ -102,6 +108,25 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
                 domains);
     }
 
+    public void execute(final Runnable command) {
+        executorService.execute(command);
+    }
+
+    public ScheduledFuture<?> scheduleAtFixedRate(
+            final Runnable command,
+            final long initialDelay,
+            final long period,
+            final TimeUnit unit) {
+
+        return executorService.scheduleAtFixedRate(command, initialDelay, period, unit);
+    }
+
+    @Override
+    public void invalidate() {
+        super.invalidate();
+        executorService.shutdownNow();
+    }
+
     public PlatformInfo getPlatformInfo() {
         return platformInfo;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
index b9823ca..0c50aa5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
@@ -24,10 +24,12 @@ public final class Constants {
 
     public static final String ON_CHANGE = "change";
 
-    public static final String ON_KEYUP = "keyup";
-
     public static final String ON_BLUR = "blur";
 
+    public static final String ON_MOUSE_ENTER = "mouseenter";
+
+    public static final String ON_MOUSE_LEAVE = "mouseleave";
+
     public static final String PNG_EXT = ".png";
 
     public static final String FEEDBACK = "feedback";

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java b/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
index 67bbe20..76b298c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
@@ -25,7 +25,7 @@ import java.util.Comparator;
 import java.util.List;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.pages.AbstractExtPage;
+import org.apache.syncope.client.console.pages.BaseExtPage;
 import org.apache.syncope.client.console.annotations.BinaryPreview;
 import org.apache.syncope.client.console.annotations.ExtPage;
 import org.apache.syncope.client.console.pages.BasePage;
@@ -45,7 +45,7 @@ public class ClassPathScanImplementationLookup {
 
     private List<Class<? extends AbstractBinaryPreviewer>> previewers;
 
-    private List<Class<? extends AbstractExtPage>> extPages;
+    private List<Class<? extends BaseExtPage>> extPages;
 
     @SuppressWarnings("unchecked")
     public void load() {
@@ -56,7 +56,7 @@ public class ClassPathScanImplementationLookup {
         ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
         scanner.addIncludeFilter(new AssignableTypeFilter(BasePage.class));
         scanner.addIncludeFilter(new AssignableTypeFilter(AbstractBinaryPreviewer.class));
-        scanner.addIncludeFilter(new AssignableTypeFilter(AbstractExtPage.class));
+        scanner.addIncludeFilter(new AssignableTypeFilter(BaseExtPage.class));
 
         for (BeanDefinition bd : scanner.findCandidateComponents(StringUtils.EMPTY)) {
             try {
@@ -65,9 +65,9 @@ public class ClassPathScanImplementationLookup {
                 boolean isAbsractClazz = Modifier.isAbstract(clazz.getModifiers());
 
                 if (!isAbsractClazz) {
-                    if (AbstractExtPage.class.isAssignableFrom(clazz)) {
+                    if (BaseExtPage.class.isAssignableFrom(clazz)) {
                         if (clazz.isAnnotationPresent(ExtPage.class)) {
-                            extPages.add((Class<? extends AbstractExtPage>) clazz);
+                            extPages.add((Class<? extends BaseExtPage>) clazz);
                         } else {
                             LOG.error("Could not find annotation {} in {}, ignoring",
                                     ExtPage.class.getName(), clazz.getName());
@@ -85,12 +85,12 @@ public class ClassPathScanImplementationLookup {
         pages = Collections.unmodifiableList(pages);
         previewers = Collections.unmodifiableList(previewers);
 
-        Collections.sort(extPages, new Comparator<Class<? extends AbstractExtPage>>() {
+        Collections.sort(extPages, new Comparator<Class<? extends BaseExtPage>>() {
 
             @Override
             public int compare(
-                    final Class<? extends AbstractExtPage> o1,
-                    final Class<? extends AbstractExtPage> o2) {
+                    final Class<? extends BaseExtPage> o1,
+                    final Class<? extends BaseExtPage> o2) {
 
                 int prio1 = o1.getAnnotation(ExtPage.class).priority();
                 int prio2 = o2.getAnnotation(ExtPage.class).priority();
@@ -130,7 +130,7 @@ public class ClassPathScanImplementationLookup {
         return previewers;
     }
 
-    public List<Class<? extends AbstractExtPage>> getExtPageClasses() {
+    public List<Class<? extends BaseExtPage>> getExtPageClasses() {
         return extPages;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractExtPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractExtPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractExtPage.java
deleted file mode 100644
index 1a8949d..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractExtPage.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.pages;
-
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-
-public abstract class AbstractExtPage extends BasePage {
-
-    private static final long serialVersionUID = 4627828052717627159L;
-
-    public AbstractExtPage() {
-        super();
-    }
-
-    public AbstractExtPage(final PageParameters parameters) {
-        super(parameters);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/pages/BaseExtPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BaseExtPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BaseExtPage.java
new file mode 100644
index 0000000..c666fe3
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BaseExtPage.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public abstract class BaseExtPage extends BasePage {
+
+    private static final long serialVersionUID = 4627828052717627159L;
+
+    public BaseExtPage() {
+        super();
+    }
+
+    public BaseExtPage(final PageParameters parameters) {
+        super(parameters);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/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 820fa7f..a860bfe 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
@@ -251,20 +251,20 @@ public class BasePage extends WebPage implements IAjaxIndicatorAware {
         ClassPathScanImplementationLookup classPathScanImplementationLookup =
                 (ClassPathScanImplementationLookup) SyncopeConsoleApplication.get().
                 getServletContext().getAttribute(ConsoleInitializer.CLASSPATH_LOOKUP);
-        List<Class<? extends AbstractExtPage>> extPageClasses = classPathScanImplementationLookup.getExtPageClasses();
+        List<Class<? extends BaseExtPage>> extPageClasses = classPathScanImplementationLookup.getExtPageClasses();
 
         WebMarkupContainer extensionsLI = new WebMarkupContainer(getLIContainerId("extensions"));
         extensionsLI.setOutputMarkupPlaceholderTag(true);
         extensionsLI.setVisible(!extPageClasses.isEmpty());
         body.add(extensionsLI);
 
-        ListView<Class<? extends AbstractExtPage>> extPages = new ListView<Class<? extends AbstractExtPage>>(
+        ListView<Class<? extends BaseExtPage>> extPages = new ListView<Class<? extends BaseExtPage>>(
                 "extPages", extPageClasses) {
 
             private static final long serialVersionUID = 4949588177564901031L;
 
             @Override
-            protected void populateItem(final ListItem<Class<? extends AbstractExtPage>> item) {
+            protected void populateItem(final ListItem<Class<? extends BaseExtPage>> item) {
                 WebMarkupContainer containingLI = new WebMarkupContainer("extPageLI");
                 item.add(containingLI);
                 if (item.getModelObject().equals(BasePage.this.getClass())) {
@@ -294,7 +294,7 @@ public class BasePage extends WebPage implements IAjaxIndicatorAware {
         extPages.setOutputMarkupId(true);
         extensionsLI.add(extPages);
 
-        if (getPage() instanceof AbstractExtPage) {
+        if (getPage() instanceof BaseExtPage) {
             extPages.add(new Behavior() {
 
                 private static final long serialVersionUID = 1469628524240283489L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/pages/Dashboard.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Dashboard.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Dashboard.java
index 28dfbb8..4d26d93 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Dashboard.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Dashboard.java
@@ -18,7 +18,9 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import org.apache.commons.lang3.tuple.Triple;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.wicket.ajax.IndicatorAjaxTimerBehavior;
 import org.apache.syncope.client.console.widgets.NumberWidget;
 import org.apache.syncope.client.console.widgets.AnyByRealmWidget;
 import org.apache.syncope.client.console.widgets.CompletenessWidget;
@@ -26,23 +28,138 @@ import org.apache.syncope.client.console.widgets.JobWidget;
 import org.apache.syncope.client.console.widgets.LoadWidget;
 import org.apache.syncope.client.console.widgets.UsersByStatusWidget;
 import org.apache.syncope.common.lib.info.NumbersInfo;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.rest.api.service.SyncopeService;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.time.Duration;
 
 public class Dashboard extends BasePage {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
+    private final NumberWidget totalUsers;
+
+    private final NumberWidget totalGroups;
+
+    private final NumberWidget totalAny1OrRoles;
+
+    private final NumberWidget totalAny2OrResources;
+
+    private final UsersByStatusWidget usersByStatus;
+
+    private final CompletenessWidget completeness;
+
+    private final AnyByRealmWidget anyByRealm;
+
+    private final LoadWidget load;
+
     public Dashboard(final PageParameters parameters) {
         super(parameters);
 
         NumbersInfo numbers = SyncopeConsoleSession.get().getService(SyncopeService.class).numbers();
 
-        body.add(new NumberWidget(
-                "totalUsers", "bg-yellow", numbers.getTotalUsers(), getString("users"), "ion ion-person"));
-        body.add(new NumberWidget(
-                "totalGroups", "bg-red", numbers.getTotalGroups(), getString("groups"), "ion ion-person-stalker"));
+        WebMarkupContainer timer = new WebMarkupContainer("timer");
+        timer.setOutputMarkupId(true);
+        body.add(timer);
+
+        totalUsers = new NumberWidget(
+                "totalUsers", "bg-yellow", numbers.getTotalUsers(), getString("users"), "ion ion-person");
+        timer.add(totalUsers);
+        totalGroups = new NumberWidget(
+                "totalGroups", "bg-red", numbers.getTotalGroups(), getString("groups"), "ion ion-person-stalker");
+        timer.add(totalGroups);
+
+        Triple<Integer, String, String> built = buildTotalAny1OrRoles(numbers);
+        totalAny1OrRoles = new NumberWidget(
+                "totalAny1OrRoles", "bg-green", built.getLeft(), built.getMiddle(), built.getRight());
+        timer.add(totalAny1OrRoles);
+
+        built = buildTotalAny2OrResources(numbers);
+        totalAny2OrResources = new NumberWidget(
+                "totalAny2OrResources", "bg-aqua", built.getLeft(), built.getMiddle(), built.getRight());
+        timer.add(totalAny2OrResources);
+
+        usersByStatus = new UsersByStatusWidget("usersByStatus", numbers.getUsersByStatus());
+        timer.add(usersByStatus);
+
+        completeness = new CompletenessWidget("completeness", numbers.getConfCompleteness());
+        timer.add(completeness);
+
+        anyByRealm = new AnyByRealmWidget(
+                "anyByRealm",
+                numbers.getUsersByRealm(),
+                numbers.getGroupsByRealm(),
+                numbers.getAnyType1(),
+                numbers.getAny1ByRealm(),
+                numbers.getAnyType2(),
+                numbers.getAny2ByRealm());
+        timer.add(anyByRealm);
+
+        load = new LoadWidget("load", SyncopeConsoleSession.get().getService(SyncopeService.class).system());
+        timer.add(load);
+
+        timer.add(new IndicatorAjaxTimerBehavior(Duration.seconds(60)) {
+
+            private static final long serialVersionUID = -4426283634345968585L;
 
+            @Override
+            protected void onTimer(final AjaxRequestTarget target) {
+                NumbersInfo numbers = SyncopeConsoleSession.get().getService(SyncopeService.class).numbers();
+
+                if (totalUsers.refresh(numbers.getTotalUsers())) {
+                    target.add(totalUsers);
+                }
+                if (totalGroups.refresh(numbers.getTotalGroups())) {
+                    target.add(totalGroups);
+                }
+
+                Triple<Integer, String, String> updatedBuild = buildTotalAny1OrRoles(numbers);
+                if (totalAny1OrRoles.refresh(updatedBuild.getLeft())) {
+                    target.add(totalAny1OrRoles);
+                }
+                updatedBuild = buildTotalAny2OrResources(numbers);
+                if (totalAny2OrResources.refresh(updatedBuild.getLeft())) {
+                    target.add(totalAny2OrResources);
+                }
+
+                if (usersByStatus.refresh(numbers.getUsersByStatus())) {
+                    target.add(usersByStatus);
+                }
+
+                if (completeness.refresh(numbers.getConfCompleteness())) {
+                    target.add(completeness);
+                }
+
+                if (anyByRealm.refresh(
+                        numbers.getUsersByRealm(),
+                        numbers.getGroupsByRealm(),
+                        numbers.getAnyType1(),
+                        numbers.getAny1ByRealm(),
+                        numbers.getAnyType2(),
+                        numbers.getAny2ByRealm())) {
+
+                    target.add(anyByRealm);
+                }
+
+                load.refresh(SyncopeConsoleSession.get().getService(SyncopeService.class).system());
+                target.add(load);
+            }
+        });
+
+        JobWidget job = new JobWidget("job", getPageReference());
+        MetaDataRoleAuthorizationStrategy.authorize(job, WebPage.ENABLE,
+                String.format("%s,%s,%s",
+                        StandardEntitlement.NOTIFICATION_LIST,
+                        StandardEntitlement.TASK_LIST,
+                        StandardEntitlement.REPORT_LIST));
+        body.add(job);
+    }
+
+    private Triple<Integer, String, String> buildTotalAny1OrRoles(final NumbersInfo numbers) {
         int number;
         String label;
         String icon;
@@ -55,8 +172,13 @@ public class Dashboard extends BasePage {
             label = numbers.getAnyType1();
             icon = "ion ion-gear-a";
         }
-        body.add(new NumberWidget("totalAny1OrRoles", "bg-green", number, label, icon));
+        return Triple.of(number, label, icon);
+    }
 
+    private Triple<Integer, String, String> buildTotalAny2OrResources(final NumbersInfo numbers) {
+        int number;
+        String label;
+        String icon;
         if (numbers.getAnyType2() == null) {
             number = numbers.getTotalResources();
             label = getString("resources");
@@ -66,21 +188,6 @@ public class Dashboard extends BasePage {
             label = numbers.getAnyType2();
             icon = "ion ion-gear-a";
         }
-        body.add(new NumberWidget("totalAny1OrResources", "bg-aqua", number, label, icon));
-
-        body.add(new UsersByStatusWidget("usersByStatus", numbers.getUsersByStatus()));
-        body.add(new CompletenessWidget("completeness", numbers.getConfCompleteness()));
-        body.add(new AnyByRealmWidget(
-                "anyByRealm",
-                numbers.getUsersByRealm(),
-                numbers.getGroupsByRealm(),
-                numbers.getAnyType1(),
-                numbers.getAny1ByRealm(),
-                numbers.getAnyType2(),
-                numbers.getAny2ByRealm()));
-
-        body.add(new LoadWidget("load", SyncopeConsoleSession.get().getService(SyncopeService.class).system()));
-
-        body.add(new JobWidget("job", getPageReference()));
+        return Triple.of(number, label, icon);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
index c9c0e56..c563fca 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
@@ -137,8 +137,8 @@ public class AnyTypeClassesPanel extends AbstractTypesPanel<AnyTypeClassTO, AnyT
                             String css = super.getCssClass();
                             if ("key".equals(fieldName)) {
                                 css = StringUtils.isBlank(css)
-                                        ? "medium_fixedsize"
-                                        : css + " medium_fixedsize";
+                                        ? "col-xs-1"
+                                        : css + " col-xs-1";
                             }
                             return css;
                         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
index a2b97ff..d7f5a95 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
@@ -138,8 +138,8 @@ public class AnyTypesPanel extends AbstractTypesPanel<AnyTypeTO, AnyTypeProvider
                             String css = super.getCssClass();
                             if ("key".equals(fieldName)) {
                                 css = StringUtils.isBlank(css)
-                                        ? "medium_fixedsize"
-                                        : css + " medium_fixedsize";
+                                        ? "col-xs-1"
+                                        : css + " col-xs-1";
                             }
                             return css;
                         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
index c778bab..5d8190e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
@@ -160,8 +160,8 @@ public class ParametersPanel extends AbstractSearchResultPanel<
                             String css = super.getCssClass();
                             if ("key".equals(fieldName)) {
                                 css = StringUtils.isBlank(css)
-                                        ? "medium_fixedsize"
-                                        : css + " medium_fixedsize";
+                                        ? "col-xs-1"
+                                        : css + " col-xs-1";
                             }
                             return css;
                         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
index d00dd7b..5efbf47 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
@@ -135,8 +135,8 @@ public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO
                         String css = super.getCssClass();
                         if ("key".equals(fieldName)) {
                             css = StringUtils.isBlank(css)
-                                    ? "medium_fixedsize"
-                                    : css + " medium_fixedsize";
+                                    ? "col-xs-1"
+                                    : css + " col-xs-1";
                         }
                         return css;
                     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
index 6f25bdd..5fb5564 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
@@ -74,19 +74,9 @@ public class ResourceMappingPanel extends Panel {
     /**
      * Mapping field style sheet.
      */
-    private static final String FIELD_STYLE = "short_fixedsize";
-
-    /**
-     * Mapping field style sheet.
-     */
     private static final String DEF_FIELD_STYLE = "";
 
     /**
-     * Mapping field style sheet.
-     */
-    private static final String SHORT_FIELD_STYLE = "veryshort_fixedsize";
-
-    /**
      * Schema rest client.
      */
     private final SchemaRestClient schemaRestClient = new SchemaRestClient();
@@ -264,7 +254,6 @@ public class ResourceMappingPanel extends Panel {
                         false);
                 intAttrNames.setChoices(schemaNames);
                 intAttrNames.setRequired(true).hideLabel();
-                intAttrNames.setStyleSheet(false, FIELD_STYLE);
 
                 intAttrNames.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
@@ -283,7 +272,6 @@ public class ResourceMappingPanel extends Panel {
                         new PropertyModel<IntMappingType>(mapItem, "intMappingType"));
                 intMappingTypes.setRequired(true).hideLabel();
                 intMappingTypes.setChoices(attrTypes);
-                intMappingTypes.setStyleSheet(false, FIELD_STYLE);
                 item.add(intMappingTypes);
 
                 final AjaxDropDownChoicePanel<AnyTypeKind> entitiesPanel = new AjaxDropDownChoicePanel<>(
@@ -330,7 +318,6 @@ public class ResourceMappingPanel extends Panel {
                 }
                 extAttrNames.setRequired(required).hideLabel();
                 extAttrNames.setEnabled(required);
-                extAttrNames.setStyleSheet(false, FIELD_STYLE);
                 item.add(extAttrNames);
 
                 final AjaxTextFieldPanel mandatory = new AjaxTextFieldPanel(
@@ -339,7 +326,6 @@ public class ResourceMappingPanel extends Panel {
                         new PropertyModel<String>(mapItem, "mandatoryCondition"));
                 mandatory.hideLabel();
                 mandatory.setChoices(Arrays.asList(new String[] { "true", "false" }));
-                mandatory.setStyleSheet(false, SHORT_FIELD_STYLE);
                 item.add(mandatory);
 
                 final AjaxCheckBoxPanel connObjectKey = new AjaxCheckBoxPanel(
@@ -456,9 +442,10 @@ public class ResourceMappingPanel extends Panel {
 
         return clazz == null ? new ArrayList<String>()
                 : IterableUtils.toList(IterableUtils.filteredIterable(clazz.getAttributes(), new Predicate<String>() {
+
                     @Override
                     public boolean evaluate(final String object) {
-                        return !("__NAME__".equals(object) || "__ENABLE__".equals(object) 
+                        return !("__NAME__".equals(object) || "__ENABLE__".equals(object)
                                 || "__PASSWORD__".equals(object));
                     }
                 }));

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
index 8207b78..fe965c0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
@@ -171,8 +171,8 @@ public class SchemaTypePanel extends AbstractTypesPanel<AbstractSchemaTO, Schema
                             String css = super.getCssClass();
                             if ("key".equals(field)) {
                                 css = StringUtils.isBlank(css)
-                                        ? "medium_fixedsize"
-                                        : css + " medium_fixedsize";
+                                        ? "col-xs-1"
+                                        : css + " col-xs-1";
                             }
                             return css;
                         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
index 65d2b5c..c7d2fcc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
@@ -139,8 +139,8 @@ public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
                             String css = super.getCssClass();
                             if ("key".equals(fieldName)) {
                                 css = StringUtils.isBlank(css)
-                                        ? "medium_fixedsize"
-                                        : css + " medium_fixedsize";
+                                        ? "col-xs-1"
+                                        : css + " col-xs-1";
                             }
                             return css;
                         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
index f8e6372..a57127e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
@@ -165,7 +165,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
 
                 switch (field.getModel().getObject().getType()) {
                     case ATTRIBUTE:
-                        final List<String> names = new ArrayList<String>(dnames.getObject());
+                        final List<String> names = new ArrayList<>(dnames.getObject());
                         if (anames != null && anames.getObject() != null && !anames.getObject().isEmpty()) {
                             names.addAll(anames.getObject());
                         }
@@ -293,7 +293,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
             operatorContainer.add(searchButtonFragment);
         }
 
-        final AjaxDropDownChoicePanel<Pair<Long, String>> property = new AjaxDropDownChoicePanel<Pair<Long, String>>(
+        final AjaxDropDownChoicePanel<Pair<Long, String>> property = new AjaxDropDownChoicePanel<>(
                 "property", "property", new PropertyModel<Pair<Long, String>>(searchClause, "property") {
 
             private static final long serialVersionUID = -8430020195995502040L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
index 695f868..8017238 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
@@ -147,8 +147,7 @@ public class Topology extends BasePage {
     }
 
     public Topology() {
-
-        modal = new BaseModal<Serializable>("resource-modal");
+        modal = new BaseModal<>("resource-modal");
         body.add(modal.size(Modal.Size.Large));
         modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
 
@@ -594,7 +593,7 @@ public class Topology extends BasePage {
 
     private static class WebMarkupContainerNoVeil extends WebMarkupContainer implements IAjaxIndicatorAware {
 
-        private static final long serialVersionUID = 1L;
+        private static final long serialVersionUID = 6883930486048460708L;
 
         WebMarkupContainerNoVeil(final String id) {
             super(id);

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java
index 3f37984..e8b1edc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java
@@ -25,8 +25,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.rest.ConnectorRestClient;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
@@ -42,10 +41,12 @@ import org.slf4j.LoggerFactory;
 
 public class TopologyWebSocketBehavior extends WebSocketBehavior {
 
-    protected static final Logger LOG = LoggerFactory.getLogger(TopologyWebSocketBehavior.class);
-
     private static final long serialVersionUID = -1653665542635275551L;
 
+    private static final Logger LOG = LoggerFactory.getLogger(TopologyWebSocketBehavior.class);
+
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
     private final Map<String, String> resources = new HashMap<>();
 
     private final Set<String> runningResCheck = new HashSet<>();
@@ -61,10 +62,7 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior {
     @Override
     protected void onMessage(final WebSocketRequestHandler handler, final TextMessage message) {
         try {
-            final ObjectMapper mapper = new ObjectMapper();
-            final JsonNode obj = mapper.readTree(message.getText());
-
-            final ExecutorService executorService = Executors.newFixedThreadPool(1);
+            JsonNode obj = OBJECT_MAPPER.readTree(message.getText());
 
             switch (Topology.SupportedOperation.valueOf(obj.get("kind").asText())) {
                 case CHECK_CONNECTOR:
@@ -85,7 +83,7 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior {
                         }
                     }
 
-                    executorService.execute(new ConnCheck(ckey));
+                    SyncopeConsoleSession.get().execute(new ConnCheck(ckey));
 
                     break;
                 case CHECK_RESOURCE:
@@ -106,7 +104,7 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior {
                         }
                     }
 
-                    executorService.execute(new ResCheck(rkey));
+                    SyncopeConsoleSession.get().execute(new ResCheck(rkey));
 
                     break;
                 case ADD_ENDPOINT:
@@ -117,9 +115,6 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior {
                     break;
                 default:
             }
-
-            executorService.shutdown();
-
         } catch (IOException e) {
             LOG.error("Eror managing websocket message", e);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/IndicatorAjaxEventBehavior.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/IndicatorAjaxEventBehavior.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/IndicatorAjaxEventBehavior.java
new file mode 100644
index 0000000..b286486
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/IndicatorAjaxEventBehavior.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.wicket.ajax;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.IAjaxIndicatorAware;
+
+/**
+ * An {@link AjaxEventBehavior} not showin veil.
+ */
+public abstract class IndicatorAjaxEventBehavior extends AjaxEventBehavior implements IAjaxIndicatorAware {
+
+    private static final long serialVersionUID = 8531694702059356303L;
+
+    public IndicatorAjaxEventBehavior(final String event) {
+        super(event);
+    }
+
+    @Override
+    public String getAjaxIndicatorMarkupId() {
+        return StringUtils.EMPTY;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/IndicatorAjaxTimerBehavior.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/IndicatorAjaxTimerBehavior.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/IndicatorAjaxTimerBehavior.java
new file mode 100644
index 0000000..5efc5a9
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/IndicatorAjaxTimerBehavior.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.wicket.ajax;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
+import org.apache.wicket.ajax.IAjaxIndicatorAware;
+import org.apache.wicket.util.time.Duration;
+
+/**
+ * An {@link AbstractAjaxTimerBehavior} not showin veil.
+ */
+public abstract class IndicatorAjaxTimerBehavior extends AbstractAjaxTimerBehavior implements IAjaxIndicatorAware {
+
+    private static final long serialVersionUID = 8863750325559215077L;
+
+    public IndicatorAjaxTimerBehavior(final Duration updateInterval) {
+        super(updateInterval);
+    }
+
+    @Override
+    public String getAjaxIndicatorMarkupId() {
+        return StringUtils.EMPTY;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/IndicatorAjaxFormChoiceComponentUpdatingBehavior.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/IndicatorAjaxFormChoiceComponentUpdatingBehavior.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/IndicatorAjaxFormChoiceComponentUpdatingBehavior.java
index db9680e..8177818 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/IndicatorAjaxFormChoiceComponentUpdatingBehavior.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/IndicatorAjaxFormChoiceComponentUpdatingBehavior.java
@@ -22,6 +22,9 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.wicket.ajax.IAjaxIndicatorAware;
 import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 
+/**
+ * An {@link AjaxFormChoiceComponentUpdatingBehavior} not showin veil.
+ */
 public abstract class IndicatorAjaxFormChoiceComponentUpdatingBehavior
         extends AjaxFormChoiceComponentUpdatingBehavior implements IAjaxIndicatorAware {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/widgets/AnyByRealmWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/AnyByRealmWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/AnyByRealmWidget.java
index 0b3caa1..d67fc08 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/AnyByRealmWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/AnyByRealmWidget.java
@@ -35,6 +35,20 @@ public class AnyByRealmWidget extends AbstractWidget {
 
     private static final int MAX_REALMS = 9;
 
+    private Map<String, Integer> usersByRealm;
+
+    private Map<String, Integer> groupsByRealm;
+
+    private String anyType1;
+
+    private Map<String, Integer> any1ByRealm;
+
+    private String anyType2;
+
+    private Map<String, Integer> any2ByRealm;
+
+    private final BarChartPanel chart;
+
     public AnyByRealmWidget(
             final String id,
             final Map<String, Integer> usersByRealm,
@@ -45,6 +59,27 @@ public class AnyByRealmWidget extends AbstractWidget {
             final Map<String, Integer> any2ByRealm) {
 
         super(id);
+        this.usersByRealm = usersByRealm;
+        this.groupsByRealm = groupsByRealm;
+        this.anyType1 = anyType1;
+        this.any1ByRealm = any1ByRealm;
+        this.anyType2 = anyType2;
+        this.any2ByRealm = any2ByRealm;
+        setOutputMarkupId(true);
+
+        chart = new BarChartPanel(
+                "chart",
+                Model.of(build(usersByRealm, groupsByRealm, anyType1, any1ByRealm, anyType2, any2ByRealm)));
+        add(chart);
+    }
+
+    private Bar build(
+            final Map<String, Integer> usersByRealm,
+            final Map<String, Integer> groupsByRealm,
+            final String anyType1,
+            final Map<String, Integer> any1ByRealm,
+            final String anyType2,
+            final Map<String, Integer> any2ByRealm) {
 
         List<String> labels = new ArrayList<>();
 
@@ -106,7 +141,36 @@ public class AnyByRealmWidget extends AbstractWidget {
         }
         bar.getData().setDatasets(datasets);
 
-        add(new BarChartPanel("chart", Model.of(bar)));
+        return bar;
     }
 
+    public boolean refresh(
+            final Map<String, Integer> usersByRealm,
+            final Map<String, Integer> groupsByRealm,
+            final String anyType1,
+            final Map<String, Integer> any1ByRealm,
+            final String anyType2,
+            final Map<String, Integer> any2ByRealm) {
+
+        if (!this.usersByRealm.equals(usersByRealm)
+                || !this.groupsByRealm.equals(groupsByRealm)
+                || (!(this.anyType1 == null && anyType1 == null) && !this.anyType1.equals(anyType1))
+                || !this.any1ByRealm.equals(any1ByRealm)
+                || (!(this.anyType2 == null && anyType2 == null) && !this.anyType2.equals(anyType2))
+                || !this.any2ByRealm.equals(any2ByRealm)) {
+
+            this.usersByRealm = usersByRealm;
+            this.groupsByRealm = groupsByRealm;
+            this.anyType1 = anyType1;
+            this.any1ByRealm = any1ByRealm;
+            this.anyType2 = anyType2;
+            this.any2ByRealm = any2ByRealm;
+
+            chart.setDefaultModelObject(
+                    build(usersByRealm, groupsByRealm, anyType1, any1ByRealm, anyType2, any2ByRealm));
+
+            return true;
+        }
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
index 31ced75..a145632 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
@@ -21,6 +21,7 @@ package org.apache.syncope.client.console.widgets;
 import com.pingunaut.wicket.chartjs.chart.impl.Doughnut;
 import com.pingunaut.wicket.chartjs.core.panel.DoughnutChartPanel;
 import java.util.Map;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
 import org.apache.syncope.client.console.pages.Notifications;
 import org.apache.syncope.client.console.pages.Policies;
@@ -41,9 +42,85 @@ public class CompletenessWidget extends AbstractWidget {
 
     private static final long serialVersionUID = 7667120094526529934L;
 
+    private Map<NumbersInfo.ConfItem, Boolean> confCompleteness;
+
+    private final DoughnutChartPanel chart;
+
+    private final WebMarkupContainer actions;
+
+    private final BookmarkablePageLink<Page> topology;
+
+    private final BookmarkablePageLink<Page> policies;
+
+    private final BookmarkablePageLink<Page> notifications;
+
+    private final BookmarkablePageLink<Page> types;
+
+    private final BookmarkablePageLink<Page> securityquestions;
+
+    private final BookmarkablePageLink<Page> roles;
+
     public CompletenessWidget(final String id, final Map<NumbersInfo.ConfItem, Boolean> confCompleteness) {
         super(id);
+        this.confCompleteness = confCompleteness;
+        setOutputMarkupId(true);
+
+        Pair<Doughnut, Integer> built = build(confCompleteness);
+
+        chart = new DoughnutChartPanel("chart", Model.of(built.getLeft()));
+        add(chart);
+
+        actions = new WebMarkupContainer("actions");
+        actions.setOutputMarkupPlaceholderTag(true);
+        actions.setVisible(built.getRight() > 0);
+
+        add(actions);
 
+        topology = BookmarkablePageLinkBuilder.build("topology", Topology.class);
+        topology.setOutputMarkupPlaceholderTag(true);
+        actions.add(topology);
+        MetaDataRoleAuthorizationStrategy.authorize(topology, WebPage.ENABLE,
+                String.format("%s,%s", StandardEntitlement.CONNECTOR_LIST, StandardEntitlement.RESOURCE_LIST));
+        topology.setVisible(
+                !confCompleteness.get(NumbersInfo.ConfItem.RESOURCE)
+                || !confCompleteness.get(NumbersInfo.ConfItem.SYNC_TASK));
+
+        policies = BookmarkablePageLinkBuilder.build("policies", Policies.class);
+        policies.setOutputMarkupPlaceholderTag(true);
+        MetaDataRoleAuthorizationStrategy.authorize(policies, WebPage.ENABLE, StandardEntitlement.POLICY_LIST);
+        actions.add(policies);
+        policies.setVisible(
+                !confCompleteness.get(NumbersInfo.ConfItem.ACCOUNT_POLICY)
+                || !confCompleteness.get(NumbersInfo.ConfItem.PASSWORD_POLICY));
+
+        notifications = BookmarkablePageLinkBuilder.build("notifications", Notifications.class);
+        notifications.setOutputMarkupPlaceholderTag(true);
+        MetaDataRoleAuthorizationStrategy.authorize(
+                notifications, WebPage.ENABLE, StandardEntitlement.NOTIFICATION_LIST);
+        actions.add(notifications);
+        notifications.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.NOTIFICATION));
+
+        types = BookmarkablePageLinkBuilder.build("types", Types.class);
+        types.setOutputMarkupPlaceholderTag(true);
+        MetaDataRoleAuthorizationStrategy.authorize(types, WebPage.ENABLE, StandardEntitlement.SCHEMA_LIST);
+        actions.add(types);
+        types.setVisible(
+                !confCompleteness.get(NumbersInfo.ConfItem.VIR_SCHEMA)
+                || !confCompleteness.get(NumbersInfo.ConfItem.ANY_TYPE));
+
+        securityquestions = BookmarkablePageLinkBuilder.build("securityquestions", SecurityQuestions.class);
+        securityquestions.setOutputMarkupPlaceholderTag(true);
+        actions.add(securityquestions);
+        securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION));
+
+        roles = BookmarkablePageLinkBuilder.build("roles", Roles.class);
+        roles.setOutputMarkupPlaceholderTag(true);
+        MetaDataRoleAuthorizationStrategy.authorize(roles, WebPage.ENABLE, StandardEntitlement.ROLE_LIST);
+        actions.add(roles);
+        roles.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.ROLE));
+    }
+
+    private Pair<Doughnut, Integer> build(final Map<NumbersInfo.ConfItem, Boolean> confCompleteness) {
         Doughnut doughnut = new Doughnut();
         doughnut.getOptions().setResponsive(true);
         doughnut.getOptions().setMaintainAspectRatio(true);
@@ -64,68 +141,39 @@ public class CompletenessWidget extends AbstractWidget {
         doughnut.getData().add(
                 new LabeledDoughnutChartData(100 - done, "red", getString("todo") + ": " + todo));
 
-        add(new DoughnutChartPanel("chart", Model.of(doughnut)));
+        return Pair.of(doughnut, todo);
+    }
 
-        WebMarkupContainer actions = new WebMarkupContainer("actions");
-        actions.setOutputMarkupPlaceholderTag(true);
-        if (todo == 0) {
-            actions.setVisible(false);
-        }
-        add(actions);
+    public boolean refresh(final Map<NumbersInfo.ConfItem, Boolean> confCompleteness) {
+        if (!this.confCompleteness.equals(confCompleteness)) {
+            this.confCompleteness = confCompleteness;
 
-        BookmarkablePageLink<Page> link = BookmarkablePageLinkBuilder.build("topology", Topology.class);
-        link.setOutputMarkupPlaceholderTag(true);
-        actions.add(link);
-        MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.ENABLE,
-                String.format("%s,%s", StandardEntitlement.CONNECTOR_LIST, StandardEntitlement.RESOURCE_LIST));
-        if (confCompleteness.get(NumbersInfo.ConfItem.RESOURCE)
-                || confCompleteness.get(NumbersInfo.ConfItem.SYNC_TASK)) {
+            Pair<Doughnut, Integer> built = build(confCompleteness);
 
-            link.setVisible(false);
-        }
+            chart.setDefaultModelObject(built.getLeft());
 
-        link = BookmarkablePageLinkBuilder.build("policies", Policies.class);
-        link.setOutputMarkupPlaceholderTag(true);
-        MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.ENABLE, StandardEntitlement.POLICY_LIST);
-        actions.add(link);
-        if (confCompleteness.get(NumbersInfo.ConfItem.ACCOUNT_POLICY)
-                || confCompleteness.get(NumbersInfo.ConfItem.PASSWORD_POLICY)) {
+            actions.setVisible(built.getRight() > 0);
 
-            link.setVisible(false);
-        }
+            topology.setVisible(
+                    !confCompleteness.get(NumbersInfo.ConfItem.RESOURCE)
+                    || !confCompleteness.get(NumbersInfo.ConfItem.SYNC_TASK));
 
-        link = BookmarkablePageLinkBuilder.build("notifications", Notifications.class);
-        link.setOutputMarkupPlaceholderTag(true);
-        MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.ENABLE, StandardEntitlement.NOTIFICATION_LIST);
-        actions.add(link);
-        if (confCompleteness.get(NumbersInfo.ConfItem.NOTIFICATION)) {
-            link.setVisible(false);
-        }
+            policies.setVisible(
+                    !confCompleteness.get(NumbersInfo.ConfItem.ACCOUNT_POLICY)
+                    || !confCompleteness.get(NumbersInfo.ConfItem.PASSWORD_POLICY));
 
-        link = BookmarkablePageLinkBuilder.build("types", Types.class);
-        link.setOutputMarkupPlaceholderTag(true);
-        MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.ENABLE, StandardEntitlement.SCHEMA_LIST);
-        actions.add(link);
-        if (confCompleteness.get(NumbersInfo.ConfItem.VIR_SCHEMA)
-                || confCompleteness.get(NumbersInfo.ConfItem.ANY_TYPE)) {
+            notifications.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.NOTIFICATION));
 
-            link.setVisible(false);
-        }
+            types.setVisible(
+                    !confCompleteness.get(NumbersInfo.ConfItem.VIR_SCHEMA)
+                    || !confCompleteness.get(NumbersInfo.ConfItem.ANY_TYPE));
 
-        link = BookmarkablePageLinkBuilder.build("securityquestions", SecurityQuestions.class);
-        link.setOutputMarkupPlaceholderTag(true);
-        actions.add(link);
-        if (confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION)) {
-            link.setVisible(false);
-        }
+            securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION));
+
+            roles.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.ROLE));
 
-        link = BookmarkablePageLinkBuilder.build("roles", Roles.class);
-        link.setOutputMarkupPlaceholderTag(true);
-        MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.ENABLE, StandardEntitlement.ROLE_LIST);
-        actions.add(link);
-        if (confCompleteness.get(NumbersInfo.ConfItem.ROLE)) {
-            link.setVisible(false);
+            return true;
         }
+        return false;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6306562f/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobActionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobActionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobActionPanel.java
new file mode 100644
index 0000000..bd55689
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/JobActionPanel.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.widgets;
+
+import java.io.Serializable;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.common.lib.to.JobTO;
+import org.apache.syncope.common.lib.types.JobAction;
+import org.apache.syncope.common.rest.api.service.NotificationService;
+import org.apache.syncope.common.rest.api.service.ReportService;
+import org.apache.syncope.common.rest.api.service.TaskService;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JobActionPanel extends Panel {
+
+    private static final long serialVersionUID = 6645135178773151224L;
+
+    private static final Logger LOG = LoggerFactory.getLogger(JobActionPanel.class);
+
+    public JobActionPanel(final String id, final JobTO jobTO, final JobWidget widget) {
+        super(id);
+        setOutputMarkupId(true);
+
+        Fragment controls;
+        if (jobTO.isRunning()) {
+            controls = new Fragment("controls", "runningFragment", this);
+            controls.add(new AjaxLink<Void>("stop") {
+
+                private static final long serialVersionUID = -7978723352517770644L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target) {
+                    try {
+                        switch (jobTO.getType()) {
+                            case NOTIFICATION:
+                                SyncopeConsoleSession.get().getService(NotificationService.class).
+                                        actionJob(JobAction.STOP);
+                                break;
+
+                            case REPORT:
+                                SyncopeConsoleSession.get().getService(ReportService.class).
+                                        actionJob(jobTO.getRefKey(), JobAction.STOP);
+                                break;
+
+                            case TASK:
+                                SyncopeConsoleSession.get().getService(TaskService.class).
+                                        actionJob(jobTO.getRefKey(), JobAction.STOP);
+                                break;
+
+                            default:
+                        }
+                        info(getString(Constants.OPERATION_SUCCEEDED));
+                        send(widget, Broadcast.EXACT, new JobActionPayload(target));
+                    } catch (Exception e) {
+                        LOG.error("While stopping {}", jobTO.getRefDesc(), e);
+                        error(getString(Constants.ERROR) + ": " + e.getMessage());
+                    }
+                    SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+                }
+            });
+        } else {
+            controls = new Fragment("controls", "notRunningFragment", this);
+            controls.add(new AjaxLink<Void>("start") {
+
+                private static final long serialVersionUID = -7978723352517770644L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target) {
+                    try {
+                        switch (jobTO.getType()) {
+                            case NOTIFICATION:
+                                SyncopeConsoleSession.get().getService(NotificationService.class).
+                                        actionJob(JobAction.START);
+                                break;
+
+                            case REPORT:
+                                SyncopeConsoleSession.get().getService(ReportService.class).
+                                        actionJob(jobTO.getRefKey(), JobAction.START);
+                                break;
+
+                            case TASK:
+                                SyncopeConsoleSession.get().getService(TaskService.class).
+                                        actionJob(jobTO.getRefKey(), JobAction.START);
+                                break;
+
+                            default:
+                        }
+                        info(getString(Constants.OPERATION_SUCCEEDED));
+                        send(widget, Broadcast.EXACT, new JobActionPayload(target));
+                    } catch (Exception e) {
+                        LOG.error("While stopping {}", jobTO.getRefDesc(), e);
+                        error(getString(Constants.ERROR) + ": " + e.getMessage());
+                    }
+                    SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+                }
+            });
+        }
+        add(controls);
+    }
+
+    public static class JobActionPayload implements Serializable {
+
+        private static final long serialVersionUID = -6798174303329212126L;
+
+        private final AjaxRequestTarget target;
+
+        public JobActionPayload(final AjaxRequestTarget target) {
+            this.target = target;
+        }
+
+        public AjaxRequestTarget getTarget() {
+            return target;
+        }
+
+    }
+}


Mime
View raw message