@Override
  @SuppressWarnings({"unchecked"})
  public Set<Pair<String, Class>> findEntityTypes(Number revision)
      throws IllegalStateException, IllegalArgumentException {
    checkNotNull(revision, "Entity revision");
    checkPositive(revision, "Entity revision");
    checkSession();

    final Session session = auditReaderImplementor.getSession();
    final SessionImplementor sessionImplementor = auditReaderImplementor.getSessionImplementor();

    final Set<Number> revisions = new HashSet<Number>(1);
    revisions.add(revision);
    final Criteria query =
        verCfg.getRevisionInfoQueryCreator().getRevisionsQuery(session, revisions);
    final Object revisionInfo = query.uniqueResult();

    if (revisionInfo != null) {
      // If revision exists.
      final Set<String> entityNames =
          verCfg.getModifiedEntityNamesReader().getModifiedEntityNames(revisionInfo);
      if (entityNames != null) {
        // Generate result that contains entity names and corresponding Java classes.
        final Set<Pair<String, Class>> result = new HashSet<Pair<String, Class>>();
        for (String entityName : entityNames) {
          result.add(
              Pair.make(
                  entityName, EntityTools.getEntityClass(sessionImplementor, session, entityName)));
        }
        return result;
      }
    }

    return Collections.EMPTY_SET;
  }
 @Override
 @SuppressWarnings({"unchecked"})
 public List<Object> findEntities(Number revision)
     throws IllegalStateException, IllegalArgumentException {
   final Set<Pair<String, Class>> entityTypes = findEntityTypes(revision);
   final List<Object> result = new ArrayList<Object>();
   for (Pair<String, Class> type : entityTypes) {
     result.addAll(
         auditReaderImplementor
             .createQuery()
             .forEntitiesModifiedAtRevision(type.getSecond(), type.getFirst(), revision)
             .getResultList());
   }
   return result;
 }
 @Override
 @SuppressWarnings({"unchecked"})
 public Map<RevisionType, List<Object>> findEntitiesGroupByRevisionType(Number revision)
     throws IllegalStateException, IllegalArgumentException {
   final Set<Pair<String, Class>> entityTypes = findEntityTypes(revision);
   final Map<RevisionType, List<Object>> result = new HashMap<RevisionType, List<Object>>();
   for (RevisionType revisionType : RevisionType.values()) {
     result.put(revisionType, new ArrayList<Object>());
     for (Pair<String, Class> type : entityTypes) {
       final List<Object> list =
           auditReaderImplementor
               .createQuery()
               .forEntitiesModifiedAtRevision(type.getSecond(), type.getFirst(), revision)
               .add(new RevisionTypeAuditExpression(revisionType, "="))
               .getResultList();
       result.get(revisionType).addAll(list);
     }
   }
   return result;
 }
 private void checkSession() {
   if (!auditReaderImplementor.getSession().isOpen()) {
     throw new IllegalStateException("The associated entity manager is closed!");
   }
 }