com.sdm.core.hibernate.dao.AuditDAO.java Source code

Java tutorial

Introduction

Here is the source code for com.sdm.core.hibernate.dao.AuditDAO.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sdm.core.hibernate.dao;

import com.sdm.core.Globalizer;
import com.sdm.core.hibernate.HibernateConnector;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.Session;
import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
import org.hibernate.envers.query.AuditEntity;
import org.hibernate.envers.query.AuditQuery;

/**
 *
 * @author htoonlin
 */
public class AuditDAO {

    private final AuditReader reader;

    public AuditDAO(AuditReader reader) {
        this.reader = reader;
    }

    public AuditDAO() {
        this(HibernateConnector.getFactory().openSession());
    }

    public AuditDAO(Session session) {
        this(AuditReaderFactory.get(session));
    }

    private HashMap<String, Object> convertMap(Object[] data) {
        HashMap<String, Object> response = new HashMap<>();
        for (Object value : data) {
            String key = Globalizer.camelToLowerUnderScore(value.getClass().getSimpleName());
            response.put(key.replaceAll("_entity.*", ""), value);
        }
        return response;
    }

    private AuditQuery getQueryById(Class entityClass, Object id) {
        return reader.createQuery().forRevisionsOfEntity(entityClass, false, true)
                .addOrder(AuditEntity.revisionNumber().desc()).add(AuditEntity.id().eq(id));
    }

    public List<?> getNewDataByVersion(Class entityClass, long version) {
        AuditQuery query = reader.createQuery().forRevisionsOfEntity(entityClass, false, true)
                .add(AuditEntity.revisionNumber().gt(version))
                .add(AuditEntity.revisionNumber().maximize().computeAggregationInInstanceContext())
                .addOrder(AuditEntity.revisionNumber().desc());

        List data = query.getResultList();

        List<Map<String, Object>> responseList = new ArrayList<>();
        for (Object result : data) {
            responseList.add(this.convertMap((Object[]) result));
        }

        return responseList;

    }

    public HashMap<String, Object> getDataByVersion(Class entityClass, Object id, long version) {
        Object data = this.getQueryById(entityClass, id).add(AuditEntity.revisionNumber().eq(version))
                .getSingleResult();

        return this.convertMap(((Object[]) data));
    }

    public long getTotal(Class entityClass, Object id) {
        Object data = this.getQueryById(entityClass, id).addProjection(AuditEntity.revisionNumber().count())
                .getSingleResult();
        return (long) data;
    }

    public List<?> getVersions(Class entityClass, Object id, int pageId, int pageSize) {
        // Calculate Start Index
        if (pageId <= 0) {
            pageId = 1;
        }
        int start = pageSize * (pageId - 1);

        List data = this.getQueryById(entityClass, id).setFirstResult(start).setMaxResults(pageSize)
                .getResultList();

        List<Map<String, Object>> responseList = new ArrayList<>();
        for (Object result : data) {
            responseList.add(this.convertMap((Object[]) result));
        }

        return responseList;
    }
}