SnapshotRepositoryImpl.java

package com.tradecloud.repository.impl;

import com.tradecloud.authentication.MultiTenantUtil;
import com.tradecloud.authentication.User;
import com.tradecloud.domain.model.accounting.Snapshot;
import com.tradecloud.domain.model.events.AccountingEvent;
import com.tradecloud.repository.SnapshotRepository;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.log4j.Logger;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.springframework.stereotype.Repository;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * Accounting Repository.
 */
@Repository(value = "snapshotRepository")
public class SnapshotRepositoryImpl extends RepositoryBaseImpl<Snapshot, Object> implements SnapshotRepository {

    Logger logger = Logger.getLogger(SnapshotRepositoryImpl.class);

    // private final static String QUERY_FIND_BY_REFERENCE_CONSUMER_AND_TYPE =
    // "from snapshot as ss where ss.reference = :reference and ss.consumerTag = :consumerTag " +
    // "and ss.snapshotType = :snapshotType order by ss.timeStamp asc";

    @Override
    public void storeSnapshot(Snapshot snapshot) {
        saveOrUpdate(snapshot);
    }

    @Override
    public Snapshot getSnapshot(String reference, Snapshot.SnapshotType snapshotType) {
        User user = (User) MultiTenantUtil.getActiveUser();

        @SuppressWarnings("unchecked")
        List<Snapshot> results =
                (List<Snapshot>) getNamedQueryAndNamedParam("findSnapshots",
                        new String[]{"reference", "consumerTag", "snapshotType"},
                        Arrays.asList(reference, user.getUsername(), snapshotType).toArray());

        return results.isEmpty() ? null : results.iterator().next();
    }

    @Override
    public Snapshot getSnapshotByRef(String reference, Snapshot.SnapshotType snapshotType) {
        User user =  MultiTenantUtil.getActiveUser();

        @SuppressWarnings("unchecked")
        List<Snapshot> results =
                (List<Snapshot>) getNamedQueryAndNamedParam("findSnapshotsByReference",
                        new String[]{"reference", "consumerTag", "snapshotType"},
                        Arrays.asList(reference, user.getUsername(), snapshotType).toArray());

        return results.isEmpty() ? null : results.iterator().next();
    }

    @Override
    public Snapshot getSnapshot(String reference, Snapshot.SnapshotType snapshotType, User interestedUser) {
        @SuppressWarnings("unchecked")
        List<Snapshot> results =
                (List<Snapshot>) getNamedQueryAndNamedParam("findSnapshots",
                        new String[]{"reference", "consumerTag", "snapshotType"},
                        Arrays.asList(reference, interestedUser.getUsername(), snapshotType).stream().toArray());

        return results.isEmpty() ? null : results.iterator().next();
    }

    @Override
    public Snapshot getSnapshot(String reference, String shipmentNumber, Snapshot.SnapshotType snapshotType) {
        User user = MultiTenantUtil.getActiveUser();
        @SuppressWarnings("unchecked")
        List<Snapshot> results =
                (List<Snapshot>) getNamedQueryAndNamedParam("findSnapshotsByShipment",
                        new String[]{"reference", "consumerTag", "snapshotType", "shipmentNumber"},
                        Arrays.asList(reference, user.getUsername(), snapshotType, shipmentNumber).toArray());

        return results.isEmpty() ? null : results.iterator().next();
    }

    @Override
    public void removeSnapshot(String reference, Snapshot.SnapshotType snapshotType) {
        Snapshot snapshot = getSnapshot(reference, snapshotType);
        if (snapshot != null) {
            delete(snapshot);
        } else {
            logger.info("No Snapshot (" + snapshotType.name() + ") found to delete: " + reference);
        }
    }

    @Override
    public Snapshot getSnapshotEventId(Long id) {
        String queryStr = "select s from  Snapshot s where s.acknowledgeEventId=" + id + " order by timeStamp asc";
        Query query = getCurrentSession().createQuery(queryStr);
        List list = query.list();
        return CollectionUtils.isNotEmpty(list) ? (Snapshot) list.get(0) : null;
    }

    @Override
    public boolean snapshotExists(String md5Sum, AccountingEvent.AccountingEventType eventType) {
        String sqlString = null;
        if (eventType != null)
            sqlString = "select count(*) from snapshot s left join event e on s.eventid = e.id " +
                    "where s.md5Sum = :md5Sum and e.eventtype = :eventType and acknowledgeeventid is null";
        else
            sqlString = "select count(*) from snapshot s where s.md5Sum = :md5Sum and acknowledgeeventid is null";
        NativeQuery nativeQuery = getCurrentSession().createNativeQuery(sqlString);
        if (eventType != null)
            nativeQuery.setParameter("md5Sum", md5Sum);
        nativeQuery.setParameter("eventType", eventType.name());
        BigInteger count = (BigInteger) nativeQuery.uniqueResult();
        if (count != null && count.intValue() > 0)
            return true;
        return false;
    }

    @Override
    public List<Snapshot> searchByDateRange(Date from, Date to) {
        String queryStr = "select s from  Snapshot s where s.timeStamp>=:from and s.timeStamp<:to order by timeStamp asc";
        Query<Snapshot> query = getCurrentSession().createQuery(queryStr, Snapshot.class);
        query.setParameter("from", from);
        query.setParameter("to", to);
        return query.list();
    }
}