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();
}
}