Example usage for org.hibernate.envers AuditReaderFactory get

List of usage examples for org.hibernate.envers AuditReaderFactory get

Introduction

In this page you can find the example usage for org.hibernate.envers AuditReaderFactory get.

Prototype

public static AuditReader get(EntityManager entityManager) throws AuditException 

Source Link

Document

Create an audit reader associated with an open entity manager.

Usage

From source file:ch.puzzle.itc.mobiliar.release.ReleaseTest.java

License:Open Source License

@Before
public void before() {
    MockitoAnnotations.initMocks(this);
    builder = new PersistingEntityBuilder(entityManager).buildSimple();
    as = builder.resourceFor(AS);//  w  ww  .  j  a va2 s  .  c  om
    app = builder.resourceFor(APP);
    context = builder.context;
    asContext = as.getContextsByLowestContext(context).get(0);

    reader = AuditReaderFactory.get(entityManager);
}

From source file:ch.puzzle.itc.mobiliar.test.testrunner.example.ExamplePersistenceEnversTest.java

License:Open Source License

@Test
public void shouldFindPropertyDescriptorEntity_inDifferentVersions() throws Exception {
    // when//from   w  w w.  j  a  v a 2 s. co m
    PropertyDescriptorEntity result = entityManager.find(PropertyDescriptorEntity.class, 1);

    AuditReader auditReader = AuditReaderFactory.get(entityManager);

    List<Number> revisions = auditReader.getRevisions(PropertyDescriptorEntity.class, 1);
    PropertyDescriptorEntity revision1 = auditReader.find(PropertyDescriptorEntity.class, 1, 1);
    PropertyDescriptorEntity revision2 = auditReader.find(PropertyDescriptorEntity.class, 1, 2);

    // then
    assertNotNull(revisions);
    assertNotNull(revision1);
    assertNotNull(result);
    assertEquals(2, revisions.size());
    assertEquals("comment2", result.getPropertyComment());
    assertEquals("comment", revision1.getPropertyComment());
    assertEquals("comment2", revision2.getPropertyComment());
}

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

License:Open Source License

/**
 * Returns all revisions of the given entity until the given maxRevId
 * @param obj/*from www  . j av  a2  s .c o m*/
 * @param maxRevId (-1, to ignore)
 * @return
 */
@SuppressWarnings("unchecked")
public static List<Revision> getLastRevisions(Class<?> claz, Serializable entityId, int maxRevId, int n) {

    long s = System.currentTimeMillis();
    EntityManager session = JPAUtil.getManager();
    AuditReader reader = AuditReaderFactory.get(session);
    AuditQuery query = reader.createQuery().forRevisionsOfEntity(claz, false, true).setCacheable(false)
            .setLockMode(LockMode.NONE);
    query.add(AuditEntity.id().eq(entityId));

    if (maxRevId > 0) {
        query.add(AuditEntity.revisionNumber().le(maxRevId));
    }
    if (n > 0) {
        query.setMaxResults(n);
        query.addOrder(AuditEntity.revisionNumber().desc());
    }
    List<Revision> revisions = getRevisions(null, query.getResultList());
    LoggerFactory.getLogger(DAORevision.class).debug("Loaded revisions for " + claz.getSimpleName() + "("
            + entityId + ") maxRevId=" + maxRevId + "-" + n + " in " + (System.currentTimeMillis() - s) + "ms");
    return revisions;
}

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

License:Open Source License

/**
 * Get the different version of an element, the first element of the list shows the most recent version
 * @param obj//from   w  ww. j ava 2s .co m
 * @return
 */
