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 2017/07/04 07:52:01 UTC

[1/2] syncope git commit: [SYNCOPE-1141] JAXB Map adapter cannot cope with Enums, simplifying

Repository: syncope
Updated Branches:
  refs/heads/2_0_X c102038a9 -> 09b1e9ace
  refs/heads/master 615b29aa6 -> 631740d6f


[SYNCOPE-1141] JAXB Map adapter cannot cope with Enums, simplifying


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

Branch: refs/heads/2_0_X
Commit: 09b1e9ace1e6d74b7409127f0a70e09e52d761f8
Parents: c102038
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue Jul 4 09:51:35 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue Jul 4 09:51:35 2017 +0200

----------------------------------------------------------------------
 .../console/widgets/CompletenessWidget.java     | 51 ++++++++++----------
 .../syncope/common/lib/info/NumbersInfo.java    | 16 ++++--
 .../org/apache/syncope/common/lib/JAXBTest.java | 41 +++++++++++++++-
 .../apache/syncope/core/logic/SyncopeLogic.java | 18 +++----
 4 files changed, 86 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/09b1e9ac/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 2f1390c..c3e0a07 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.BooleanUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
 import org.apache.syncope.client.console.pages.Notifications;
@@ -42,7 +43,7 @@ public class CompletenessWidget extends BaseWidget {
 
     private static final long serialVersionUID = 7667120094526529934L;
 
-    private Map<NumbersInfo.ConfItem, Boolean> confCompleteness;
+    private Map<String, Boolean> confCompleteness;
 
     private final DoughnutChartPanel chart;
 
@@ -60,7 +61,7 @@ public class CompletenessWidget extends BaseWidget {
 
     private final BookmarkablePageLink<Page> roles;
 
-    public CompletenessWidget(final String id, final Map<NumbersInfo.ConfItem, Boolean> confCompleteness) {
+    public CompletenessWidget(final String id, final Map<String, Boolean> confCompleteness) {
         super(id);
         this.confCompleteness = confCompleteness;
         setOutputMarkupId(true);
@@ -82,45 +83,45 @@ public class CompletenessWidget extends BaseWidget {
         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));
+                !confCompleteness.get(NumbersInfo.ConfItem.RESOURCE.name())
+                || !confCompleteness.get(NumbersInfo.ConfItem.PULL_TASK.name()));
 
         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));
+                !confCompleteness.get(NumbersInfo.ConfItem.ACCOUNT_POLICY.name())
+                || !confCompleteness.get(NumbersInfo.ConfItem.PASSWORD_POLICY.name()));
 
         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));
+        notifications.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.NOTIFICATION.name()));
 
         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));
+                !confCompleteness.get(NumbersInfo.ConfItem.VIR_SCHEMA.name())
+                || !confCompleteness.get(NumbersInfo.ConfItem.ANY_TYPE.name()));
 
         securityquestions = BookmarkablePageLinkBuilder.build("securityquestions", SecurityQuestions.class);
         securityquestions.setOutputMarkupPlaceholderTag(true);
         actions.add(securityquestions);
-        securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION));
+        securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION.name()));
 
         roles = BookmarkablePageLinkBuilder.build("roles", Administration.class);
         roles.setOutputMarkupPlaceholderTag(true);
         MetaDataRoleAuthorizationStrategy.authorize(roles, WebPage.ENABLE, StandardEntitlement.ROLE_LIST);
         actions.add(roles);
-        roles.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.ROLE));
+        roles.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.ROLE.name()));
     }
 
