List of usage examples for org.hibernate.envers RevisionType ADD
RevisionType ADD
To view the source code for org.hibernate.envers RevisionType ADD.
Click Source Link
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(); }