public static <T extends IObject> List<T> getHistory(Class claz, Serializable objectId, int maxRevs) {
    long s = System.currentTimeMillis();
    EntityManager session = JPAUtil.getManager();
    AuditReader reader = AuditReaderFactory.get(session);
    AuditQuery query = reader.createQuery().forRevisionsOfEntity(claz, true, false)
            .add(AuditEntity.id().eq(objectId)).addOrder(AuditEntity.revisionNumber().desc())
            .setCacheable(false).setLockMode(LockMode.NONE);
    if (maxRevs > 0) {
        query.setMaxResults(maxRevs);
    }
    List<T> res = query.getResultList();
    for (T t : res) {
        session.detach(t);
    }

    LoggerFactory.getLogger(DAORevision.class).debug("Loaded history for " + claz.getSimpleName() + ": ("
            + objectId + ") in " + (System.currentTimeMillis() - s) + "ms");
    return res;
}

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

License:Open Source License

public static List<Revision> queryRevisions(RevisionQuery query) {
    assert query != null;
    long s = System.currentTimeMillis();
    EntityManager session = JPAUtil.getManager();
    AuditReader reader = AuditReaderFactory.get(session);

    int rev1 = 0;
    try {/*from   w  ww  .j  av a 2 s  .  co m*/
        rev1 = query.getRevId() > 0 ? query.getRevId()
                : query.getFromDate() == null ? 0
                        : reader.getRevisionNumberForDate(query.getFromDate()).intValue() + 1;
    } catch (Exception e) {
        //before first revision->ignore
    }
    int rev2 = Integer.MAX_VALUE;
    try {
        rev2 = query.getRevId() > 0 ? query.getRevId()
                : query.getToDate() == null ? Integer.MAX_VALUE
                        : reader.getRevisionNumberForDate(query.getToDate()).intValue();
    } catch (Exception e) {
        //after last revision->ignore
    }
    LoggerFactory.getLogger(DAORevision.class).debug("getRevisions between " + rev1 + " and " + rev2);
    Set<Class<?>> entityClasses = new HashSet<>();
    if (query.isStudies())
        entityClasses.add(Study.class);
    if (query.isSamples())
        entityClasses.add(Biosample.class);
    if (query.isResults())
        entityClasses.add(Result.class);
    if (query.isLocations())
        entityClasses.add(Location.class);
    if (query.isAdmin())
        entityClasses.add(Biotype.class);
    if (query.isAdmin())
        entityClasses.add(Test.class);
    if (query.isAdmin())
        entityClasses.add(Employee.class);
    if (query.isAdmin())
        entityClasses.add(EmployeeGroup.class);
    if (query.isAdmin())
        entityClasses.add(SpiritProperty.class);

    List<Revision> revisions = getRevisions(entityClasses, queryForRevisions(reader, entityClasses, rev1, rev2,
            query.getUserIdFilter(), query.getSidFilter(), query.getStudyIdFilter()));
    LoggerFactory.getLogger(DAORevision.class)
            .debug("Loaded revisions in " + (System.currentTimeMillis() - s) + "ms");

    //Post filter per study
    List<Revision> res = new ArrayList<>();
    for (Revision revision : revisions) {
        System.out.println("DAORevision.queryRevisions() " + revision + " " + revision.getType() + " "
                + revision.getDifference());
        if (query.getSidFilter() > 0
                || (query.getStudyIdFilter() != null && query.getStudyIdFilter().length() > 0)) {
            boolean ok = false;
            if (!ok) {
                for (Study study : revision.getStudies()) {
                    if (query.getSidFilter() > 0 && query.getSidFilter() == study.getId())
                        ok = true;
                    else if (query.getStudyIdFilter() != null
                            && query.getStudyIdFilter().contains(study.getStudyId()))
                        ok = true;
                }
            }
            if (!ok) {
                for (Biosample b : revision.getBiosamples()) {
                    if (b.getInheritedStudy() != null) {
                        if (query.getSidFilter() > 0 && query.getSidFilter() == b.getInheritedStudy().getId())
                            ok = true;
                        else if (query.getStudyIdFilter() != null
                                && query.getStudyIdFilter().contains(b.getInheritedStudy().getStudyId()))
                            ok = true;
                    }
                }
            }
            if (!ok) {
                for (Result r : revision.getResults()) {
                    if (r.getStudy() != null) {
                        if (query.getSidFilter() > 0 && query.getSidFilter() == r.getStudy().getId())
                            ok = true;
                        else if (query.getStudyIdFilter() != null
                                && query.getStudyIdFilter().contains(r.getStudy().getStudyId()))
                            ok = true;
                    }
                }
            }

            if (!ok) {
                continue;
            }
        }

        res.add(revision);
    }

    return res;
}

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