-    private Pair<Doughnut, Integer> build(final Map<NumbersInfo.ConfItem, Boolean> confCompleteness) {
+    private Pair<Doughnut, Integer> build(final Map<String, Boolean> confCompleteness) {
         Doughnut doughnut = new Doughnut();
         doughnut.getOptions().setResponsive(true);
         doughnut.getOptions().setMaintainAspectRatio(true);
@@ -128,9 +129,9 @@ public class CompletenessWidget extends BaseWidget {
 
         int done = 0;
         int todo = 0;
-        for (Map.Entry<NumbersInfo.ConfItem, Boolean> entry : confCompleteness.entrySet()) {
-            if (entry.getValue()) {
-                done += entry.getKey().getScore();
+        for (Map.Entry<String, Boolean> entry : confCompleteness.entrySet()) {
+            if (BooleanUtils.isTrue(entry.getValue())) {
+                done += NumbersInfo.ConfItem.getScore(entry.getKey());
             } else {
                 todo++;
             }
@@ -144,7 +145,7 @@ public class CompletenessWidget extends BaseWidget {
         return Pair.of(doughnut, todo);
     }
 
-    public boolean refresh(final Map<NumbersInfo.ConfItem, Boolean> confCompleteness) {
+    public boolean refresh(final Map<String, Boolean> confCompleteness) {
         if (!this.confCompleteness.equals(confCompleteness)) {
             this.confCompleteness = confCompleteness;
 
@@ -155,22 +156,22 @@ public class CompletenessWidget extends BaseWidget {
             actions.setVisible(built.getRight() > 0);
 
             topology.setVisible(
-                    !confCompleteness.get(NumbersInfo.ConfItem.RESOURCE)
-                    || !confCompleteness.get(NumbersInfo.ConfItem.SYNC_TASK));
+                    !confCompleteness.get(NumbersInfo.ConfItem.RESOURCE.name())
+                    || !confCompleteness.get(NumbersInfo.ConfItem.PULL_TASK.name()));
 
             policies.setVisible(
-                    !confCompleteness.get(NumbersInfo.ConfItem.ACCOUNT_POLICY)
-                    || !confCompleteness.get(NumbersInfo.ConfItem.PASSWORD_POLICY));
+                    !confCompleteness.get(NumbersInfo.ConfItem.ACCOUNT_POLICY.name())
+                    || !confCompleteness.get(NumbersInfo.ConfItem.PASSWORD_POLICY.name()));
 
-            notifications.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.NOTIFICATION));
+            notifications.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.NOTIFICATION.name()));
 
             types.setVisible(
-                    !confCompleteness.get(NumbersInfo.ConfItem.VIR_SCHEMA)
-                    || !confCompleteness.get(NumbersInfo.ConfItem.ANY_TYPE));
+                    !confCompleteness.get(NumbersInfo.ConfItem.VIR_SCHEMA.name())
+                    || !confCompleteness.get(NumbersInfo.ConfItem.ANY_TYPE.name()));
 
-            securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION));
+            securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION.name()));
 
