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 2012/02/27 12:46:51 UTC

svn commit: r1294122 - in /incubator/syncope/trunk/core/src: main/java/org/syncope/core/persistence/beans/ main/java/org/syncope/core/rest/data/ main/resources/META-INF/ test/java/org/syncope/core/rest/ test/resources/

Author: ilgrosso
Date: Mon Feb 27 11:46:50 2012
New Revision: 1294122

URL: http://svn.apache.org/viewvc?rev=1294122&view=rev
Log:
[SYNCOPE-8] Adding an explicit ReportletConfInstance entity in order to avoid @ElementCollection / CLOB confusion with other DBMS than H2

Added:
    incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportletConfInstance.java   (with props)
Modified:
    incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/Policy.java
    incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/Report.java
    incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportExec.java
    incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/data/ReportDataBinder.java
    incubator/syncope/trunk/core/src/main/resources/META-INF/orm.xml
    incubator/syncope/trunk/core/src/main/resources/META-INF/orm.xml.oracle
    incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ReportTestITCase.java
    incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/TaskTestITCase.java
    incubator/syncope/trunk/core/src/test/resources/content.xml

Modified: incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/Policy.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/Policy.java?rev=1294122&r1=1294121&r2=1294122&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/Policy.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/Policy.java Mon Feb 27 11:46:50 2012
@@ -24,8 +24,8 @@ import javax.persistence.Enumerated;
 import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.validation.constraints.NotNull;
-import org.syncope.core.persistence.validation.entity.PolicyCheck;
 import org.syncope.client.util.XMLSerializer;
+import org.syncope.core.persistence.validation.entity.PolicyCheck;
 import org.syncope.types.AbstractPolicySpec;
 import org.syncope.types.PolicyType;
 

Modified: incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/Report.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/Report.java?rev=1294122&r1=1294121&r2=1294122&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/Report.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/Report.java Mon Feb 27 11:46:50 2012
@@ -22,17 +22,12 @@ import java.util.ArrayList;
 import java.util.List;
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
-import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
 import javax.persistence.Id;
-import javax.persistence.Lob;
 import javax.persistence.OneToMany;
 import org.syncope.client.report.ReportletConf;
 import org.syncope.core.persistence.validation.entity.ReportCheck;
-import org.syncope.client.util.XMLSerializer;
 
 @Entity
 @ReportCheck
@@ -41,16 +36,14 @@ public class Report extends AbstractBase
     private static final long serialVersionUID = -587652654964285834L;
 
     @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
     @Column(unique = true, nullable = false)
     private String name;
 
-    @Lob
-    @ElementCollection(fetch = FetchType.EAGER)
-    @Column(name = "reportletConfs", columnDefinition = "CLOB")
-    private List<String> reportletConfs;
+    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true,
+    fetch = FetchType.EAGER, mappedBy = "report")
+    private List<ReportletConfInstance> reportletConfs;
 
     private String cronExpression;
 
@@ -61,7 +54,7 @@ public class Report extends AbstractBase
     public Report() {
         super();
 
-        reportletConfs = new ArrayList<String>();
+        reportletConfs = new ArrayList<ReportletConfInstance>();
         executions = new ArrayList<ReportExec>();
     }
 
@@ -102,9 +95,11 @@ public class Report extends AbstractBase
             return false;
         }
 
-        String xmlReportlet = XMLSerializer.serialize(reportletConf);
-        return !reportletConfs.contains(xmlReportlet)
-                && reportletConfs.add(xmlReportlet);
+        ReportletConfInstance instance = new ReportletConfInstance();
+        instance.setReport(this);
+        instance.setInstance(reportletConf);
+
+        return reportletConfs.add(instance);
     }
 
     public boolean removeReportletConf(ReportletConf reportletConf) {
@@ -112,22 +107,28 @@ public class Report extends AbstractBase
             return false;
         }
 
