Search in sources :

Example 11 with AuditTrail

use of ubic.gemma.model.common.auditAndSecurity.AuditTrail in project Gemma by PavlidisLab.

the class AuditEventDaoImpl method getLastEvent.

private Map<Auditable, AuditEvent> getLastEvent(final Collection<? extends Auditable> auditables, Class<? extends AuditEventType> type) {
    Map<Auditable, AuditEvent> result = new HashMap<>();
    if (auditables.size() == 0)
        return result;
    final Map<AuditTrail, Auditable> atMap = this.getAuditTrailMap(auditables);
    List<String> classes = this.getClassHierarchy(type);
    // language=HQL
    final String queryString = "select trail, ae from AuditTrailImpl trail " + "inner join trail.events ae inner join ae.eventType et inner join fetch ae.performer where trail in (:trails) " + "and et.class in (:classes) order by ae.date desc, ae.id desc ";
    StopWatch timer = new StopWatch();
    timer.start();
    Collection<AuditTrail> batch = new ArrayList<>();
    int batchSize = 100;
    for (AuditTrail at : atMap.keySet()) {
        batch.add(at);
        if (batch.size() == batchSize) {
            org.hibernate.Query queryObject = this.getSessionFactory().getCurrentSession().createQuery(queryString);
            queryObject.setParameterList("trails", batch);
            queryObject.setParameterList("classes", classes);
            queryObject.setReadOnly(true);
            List<?> qr = queryObject.list();
            if (qr == null || qr.isEmpty()) {
                batch.clear();
                continue;
            }
            this.putAllQrs(result, qr, atMap);
            batch.clear();
        }
    }
    if (!batch.isEmpty()) {
        org.hibernate.Query queryObject = this.getSessionFactory().getCurrentSession().createQuery(queryString);
        // if too many will fail.
        queryObject.setParameterList("trails", batch);
        queryObject.setParameterList("classes", classes);
        queryObject.setReadOnly(true);
        List<?> qr = queryObject.list();
        if (qr == null || qr.isEmpty())
            return result;
        this.putAllQrs(result, qr, atMap);
    }
    timer.stop();
    if (timer.getTime() > 500) {
        AbstractDao.log.info("Last event of type " + type.getSimpleName() + " retrieved for " + auditables.size() + " items in " + timer.getTime() + "ms");
    }
    return result;
}
Also used : Auditable(ubic.gemma.model.common.Auditable) StopWatch(org.apache.commons.lang3.time.StopWatch) Query(org.hibernate.Query) AuditEvent(ubic.gemma.model.common.auditAndSecurity.AuditEvent) AuditTrail(ubic.gemma.model.common.auditAndSecurity.AuditTrail)

Example 12 with AuditTrail

use of ubic.gemma.model.common.auditAndSecurity.AuditTrail in project Gemma by PavlidisLab.

the class AuditEventDaoImpl method getLastEvents.

@Override
public Map<Class<? extends AuditEventType>, Map<Auditable, AuditEvent>> getLastEvents(Collection<? extends Auditable> auditables, Collection<Class<? extends AuditEventType>> types) {
    StopWatch timer = new StopWatch();
    timer.start();
    Map<Class<? extends AuditEventType>, Map<Auditable, AuditEvent>> results = new HashMap<>();
    if (auditables.size() == 0)
        return results;
    for (Class<? extends AuditEventType> t : types) {
        results.put(t, new HashMap<Auditable, AuditEvent>());
    }
    final Map<AuditTrail, Auditable> atMap = this.getAuditTrailMap(auditables);
    List<String> classes = this.getClassHierarchy(types);
    // language=HQL
    final String queryString = "select et, trail, event from AuditTrailImpl trail " + "inner join trail.events event inner join event.eventType et inner join fetch event.performer where trail in (:trails) " + "and et.class in (:classes) order by event.date desc, event.id desc ";
    Query queryObject = this.getSessionFactory().getCurrentSession().createQuery(queryString);
    queryObject.setParameterList("trails", atMap.keySet());
    queryObject.setParameterList("classes", classes);
    List<?> qr = queryObject.list();
    for (Object o : qr) {
        Object[] ar = (Object[]) o;
        AuditEventType ty = (AuditEventType) ar[0];
        AuditTrail t = (AuditTrail) ar[1];
        AuditEvent e = (AuditEvent) ar[2];
        /*
             * This is a bit inefficient. Loop needed because returned type is Impl (and probably a proxy). But probably
             * query is the bottleneck.
             */
        for (Class<? extends AuditEventType> ti : types) {
            if (ti.isAssignableFrom(ty.getClass())) {
                Map<Auditable, AuditEvent> innerMap = results.get(ti);
                assert innerMap != null;
                // only replace event if its date is more recent.
                Auditable ae = atMap.get(t);
                if (!innerMap.containsKey(ae) || innerMap.get(ae).getDate().compareTo(e.getDate()) < 0) {
                    innerMap.put(atMap.get(t), e);
                }
                break;
            }
        }
    }
    timer.stop();
    if (timer.getTime() > 1000) {
        AbstractDao.log.info("Last events retrieved for  " + types.size() + " different types for " + auditables.size() + " items in " + timer.getTime() + "ms");
    }
    return results;
}
Also used : Auditable(ubic.gemma.model.common.Auditable) AuditEventType(ubic.gemma.model.common.auditAndSecurity.eventType.AuditEventType) Query(org.hibernate.Query) StopWatch(org.apache.commons.lang3.time.StopWatch) AuditEvent(ubic.gemma.model.common.auditAndSecurity.AuditEvent) AuditEventValueObject(ubic.gemma.model.common.auditAndSecurity.AuditEventValueObject) AuditTrail(ubic.gemma.model.common.auditAndSecurity.AuditTrail)

Aggregations

AuditTrail (ubic.gemma.model.common.auditAndSecurity.AuditTrail)12 AuditEvent (ubic.gemma.model.common.auditAndSecurity.AuditEvent)5 StopWatch (org.apache.commons.lang3.time.StopWatch)3 Auditable (ubic.gemma.model.common.Auditable)3 AuditEventValueObject (ubic.gemma.model.common.auditAndSecurity.AuditEventValueObject)3 Query (org.hibernate.Query)2 AuditEventType (ubic.gemma.model.common.auditAndSecurity.eventType.AuditEventType)2 PropertyDescriptor (java.beans.PropertyDescriptor)1 Field (java.lang.reflect.Field)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 Collection (java.util.Collection)1 JoinPoint (org.aspectj.lang.JoinPoint)1 LazyInitializationException (org.hibernate.LazyInitializationException)1 CascadeStyle (org.hibernate.engine.CascadeStyle)1 EntityPersister (org.hibernate.persister.entity.EntityPersister)1 HibernateProxy (org.hibernate.proxy.HibernateProxy)1 Before (org.junit.Before)1 Test (org.junit.Test)1 HibernateTemplate (org.springframework.orm.hibernate3.HibernateTemplate)1 UsernameNotFoundException (org.springframework.security.core.userdetails.UsernameNotFoundException)1