-            roles.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.ROLE));
+            roles.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.ROLE.name()));
 
             return true;
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/09b1e9ac/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java b/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
index 293bb55..d53025c 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
@@ -37,13 +37,13 @@ public class NumbersInfo extends AbstractBaseBean {
 
     @XmlEnum
     @XmlType(name = "confItem")
-    public enum ConfItem {
+    public static enum ConfItem {
 
         RESOURCE(20),
         ACCOUNT_POLICY(10),
         PASSWORD_POLICY(10),
         NOTIFICATION(8),
-        SYNC_TASK(10),
+        PULL_TASK(10),
         VIR_SCHEMA(10),
         ANY_TYPE(5),
         SECURITY_QUESTION(12),
@@ -55,7 +55,13 @@ public class NumbersInfo extends AbstractBaseBean {
             this.score = score;
         }
 
-        public int getScore() {
+        public static int getScore(final String name) {
+            int score = 0;
+            for (ConfItem value : values()) {
+                if (value.name().equals(name)) {
+                    score = value.score;
+                }
+            }
             return score;
         }
 
@@ -99,7 +105,7 @@ public class NumbersInfo extends AbstractBaseBean {
 
     @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     @JsonIgnore
-    private final Map<ConfItem, Boolean> confCompleteness = new HashMap<>();
+    private final Map<String, Boolean> confCompleteness = new HashMap<>();
 
     public int getTotalUsers() {
         return totalUsers;
@@ -191,7 +197,7 @@ public class NumbersInfo extends AbstractBaseBean {
     }
 
     @JsonProperty
-    public Map<ConfItem, Boolean> getConfCompleteness() {
+    public Map<String, Boolean> getConfCompleteness() {
         return confCompleteness;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/09b1e9ac/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
----------------------------------------------------------------------
diff --git a/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java b/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
index a14b878..529e604 100644
--- a/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
+++ b/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
@@ -29,6 +29,7 @@ import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.apache.syncope.common.lib.info.NumbersInfo;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.report.UserReportletConf;
 import org.apache.syncope.common.lib.to.AttrTO;
@@ -72,7 +73,45 @@ public class JAXBTest {
         status.setFailureReason("failed");
         status.setBeforeObj(new ConnObjectTO());
         original.getPropagationStatuses().add(status);
-        
+
+        StringWriter writer = new StringWriter();
+        marshaller.marshal(original, writer);
+
+        Object actual = unmarshaller.unmarshal(new StringReader(writer.toString()));
+        assertEquals(original, actual);
+    }
+
+    @Test
+    public void numbersInfo() throws JAXBException {
+        JAXBContext context = JAXBContext.newInstance(NumbersInfo.class);
+        Marshaller marshaller = context.createMarshaller();
+        Unmarshaller unmarshaller = context.createUnmarshaller();
+
+        NumbersInfo original = new NumbersInfo();
+        original.setTotalUsers(5);
+        original.getUsersByRealm().put("/", 4);
+        original.getUsersByRealm().put("/even", 1);
+        original.getUsersByStatus().put("active", 5);
+        original.setTotalGroups(16);
+        original.getGroupsByRealm().put("/", 14);
+        original.getGroupsByRealm().put("/even", 1);
+        original.getGroupsByRealm().put("/odd", 1);
+        original.setAnyType1("PRINTER");
+        original.setTotalAny1(3);
+        original.getAny1ByRealm().put("/", 2);
+        original.getAny1ByRealm().put("/even/two", 1);
+        original.setTotalResources(21);
+        original.setTotalRoles(4);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.ANY_TYPE.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.PULL_TASK.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.ROLE.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.NOTIFICATION.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.PASSWORD_POLICY.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.ACCOUNT_POLICY.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.RESOURCE.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.VIR_SCHEMA.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.SECURITY_QUESTION.name(), Boolean.TRUE);
+
         StringWriter writer = new StringWriter();
         marshaller.marshal(original, writer);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/09b1e9ac/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
index 22cec77..29bab96 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
@@ -290,23 +290,23 @@ public class SyncopeLogic extends AbstractLogic<AbstractBaseBean> {
         numbersInfo.setTotalRoles(roleDAO.count());
 
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.RESOURCE, numbersInfo.getTotalResources() > 0);
+                NumbersInfo.ConfItem.RESOURCE.name(), numbersInfo.getTotalResources() > 0);
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.ACCOUNT_POLICY, !policyDAO.find(AccountPolicy.class).isEmpty());
+                NumbersInfo.ConfItem.ACCOUNT_POLICY.name(), !policyDAO.find(AccountPolicy.class).isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.PASSWORD_POLICY, !policyDAO.find(PasswordPolicy.class).isEmpty());
+                NumbersInfo.ConfItem.PASSWORD_POLICY.name(), !policyDAO.find(PasswordPolicy.class).isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.NOTIFICATION, !notificationDAO.findAll().isEmpty());
+                NumbersInfo.ConfItem.NOTIFICATION.name(), !notificationDAO.findAll().isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.SYNC_TASK, !taskDAO.findAll(TaskType.PULL).isEmpty());
+                NumbersInfo.ConfItem.PULL_TASK.name(), !taskDAO.findAll(TaskType.PULL).isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.VIR_SCHEMA, !virSchemaDAO.findAll().isEmpty());
+                NumbersInfo.ConfItem.VIR_SCHEMA.name(), !virSchemaDAO.findAll().isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.ANY_TYPE, !anyObjectNumbers.isEmpty());
+                NumbersInfo.ConfItem.ANY_TYPE.name(), !anyObjectNumbers.isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.SECURITY_QUESTION, !securityQuestionDAO.findAll().isEmpty());
+                NumbersInfo.ConfItem.SECURITY_QUESTION.name(), !securityQuestionDAO.findAll().isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.ROLE, numbersInfo.getTotalRoles() > 0);
+                NumbersInfo.ConfItem.ROLE.name(), numbersInfo.getTotalRoles() > 0);
 
         return numbersInfo;
     }


