http://git-wip-us.apache.org/repos/asf/syncope/blob/67ecbea3/core/logic/src/main/java/org/apache/syncope/core/logic/report/GroupReportlet.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/GroupReportlet.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/report/GroupReportlet.java
deleted file mode 100644
index 0aeaf0a..0000000
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/GroupReportlet.java
+++ /dev/null
@@ -1,316 +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.core.logic.report;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.report.GroupReportletConf;
-import org.apache.syncope.common.lib.report.GroupReportletConf.Feature;
-import org.apache.syncope.common.lib.report.ReportletConf;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.AttrTO;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.core.persistence.api.dao.AnyDAO;
-import org.apache.syncope.core.persistence.api.dao.GroupDAO;
-import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.persistence.api.search.SearchCondConverter;
-import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.api.dao.ReportletConfClass;
-import org.apache.syncope.core.persistence.api.entity.user.UMembership;
-import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.AttributesImpl;
-
-@ReportletConfClass(GroupReportletConf.class)
-public class GroupReportlet extends AbstractReportlet {
-
-    @Autowired
-    private GroupDAO groupDAO;
-
-    @Autowired
-    private AnySearchDAO searchDAO;
-
-    @Autowired
-    private GroupDataBinder groupDataBinder;
-
-    private GroupReportletConf conf;
-
-    private void doExtractResources(final ContentHandler handler, final AnyTO 
anyTO)
-            throws SAXException {
-
-        if (anyTO.getResources().isEmpty()) {
-            LOG.debug("No resources found for {}[{}]", 
anyTO.getClass().getSimpleName(), anyTO.getKey());
-        } else {
-            AttributesImpl atts = new AttributesImpl();
-            handler.startElement("", "", "resources", null);
-
-            for (String resourceName : anyTO.getResources()) {
-                atts.clear();
-
-                atts.addAttribute("", "", ReportXMLConst.ATTR_NAME, 
ReportXMLConst.XSD_STRING, resourceName);
-                handler.startElement("", "", "resource", atts);
-                handler.endElement("", "", "resource");
-            }
-
-            handler.endElement("", "", "resources");
-        }
-    }
-
-    private void doExtractAttributes(final ContentHandler handler, final AnyTO 
anyTO,
-            final Collection<String> attrs, final Collection<String> derAttrs, 
final Collection<String> virAttrs)
-            throws SAXException {
-
-        AttributesImpl atts = new AttributesImpl();
-        if (!attrs.isEmpty()) {
-            Map<String, AttrTO> attrMap = anyTO.getPlainAttrMap();
-
-            handler.startElement("", "", "attributes", null);
-            for (String attrName : attrs) {
-                atts.clear();
-
-                atts.addAttribute("", "", ReportXMLConst.ATTR_NAME, 
ReportXMLConst.XSD_STRING, attrName);
-                handler.startElement("", "", "attribute", atts);
-
-                if (attrMap.containsKey(attrName)) {
-                    for (String value : attrMap.get(attrName).getValues()) {
-                        handler.startElement("", "", "value", null);
-                        handler.characters(value.toCharArray(), 0, 
value.length());
-                        handler.endElement("", "", "value");
-                    }
-                } else {
-                    LOG.debug("{} not found for {}[{}]", attrName,
-                            anyTO.getClass().getSimpleName(), anyTO.getKey());
-                }
-
-                handler.endElement("", "", "attribute");
-            }
-            handler.endElement("", "", "attributes");
-        }
-
-        if (!derAttrs.isEmpty()) {
-            Map<String, AttrTO> derAttrMap = anyTO.getDerAttrMap();
-
-            handler.startElement("", "", "derivedAttributes", null);
-            for (String attrName : derAttrs) {
-                atts.clear();
-
-                atts.addAttribute("", "", ReportXMLConst.ATTR_NAME, 
ReportXMLConst.XSD_STRING, attrName);
-                handler.startElement("", "", "derivedAttribute", atts);
-
-                if (derAttrMap.containsKey(attrName)) {
-                    for (String value : derAttrMap.get(attrName).getValues()) {
-                        handler.startElement("", "", "value", null);
-                        handler.characters(value.toCharArray(), 0, 
value.length());
-                        handler.endElement("", "", "value");
-                    }
-                } else {
-                    LOG.debug("{} not found for {}[{}]", attrName,
-                            anyTO.getClass().getSimpleName(), anyTO.getKey());
-                }
-
-                handler.endElement("", "", "derivedAttribute");
-            }
-            handler.endElement("", "", "derivedAttributes");
-        }
-
-        if (!virAttrs.isEmpty()) {
-            Map<String, AttrTO> virAttrMap = anyTO.getVirAttrMap();
-
-            handler.startElement("", "", "virtualAttributes", null);
-            for (String attrName : virAttrs) {
-                atts.clear();
-
-                atts.addAttribute("", "", ReportXMLConst.ATTR_NAME, 
ReportXMLConst.XSD_STRING, attrName);
-                handler.startElement("", "", "virtualAttribute", atts);
-
-                if (virAttrMap.containsKey(attrName)) {
-                    for (String value : virAttrMap.get(attrName).getValues()) {
-                        handler.startElement("", "", "value", null);
-                        handler.characters(value.toCharArray(), 0, 
value.length());
-                        handler.endElement("", "", "value");
-                    }
-                } else {
-                    LOG.debug("{} not found for {}[{}]", attrName,
-                            anyTO.getClass().getSimpleName(), anyTO.getKey());
-                }
-
-                handler.endElement("", "", "virtualAttribute");
-            }
-            handler.endElement("", "", "virtualAttributes");
-        }
-    }
-
-    private void doExtract(final ContentHandler handler, final List<Group> 
groups) throws SAXException {
-        AttributesImpl atts = new AttributesImpl();
-        for (Group group : groups) {
-            atts.clear();
-
-            for (Feature feature : conf.getFeatures()) {
-                String type = null;
-                String value = null;
-                switch (feature) {
-                    case key:
-                        type = ReportXMLConst.XSD_STRING;
-                        value = group.getKey();
-                        break;
-
-                    case name:
-                        type = ReportXMLConst.XSD_STRING;
-                        value = String.valueOf(group.getName());
-                        break;
-
-                    case groupOwner:
-                        type = ReportXMLConst.XSD_STRING;
-                        value = group.getGroupOwner().getKey();
-                        break;
-
-                    case userOwner:
-                        type = ReportXMLConst.XSD_STRING;
-                        value = group.getUserOwner().getKey();
-                        break;
-
-                    default:
-                }
-
-                if (type != null && value != null) {
-                    atts.addAttribute("", "", feature.name(), type, value);
-                }
-            }
-
-            handler.startElement("", "", "group", atts);
-
-            // Using GroupTO for attribute values, since the conversion logic 
of
-            // values to String is already encapsulated there
-            GroupTO groupTO = groupDataBinder.getGroupTO(group, true);
-
-            doExtractAttributes(handler, groupTO, conf.getPlainAttrs(), 
conf.getDerAttrs(), conf.getVirAttrs());
-
-            // to get resources associated to a group
-            if (conf.getFeatures().contains(Feature.resources)) {
-                doExtractResources(handler, groupTO);
-            }
-            //to get users asscoiated to a group is preferred GroupDAO to 
GroupTO
-            if (conf.getFeatures().contains(Feature.users)) {
-                handler.startElement("", "", "users", null);
-
-                for (UMembership memb : groupDAO.findUMemberships(group)) {
-                    atts.clear();
-
-                    atts.addAttribute("", "", "key", ReportXMLConst.XSD_STRING,
-                            memb.getLeftEnd().getKey());
-                    atts.addAttribute("", "", "username", 
ReportXMLConst.XSD_STRING,
-                            String.valueOf(memb.getLeftEnd().getUsername()));
-
-                    handler.startElement("", "", "user", atts);
-                    handler.endElement("", "", "user");
-                }
-
-                handler.endElement("", "", "users");
-            }
-
-            handler.endElement("", "", "group");
-        }
-    }
-
-    private void doExtractConf(final ContentHandler handler) throws 
SAXException {
-        if (conf == null) {
-            LOG.debug("Report configuration is not present");
-        }
-
-        AttributesImpl atts = new AttributesImpl();
-        handler.startElement("", "", "configurations", null);
-        handler.startElement("", "", "groupAttributes", atts);
-
-        if (conf != null) {
-            for (Feature feature : conf.getFeatures()) {
-                atts.clear();
-                handler.startElement("", "", "feature", atts);
-                handler.characters(feature.name().toCharArray(), 0, 
feature.name().length());
-                handler.endElement("", "", "feature");
-            }
-
-            for (String attr : conf.getPlainAttrs()) {
-                atts.clear();
-                handler.startElement("", "", "attribute", atts);
-                handler.characters(attr.toCharArray(), 0, attr.length());
-                handler.endElement("", "", "attribute");
-            }
-
-            for (String derAttr : conf.getDerAttrs()) {
-                atts.clear();
-                handler.startElement("", "", "derAttribute", atts);
-                handler.characters(derAttr.toCharArray(), 0, derAttr.length());
-                handler.endElement("", "", "derAttribute");
-            }
-
-            for (String virAttr : conf.getVirAttrs()) {
-                atts.clear();
-                handler.startElement("", "", "virAttribute", atts);
-                handler.characters(virAttr.toCharArray(), 0, virAttr.length());
-                handler.endElement("", "", "virAttribute");
-            }
-        }
-
-        handler.endElement("", "", "groupAttributes");
-        handler.endElement("", "", "configurations");
-    }
-
-    private int count() {
-        return StringUtils.isBlank(conf.getMatchingCond())
-                ? groupDAO.count()
-                : searchDAO.count(SyncopeConstants.FULL_ADMIN_REALMS,
-                        SearchCondConverter.convert(conf.getMatchingCond()), 
AnyTypeKind.GROUP);
-    }
-
-    @Override
-    protected void doExtract(final ReportletConf conf, final ContentHandler 
handler) throws SAXException {
-        if (conf instanceof GroupReportletConf) {
-            this.conf = GroupReportletConf.class.cast(conf);
-        } else {
-            throw new ReportException(new IllegalArgumentException("Invalid 
configuration provided"));
-        }
-
-        doExtractConf(handler);
-
-        for (int page = 1; page <= (count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; 
page++) {
-            List<Group> groups;
-            if (StringUtils.isBlank(this.conf.getMatchingCond())) {
-                groups = groupDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE);
-            } else {
-                groups = searchDAO.search(
-                        SyncopeConstants.FULL_ADMIN_REALMS,
-                        
SearchCondConverter.convert(this.conf.getMatchingCond()),
-                        page,
-                        AnyDAO.DEFAULT_PAGE_SIZE,
-                        Collections.<OrderByClause>emptyList(),
-                        AnyTypeKind.USER);
-            }
-
-            doExtract(handler, groups);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/67ecbea3/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReconciliationReportlet.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReconciliationReportlet.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReconciliationReportlet.java
deleted file mode 100644
index 4922015..0000000
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReconciliationReportlet.java
+++ /dev/null
@@ -1,519 +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.core.logic.report;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import org.apache.commons.collections4.Closure;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.report.ReconciliationReportletConf;
-import 
org.apache.syncope.common.lib.report.ReconciliationReportletConf.Feature;
-import org.apache.syncope.common.lib.report.ReportletConf;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.core.persistence.api.dao.AnyDAO;
-import org.apache.syncope.core.persistence.api.search.SearchCondConverter;
-import org.apache.syncope.core.provisioning.api.utils.FormatUtils;
-import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
-import org.apache.syncope.core.persistence.api.dao.GroupDAO;
-import org.apache.syncope.core.persistence.api.dao.ReportletConfClass;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.dao.search.AnyTypeCond;
-import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
-import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.AnyType;
-import org.apache.syncope.core.persistence.api.entity.AnyUtils;
-import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
-import 
org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
-import org.apache.syncope.core.persistence.api.entity.resource.Provision;
-import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.provisioning.api.Connector;
-import org.apache.syncope.core.provisioning.api.ConnectorFactory;
-import org.apache.syncope.core.provisioning.api.MappingManager;
-import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
-import org.identityconnectors.common.Base64;
-import org.identityconnectors.framework.common.objects.Attribute;
-import org.identityconnectors.framework.common.objects.AttributeBuilder;
-import org.identityconnectors.framework.common.objects.ConnectorObject;
-import org.identityconnectors.framework.common.objects.OperationalAttributes;
-import org.identityconnectors.framework.common.objects.Uid;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.AttributesImpl;
-
-/**
- * Reportlet for extracting information for the current reconciliation status, 
e.g. the coherence between Syncope
- * information and mapped entities on external resources.
- */
-@ReportletConfClass(ReconciliationReportletConf.class)
-public class ReconciliationReportlet extends AbstractReportlet {
-
-    private static final int PAGE_SIZE = 10;
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Autowired
-    private GroupDAO groupDAO;
-
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
-    @Autowired
-    private AnySearchDAO searchDAO;
-
-    @Autowired
-    private MappingManager mappingManager;
-
-    @Autowired
-    private ConnectorFactory connFactory;
-
-    @Autowired
-    private AnyUtilsFactory anyUtilsFactory;
-
-    private ReconciliationReportletConf conf;
-
-    private String getAnyElementName(final AnyTypeKind anyTypeKind) {
-        String elementName;
-
-        switch (anyTypeKind) {
-            case USER:
-                elementName = "user";
-                break;
-
-            case GROUP:
-                elementName = "group";
-                break;
-
-            case ANY_OBJECT:
-            default:
-                elementName = "anyObject";
-        }
-
-        return elementName;
-    }
-
-    private void doExtract(
-            final ContentHandler handler,
-            final Any<?> any,
-            final Set<Missing> missing,
-            final Set<Misaligned> misaligned)
-            throws SAXException {
-
-        AttributesImpl atts = new AttributesImpl();
-
-        for (Feature feature : conf.getFeatures()) {
-            String type = null;
-            String value = null;
-            switch (feature) {
-                case key:
-                    type = ReportXMLConst.XSD_STRING;
-                    value = any.getKey();
-                    break;
-
-                case username:
-                    if (any instanceof User) {
-                        type = ReportXMLConst.XSD_STRING;
-                        value = User.class.cast(any).getUsername();
-                    }
-                    break;
-
-                case groupName:
-                    if (any instanceof Group) {
-                        type = ReportXMLConst.XSD_STRING;
-                        value = Group.class.cast(any).getName();
-                    }
-                    break;
-
-                case workflowId:
-                    type = ReportXMLConst.XSD_STRING;
-                    value = any.getWorkflowId();
-                    break;
-
-                case status:
-                    type = ReportXMLConst.XSD_STRING;
-                    value = any.getStatus();
-                    break;
-
-                case creationDate:
-                    type = ReportXMLConst.XSD_DATETIME;
-                    value = any.getCreationDate() == null
-                            ? StringUtils.EMPTY
-                            : FormatUtils.format(any.getCreationDate());
-                    break;
-
-                case lastLoginDate:
-                    if (any instanceof User) {
-                        type = ReportXMLConst.XSD_DATETIME;
-                        value = User.class.cast(any).getLastLoginDate() == null
-                                ? StringUtils.EMPTY
-                                : 
FormatUtils.format(User.class.cast(any).getLastLoginDate());
-                    }
-                    break;
-
-                case changePwdDate:
-                    if (any instanceof User) {
-                        type = ReportXMLConst.XSD_DATETIME;
-                        value = User.class.cast(any).getChangePwdDate() == null
-                                ? StringUtils.EMPTY
-                                : 
FormatUtils.format(User.class.cast(any).getChangePwdDate());
-                    }
-                    break;
-
-                case passwordHistorySize:
-                    if (any instanceof User) {
-                        type = ReportXMLConst.XSD_INT;
-                        value = 
String.valueOf(User.class.cast(any).getPasswordHistory().size());
-                    }
-                    break;
-
-                case failedLoginCount:
-                    if (any instanceof User) {
-                        type = ReportXMLConst.XSD_INT;
-                        value = 
String.valueOf(User.class.cast(any).getFailedLogins());
-                    }
-                    break;
-
-                default:
-            }
-
-            if (type != null && value != null) {
-                atts.addAttribute("", "", feature.name(), type, value);
-            }
-        }
-
-        handler.startElement("", "", 
getAnyElementName(any.getType().getKind()), atts);
-
-        for (Missing item : missing) {
-            atts.clear();
-            atts.addAttribute("", "", "resource", ReportXMLConst.XSD_STRING, 
item.getResource());
-            atts.addAttribute("", "", "connObjectKeyValue", 
ReportXMLConst.XSD_STRING, item.getConnObjectKeyValue());
-
-            handler.startElement("", "", "missing", atts);
-            handler.endElement("", "", "missing");
-        }
-        for (Misaligned item : misaligned) {
-            atts.clear();
-            atts.addAttribute("", "", "resource", ReportXMLConst.XSD_STRING, 
item.getResource());
-            atts.addAttribute("", "", "connObjectKeyValue", 
ReportXMLConst.XSD_STRING, item.getConnObjectKeyValue());
-            atts.addAttribute("", "", ReportXMLConst.ATTR_NAME, 
ReportXMLConst.XSD_STRING, item.getName());
-
-            handler.startElement("", "", "misaligned", atts);
-
-            handler.startElement("", "", "onSyncope", null);
-            if (item.getOnSyncope() != null) {
-                for (Object value : item.getOnSyncope()) {
-                    char[] asChars = value.toString().toCharArray();
-
-                    handler.startElement("", "", "value", null);
-                    handler.characters(asChars, 0, asChars.length);
-                    handler.endElement("", "", "value");
-                }
-            }
-            handler.endElement("", "", "onSyncope");
-
-            handler.startElement("", "", "onResource", null);
-            if (item.getOnResource() != null) {
-                for (Object value : item.getOnResource()) {
-                    char[] asChars = value.toString().toCharArray();
-
-                    handler.startElement("", "", "value", null);
-                    handler.characters(asChars, 0, asChars.length);
-                    handler.endElement("", "", "value");
-                }
-            }
-            handler.endElement("", "", "onResource");
-
-            handler.endElement("", "", "misaligned");
-        }
-
-        handler.endElement("", "", getAnyElementName(any.getType().getKind()));
-    }
-
-    private Set<Object> getValues(final Attribute attr) {
-        Set<Object> values;
-        if (attr.getValue() == null || attr.getValue().isEmpty()) {
-            values = Collections.emptySet();
-        } else if (attr.getValue().get(0) instanceof byte[]) {
-            values = new HashSet<>(attr.getValue().size());
-            for (Object single : attr.getValue()) {
-                values.add(Base64.encode((byte[]) single));
-            }
-        } else {
-            values = new HashSet<>(attr.getValue());
-        }
-
-        return values;
-    }
-
-    private void doExtract(final ContentHandler handler, final List<? extends 
Any<?>> anys)
-            throws SAXException, ReportException {
-
-        final Set<Missing> missing = new HashSet<>();
-        final Set<Misaligned> misaligned = new HashSet<>();
-
-        for (Any<?> any : anys) {
-            missing.clear();
-            misaligned.clear();
-
-            AnyUtils anyUtils = anyUtilsFactory.getInstance(any);
-            for (final ExternalResource resource : 
anyUtils.getAllResources(any)) {
-                Provision provision = resource.getProvision(any.getType());
-                MappingItem connObjectKeyItem = 
MappingUtils.getConnObjectKeyItem(provision);
-                final String connObjectKeyValue = connObjectKeyItem == null
-                        ? StringUtils.EMPTY
-                        : mappingManager.getConnObjectKeyValue(any, provision);
-                if (provision != null && connObjectKeyItem != null && 
StringUtils.isNotBlank(connObjectKeyValue)) {
-                    // 1. read from the underlying connector
-                    Connector connector = connFactory.getConnector(resource);
-                    ConnectorObject connectorObject = 
connector.getObject(provision.getObjectClass(),
-                            new Uid(connObjectKeyValue),
-                            
MappingUtils.buildOperationOptions(provision.getMapping().getItems().iterator()));
-
-                    if (connectorObject == null) {
-                        // 2. not found on resource?
-                        LOG.error("Object {} with class {} not found on 
resource {}",
-                                connObjectKeyValue, 
provision.getObjectClass(), resource);
-
-                        missing.add(new Missing(resource.getKey(), 
connObjectKeyValue));
-                    } else {
-                        // 3. found but misaligned?
-                        Pair<String, Set<Attribute>> preparedAttrs =
-                                mappingManager.prepareAttrs(any, null, false, 
null, provision);
-                        preparedAttrs.getRight().add(AttributeBuilder.build(
-                                Uid.NAME, preparedAttrs.getLeft()));
-                        preparedAttrs.getRight().add(AttributeBuilder.build(
-                                connObjectKeyItem.getExtAttrName(), 
preparedAttrs.getLeft()));
-
-                        final Map<String, Set<Object>> syncopeAttrs = new 
HashMap<>();
-                        for (Attribute attr : preparedAttrs.getRight()) {
-                            syncopeAttrs.put(attr.getName(), getValues(attr));
-                        }
-
-                        final Map<String, Set<Object>> resourceAttrs = new 
HashMap<>();
-                        for (Attribute attr : connectorObject.getAttributes()) 
{
-                            if 
(!OperationalAttributes.PASSWORD_NAME.equals(attr.getName())
-                                    && 
!OperationalAttributes.ENABLE_NAME.equals(attr.getName())) {
-
-                                resourceAttrs.put(attr.getName(), 
getValues(attr));
-                            }
-                        }
-
-                        
IterableUtils.forEach(CollectionUtils.subtract(syncopeAttrs.keySet(), 
resourceAttrs.keySet()),
-                                new Closure<String>() {
-
-                            @Override
-                            public void execute(final String name) {
-                                misaligned.add(new Misaligned(
-                                        resource.getKey(),
-                                        connObjectKeyValue,
-                                        name,
-                                        syncopeAttrs.get(name),
-                                        Collections.emptySet()));
-                            }
-                        });
-
-                        for (Map.Entry<String, Set<Object>> entry : 
resourceAttrs.entrySet()) {
-                            if (syncopeAttrs.containsKey(entry.getKey())) {
-                                if 
(!Objects.equals(syncopeAttrs.get(entry.getKey()), entry.getValue())) {
-                                    misaligned.add(new Misaligned(
-                                            resource.getKey(),
-                                            connObjectKeyValue,
-                                            entry.getKey(),
-                                            syncopeAttrs.get(entry.getKey()),
-                                            entry.getValue()));
-                                }
-                            } else {
-                                misaligned.add(new Misaligned(
-                                        resource.getKey(),
-                                        connObjectKeyValue,
-                                        entry.getKey(),
-                                        Collections.emptySet(),
-                                        entry.getValue()));
-                            }
-                        }
-                    }
-                }
-            }
-
-            if (!missing.isEmpty() || !misaligned.isEmpty()) {
-                doExtract(handler, any, missing, misaligned);
-            }
-        }
-    }
-
-    private void doExtract(
-            final ContentHandler handler, final int count, final SearchCond 
cond, final AnyTypeKind anyTypeKind)
-            throws SAXException {
-
-        for (int page = 1; page <= (count / PAGE_SIZE) + 1; page++) {
-            List<AnyObject> anys = searchDAO.search(
-                    SyncopeConstants.FULL_ADMIN_REALMS,
-                    cond,
-                    page,
-                    PAGE_SIZE,
-                    Collections.<OrderByClause>emptyList(),
-                    anyTypeKind);
-
-            doExtract(handler, anys);
-        }
-    }
-
-    @Override
-    protected void doExtract(final ReportletConf conf, final ContentHandler 
handler) throws SAXException {
-        if (conf instanceof ReconciliationReportletConf) {
-            this.conf = ReconciliationReportletConf.class.cast(conf);
-        } else {
-            throw new ReportException(new IllegalArgumentException("Invalid 
configuration provided"));
-        }
-
-        AttributesImpl atts = new AttributesImpl();
-
-        if (StringUtils.isBlank(this.conf.getUserMatchingCond())) {
-            atts.addAttribute("", "", "total", ReportXMLConst.XSD_INT, 
String.valueOf(userDAO.count()));
-            handler.startElement("", "", getAnyElementName(AnyTypeKind.USER) + 
"s", atts);
-
-            for (int page = 1; page <= (userDAO.count() / 
AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                doExtract(handler, userDAO.findAll(page, 
AnyDAO.DEFAULT_PAGE_SIZE));
-            }
-        } else {
-            SearchCond cond = 
SearchCondConverter.convert(this.conf.getUserMatchingCond());
-
-            int count = searchDAO.count(SyncopeConstants.FULL_ADMIN_REALMS, 
cond, AnyTypeKind.USER);
-            atts.addAttribute("", "", "total", ReportXMLConst.XSD_INT, 
String.valueOf(count));
-            handler.startElement("", "", getAnyElementName(AnyTypeKind.USER) + 
"s", atts);
-
-            doExtract(handler, count, cond, AnyTypeKind.USER);
-        }
-        handler.endElement("", "", getAnyElementName(AnyTypeKind.USER) + "s");
-
-        atts.clear();
-        if (StringUtils.isBlank(this.conf.getGroupMatchingCond())) {
-            atts.addAttribute("", "", "total", ReportXMLConst.XSD_INT, 
String.valueOf(groupDAO.count()));
-            handler.startElement("", "", getAnyElementName(AnyTypeKind.GROUP) 
+ "s", atts);
-
-            for (int page = 1; page <= (groupDAO.count() / 
AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                doExtract(handler, groupDAO.findAll(page, 
AnyDAO.DEFAULT_PAGE_SIZE));
-            }
-        } else {
-            SearchCond cond = 
SearchCondConverter.convert(this.conf.getUserMatchingCond());
-
-            int count = searchDAO.count(SyncopeConstants.FULL_ADMIN_REALMS, 
cond, AnyTypeKind.GROUP);
-            atts.addAttribute("", "", "total", ReportXMLConst.XSD_INT, 
String.valueOf(count));
-            handler.startElement("", "", getAnyElementName(AnyTypeKind.GROUP) 
+ "s", atts);
-
-            doExtract(handler, count, cond, AnyTypeKind.GROUP);
-        }
-        handler.endElement("", "", getAnyElementName(AnyTypeKind.GROUP) + "s");
-
-        for (AnyType anyType : anyTypeDAO.findAll()) {
-            if (!anyType.equals(anyTypeDAO.findUser()) && 
!anyType.equals(anyTypeDAO.findGroup())) {
-                AnyTypeCond anyTypeCond = new AnyTypeCond();
-                anyTypeCond.setAnyTypeKey(anyType.getKey());
-                SearchCond cond = 
StringUtils.isBlank(this.conf.getAnyObjectMatchingCond())
-                        ? SearchCond.getLeafCond(anyTypeCond)
-                        : SearchCond.getAndCond(
-                                SearchCond.getLeafCond(anyTypeCond),
-                                
SearchCondConverter.convert(this.conf.getAnyObjectMatchingCond()));
-
-                int count = 
searchDAO.count(SyncopeConstants.FULL_ADMIN_REALMS, cond, 
AnyTypeKind.ANY_OBJECT);
-
-                atts.clear();
-                atts.addAttribute("", "", "type", ReportXMLConst.XSD_STRING, 
anyType.getKey());
-                atts.addAttribute("", "", "total", ReportXMLConst.XSD_INT, 
String.valueOf(count));
-                handler.startElement("", "", 
getAnyElementName(AnyTypeKind.ANY_OBJECT) + "s", atts);
-
-                doExtract(handler, count, cond, AnyTypeKind.ANY_OBJECT);
-
-                handler.endElement("", "", 
getAnyElementName(AnyTypeKind.ANY_OBJECT) + "s");
-            }
-        }
-    }
-
-    private static class Missing {
-
-        private final String resource;
-
-        private final String connObjectKeyValue;
-
-        Missing(final String resource, final String connObjectKeyValue) {
-            this.resource = resource;
-            this.connObjectKeyValue = connObjectKeyValue;
-        }
-
-        public String getResource() {
-            return resource;
-        }
-
-        public String getConnObjectKeyValue() {
-            return connObjectKeyValue;
-        }
-
-    }
-
-    private static class Misaligned extends Missing {
-
-        private final String name;
-
-        private final Set<Object> onSyncope;
-
-        private final Set<Object> onResource;
-
-        Misaligned(
-                final String resource,
-                final String connObjectKeyValue,
-                final String name,
-                final Set<Object> onSyncope,
-                final Set<Object> onResource) {
-
-            super(resource, connObjectKeyValue);
-
-            this.name = name;
-            this.onSyncope = onSyncope;
-            this.onResource = onResource;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public Set<Object> getOnSyncope() {
-            return onSyncope;
-        }
-
-        public Set<Object> getOnResource() {
-            return onResource;
-        }
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/67ecbea3/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportException.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportException.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportException.java
deleted file mode 100644
index f4495ad..0000000
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportException.java
+++ /dev/null
@@ -1,32 +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.core.logic.report;
-
-public class ReportException extends RuntimeException {
-
-    private static final long serialVersionUID = 6719507778589395283L;
-
-    public ReportException(final Throwable cause) {
-        super(cause);
-    }
-
-    public ReportException(final String message, final Throwable cause) {
-        super(message, cause);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/67ecbea3/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJob.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJob.java 
b/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJob.java
deleted file mode 100644
index 8b14024..0000000
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJob.java
+++ /dev/null
@@ -1,80 +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.core.logic.report;
-
-import org.apache.syncope.core.spring.security.AuthContextUtils;
-import org.apache.syncope.core.provisioning.java.job.AbstractInterruptableJob;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.apache.syncope.core.provisioning.api.job.JobManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Quartz job for executing a given report.
- */
-public class ReportJob extends AbstractInterruptableJob {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ReportJob.class);
-
-    /**
-     * Key, set by the caller, for identifying the report to be executed.
-     */
-    private String reportKey;
-
-    @Autowired
-    private ReportJobDelegate delegate;
-
-    /**
-     * Report id setter.
-     *
-     * @param reportKey to be set
-     */
-    public void setReportKey(final String reportKey) {
-        this.reportKey = reportKey;
-    }
-
-    @Override
-    public void execute(final JobExecutionContext context) throws 
JobExecutionException {
-        super.execute(context);
-
-        try {
-            
AuthContextUtils.execWithAuthContext(context.getMergedJobDataMap().getString(JobManager.DOMAIN_KEY),
-                    new AuthContextUtils.Executable<Void>() {
-
-                @Override
-                public Void exec() {
-                    try {
-                        delegate.execute(reportKey);
-                    } catch (Exception e) {
-                        LOG.error("While executing report {}", reportKey, e);
-                        throw new RuntimeException(e);
-                    }
-
-                    return null;
-                }
-            });
-        } catch (RuntimeException e) {
-            LOG.error("While executing report {}", reportKey, e);
-            throw new JobExecutionException("While executing report " + 
reportKey, e);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/67ecbea3/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJobDelegate.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJobDelegate.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJobDelegate.java
deleted file mode 100644
index 6d41686..0000000
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJobDelegate.java
+++ /dev/null
@@ -1,198 +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.core.logic.report;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.Date;
-import java.util.zip.Deflater;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-import org.apache.commons.io.IOUtils;
-import org.apache.syncope.common.lib.report.ReportletConf;
-import org.apache.syncope.common.lib.types.ReportExecStatus;
-import org.apache.syncope.core.provisioning.api.utils.ExceptionUtils2;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
-import org.apache.syncope.core.persistence.api.ImplementationLookup;
-import org.apache.syncope.core.persistence.api.dao.ReportDAO;
-import org.apache.syncope.core.persistence.api.dao.ReportExecDAO;
-import org.apache.syncope.core.persistence.api.dao.Reportlet;
-import org.apache.syncope.core.persistence.api.entity.EntityFactory;
-import org.apache.syncope.core.persistence.api.entity.Report;
-import org.apache.syncope.core.persistence.api.entity.ReportExec;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.support.AbstractBeanDefinition;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-import org.xml.sax.helpers.AttributesImpl;
-
-@Component
-public class ReportJobDelegate {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(ReportJobDelegate.class);
-
-    /**
-     * Report DAO.
-     */
-    @Autowired
-    private ReportDAO reportDAO;
-
-    /**
-     * Report execution DAO.
-     */
-    @Autowired
-    private ReportExecDAO reportExecDAO;
-
-    @Autowired
-    private EntityFactory entityFactory;
-
-    @Autowired
-    private ImplementationLookup implementationLookup;
-
-    @Transactional
-    public void execute(final String reportKey) throws JobExecutionException {
-        Report report = reportDAO.find(reportKey);
-        if (report == null) {
-            throw new JobExecutionException("Report " + reportKey + " not 
found");
-        }
-
-        if (!report.isActive()) {
-            LOG.info("Report {} not active, aborting...", reportKey);
-            return;
-        }
-
-        // 1. create execution
-        ReportExec execution = entityFactory.newEntity(ReportExec.class);
-        execution.setStatus(ReportExecStatus.STARTED);
-        execution.setStart(new Date());
-        execution.setReport(report);
-        execution = reportExecDAO.save(execution);
-
-        report.add(execution);
-        report = reportDAO.save(report);
-
-        // 2. define a SAX handler for generating result as XML
-        TransformerHandler handler;
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ZipOutputStream zos = new ZipOutputStream(baos);
-        zos.setLevel(Deflater.BEST_COMPRESSION);
-        try {
-            SAXTransformerFactory tFactory = (SAXTransformerFactory) 
SAXTransformerFactory.newInstance();
-            
tFactory.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);
-            handler = tFactory.newTransformerHandler();
-            Transformer serializer = handler.getTransformer();
-            serializer.setOutputProperty(OutputKeys.ENCODING, 
StandardCharsets.UTF_8.name());
-            serializer.setOutputProperty(OutputKeys.INDENT, "yes");
-
-            // a single ZipEntry in the ZipOutputStream
-            zos.putNextEntry(new ZipEntry(report.getName()));
-
-            // streaming SAX handler in a compressed byte array stream
-            handler.setResult(new StreamResult(zos));
-        } catch (Exception e) {
-            throw new JobExecutionException("While configuring for SAX 
generation", e, true);
-        }
-
-        execution.setStatus(ReportExecStatus.RUNNING);
-        execution = reportExecDAO.save(execution);
-
-        // 3. actual report execution
-        StringBuilder reportExecutionMessage = new StringBuilder();
-        try {
-            // report header
-            handler.startDocument();
-            AttributesImpl atts = new AttributesImpl();
-            atts.addAttribute("", "", ReportXMLConst.ATTR_NAME, 
ReportXMLConst.XSD_STRING, report.getName());
-            handler.startElement("", "", ReportXMLConst.ELEMENT_REPORT, atts);
-
-            // iterate over reportlet instances defined for this report
-            for (ReportletConf reportletConf : report.getReportletConfs()) {
-                Class<? extends Reportlet> reportletClass =
-                        
implementationLookup.getReportletClass(reportletConf.getClass());
-                if (reportletClass == null) {
-                    LOG.warn("Could not find matching reportlet for {}", 
reportletConf.getClass());
-                } else {
-                    // fetch (or create) reportlet
-                    Reportlet reportlet;
-                    if 
(ApplicationContextProvider.getBeanFactory().containsSingleton(reportletClass.getName()))
 {
-                        reportlet = (Reportlet) 
ApplicationContextProvider.getBeanFactory().
-                                getSingleton(reportletClass.getName());
-                    } else {
-                        reportlet = (Reportlet) 
ApplicationContextProvider.getBeanFactory().
-                                createBean(reportletClass, 
AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
-                        ApplicationContextProvider.getBeanFactory().
-                                registerSingleton(reportletClass.getName(), 
reportlet);
-                    }
-
-                    // invoke reportlet
-                    try {
-                        reportlet.extract(reportletConf, handler);
-                    } catch (Throwable t) {
-                        LOG.error("While executing reportlet {} for report 
{}", reportlet, reportKey, t);
-
-                        execution.setStatus(ReportExecStatus.FAILURE);
-
-                        Throwable effective = t instanceof ReportException
-                                ? t.getCause()
-                                : t;
-                        reportExecutionMessage.
-                                
append(ExceptionUtils2.getFullStackTrace(effective)).
-                                append("\n==================\n");
-                    }
-                }
-            }
-
-            // report footer
-            handler.endElement("", "", ReportXMLConst.ELEMENT_REPORT);
-            handler.endDocument();
-
-            if 
(!ReportExecStatus.FAILURE.name().equals(execution.getStatus())) {
-                execution.setStatus(ReportExecStatus.SUCCESS);
-            }
-        } catch (Exception e) {
-            execution.setStatus(ReportExecStatus.FAILURE);
-            
reportExecutionMessage.append(ExceptionUtils2.getFullStackTrace(e));
-
-            throw new JobExecutionException(e, true);
-        } finally {
-            try {
-                zos.closeEntry();
-                IOUtils.closeQuietly(zos);
-                IOUtils.closeQuietly(baos);
-            } catch (IOException e) {
-                LOG.error("While closing StreamResult's backend", e);
-            }
-
-            execution.setExecResult(baos.toByteArray());
-            execution.setMessage(reportExecutionMessage.toString());
-            execution.setEnd(new Date());
-            reportExecDAO.save(execution);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/67ecbea3/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportXMLConst.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportXMLConst.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportXMLConst.java
deleted file mode 100644
index 1bbae73..0000000
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportXMLConst.java
+++ /dev/null
@@ -1,44 +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.core.logic.report;
-
-public final class ReportXMLConst {
-
-    public static final String XSD_STRING = "xsd:string";
-
-    public static final String XSD_INT = "xsd:integer";
-
-    public static final String XSD_LONG = "xsd:long";
-
-    public static final String XSD_BOOLEAN = "xsd:boolean";
-
-    public static final String XSD_DATETIME = "xsd:dateTime";
-
-    public static final String ELEMENT_REPORT = "report";
-
-    public static final String ATTR_NAME = "name";
-
-    public static final String ATTR_CLASS = "class";
-
-    public static final String ELEMENT_REPORTLET = "reportlet";
-
-    private ReportXMLConst() {
-        // empty private constructor for static utility class
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/67ecbea3/core/logic/src/main/java/org/apache/syncope/core/logic/report/StaticReportlet.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/StaticReportlet.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/report/StaticReportlet.java
deleted file mode 100644
index 404d086..0000000
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/StaticReportlet.java
+++ /dev/null
@@ -1,128 +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.core.logic.report;
-
-import org.apache.syncope.core.persistence.api.dao.ReportletConfClass;
-import org.apache.syncope.common.lib.report.ReportletConf;
-import org.apache.syncope.common.lib.report.StaticReportletConf;
-import org.apache.syncope.core.provisioning.api.utils.FormatUtils;
-import org.springframework.util.StringUtils;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.AttributesImpl;
-
-@ReportletConfClass(StaticReportletConf.class)
-public class StaticReportlet extends AbstractReportlet {
-
-    private StaticReportletConf conf;
-
-    private void doExtractConf(final ContentHandler handler) throws 
SAXException {
-        AttributesImpl atts = new AttributesImpl();
-        handler.startElement("", "", "configurations", null);
-        handler.startElement("", "", "staticAttributes", atts);
-
-        handler.startElement("", "", "string", atts);
-        handler.characters("string".toCharArray(), 0, "string".length());
-        handler.endElement("", "", "string");
-
-        handler.startElement("", "", "long", atts);
-        handler.characters("long".toCharArray(), 0, "long".length());
-        handler.endElement("", "", "long");
-
-        handler.startElement("", "", "double", atts);
-        handler.characters("double".toCharArray(), 0, "double".length());
-        handler.endElement("", "", "double");
-
-        handler.startElement("", "", "date", atts);
-        handler.characters("date".toCharArray(), 0, "date".length());
-        handler.endElement("", "", "date");
-
-        handler.startElement("", "", "double", atts);
-        handler.characters("double".toCharArray(), 0, "double".length());
-        handler.endElement("", "", "double");
-
-        handler.startElement("", "", "enum", atts);
-        handler.characters("enum".toCharArray(), 0, "enum".length());
-        handler.endElement("", "", "enum");
-
-        handler.startElement("", "", "list", atts);
-        handler.characters("list".toCharArray(), 0, "list".length());
-        handler.endElement("", "", "list");
-
-        handler.endElement("", "", "staticAttributes");
-        handler.endElement("", "", "configurations");
-    }
-
-    @Override
-    protected void doExtract(final ReportletConf conf, final ContentHandler 
handler) throws SAXException {
-        if (conf instanceof StaticReportletConf) {
-            this.conf = StaticReportletConf.class.cast(conf);
-        } else {
-            throw new ReportException(new IllegalArgumentException("Invalid 
configuration provided"));
-        }
-
-        doExtractConf(handler);
-
-        if (StringUtils.hasText(this.conf.getStringField())) {
-            handler.startElement("", "", "string", null);
-            handler.characters(this.conf.getStringField().toCharArray(), 0, 
this.conf.getStringField().length());
-            handler.endElement("", "", "string");
-        }
-
-        if (this.conf.getLongField() != null) {
-            handler.startElement("", "", "long", null);
-            String printed = String.valueOf(this.conf.getLongField());
-            handler.characters(printed.toCharArray(), 0, printed.length());
-            handler.endElement("", "", "long");
-        }
-
-        if (this.conf.getDoubleField() != null) {
-            handler.startElement("", "", "double", null);
-            String printed = String.valueOf(this.conf.getDoubleField());
-            handler.characters(printed.toCharArray(), 0, printed.length());
-            handler.endElement("", "", "double");
-        }
-
-        if (this.conf.getDateField() != null) {
-            handler.startElement("", "", "date", null);
-            String printed = FormatUtils.format(this.conf.getDateField());
-            handler.characters(printed.toCharArray(), 0, printed.length());
-            handler.endElement("", "", "date");
-        }
-
-        if (this.conf.getTraceLevel() != null) {
-            handler.startElement("", "", "enum", null);
-            String printed = this.conf.getTraceLevel().name();
-            handler.characters(printed.toCharArray(), 0, printed.length());
-            handler.endElement("", "", "enum");
-        }
-
-        if (this.conf.getListField() != null && 
!this.conf.getListField().isEmpty()) {
-            handler.startElement("", "", "list", null);
-            for (String item : this.conf.getListField()) {
-                if (StringUtils.hasText(item)) {
-                    handler.startElement("", "", "string", null);
-                    handler.characters(item.toCharArray(), 0, item.length());
-                    handler.endElement("", "", "string");
-                }
-            }
-            handler.endElement("", "", "list");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/67ecbea3/core/logic/src/main/java/org/apache/syncope/core/logic/report/TextSerializer.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/TextSerializer.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/report/TextSerializer.java
deleted file mode 100644
index f1f3a9e..0000000
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/TextSerializer.java
+++ /dev/null
@@ -1,83 +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.core.logic.report;
-
-import org.apache.cocoon.sax.component.XMLSerializer;
-import org.xml.sax.Attributes;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-
-/**
- * Converts XML into plain text. It omits all XML tags and writes only 
character events to the output. Input document
- * must have at least one element - root element - which should wrap all the 
text inside it.
- *
- */
-public class TextSerializer extends XMLSerializer {
-
-    private static final String UTF_8 = "UTF-8";
-
-    private static final String TXT = "text";
-
-    public TextSerializer() {
-        super();
-        super.setOmitXmlDeclaration(true);
-    }
-
-    @Override
-    public void setDocumentLocator(final Locator locator) {
-        // nothing
-    }
-
-    @Override
-    public void processingInstruction(final String target, final String data)
-            throws SAXException {
-        // nothing
-    }
-
-    @Override
-    public void startDTD(final String name, final String publicId, final 
String systemId)
-            throws SAXException {
-        // nothing
-    }
-
-    @Override
-    public void endDTD() throws SAXException {
-        // nothing
-    }
-
-    @Override
-    public void startElement(final String uri, final String loc, final String 
raw, final Attributes atts)
-            throws SAXException {
-        // nothing
-    }
-
-    @Override
-    public void endElement(final String uri, final String name, final String 
raw)
-            throws SAXException {
-        // nothing
-    }
-
-    public static TextSerializer createPlainSerializer() {
-        final TextSerializer serializer = new TextSerializer();
-        serializer.setContentType("text/plain; charset=" + UTF_8);
-        serializer.setEncoding(UTF_8);
-        serializer.setMethod(TXT);
-        return serializer;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/67ecbea3/core/logic/src/main/java/org/apache/syncope/core/logic/report/UserReportlet.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/UserReportlet.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/report/UserReportlet.java
deleted file mode 100644
index bb1048b..0000000
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/UserReportlet.java
+++ /dev/null
@@ -1,383 +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.core.logic.report;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.report.ReportletConf;
-import org.apache.syncope.common.lib.report.UserReportletConf;
-import org.apache.syncope.common.lib.report.UserReportletConf.Feature;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.AttrTO;
-import org.apache.syncope.common.lib.to.MembershipTO;
-import org.apache.syncope.common.lib.to.RelationshipTO;
-import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.core.persistence.api.dao.AnyDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
-import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.persistence.api.search.SearchCondConverter;
-import org.apache.syncope.core.provisioning.api.utils.FormatUtils;
-import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.api.dao.ReportletConfClass;
-import org.apache.syncope.core.persistence.api.entity.user.UMembership;
-import org.apache.syncope.core.persistence.api.entity.user.URelationship;
-import org.apache.syncope.core.provisioning.api.data.AnyObjectDataBinder;
-import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
-import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.AttributesImpl;
-
-@ReportletConfClass(UserReportletConf.class)
-public class UserReportlet extends AbstractReportlet {
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Autowired
-    private AnySearchDAO searchDAO;
-
-    @Autowired
-    private UserDataBinder userDataBinder;
-
-    @Autowired
-    private GroupDataBinder groupDataBinder;
-
-    @Autowired
-    private AnyObjectDataBinder anyObjectDataBinder;
-
-    private UserReportletConf conf;
-
-    private void doExtractResources(final ContentHandler handler, final AnyTO 
anyTO)
-            throws SAXException {
-
-        if (anyTO.getResources().isEmpty()) {
-            LOG.debug("No resources found for {}[{}]", 
anyTO.getClass().getSimpleName(), anyTO.getKey());
-        } else {
-            AttributesImpl atts = new AttributesImpl();
-            handler.startElement("", "", "resources", null);
-
-            for (String resourceName : anyTO.getResources()) {
-                atts.clear();
-
-                atts.addAttribute("", "", ReportXMLConst.ATTR_NAME, 
ReportXMLConst.XSD_STRING, resourceName);
-                handler.startElement("", "", "resource", atts);
-                handler.endElement("", "", "resource");
-            }
-
-            handler.endElement("", "", "resources");
-        }
-    }
-
-    private void doExtractAttributes(final ContentHandler handler, final AnyTO 
anyTO,
-            final Collection<String> attrs, final Collection<String> derAttrs, 
final Collection<String> virAttrs)
-            throws SAXException {
-
-        AttributesImpl atts = new AttributesImpl();
-        if (!attrs.isEmpty()) {
-            Map<String, AttrTO> attrMap = anyTO.getPlainAttrMap();
-
-            handler.startElement("", "", "attributes", null);
-            for (String attrName : attrs) {
-                atts.clear();
-
-                atts.addAttribute("", "", ReportXMLConst.ATTR_NAME, 
ReportXMLConst.XSD_STRING, attrName);
-                handler.startElement("", "", "attribute", atts);
-
-                if (attrMap.containsKey(attrName)) {
-                    for (String value : attrMap.get(attrName).getValues()) {
-                        handler.startElement("", "", "value", null);
-                        handler.characters(value.toCharArray(), 0, 
value.length());
-                        handler.endElement("", "", "value");
-                    }
-                } else {
-                    LOG.debug("{} not found for {}[{}]", attrName,
-                            anyTO.getClass().getSimpleName(), anyTO.getKey());
-                }
-
-                handler.endElement("", "", "attribute");
-            }
-            handler.endElement("", "", "attributes");
-        }
-
-        if (!derAttrs.isEmpty()) {
-            Map<String, AttrTO> derAttrMap = anyTO.getDerAttrMap();
-
-            handler.startElement("", "", "derivedAttributes", null);
-            for (String attrName : derAttrs) {
-                atts.clear();
-
-                atts.addAttribute("", "", ReportXMLConst.ATTR_NAME, 
ReportXMLConst.XSD_STRING, attrName);
-                handler.startElement("", "", "derivedAttribute", atts);
-
-                if (derAttrMap.containsKey(attrName)) {
-                    for (String value : derAttrMap.get(attrName).getValues()) {
-                        handler.startElement("", "", "value", null);
-                        handler.characters(value.toCharArray(), 0, 
value.length());
-                        handler.endElement("", "", "value");
-                    }
-                } else {
-                    LOG.debug("{} not found for {}[{}]", attrName,
-                            anyTO.getClass().getSimpleName(), anyTO.getKey());
-                }
-
-                handler.endElement("", "", "derivedAttribute");
-            }
-            handler.endElement("", "", "derivedAttributes");
-        }
-
-        if (!virAttrs.isEmpty()) {
-            Map<String, AttrTO> virAttrMap = anyTO.getVirAttrMap();
-
-            handler.startElement("", "", "virtualAttributes", null);
-            for (String attrName : virAttrs) {
-                atts.clear();
-
-                atts.addAttribute("", "", ReportXMLConst.ATTR_NAME, 
ReportXMLConst.XSD_STRING, attrName);
-                handler.startElement("", "", "virtualAttribute", atts);
-
-                if (virAttrMap.containsKey(attrName)) {
-                    for (String value : virAttrMap.get(attrName).getValues()) {
-                        handler.startElement("", "", "value", null);
-                        handler.characters(value.toCharArray(), 0, 
value.length());
-                        handler.endElement("", "", "value");
-                    }
-                } else {
-                    LOG.debug("{} not found for {}[{}]", attrName,
-                            anyTO.getClass().getSimpleName(), anyTO.getKey());
-                }
-
-                handler.endElement("", "", "virtualAttribute");
-            }
-            handler.endElement("", "", "virtualAttributes");
-        }
-    }
-
-    private void doExtract(final ContentHandler handler, final List<User> 
users) throws SAXException {
-        AttributesImpl atts = new AttributesImpl();
-        for (User user : users) {
-            atts.clear();
-
-            for (Feature feature : conf.getFeatures()) {
-                String type = null;
-                String value = null;
-                switch (feature) {
-                    case key:
-                        type = ReportXMLConst.XSD_STRING;
-                        value = user.getKey();
-                        break;
-
-                    case username:
-                        type = ReportXMLConst.XSD_STRING;
-                        value = user.getUsername();
-                        break;
-
-                    case workflowId:
-                        type = ReportXMLConst.XSD_STRING;
-                        value = user.getWorkflowId();
-                        break;
-
-                    case status:
-                        type = ReportXMLConst.XSD_STRING;
-                        value = user.getStatus();
-                        break;
-
-                    case creationDate:
-                        type = ReportXMLConst.XSD_DATETIME;
-                        value = user.getCreationDate() == null
-                                ? ""
-                                : FormatUtils.format(user.getCreationDate());
-                        break;
-
-                    case lastLoginDate:
-                        type = ReportXMLConst.XSD_DATETIME;
-                        value = user.getLastLoginDate() == null
-                                ? ""
-                                : FormatUtils.format(user.getLastLoginDate());
-                        break;
-
-                    case changePwdDate:
-                        type = ReportXMLConst.XSD_DATETIME;
-                        value = user.getChangePwdDate() == null
-                                ? ""
-                                : FormatUtils.format(user.getChangePwdDate());
-                        break;
-
-                    case passwordHistorySize:
-                        type = ReportXMLConst.XSD_INT;
-                        value = 
String.valueOf(user.getPasswordHistory().size());
-                        break;
-
-                    case failedLoginCount:
-                        type = ReportXMLConst.XSD_INT;
-                        value = String.valueOf(user.getFailedLogins());
-                        break;
-
-                    default:
-                }
-
-                if (type != null && value != null) {
-                    atts.addAttribute("", "", feature.name(), type, value);
-                }
-            }
-
-            handler.startElement("", "", "user", atts);
-
-            // Using UserTO for attribute values, since the conversion logic of
-            // values to String is already encapsulated there
-            UserTO userTO = userDataBinder.getUserTO(user, true);
-
-            doExtractAttributes(handler, userTO, conf.getPlainAttrs(), 
conf.getDerAttrs(), conf.getVirAttrs());
-
-            if (conf.getFeatures().contains(Feature.relationships)) {
-                handler.startElement("", "", "relationships", null);
-
-                for (RelationshipTO rel : userTO.getRelationships()) {
-                    atts.clear();
-
-                    atts.addAttribute("", "", "anyObjectKey",
-                            ReportXMLConst.XSD_STRING, rel.getRightKey());
-                    handler.startElement("", "", "relationship", atts);
-
-                    if (conf.getFeatures().contains(Feature.resources)) {
-                        for (URelationship actualRel : 
user.getRelationships(rel.getRightKey())) {
-                            doExtractResources(
-                                    handler, 
anyObjectDataBinder.getAnyObjectTO(actualRel.getRightEnd(), true));
-                        }
-                    }
-
-                    handler.endElement("", "", "relationship");
-                }
-
-                handler.endElement("", "", "relationships");
-            }
-            if (conf.getFeatures().contains(Feature.memberships)) {
-                handler.startElement("", "", "memberships", null);
-
-                for (MembershipTO memb : userTO.getMemberships()) {
-                    atts.clear();
-
-                    atts.addAttribute("", "", "groupKey",
-                            ReportXMLConst.XSD_STRING, memb.getRightKey());
-                    atts.addAttribute("", "", "groupName", 
ReportXMLConst.XSD_STRING, memb.getGroupName());
-                    handler.startElement("", "", "membership", atts);
-
-                    if (conf.getFeatures().contains(Feature.resources)) {
-                        UMembership actualMemb = 
user.getMembership(memb.getRightKey());
-                        if (actualMemb == null) {
-                            LOG.warn("Unexpected: cannot find membership for 
group {} for user {}",
-                                    memb.getRightKey(), user);
-                        } else {
-                            doExtractResources(handler, 
groupDataBinder.getGroupTO(actualMemb.getRightEnd(), true));
-                        }
-                    }
-
-                    handler.endElement("", "", "membership");
-                }
-
-                handler.endElement("", "", "memberships");
-            }
-
-            if (conf.getFeatures().contains(Feature.resources)) {
-                doExtractResources(handler, userTO);
-            }
-
-            handler.endElement("", "", "user");
-        }
-    }
-
-    private void doExtractConf(final ContentHandler handler) throws 
SAXException {
-        AttributesImpl atts = new AttributesImpl();
-        handler.startElement("", "", "configurations", null);
-        handler.startElement("", "", "userAttributes", atts);
-
-        for (Feature feature : conf.getFeatures()) {
-            atts.clear();
-            handler.startElement("", "", "feature", atts);
-            handler.characters(feature.name().toCharArray(), 0, 
feature.name().length());
-            handler.endElement("", "", "feature");
-        }
-
-        for (String attr : conf.getPlainAttrs()) {
-            atts.clear();
-            handler.startElement("", "", "attribute", atts);
-            handler.characters(attr.toCharArray(), 0, attr.length());
-            handler.endElement("", "", "attribute");
-        }
-
-        for (String derAttr : conf.getDerAttrs()) {
-            atts.clear();
-            handler.startElement("", "", "derAttribute", atts);
-            handler.characters(derAttr.toCharArray(), 0, derAttr.length());
-            handler.endElement("", "", "derAttribute");
-        }
-
-        for (String virAttr : conf.getVirAttrs()) {
-            atts.clear();
-            handler.startElement("", "", "virAttribute", atts);
-            handler.characters(virAttr.toCharArray(), 0, virAttr.length());
-            handler.endElement("", "", "virAttribute");
-        }
-
-        handler.endElement("", "", "userAttributes");
-        handler.endElement("", "", "configurations");
-    }
-
-    private int count() {
-        return StringUtils.isBlank(conf.getMatchingCond())
-                ? userDAO.count()
-                : searchDAO.count(SyncopeConstants.FULL_ADMIN_REALMS,
-                        SearchCondConverter.convert(conf.getMatchingCond()), 
AnyTypeKind.USER);
-    }
-
-    @Override
-    protected void doExtract(final ReportletConf conf, final ContentHandler 
handler) throws SAXException {
-        if (conf instanceof UserReportletConf) {
-            this.conf = UserReportletConf.class.cast(conf);
-        } else {
-            throw new ReportException(new IllegalArgumentException("Invalid 
configuration provided"));
-        }
-
-        doExtractConf(handler);
-
-        for (int page = 1; page <= (count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; 
page++) {
-            List<User> users;
-            if (StringUtils.isBlank(this.conf.getMatchingCond())) {
-                users = userDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE);
-            } else {
-                users = searchDAO.search(
-                        SyncopeConstants.FULL_ADMIN_REALMS,
-                        
SearchCondConverter.convert(this.conf.getMatchingCond()),
-                        page,
-                        AnyDAO.DEFAULT_PAGE_SIZE,
-                        Collections.<OrderByClause>emptyList(),
-                        AnyTypeKind.USER);
-            }
-
-            doExtract(handler, users);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/67ecbea3/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
deleted file mode 100644
index 3dd6d78..0000000
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
+++ /dev/null
@@ -1,193 +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.core.logic.report;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Pattern;
-import javax.xml.transform.Source;
-import javax.xml.transform.Templates;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import org.apache.cocoon.pipeline.SetupException;
-import org.apache.cocoon.pipeline.caching.CacheKey;
-import org.apache.cocoon.pipeline.component.CachingPipelineComponent;
-import org.apache.cocoon.pipeline.util.StringRepresentation;
-import org.apache.cocoon.sax.AbstractSAXTransformer;
-import org.apache.cocoon.sax.SAXConsumer;
-import org.apache.cocoon.sax.util.SAXConsumerAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class XSLTTransformer extends AbstractSAXTransformer implements 
CachingPipelineComponent {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(XSLTTransformer.class);
-
-    /**
-     * A generic transformer factory to parse XSLTs.
-     */
-    private static final SAXTransformerFactory TRAX_FACTORY = 
createNewSAXTransformerFactory();
-
-    /**
-     * The XSLT parameters name pattern.
-     */
-    private static final Pattern XSLT_PARAMETER_NAME_PATTERN = 
Pattern.compile("[a-zA-Z_][\\w\\-\\.]*");
-
-    /**
-     * The XSLT parameters reference.
-     */
-    private Map<String, Object> parameters;
-
-    /**
-     * The XSLT Template reference.
-     */
-    private Templates templates;
-
-    private Source source;
-
-    public XSLTTransformer(final Source source) {
-        super();
-        this.load(source, null);
-    }
-
-    /**
-     * Creates a new transformer reading the XSLT from the Source source and 
setting the TransformerFactory attributes.
-     *
-     * This constructor is useful when users want to perform XSLT 
transformation using <a
-     * href="http://xml.apache.org/xalan-j/xsltc_usage.html";>xsltc</a>.
-     *
-     * @param source the XSLT source
-     * @param attributes the Transformer Factory attributes
-     */
-    public XSLTTransformer(final Source source, final Map<String, Object> 
attributes) {
-        super();
-        this.load(source, attributes);
-    }
-
-    /**
-     * Method useful to create a new transformer reading the XSLT from the URL 
source and setting the Transformer
-     * Factory attributes.
-     *
-     * This method is useful when users want to perform XSLT transformation 
using <a
-     * href="http://xml.apache.org/xalan-j/xsltc_usage.html";>xsltc</a>.
-     *
-     * @param source the XSLT source
-     * @param attributes the Transformer Factory attributes
-     */
-    private void load(final Source source, final Map<String, Object> 
attributes) {
-        if (source == null) {
-            throw new IllegalArgumentException("The parameter 'source' mustn't 
be null.");
-        }
-
-        this.source = source;
-
-        this.load(this.source, this.source.toString(), attributes);
-    }
-
-    private void load(final Source source, final String localCacheKey, final 
Map<String, Object> attributes) {
-        LOG.debug("{} local cache miss: {}", getClass().getSimpleName(), 
localCacheKey);
-
-        // XSLT has to be parsed
-        final SAXTransformerFactory transformerFactory;
-        if (attributes == null || attributes.isEmpty()) {
-            transformerFactory = TRAX_FACTORY;
-        } else {
-            transformerFactory = createNewSAXTransformerFactory();
-            for (Map.Entry<String, Object> attribute : attributes.entrySet()) {
-                transformerFactory.setAttribute(attribute.getKey(), 
attribute.getValue());
-            }
-        }
-
-        try {
-            this.templates = transformerFactory.newTemplates(source);
-        } catch (TransformerConfigurationException e) {
-            throw new SetupException("Impossible to read XSLT from '" + source 
+ "', see nested exception", e);
-        }
-    }
-
-    /**
-     * Sets the XSLT parameters to be applied to XSLT stylesheet.
-     *
-     * @param parameters the XSLT parameters to be applied to XSLT stylesheet
-     */
-    public void setParameters(final Map<String, ? extends Object> parameters) {
-        if (parameters == null) {
-            this.parameters = null;
-        } else {
-            this.parameters = new HashMap<String, Object>(parameters);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected void setSAXConsumer(final SAXConsumer consumer) {
-        TransformerHandler transformerHandler;
-        try {
-            transformerHandler = 
TRAX_FACTORY.newTransformerHandler(this.templates);
-        } catch (Exception e) {
-            throw new SetupException("Could not initialize transformer 
handler.", e);
-        }
-
-        if (this.parameters != null) {
-            final Transformer transformer = 
transformerHandler.getTransformer();
-
-            for (Map.Entry<String, Object> entry : this.parameters.entrySet()) 
{
-                final String name = entry.getKey();
-
-                // is valid XSLT parameter name
-                if (XSLT_PARAMETER_NAME_PATTERN.matcher(name).matches()) {
-                    transformer.setParameter(name, entry.getValue());
-                }
-            }
-        }
-
-        final SAXResult result = new SAXResult();
-        result.setHandler(consumer);
-        // According to TrAX specs, all TransformerHandlers are LexicalHandlers
-        result.setLexicalHandler(consumer);
-        transformerHandler.setResult(result);
-
-        final SAXConsumerAdapter saxConsumerAdapter = new SAXConsumerAdapter();
-        saxConsumerAdapter.setContentHandler(transformerHandler);
-        super.setSAXConsumer(saxConsumerAdapter);
-    }
-
-    @Override
-    public CacheKey constructCacheKey() {
-        return null;
-    }
-
-    /**
-     * Utility method to create a new transformer factory.
-     *
-     * @return a new transformer factory
-     */
-    private static SAXTransformerFactory createNewSAXTransformerFactory() {
-        return (SAXTransformerFactory) TransformerFactory.newInstance();
-    }
-
-    @Override
-    public String toString() {
-        return StringRepresentation.buildString(this, "src=<" + this.source + 
">");
-    }
-}

Reply via email to