List of usage examples for org.hibernate.envers AuditReaderFactory get
public static AuditReader get(EntityManager entityManager) throws AuditException
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; } }