[2/2] syncope git commit: [SYNCOPE-1141] JAXB Map adapter cannot cope with Enums, simplifying

Posted by il...@apache.org.
[SYNCOPE-1141] JAXB Map adapter cannot cope with Enums, simplifying


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

Branch: refs/heads/master
Commit: 631740d6f18037c3d2438f938bcff9000d089e95
Parents: 615b29a
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue Jul 4 09:51:35 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue Jul 4 09:51:51 2017 +0200

----------------------------------------------------------------------
 .../console/widgets/CompletenessWidget.java     | 51 ++++++++++----------
 .../syncope/common/lib/info/NumbersInfo.java    | 16 ++++--
 .../org/apache/syncope/common/lib/JAXBTest.java | 41 +++++++++++++++-
 .../apache/syncope/core/logic/SyncopeLogic.java | 18 +++----
 4 files changed, 86 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/631740d6/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 50b45d1..d45e34f 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.BooleanUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
 import org.apache.syncope.client.console.pages.Notifications;
@@ -41,7 +42,7 @@ public class CompletenessWidget extends BaseWidget {
 
     private static final long serialVersionUID = 7667120094526529934L;
 
-    private Map<NumbersInfo.ConfItem, Boolean> confCompleteness;
+    private Map<String, Boolean> confCompleteness;
 
     private final DoughnutChartPanel chart;
 
@@ -59,7 +60,7 @@ public class CompletenessWidget extends BaseWidget {
 
     private final BookmarkablePageLink<Administration> roles;
 
-    public CompletenessWidget(final String id, final Map<NumbersInfo.ConfItem, Boolean> confCompleteness) {
+    public CompletenessWidget(final String id, final Map<String, Boolean> confCompleteness) {
         super(id);
         this.confCompleteness = confCompleteness;
         setOutputMarkupId(true);
@@ -81,45 +82,45 @@ public class CompletenessWidget extends BaseWidget {
         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));
+                !confCompleteness.get(NumbersInfo.ConfItem.RESOURCE.name())
+                || !confCompleteness.get(NumbersInfo.ConfItem.PULL_TASK.name()));
 
         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));
+                !confCompleteness.get(NumbersInfo.ConfItem.ACCOUNT_POLICY.name())
+                || !confCompleteness.get(NumbersInfo.ConfItem.PASSWORD_POLICY.name()));
 
         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));
+        notifications.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.NOTIFICATION.name()));
 
         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));
+                !confCompleteness.get(NumbersInfo.ConfItem.VIR_SCHEMA.name())
+                || !confCompleteness.get(NumbersInfo.ConfItem.ANY_TYPE.name()));
 
         securityquestions = BookmarkablePageLinkBuilder.build("securityquestions", SecurityQuestions.class);
         securityquestions.setOutputMarkupPlaceholderTag(true);
         actions.add(securityquestions);
-        securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION));
+        securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION.name()));
 
         roles = BookmarkablePageLinkBuilder.build("roles", Administration.class);
         roles.setOutputMarkupPlaceholderTag(true);
         MetaDataRoleAuthorizationStrategy.authorize(roles, WebPage.ENABLE, StandardEntitlement.ROLE_LIST);
         actions.add(roles);
-        roles.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.ROLE));
+        roles.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.ROLE.name()));
     }
 
