Example usage for org.hibernate.envers RevisionType ADD

List of usage examples for org.hibernate.envers RevisionType ADD

Introduction

In this page you can find the example usage for org.hibernate.envers RevisionType ADD.

Prototype

RevisionType ADD

To view the source code for org.hibernate.envers RevisionType ADD.

Click Source Link

Document

Indicates that the entity was added (persisted) at that revision.

Usage

From source file:ch.puzzle.itc.mobiliar.business.auditview.control.AuditServiceTest.java

License:Open Source License

@Test
public void shouldReturnTrueIfRevisionTypeIsAdd() {
    // given/*from  w  w  w .j a  va  2 s. c  o m*/
    String value = EMPTY;
    MyRevisionEntity revisionEntity = new MyRevisionEntity();
    AuditViewEntry entryInList = AuditViewEntry.builder(revisionEntity, RevisionType.ADD).oldValue(value)
            .value(value).build();
    Map<Integer, AuditViewEntry> allAuditViewEntries = new HashMap<>(1);
    allAuditViewEntries.put(entryInList.hashCode(), entryInList);

    // when
    boolean relevant = auditService.isAuditViewEntryRelevant(entryInList, allAuditViewEntries);

    // then
    assertThat(relevant, is(true));
}

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  w w  . ja v  a  2  s.  c  o m*/
            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

/**
 * Group the modified entities per revisionId/type
 * @param objects/*from w  w w . jav  a2s .c o  m*/
 * @return
 */
private static List<Revision> getRevisions(Set<Class<?>> entityClasses, List<Object[]> objects) {
    Map<Integer, Revision> map = new HashMap<>();
    for (Object[] a : objects) {

        Object entity = a[0];
        if (entityClasses == null && !(entity instanceof IAuditable))
            continue;
        else if (entityClasses != null && !entityClasses.contains(entity.getClass()))
            continue;

        SpiritRevisionEntity rev = (SpiritRevisionEntity) a[1];
        RevisionType type = (RevisionType) a[2];

        Revision r = map.get(rev.getId());
        if (r == null) {
            int sid = rev.getSid();
            Study study = DAOStudy.getStudy(sid);
            r = new Revision(rev.getId(), type, study, rev.getReason(), rev.getDifferenceList(),
                    rev.getUserId(), rev.getRevisionDate());
            map.put(rev.getId(), r);
        } else {
            if (type == RevisionType.DEL)
                r.setType(RevisionType.DEL);
            else if (type == RevisionType.ADD && r.getType() != RevisionType.DEL)
                r.setType(RevisionType.ADD);
        }
        r.getAuditables().add((IAuditable) entity);
    }

    List<Revision> res = new ArrayList<>(map.values());
    Collections.sort(res);
    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  w w w  .  ja va  2  s .  c  o m
 * @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   w w w.ja  va2  s.co 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:fr.mcc.ginco.audit.utils.AuditQueryBuilder.java

License:CeCILL license

/**
 * Builds a query returning objects creations revisions
 * /*from w w  w.ja  v  a2s.c  o m*/
 * @param reader
 * @param thesaurus
 *            the thesaurus on which searched should be performed
 * @param startDate
 *            the start date for the search
 * @param clazz
 *            the object class
 * @return
 */
public AuditQuery getEntityAddedQuery(Thesaurus thesaurus, Date startDate, Class<?> clazz) {
    AuditQuery auditQuery = readerService.getAuditReader().createQuery().forRevisionsOfEntity(clazz, false,
            true);
    filterOnDateAndThesaurusId(auditQuery, thesaurus, startDate);
    auditQuery.add(AuditEntity.revisionType().eq(RevisionType.ADD));
    return auditQuery;
}

From source file:fr.mcc.ginco.audit.utils.AuditQueryBuilder.java

License:CeCILL license

/**
 * Builds a query returning an object creation revision Assumes the id field
 * of the object is named "identifier"/*from w  ww.  jav a2s.  co  m*/
 * 
 * @param reader
 * @param clazz
 *            the object class
 * @param identifier
 *            the object identifier
 * @return
 */
public AuditQuery getEntityAddedQuery(AuditReader reader, Class<?> clazz, Serializable identifier) {
    return reader.createQuery().forRevisionsOfEntity(clazz, false, true).add(AuditEntity.id().eq(identifier))
            .add(AuditEntity.revisionType().eq(RevisionType.ADD));

}

From source file:org.jboss.pressgang.ccms.filter.utils.EntityUtilities.java

License:Open Source License

@SuppressWarnings("unchecked")
public static <T extends AuditedEntity> List<Integer> getCreatedBy(final EntityManager entityManager,
        final Class<T> clazz, final String idName, final String username) {
    final AuditReader reader = AuditReaderFactory.get(entityManager);
    final AuditQuery query = reader.createQuery().forRevisionsOfEntity(clazz, true, false)
            .addProjection(AuditEntity.property("originalId." + idName).distinct())
            .add(AuditEntity.revisionProperty("userName").eq(username))
            .add(AuditEntity.revisionType().eq(RevisionType.ADD));
    return query.getResultList();
}