Example usage for org.hibernate.envers AuditReader createQuery

List of usage examples for org.hibernate.envers AuditReader createQuery

Introduction

In this page you can find the example usage for org.hibernate.envers AuditReader createQuery.

Prototype

AuditQueryCreator createQuery();

Source Link

Document

Creates an audit query

Usage

From source file:com.actelion.research.spiritcore.services.dao.DAORevision.java

License:Open Source License

private static List<Object[]> queryForRevisions(AuditReader reader, Set<Class<?>> entityClasses, int minRev,
        int maxRev, String userFilter, int sid, String studyIdFilter) {
    List<Object[]> res = new ArrayList<>();
    LoggerFactory.getLogger(DAORevision.class).debug("queryForRevisions " + entityClasses + " " + userFilter
            + " " + sid + " " + studyIdFilter + " " + minRev + " " + maxRev);
    //Find the study Id from the studyId (the study may have been deleted)
    if (sid <= 0 && studyIdFilter != null && studyIdFilter.length() > 0) {
        AuditQuery query = reader.createQuery().forRevisionsOfEntity(Study.class, false, true)
                .add(AuditEntity.revisionType().eq(RevisionType.ADD))
                .add(AuditEntity.property("studyId").eq(studyIdFilter));
        List<Object[]> array = query.getResultList();
        for (Object[] a : array) {
            Study entity = (Study) a[0];
            sid = entity.getId();/*  w  ww. jav a  2s.c om*/
            break;
        }
        if (sid <= 0)
            return res;
    }

    for (Class<?> claz : entityClasses) {
        AuditQuery query = reader.createQuery().forRevisionsOfEntity(claz, false, true)
                .add(AuditEntity.revisionNumber().between(minRev, maxRev));
        if (userFilter != null && userFilter.length() > 0 && (claz == Result.class || claz == Biosample.class
                || claz == Study.class || claz == Location.class)) {
            query = query.add(AuditEntity.property("updUser").eq(userFilter));
        }
        if (sid > 0) {
            //If a studyId filter is given, query the properyId directly
            if (claz == Study.class) {
                query = query.add(AuditEntity.property("id").eq(sid));
            } else if (claz == Biosample.class) {
                query = query.add(AuditEntity.property("inheritedStudy").eq(new Study(sid)));
            } else if (claz == Result.class) {
                query = query.add(AuditEntity.property("study").eq(new Study(sid)));
            } else {
                continue;
            }
        }
        res.addAll(query.getResultList());
    }
    return res;
}

From source file:com.actelion.research.spiritcore.services.dao.DAORevision.java

License:Open Source License

/**
 * Gets the last version and the change for the given entity, in the given context.
 * This method should return the last change, even if the changes of the given entity have not been committed.
 *
 * This method should be used exclusively from the SpritRevisionEntityListener to record the differences between the object to be saved and the last revision.
 * (when the record to be saved in already in the audit table)
 *
 * @param entityClass//from ww w  .  j  a v  a 2 s . c o m
 * @param entityId
 * @return
 */
@SuppressWarnings("unchecked")
public static <T extends IAuditable> Pair<IAuditable, DifferenceList> getLastChange(RevisionType revisionType,
        Class<T> entityClass, Serializable entityId) {
    //Query the 2 last revisions of entityClass:entityId
    EntityManager session = JPAUtil.getManager();
    AuditReader reader = AuditReaderFactory.get(session);
    AuditQuery query = reader.createQuery().forRevisionsOfEntity(entityClass, false, true)
            .add(AuditEntity.id().eq(entityId)).addOrder(AuditEntity.revisionNumber().desc()).setMaxResults(2)
            .setCacheable(false).setLockMode(LockMode.NONE);
    List<Object[]> histories = query.getResultList();

    //Compute the difference between those 2 last versions
    assert histories.size() > 0;

    DifferenceList diff = null;
    if (revisionType == RevisionType.DEL) {
        diff = ((T) histories.get(0)[0]).getDifferenceList(null);
        diff.add("", ChangeType.DEL);
        assert diff.size() == 1;
    } else if (revisionType == RevisionType.ADD) {
        diff = ((T) histories.get(0)[0]).getDifferenceList(null);
        diff.add("", ChangeType.ADD);
        assert diff.size() == 1;
    } else if (histories.size() >= 2) {
        diff = ((T) histories.get(0)[0]).getDifferenceList((T) histories.get(1)[0]);
    } else {
        return null;
    }
    return new Pair<IAuditable, DifferenceList>((T) histories.get(0)[0], diff);
}

From source file:com.actelion.research.spiritcore.services.dao.DAORevision.java

License:Open Source License

/**
 * Returns the lastChange from the given entity.
 * This method should be called outside the SpritRevisionEntityListener (when the record is not yet in the audit table)
 *
 * @param auditable//from w ww. j  av  a  2 s. c  o m
 * @return
 */