License:Open Source License

/**
 * Cancel the change, ie. go to the version minus one for each object in the revision.
 *
 * If this revision is a deletion->insert older version
 * If this revision is a insert->delete
 * If this revision is an update->update older version
 *
 * @param revision//from   ww w .j  a  v  a 2 s. com
 * @param user
 * @param comments
 * @throws Exception
 */
@SuppressWarnings("unchecked")
public static void revert(Revision revision, SpiritUser user) throws Exception {
    EntityManager session = JPAUtil.getManager();
    EntityTransaction txn = session.getTransaction();

    try {
        Date now = JPAUtil.getCurrentDateFromDatabase();
        int revId = revision.getRevId();

        AuditReader reader = AuditReaderFactory.get(session);

        //Query modified entities during this revision
        Map<String, IObject> mapMerged = new HashMap<>();
        txn.begin();

        for (Class<IObject> claz : new Class[] { Biotype.class, Test.class, Study.class, Location.class,
                Biosample.class, Result.class }) {
            List<Object[]> res = queryForRevisions(reader, Collections.singleton(claz), revId, revId, null, -1,
                    null);

            List<IObject> toDelete = new ArrayList<>();
            List<IObject> toMerge = new ArrayList<>();

            for (Object[] a : res) {
                IObject entity = (IObject) a[0];
                RevisionType type = (RevisionType) a[2];
                if (revision.getType() == type) {
                    if (type == RevisionType.ADD) {
                        //Attach the entity to be deleted
                        IObject obj = session.merge(entity);
                        toDelete.add(obj);
                    } else {
                        //Attach the revision to be restored
                        IObject obj = reader.find(entity.getClass(), entity.getId(), revId - 1);
                        if (obj == null)
                            throw new Exception("The " + entity.getClass().getSimpleName() + " "
                                    + entity.getId() + " could not be found at rev=" + (revId - 1));
                        toMerge.add(obj);
                    }
                    mapMerged.put(entity.getClass() + "_" + entity.getId(), null);
                }
            }

            LoggerFactory.getLogger(DAORevision.class)
                    .debug(claz + " >  toMerge=" + toMerge.size() + " toDelete=" + toDelete.size());
            int step = 0;
            while (toMerge.size() > 0 && step++ < 10) {
                for (IObject o : new ArrayList<>(toMerge)) {
                    int id = o.getId();
                    boolean success = remap(session, o, now, user, mapMerged);
                    if (!success)
                        continue;
                    toMerge.remove(o);

                    LoggerFactory.getLogger(DAORevision.class)
                            .debug("merge " + o.getClass().getSimpleName() + " " + o.getId() + ":" + o);
                    mapMerged.put(o.getClass() + "_" + id, session.merge(o));
                }
            }
            for (IObject o : toDelete) {
                LoggerFactory.getLogger(DAORevision.class)
                        .debug("remove " + o.getClass().getSimpleName() + " " + o.getId() + ":" + o);
                session.remove(o);
            }
        }
        txn.commit();
        txn = null;
    } catch (Exception e) {
        e.printStackTrace();
        if (txn != null && txn.isActive())
            txn.rollback();
        throw e;
    }
}

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  w  w.j a  va2  s. co  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// w w  w.  ja va2  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/*from   w ww  . j  a v a2  s  .  c  om*/
 * @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;
    }
}