-    private Pair<Doughnut, Integer> build(final Map<NumbersInfo.ConfItem, Boolean> confCompleteness) {
+    private Pair<Doughnut, Integer> build(final Map<String, Boolean> confCompleteness) {
         Doughnut doughnut = new Doughnut();
         doughnut.getOptions().setResponsive(true);
         doughnut.getOptions().setMaintainAspectRatio(true);
@@ -127,9 +128,9 @@ public class CompletenessWidget extends BaseWidget {
 
         int done = 0;
         int todo = 0;
-        for (Map.Entry<NumbersInfo.ConfItem, Boolean> entry : confCompleteness.entrySet()) {
-            if (entry.getValue()) {
-                done += entry.getKey().getScore();
+        for (Map.Entry<String, Boolean> entry : confCompleteness.entrySet()) {
+            if (BooleanUtils.isTrue(entry.getValue())) {
+                done += NumbersInfo.ConfItem.getScore(entry.getKey());
             } else {
                 todo++;
             }
@@ -143,7 +144,7 @@ public class CompletenessWidget extends BaseWidget {
         return Pair.of(doughnut, todo);
     }
 
-    public boolean refresh(final Map<NumbersInfo.ConfItem, Boolean> confCompleteness) {
+    public boolean refresh(final Map<String, Boolean> confCompleteness) {
         if (!this.confCompleteness.equals(confCompleteness)) {
             this.confCompleteness = confCompleteness;
 
@@ -154,22 +155,22 @@ public class CompletenessWidget extends BaseWidget {
             actions.setVisible(built.getRight() > 0);
 
             topology.setVisible(
-                    !confCompleteness.get(NumbersInfo.ConfItem.RESOURCE)
-                    || !confCompleteness.get(NumbersInfo.ConfItem.SYNC_TASK));
+                    !confCompleteness.get(NumbersInfo.ConfItem.RESOURCE.name())
+                    || !confCompleteness.get(NumbersInfo.ConfItem.PULL_TASK.name()));
 
             policies.setVisible(
-                    !confCompleteness.get(NumbersInfo.ConfItem.ACCOUNT_POLICY)
-                    || !confCompleteness.get(NumbersInfo.ConfItem.PASSWORD_POLICY));
+                    !confCompleteness.get(NumbersInfo.ConfItem.ACCOUNT_POLICY.name())
+                    || !confCompleteness.get(NumbersInfo.ConfItem.PASSWORD_POLICY.name()));
 
-            notifications.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.NOTIFICATION));
+            notifications.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.NOTIFICATION.name()));
 
             types.setVisible(
-                    !confCompleteness.get(NumbersInfo.ConfItem.VIR_SCHEMA)
-                    || !confCompleteness.get(NumbersInfo.ConfItem.ANY_TYPE));
+                    !confCompleteness.get(NumbersInfo.ConfItem.VIR_SCHEMA.name())
+                    || !confCompleteness.get(NumbersInfo.ConfItem.ANY_TYPE.name()));
 
-            securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION));
+            securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION.name()));
 
