@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;
  }
 private void checkSession() {
   if (!auditReaderImplementor.getSession().isOpen()) {
     throw new IllegalStateException("The associated entity manager is closed!");
   }
 }