@SuppressWarnings("unchecked")
public static <T extends IAuditable> Pair<T, DifferenceList> getLastChange(IAuditable auditable) {
    //Query the 2 last revisions of entityClass:entityId
    EntityManager session = JPAUtil.getManager();
    AuditReader reader = AuditReaderFactory.get(session);
    AuditQuery query = reader.createQuery().forRevisionsOfEntity(auditable.getClass(), true, true)
            .add(AuditEntity.id().eq(auditable.getSerializableId()))
            .addOrder(AuditEntity.revisionNumber().desc()).setMaxResults(1).setCacheable(false)
            .setLockMode(LockMode.NONE);
    List<IAuditable> histories = query.getResultList();

    //Compute the difference between those 2 last versions
    if (histories.size() == 0) {
        return new Pair<T, DifferenceList>(null, new DifferenceList());
    } else {
        return new Pair<T, DifferenceList>((T) histories.get(0), auditable.getDifferenceList(histories.get(0)));
    }
}

From source file:com.confighub.core.store.Store.java

License:Open Source License

/**
 * @param user/*from  w  w  w .  ja v a 2 s .co  m*/
 * @param repository
 * @param searchTerm
 * @return Map<PropertyKey                                                               ,                                                                                                                               Collection                                                               <                                                               Property>> of keys and values that contain the searchTerm
 * @throws ConfigException
 */
public Map<PropertyKey, Collection<Property>> searchKeysAndValues(final UserAccount user,
        final Repository repository, final Date dateObj, final String searchTerm) throws ConfigException {
    if (Utils.anyNull(repository)) {
        throw new ConfigException(Error.Code.MISSING_PARAMS);
    }

    if (!repository.hasReadAccess(user)) {
        throw new ConfigException(Error.Code.USER_ACCESS_DENIED);
    }

    List<PropertyKey> keys = null;
    List<Property> props = null;

    if (null == dateObj) {
        try {
            keys = em.createNamedQuery("Search.keysAndComments").setLockMode(LockModeType.NONE)
                    .setParameter("repository", repository)
                    .setParameter("searchTerm", "%" + searchTerm.toUpperCase() + "%").getResultList();
        } catch (NoResultException ignore) {
        } catch (Exception e) {
            handleException(e);
        }

        try {
            props = em.createNamedQuery("Search.values").setLockMode(LockModeType.NONE)
                    .setParameter("repository", repository)
                    .setParameter("searchTerm", "%" + searchTerm.toUpperCase() + "%").getResultList();
        } catch (NoResultException ignore) {
        } catch (Exception e) {
            handleException(e);
        }
    } else {
        AuditReader reader = AuditReaderFactory.get(em);
        Number rev = reader.getRevisionNumberForDate(dateObj);

        AuditQuery query = reader.createQuery().forEntitiesAtRevision(PropertyKey.class, rev);
        query.add(AuditEntity.property("repository").eq(repository));
        query.add(AuditEntity.or(AuditEntity.property("key").ilike("%" + searchTerm + "%"),
                AuditEntity.property("readme").ilike("%" + searchTerm + "%")));

        keys = query.getResultList();

        query = reader.createQuery().forEntitiesAtRevision(Property.class, rev);
        query.add(AuditEntity.property("repository").eq(repository));
        query.add(AuditEntity.property("value").ilike("%" + searchTerm + "%"));

        props = query.getResultList();
    }

    Map<PropertyKey, Collection<Property>> keyListMap = new HashMap<>();
    if (null != keys) {
        keys.forEach(k -> keyListMap.put(k, null));
    }

    if (null != props) {
        props.forEach(p -> {
            PropertyKey key = p.getPropertyKey();
            if (keyListMap.containsKey(key)) {
                Collection<Property> ps = keyListMap.get(key);
                if (null == ps) {
                    ps = new ArrayList<>();
                    keyListMap.put(key, ps);
                }
                ps.add(p);
            } else {
                ArrayList<Property> ps = new ArrayList<>();
                ps.add(p);
                keyListMap.put(key, ps);
            }
        });
    }
    return keyListMap;
}

From source file:com.confighub.core.store.Store.java

License:Open Source License

/**
 * @param repositoryId/* w w  w . j  a va 2  s  . com*/
 * @param date
 * @return
 * @throws ConfigException
 */
public Repository getRepository(final Long repositoryId, final Date date) throws ConfigException {
    if (Utils.anyNull(repositoryId)) {
        throw new ConfigException(Error.Code.MISSING_PARAMS);
    }

    if (null == date) {
        return get(Repository.class, repositoryId);
    }

    AuditReader reader = AuditReaderFactory.get(em);
    Number rev = reader.getRevisionNumberForDate(date);

    AuditQuery query = reader.createQuery().forEntitiesAtRevision(Repository.class, rev);
    query.add(AuditEntity.id().eq(repositoryId));

    try {
        return (Repository) query.getSingleResult();
    } catch (NoResultException e) {
        return null;
    } catch (Exception e) {
        handleException(e);
        return null;
    }
}

From source file:com.confighub.core.store.Store.java

License:Open Source License

/**
 * Get levels at a specific point in time.
 *
 * @param repository To which levels are assigned
 * @param time       At the time levels were current
 * @return Collection of Levels from that time
 * @throws ConfigException Is thrown if there were problems fetching records
 *///from   ww w .j ava2 s .  co m
