/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.hooks.data;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;
public class EventResultSetExtractor implements
ResultSetExtractor<List<Grouping>> {
@Override
public List<Grouping> extractData(final ResultSet rs) throws SQLException,
DataAccessException {
final List<Grouping> groupings = new ArrayList<>();
final Map<String, Map<String, List<String>>> groupToEntityMapping = new HashMap<>();
Map<String, List<String>> entityToActionMapping = new HashMap<>();
while (rs.next()) {
final String groupingName = rs.getString("grouping");
final String entityName = rs.getString("entity_name");
final String actionName = rs.getString("action_name");
Map<String, List<String>> entities = groupToEntityMapping
.get(groupingName);
List<String> actions = entityToActionMapping.get(entityName);
if (entities == null) {
entityToActionMapping = new HashMap<>();
}
if (actions == null) {
actions = new ArrayList<>();
}
actions.add(actionName);
entityToActionMapping.put(entityName, actions);
if (entities == null) {
entities = new HashMap<>();
}
entities.putAll(entityToActionMapping);
groupToEntityMapping.put(groupingName, entities);
}
for (final Entry<String, Map<String, List<String>>> groupingEntry : groupToEntityMapping
.entrySet()) {
final List<Entity> entities = new ArrayList<>();
final Grouping group = new Grouping();
group.setName(groupingEntry.getKey());
for (final Entry<String, List<String>> entityEntry : groupingEntry
.getValue().entrySet()) {
final List<String> actions = new ArrayList<>();
final Entity entity = new Entity();
entity.setName(entityEntry.getKey());
for (final String action : entityEntry.getValue()) {
actions.add(action);
}
Collections.sort(actions);
entity.setActions(actions);
entities.add(entity);
}
Collections.sort(entities, new Comparator<Entity>() {
@Override
public int compare(final Entity entity1, final Entity entity2) {
return entity1.getName().compareTo(entity2.getName());
}
});
group.setEntities(entities);
groupings.add(group);
}
Collections.sort(groupings, new Comparator<Grouping>() {
@Override
public int compare(final Grouping grouping1,
final Grouping grouping2) {
return grouping1.getName().compareTo(grouping2.getName());
}
});
return groupings;
}
}