-            roles.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.ROLE));
+            roles.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.ROLE.name()));
 
             return true;
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/631740d6/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java b/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
index 293bb55..d53025c 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
@@ -37,13 +37,13 @@ public class NumbersInfo extends AbstractBaseBean {
 
     @XmlEnum
     @XmlType(name = "confItem")
-    public enum ConfItem {
+    public static enum ConfItem {
 
         RESOURCE(20),
         ACCOUNT_POLICY(10),
         PASSWORD_POLICY(10),
         NOTIFICATION(8),
-        SYNC_TASK(10),
+        PULL_TASK(10),
         VIR_SCHEMA(10),
         ANY_TYPE(5),
         SECURITY_QUESTION(12),
@@ -55,7 +55,13 @@ public class NumbersInfo extends AbstractBaseBean {
             this.score = score;
         }
 
-        public int getScore() {
+        public static int getScore(final String name) {
+            int score = 0;
+            for (ConfItem value : values()) {
+                if (value.name().equals(name)) {
+                    score = value.score;
+                }
+            }
             return score;
         }
 
@@ -99,7 +105,7 @@ public class NumbersInfo extends AbstractBaseBean {
 
     @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     @JsonIgnore
-    private final Map<ConfItem, Boolean> confCompleteness = new HashMap<>();
+    private final Map<String, Boolean> confCompleteness = new HashMap<>();
 
     public int getTotalUsers() {
         return totalUsers;
@@ -191,7 +197,7 @@ public class NumbersInfo extends AbstractBaseBean {
     }
 
     @JsonProperty
-    public Map<ConfItem, Boolean> getConfCompleteness() {
+    public Map<String, Boolean> getConfCompleteness() {
         return confCompleteness;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/631740d6/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
----------------------------------------------------------------------
diff --git a/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java b/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
index a14b878..529e604 100644
--- a/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
+++ b/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
@@ -29,6 +29,7 @@ import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.apache.syncope.common.lib.info.NumbersInfo;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.report.UserReportletConf;
 import org.apache.syncope.common.lib.to.AttrTO;
@@ -72,7 +73,45 @@ public class JAXBTest {
         status.setFailureReason("failed");
         status.setBeforeObj(new ConnObjectTO());
         original.getPropagationStatuses().add(status);
-        
+
+        StringWriter writer = new StringWriter();
+        marshaller.marshal(original, writer);
+
+        Object actual = unmarshaller.unmarshal(new StringReader(writer.toString()));
+        assertEquals(original, actual);
+    }
+
+    @Test
+    public void numbersInfo() throws JAXBException {
+        JAXBContext context = JAXBContext.newInstance(NumbersInfo.class);
+        Marshaller marshaller = context.createMarshaller();
+        Unmarshaller unmarshaller = context.createUnmarshaller();
+
+        NumbersInfo original = new NumbersInfo();
+        original.setTotalUsers(5);
+        original.getUsersByRealm().put("/", 4);
+        original.getUsersByRealm().put("/even", 1);
+        original.getUsersByStatus().put("active", 5);
+        original.setTotalGroups(16);
+        original.getGroupsByRealm().put("/", 14);
+        original.getGroupsByRealm().put("/even", 1);
+        original.getGroupsByRealm().put("/odd", 1);
+        original.setAnyType1("PRINTER");
+        original.setTotalAny1(3);
+        original.getAny1ByRealm().put("/", 2);
+        original.getAny1ByRealm().put("/even/two", 1);
+        original.setTotalResources(21);
+        original.setTotalRoles(4);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.ANY_TYPE.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.PULL_TASK.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.ROLE.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.NOTIFICATION.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.PASSWORD_POLICY.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.ACCOUNT_POLICY.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.RESOURCE.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.VIR_SCHEMA.name(), Boolean.TRUE);
+        original.getConfCompleteness().put(NumbersInfo.ConfItem.SECURITY_QUESTION.name(), Boolean.TRUE);
+
         StringWriter writer = new StringWriter();
         marshaller.marshal(original, writer);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/631740d6/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
index 2c3d148..b975b53 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
@@ -287,23 +287,23 @@ public class SyncopeLogic extends AbstractLogic<AbstractBaseBean> {
         numbersInfo.setTotalRoles(roleDAO.count());
 
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.RESOURCE, numbersInfo.getTotalResources() > 0);
+                NumbersInfo.ConfItem.RESOURCE.name(), numbersInfo.getTotalResources() > 0);
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.ACCOUNT_POLICY, !policyDAO.find(AccountPolicy.class).isEmpty());
+                NumbersInfo.ConfItem.ACCOUNT_POLICY.name(), !policyDAO.find(AccountPolicy.class).isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.PASSWORD_POLICY, !policyDAO.find(PasswordPolicy.class).isEmpty());
+                NumbersInfo.ConfItem.PASSWORD_POLICY.name(), !policyDAO.find(PasswordPolicy.class).isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.NOTIFICATION, !notificationDAO.findAll().isEmpty());
+                NumbersInfo.ConfItem.NOTIFICATION.name(), !notificationDAO.findAll().isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.SYNC_TASK, !taskDAO.findAll(TaskType.PULL).isEmpty());
+                NumbersInfo.ConfItem.PULL_TASK.name(), !taskDAO.findAll(TaskType.PULL).isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.VIR_SCHEMA, !virSchemaDAO.findAll().isEmpty());
+                NumbersInfo.ConfItem.VIR_SCHEMA.name(), !virSchemaDAO.findAll().isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.ANY_TYPE, !anyObjectNumbers.isEmpty());
+                NumbersInfo.ConfItem.ANY_TYPE.name(), !anyObjectNumbers.isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.SECURITY_QUESTION, !securityQuestionDAO.findAll().isEmpty());
+                NumbersInfo.ConfItem.SECURITY_QUESTION.name(), !securityQuestionDAO.findAll().isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.ROLE, numbersInfo.getTotalRoles() > 0);
+                NumbersInfo.ConfItem.ROLE.name(), numbersInfo.getTotalRoles() > 0);
 
         return numbersInfo;
     }