/** * Persists a Audit * * @param object * @param persisted * @param auditingType */ public void audit(Object object, Object persisted, AuditingType auditingType) { try { if (isEntity(object)) { Field[] fields = object.getClass().getDeclaredFields(); Method[] methods = object.getClass().getDeclaredMethods(); Method.setAccessible(methods, true); Field.setAccessible(fields, true); AbstractAuditing auditing = Configuration.getAbstractAuditing(); auditing.setIdentifier(Long.valueOf(getId(object).toString())); auditing.setEntity(getEntityName(object.getClass())); auditing.setAuditingType(auditingType); auditing.setEventDate(new Date()); if (FacesContext.getCurrentInstance() != null) { auditing.setIp(FacesUtils.getIP()); } auditing.setAuditClass(object.getClass()); AbstractAuditingListener listener = Configuration.getAuditingListener(); if (listener != null) { listener.onSave(auditing); } List<AbstractMetadata> metadatas = null; boolean auditPersited = false; if (auditingType.equals(AuditingType.INSERT) || auditingType.equals(AuditingType.DELETE)) { entityManager.persist(auditing); metadatas = getMetadata(object, null, auditing); auditPersited = true; } else if (auditingType.equals(AuditingType.UPDATE)) { metadatas = getMetadata(object, persisted, auditing); if (metadatas != null && !metadatas.isEmpty()) { entityManager.persist(auditing); auditPersited = true; } } auditing.setMetadatas(metadatas); // add to context if (auditPersited == true) { AuditContext context = AuditContext.getCurrentInstance(); if (context != null) { context.setAuditing(object, auditing); } } if (metadatas != null && !metadatas.isEmpty()) { for (AbstractMetadata metadata : metadatas) { entityManager.persist(metadata); } } } } catch (Throwable t) { logger.log(Level.SEVERE, t.getMessage(), t); } }