public Collection<CtxLevel> getLevels(final Repository repository, final Date time) throws ConfigException {
    AuditReader reader = AuditReaderFactory.get(em);
    Number rev = reader.getRevisionNumberForDate(time);

    AuditQuery query = reader.createQuery().forEntitiesAtRevision(CtxLevel.class, rev);
    query.add(AuditEntity.property("repository").eq(repository));

    return query.getResultList();
}

From source file:com.confighub.core.store.Store.java

License:Open Source License

public CtxLevel getLevel(final String levelName, final Depth depth, final Repository repository,
        final Date time) throws ConfigException {
    if (Utils.anyNull(levelName, repository)) {
        return null;
    }//ww w.j a  v  a 2 s .c  o  m

    if (null == time) {
        try {
            String levelUpper = levelName.toUpperCase();

            return (CtxLevel) em.createNamedQuery("Level.getByName").setLockMode(LockModeType.NONE)
                    .setParameter("repository", repository).setParameter("name", levelUpper)
                    .setParameter("depth", depth).getSingleResult();
        } catch (NoResultException e) {
            return null;
        } catch (Exception e) {
            handleException(e);
        }

        return null;
    }

    AuditReader reader = AuditReaderFactory.get(em);
    Number rev = reader.getRevisionNumberForDate(time);

    // ToDo will not return deleted level
    AuditQuery query = reader.createQuery().forEntitiesAtRevision(CtxLevel.class, rev);
    query.add(AuditEntity.property("repository").eq(repository));
    query.add(AuditEntity.property("name").eq(levelName));
    query.add(AuditEntity.property("depth").eq(depth));

    try {
        return (CtxLevel) query.getSingleResult();
    } catch (NoResultException e) {
        return null;
    } catch (Exception e) {
        handleException(e);
        return null;
    }
}

From source file:com.confighub.core.store.Store.java

License:Open Source License

/**
 * Get properties at a specific point in time.
 *
 * @param repository To which levels are assigned
 * @param date       At the time levels were current
 * @return Collection of Levels from that time
 * @throws ConfigException Is thrown if there were problems fetching records
 *///ww w  .  j a  va  2  s .  co  m
public Collection<Property> getProperties(final Repository repository, final Date date) throws ConfigException {
    AuditReader reader = AuditReaderFactory.get(em);
    Number rev = reader.getRevisionNumberForDate(date);

    AuditQuery query = reader.createQuery().forEntitiesAtRevision(Property.class, rev);
    query.add(AuditEntity.property("repository").eq(repository));

    return query.getResultList();
}

From source file:com.confighub.core.store.Store.java

License:Open Source License

public Pair<PropertyKey, Collection<Property>> getPropertiesForKey(final Repository repository, final Date date,
        String key) throws ConfigException {
    AuditReader reader = AuditReaderFactory.get(em);
    Number rev = reader.getRevisionNumberForDate(null == date ? new Date() : date);

    AuditQuery kq = reader.createQuery().forEntitiesAtRevision(PropertyKey.class, rev);
    kq.add(AuditEntity.property("repository").eq(repository));
    kq.add(AuditEntity.property("key").eq(key));

    PropertyKey propertyKey;//from   www . j  a  v  a  2 s  .  c o m
    try {
        propertyKey = (PropertyKey) kq.getSingleResult();
    } catch (NoResultException e) {
        return null;
    }

    AuditQuery query = reader.createQuery().forEntitiesAtRevision(Property.class, rev);
    query.add(AuditEntity.property("repository").eq(repository));
    query.add(AuditEntity.relatedId("propertyKey").eq(propertyKey.getId()));

    Collection<Property> properties = query.getResultList();
    propertyKey.propertyCount = properties.size();

    return new Pair(propertyKey, properties);
}

From source file:com.confighub.core.store.Store.java

License:Open Source License

/**
 * Returns the key from a specific date/*from   w  w  w. j av a  2s.  c  om*/
 *
 * @param repository
 * @param key
 * @param date
 * @return
 */
public PropertyKey getKey(final Repository repository, final String key, final Date date) {
    if (null == repository || Utils.isBlank(key)) {
        return null;
    }

    try {
        if (null == date) {
            return (PropertyKey) em.createNamedQuery("Key.getByKey").setLockMode(LockModeType.NONE)
                    .setParameter("key", key.toUpperCase()).setParameter("repository", repository)
                    .getSingleResult();
        }

        AuditReader reader = AuditReaderFactory.get(em);
        Number rev = reader.getRevisionNumberForDate(null == date ? new Date() : date);

        AuditQuery kq = reader.createQuery().forEntitiesAtRevision(PropertyKey.class, rev);
        kq.add(AuditEntity.property("repository").eq(repository));
        kq.add(AuditEntity.property("key").eq(key));

        return (PropertyKey) kq.getSingleResult();
    } catch (NoResultException e) {
        return null;
    } catch (Exception e) {
        handleException(e);
        return null;
    }
}