-        String xmlReportlet = XMLSerializer.serialize(reportletConf);
-        return reportletConfs.remove(xmlReportlet);
+        ReportletConfInstance found = null;
+        for (ReportletConfInstance instance : reportletConfs) {
+            if (reportletConf.equals(instance.getInstance())) {
+                found = instance;
+            }
+        }
+
+        return found == null ? false : reportletConfs.remove(found);
     }
 
     public List<ReportletConf> getReportletConfs() {
         List<ReportletConf> result =
                 new ArrayList<ReportletConf>(reportletConfs.size());
-        for (String xmlReportletConf : reportletConfs) {
-            result.add(
-                    XMLSerializer.<ReportletConf>deserialize(xmlReportletConf));
+
+        for (ReportletConfInstance instance : reportletConfs) {
+            result.add(instance.getInstance());
         }
 
         return result;
     }
 
-    public void setReportlets(List<ReportletConf> reportletConfs) {
+    public void setReportletConfs(final List<ReportletConf> reportletConfs) {
         this.reportletConfs.clear();
         if (reportletConfs != null && !reportletConfs.isEmpty()) {
             for (ReportletConf reportlet : reportletConfs) {

Modified: incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportExec.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportExec.java?rev=1294122&r1=1294121&r2=1294122&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportExec.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportExec.java Mon Feb 27 11:46:50 2012
@@ -21,8 +21,6 @@ package org.syncope.core.persistence.bea
 import javax.persistence.Basic;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.ManyToOne;
 import org.syncope.types.ReportExecStatus;
@@ -33,7 +31,6 @@ public class ReportExec extends Abstract
     private static final long serialVersionUID = -6178274296037547769L;
 
     @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
     /**

Added: incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportletConfInstance.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportletConfInstance.java?rev=1294122&view=auto
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportletConfInstance.java (added)
+++ incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportletConfInstance.java Mon Feb 27 11:46:50 2012
@@ -0,0 +1,65 @@
+/*
+ * 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.syncope.core.persistence.beans;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import org.syncope.client.report.ReportletConf;
+import org.syncope.client.util.XMLSerializer;
+
+@Entity
+public class ReportletConfInstance extends AbstractBaseBean {
+
+    private static final long serialVersionUID = -2436055132955674610L;
+
+    @Id
+    private Long id;
+
+    @Lob
+    private String serializedInstance;
+
+    @ManyToOne
+    private Report report;
+
+    public Long getId() {
+        return id;
+    }
+
+    public Report getReport() {
+        return report;
+    }
+
+    public void setReport(final Report report) {
+        this.report = report;
+    }
+
+    public ReportletConf getInstance() {
+        return serializedInstance == null
+                ? null
+                : XMLSerializer.<ReportletConf>deserialize(serializedInstance);
+    }
+
+    public void setInstance(final ReportletConf instance) {
+        serializedInstance = instance == null
+                ? null
+                : XMLSerializer.serialize(instance);
+    }
+}

Propchange: incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportletConfInstance.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportletConfInstance.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/syncope/trunk/core/src/main/java/org/syncope/core/persistence/beans/ReportletConfInstance.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/data/ReportDataBinder.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/data/ReportDataBinder.java?rev=1294122&r1=1294121&r2=1294122&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/data/ReportDataBinder.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/data/ReportDataBinder.java Mon Feb 27 11:46:50 2012
@@ -58,7 +58,7 @@ public class ReportDataBinder {
 
     public void getReport(final Report report, final ReportTO reportTO) {
         BeanUtils.copyProperties(reportTO, report, IGNORE_REPORT_PROPERTIES);
-        report.getReportletConfs().clear();
+        report.setReportletConfs(null);
         for (ReportletConf conf : reportTO.getReportletConfs()) {
             report.addReportletConf(conf);
         }

Modified: incubator/syncope/trunk/core/src/main/resources/META-INF/orm.xml
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/resources/META-INF/orm.xml?rev=1294122&r1=1294121&r2=1294122&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/resources/META-INF/orm.xml (original)
+++ incubator/syncope/trunk/core/src/main/resources/META-INF/orm.xml Mon Feb 27 11:46:50 2012
@@ -13,11 +13,11 @@
   limitations under the License.
 -->
 <entity-mappings
-  xmlns="http://java.sun.com/xml/ns/persistence/orm"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
+    xmlns="http://java.sun.com/xml/ns/persistence/orm"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
   http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
-  version="2.0">
+    version="2.0">
 
     <table-generator name="SEQ_UAttrValue" pk-column-value="SEQ_UAttrValue" initial-value="100"/>
     <table-generator name="SEQ_RAttrValue" pk-column-value="SEQ_RAttrValue" initial-value="100"/>
@@ -227,4 +227,29 @@
             </id>
         </attributes>
     </entity>
+
+    <entity class="org.syncope.core.persistence.beans.Report">
+        <attributes>
+            <id name="id">
+                <generated-value generator="SEQ_Report" strategy="TABLE"/>
+                <table-generator name="SEQ_Report" pk-column-value="SEQ_Report" initial-value="100"/>
+            </id>
+        </attributes>
+    </entity>
+    <entity class="org.syncope.core.persistence.beans.ReportExec">
+        <attributes>
+            <id name="id">
+                <generated-value generator="SEQ_ReportExec" strategy="TABLE"/>
+                <table-generator name="SEQ_ReportExec" pk-column-value="SEQ_ReportExec" initial-value="100"/>
+            </id>
+        </attributes>
+    </entity>
+    <entity class="org.syncope.core.persistence.beans.ReportletConfInstance">
+        <attributes>
+            <id name="id">
+                <generated-value generator="SEQ_ReportletConfInstance" strategy="TABLE"/>
+                <table-generator name="SEQ_ReportletConfInstance" pk-column-value="SEQ_ReportletConfInstance" initial-value="100"/>
+            </id>
+        </attributes>
+    </entity>
 </entity-mappings>

Modified: incubator/syncope/trunk/core/src/main/resources/META-INF/orm.xml.oracle
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/resources/META-INF/orm.xml.oracle?rev=1294122&r1=1294121&r2=1294122&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/resources/META-INF/orm.xml.oracle (original)
+++ incubator/syncope/trunk/core/src/main/resources/META-INF/orm.xml.oracle Mon Feb 27 11:46:50 2012
@@ -13,11 +13,11 @@
   limitations under the License.
 -->
 <entity-mappings
-  xmlns="http://java.sun.com/xml/ns/persistence/orm"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
+    xmlns="http://java.sun.com/xml/ns/persistence/orm"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
   http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
-  version="2.0">
+    version="2.0">
 
     <table-generator name="SEQ_UAttrValue" pk-column-value="SEQ_UAttrValue" initial-value="100"/>
     <table-generator name="SEQ_RAttrValue" pk-column-value="SEQ_RAttrValue" initial-value="100"/>
@@ -191,4 +191,29 @@
             </id>
         </attributes>
     </entity>
+    
+    <entity class="org.syncope.core.persistence.beans.Report">
+        <attributes>
+            <id name="id">
+                <generated-value generator="SEQ_Report" strategy="TABLE"/>
+                <table-generator name="SEQ_Report" pk-column-value="SEQ_Report" initial-value="100"/>
+            </id>
+        </attributes>
+    </entity>
+    <entity class="org.syncope.core.persistence.beans.ReportExec">
+        <attributes>
+            <id name="id">
+                <generated-value generator="SEQ_ReportExec" strategy="TABLE"/>
+                <table-generator name="SEQ_ReportExec" pk-column-value="SEQ_ReportExec" initial-value="100"/>
+            </id>
+        </attributes>
+    </entity>
+    <entity class="org.syncope.core.persistence.beans.ReportletConfInstance">
+        <attributes>
+            <id name="id">
+                <generated-value generator="SEQ_ReportletConfInstance" strategy="TABLE"/>
+                <table-generator name="SEQ_ReportletConfInstance" pk-column-value="SEQ_ReportletConfInstance" initial-value="100"/>
+            </id>
+        </attributes>
+    </entity>
 </entity-mappings>

Modified: incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ReportTestITCase.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ReportTestITCase.java?rev=1294122&r1=1294121&r2=1294122&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ReportTestITCase.java (original)
+++ incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ReportTestITCase.java Mon Feb 27 11:46:50 2012
@@ -176,7 +176,7 @@ public class ReportTestITCase extends Ab
         assertNotNull(execution);
 
         int i = 0;
-        int maxit = 20;
+        int maxit = 50;
         do {
             try {
                 Thread.sleep(1000);

Modified: incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/TaskTestITCase.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/TaskTestITCase.java?rev=1294122&r1=1294121&r2=1294122&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/TaskTestITCase.java (original)
+++ incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/TaskTestITCase.java Mon Feb 27 11:46:50 2012
@@ -323,7 +323,7 @@ public class TaskTestITCase extends Abst
         assertEquals("JOB_FIRED", execution.getStatus());
 
         int i = 0;
-        int maxit = 20;
+        int maxit = 50;
 
         // wait for sync completion (executions incremented)
         do {

Modified: incubator/syncope/trunk/core/src/test/resources/content.xml
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/test/resources/content.xml?rev=1294122&r1=1294121&r2=1294122&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/test/resources/content.xml (original)
+++ incubator/syncope/trunk/core/src/test/resources/content.xml Mon Feb 27 11:46:50 2012
@@ -600,6 +600,6 @@ under the License.
     <Notification_events Notification_id="101" events="unexisting2"/>
     
     <Report id="1" name="test"/>
-    <Report_reportletConfs Report_id="1" reportletConfs="%3Corg.syncope.client.report.UserReportletConf%3E%0A++%3Cname%3EtestUserReportlet%3C%2Fname%3E%0A++%3Cattrs%3E%0A++++%3Cstring%3Efullname%3C%2Fstring%3E%0A++++%3Cstring%3Egender%3C%2Fstring%3E%0A++%3C%2Fattrs%3E%0A++%3CderAttrs+class%3D%22singleton-list%22%3E%0A++++%3Cstring%3Ecn%3C%2Fstring%3E%0A++%3C%2FderAttrs%3E%0A++%3CvirAttrs+class%3D%22singleton-list%22%3E%0A++++%3Cstring%3Evirtualdata%3C%2Fstring%3E%0A++%3C%2FvirAttrs%3E%0A++%3Cfeatures+class%3D%22java.util.Arrays%24ArrayList%22%3E%0A++++%3Ca+class%3D%22org.syncope.client.report.UserReportletConf%24Feature-array%22%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Eid%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Eusername%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3EworkflowId%3C%2Fo
 rg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Estatus%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3EcreationDate%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3ElastLoginDate%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3EchangePwdDate%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3EpasswordHistorySize%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3EfailedLoginCount%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Ememberships%3C%2Forg.
 syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Eresources%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++%3C%2Fa%3E%0A++%3C%2Ffeatures%3E%0A%3C%2Forg.syncope.client.report.UserReportletConf%3E"/>
+    <ReportletConfInstance id="1" Report_id="1" serializedInstance="%3Corg.syncope.client.report.UserReportletConf%3E%0A++%3Cname%3EtestUserReportlet%3C%2Fname%3E%0A++%3Cattrs%3E%0A++++%3Cstring%3Efullname%3C%2Fstring%3E%0A++++%3Cstring%3Egender%3C%2Fstring%3E%0A++%3C%2Fattrs%3E%0A++%3CderAttrs+class%3D%22singleton-list%22%3E%0A++++%3Cstring%3Ecn%3C%2Fstring%3E%0A++%3C%2FderAttrs%3E%0A++%3CvirAttrs+class%3D%22singleton-list%22%3E%0A++++%3Cstring%3Evirtualdata%3C%2Fstring%3E%0A++%3C%2FvirAttrs%3E%0A++%3Cfeatures+class%3D%22java.util.Arrays%24ArrayList%22%3E%0A++++%3Ca+class%3D%22org.syncope.client.report.UserReportletConf%24Feature-array%22%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Eid%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Eusername%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Eworkfl
 owId%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Estatus%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3EcreationDate%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3ElastLoginDate%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3EchangePwdDate%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3EpasswordHistorySize%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3EfailedLoginCount%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Emembership
 s%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++++%3Corg.syncope.client.report.UserReportletConf_-Feature%3Eresources%3C%2Forg.syncope.client.report.UserReportletConf_-Feature%3E%0A++++%3C%2Fa%3E%0A++%3C%2Ffeatures%3E%0A%3C%2Forg.syncope.client.report.UserReportletConf%3E"/>
     <ReportExec Report_id="1" id="1" status="SUCCESS" startDate="2012-02-26 15:40:04" endDate="2012-02-26 15:41:04"/>
 </dataset>