package org.artificer.repository.hibernate;
import org.apache.commons.lang.StringUtils;
import org.artificer.common.ArtificerException;
import org.artificer.common.error.ArtificerServerException;
import org.artificer.common.error.ArtificerUserException;
import org.artificer.repository.AuditManager;
import org.artificer.repository.hibernate.audit.ArtificerAuditEntry;
import org.artificer.repository.hibernate.audit.HibernateAuditor;
import org.artificer.repository.hibernate.entity.ArtificerArtifact;
import org.artificer.repository.query.ArtificerQueryArgs;
import org.artificer.repository.query.PagedResult;
import org.jboss.downloads.artificer._2013.auditing.AuditEntry;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import java.util.List;
import java.util.UUID;
/**
* @author Brett Meyer
*/
public class HibernateAuditManager implements AuditManager {
@Override
public void login(String username, String password) {
// not used
}
@Override
public AuditEntry addAuditEntry(final String artifactUuid, final AuditEntry srampAuditEntry)
throws ArtificerException {
return new HibernateUtil.HibernateTask<AuditEntry>() {
@Override
protected AuditEntry doExecute(EntityManager entityManager) throws Exception {
if (StringUtils.isBlank(srampAuditEntry.getUuid())) {
srampAuditEntry.setUuid(UUID.randomUUID().toString());
}
ArtificerArtifact artifact = HibernateUtil.getArtifact(artifactUuid, entityManager, false);
entityManager.persist(HibernateAuditor.auditEntry(srampAuditEntry, artifact));
return srampAuditEntry;
}
}.execute();
}
@Override
public AuditEntry getArtifactAuditEntry(final String artifactUuid, final String auditEntryUuid) throws ArtificerException {
return new HibernateUtil.HibernateTask<AuditEntry>() {
@Override
protected AuditEntry doExecute(EntityManager entityManager) throws Exception {
Query q = entityManager.createQuery(
"SELECT au FROM ArtificerAuditEntry au WHERE au.uuid=:uuid ORDER BY au.id DESC");
q.setParameter("uuid", auditEntryUuid);
q.unwrap(org.hibernate.Query.class).setCacheable(true);
try {
ArtificerAuditEntry auditEntry = (ArtificerAuditEntry) q.getSingleResult();
return HibernateAuditor.auditEntry(auditEntry);
} catch (NoResultException e) {
throw ArtificerUserException.auditEntryNotFound(artifactUuid, auditEntryUuid);
}
}
}.execute();
}
@Override
public PagedResult<AuditEntry> getArtifactAuditEntries(final String artifactUuid, final ArtificerQueryArgs args) throws ArtificerException {
try {
return new HibernateUtil.HibernateTask<PagedResult<AuditEntry>>() {
@Override
protected PagedResult<AuditEntry> doExecute(EntityManager entityManager) throws Exception {
Query q = entityManager.createQuery(
"SELECT au FROM ArtificerAuditEntry au INNER JOIN au.artifact a WHERE a.uuid=:uuid ORDER BY au.id DESC");
q.setParameter("uuid", artifactUuid);
q.unwrap(org.hibernate.Query.class).setCacheable(true);
args.applyPaging(q);
List<ArtificerAuditEntry> auditEntries = q.getResultList();
q = entityManager.createQuery(
"SELECT count(au) FROM ArtificerAuditEntry au INNER JOIN au.artifact a WHERE a.uuid=:uuid");
q.setParameter("uuid", artifactUuid);
q.unwrap(org.hibernate.Query.class).setCacheable(true);
args.applyPaging(q);
long totalSize = (Long) q.getSingleResult();
return new PagedResult<>(HibernateAuditor.auditEntries(auditEntries), "", totalSize, args);
}
}.execute();
} catch (ArtificerException ae) {
throw ae;
} catch (Throwable t) {
throw new ArtificerServerException(t);
}
}
@Override
public PagedResult<AuditEntry> getArtifactAuditEntries(final String artifactUuid) throws ArtificerException {
return getArtifactAuditEntries(artifactUuid, new ArtificerQueryArgs());
}
@Override
public PagedResult<AuditEntry> getUserAuditEntries(final String username, final ArtificerQueryArgs args) throws ArtificerException {
try {
return new HibernateUtil.HibernateTask<PagedResult<AuditEntry>>() {
@Override
protected PagedResult<AuditEntry> doExecute(EntityManager entityManager) throws Exception {
Query q = entityManager.createQuery(
"SELECT au FROM ArtificerAuditEntry au WHERE au.modifiedBy.username=:username ORDER BY au.id DESC");
q.setParameter("username", username);
q.unwrap(org.hibernate.Query.class).setCacheable(true);
args.applyPaging(q);
List<ArtificerAuditEntry> auditEntries = q.getResultList();
q = entityManager.createQuery(
"SELECT count(au) FROM ArtificerAuditEntry au WHERE au.modifiedBy.username=:username");
q.setParameter("username", username);
q.unwrap(org.hibernate.Query.class).setCacheable(true);
args.applyPaging(q);
long totalSize = (Long) q.getSingleResult();
return new PagedResult<>(HibernateAuditor.auditEntries(auditEntries), "", totalSize, args);
}
}.execute();
} catch (ArtificerException ae) {
throw ae;
} catch (Throwable t) {
throw new ArtificerServerException(t);
}
}
@Override
public PagedResult<AuditEntry> getUserAuditEntries(final String username) throws ArtificerException {
return getUserAuditEntries(username, new ArtificerQueryArgs());
}
}