/* Copyright (c) The m-m-m Team, Licensed under the Apache License, Version 2.0 * http://www.apache.org/licenses/LICENSE-2.0 */ package io.oasp.module.jpa.dataaccess.base; import java.util.ArrayList; import java.util.List; import net.sf.mmm.util.exception.api.ObjectNotFoundException; import org.hibernate.envers.AuditReader; import org.hibernate.envers.AuditReaderFactory; import io.oasp.module.jpa.dataaccess.api.GenericRevisionedDao; import io.oasp.module.jpa.dataaccess.api.MutablePersistenceEntity; import io.oasp.module.jpa.dataaccess.api.RevisionMetadata; import io.oasp.module.jpa.dataaccess.impl.LazyRevisionMetadata; /** * This is the abstract base-implementation of a {@link AbstractGenericDao} using to manage the revision-control. * * @param <ID> is the type of the {@link MutablePersistenceEntity#getId() primary key} of the managed * {@link MutablePersistenceEntity entity}. * @param <ENTITY> is the {@link #getEntityClass() type} of the managed entity. * */ public abstract class AbstractGenericRevisionedDao<ID, ENTITY extends MutablePersistenceEntity<ID>> extends AbstractGenericDao<ID, ENTITY> implements GenericRevisionedDao<ID, ENTITY> { /** * The constructor. */ public AbstractGenericRevisionedDao() { super(); } /** * @return the auditReader */ protected AuditReader getAuditReader() { return AuditReaderFactory.get(getEntityManager()); } @Override public ENTITY load(ID id, Number revision) throws ObjectNotFoundException { if (revision == MutablePersistenceEntity.LATEST_REVISION) { return find(id); } else { return loadRevision(id, revision); } } /** * This method gets a historic revision of the {@link net.sf.mmm.util.entity.api.GenericEntity} with the given * <code>id</code>. * * @param id is the {@link net.sf.mmm.util.entity.api.GenericEntity#getId() ID} of the requested * {@link net.sf.mmm.util.entity.api.GenericEntity entity}. * @param revision is the {@link MutablePersistenceEntity#getRevision() revision} * @return the requested {@link net.sf.mmm.util.entity.api.GenericEntity entity}. */ protected ENTITY loadRevision(Object id, Number revision) { Class<? extends ENTITY> entityClassImplementation = getEntityClass(); ENTITY entity = getAuditReader().find(entityClassImplementation, id, revision); if (entity != null) { entity.setRevision(revision); } return entity; } @Override public List<Number> getRevisionHistory(ID id) { return getAuditReader().getRevisions(getEntityClass(), id); } @Override public List<RevisionMetadata> getRevisionHistoryMetadata(Object id) { AuditReader auditReader = getAuditReader(); List<Number> revisionList = auditReader.getRevisions(getEntityClass(), id); List<RevisionMetadata> result = new ArrayList<>(); for (Number revision : revisionList) { Long revisionLong = Long.valueOf(revision.longValue()); result.add(new LazyRevisionMetadata(getEntityManager(), revisionLong)); } return result; } }