/*
* (c) 2008- RANDI2 Core Development Team
*
* This file is part of RANDI2.
*
* RANDI2 is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* RANDI2 is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* RANDI2. If not, see <http://www.gnu.org/licenses/>.
*/
package de.randi2.utility.logging;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import de.randi2.model.AbstractDomainObject;
import de.randi2.model.Trial;
import de.randi2.model.TrialSubject;
public class LogServiceImpl implements LogService {
protected EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void logChange(LogEntry.ActionType action, String username,
AbstractDomainObject value) {
LogEntry entry = new LogEntry();
entry.setAction(action);
entry.setUsername(username);
entry.setClazz(value.getClass());
entry.setIdentifier(value.getId());
entry.setValue(value.toString());
entry.setUiName(value.getUIName());
entityManager.persist(entry);
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void logSubjectAction(LogEntry.ActionType action, String username,
Trial trial, TrialSubject trialSubject) {
LogEntry entry = new LogEntry();
entry.setAction(action);
entry.setUsername(username);
entry.setClazz(trial.getClass());
entry.setIdentifier(trial.getId());
entry.setValue(trialSubject.toString());
entry.setUiName(trialSubject.getUIName());
entityManager.persist(entry);
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void logGet(LogEntry.ActionType action, String username) {
LogEntry entry = new LogEntry();
entry.setAction(action);
entry.setUsername(username);
entityManager.persist(entry);
}
@SuppressWarnings("unchecked")
@Override
@Transactional(propagation = Propagation.REQUIRED)
public List<LogEntry> getLogEntries() {
return entityManager.createQuery("from LogEntry").getResultList();
}
@SuppressWarnings("unchecked")
@Override
@Transactional(propagation = Propagation.REQUIRED)
public List<LogEntry> getLogEntries(
Class<? extends AbstractDomainObject> clazz, long id) {
List<LogEntry> entries = entityManager
.createQuery(
"from LogEntry as entry where entry.clazz = ? and entry.identifier = ?")
.setParameter(1, clazz).setParameter(2, id).getResultList();
return entries;
}
@SuppressWarnings("unchecked")
@Override
@Transactional(propagation = Propagation.REQUIRED)
public List<LogEntry> getLogEntries(String username) {
List<LogEntry> entries = entityManager
.createQuery("from LogEntry as entry where entry.username = ?")
.setParameter(1, username).getResultList();
return entries;
}
public static List<String> convert(List<LogEntry> entries) {
List<String> strings = new ArrayList<String>();
for (LogEntry entry : entries) {
strings.add(entry.toString());
}
return strings;
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void logTrialChange(LogEntry.ActionType action, String username,
Trial oldTrial, Trial changedTrial) {
LogEntry entry = new LogEntry();
entry.setAction(action);
entry.setUsername(username);
entry.setClazz(Trial.class);
entry.setIdentifier(changedTrial.getId());
StringBuilder sb = new StringBuilder();
if (!oldTrial.getName().equals(changedTrial.getName())) {
sb.append("Name: ").append(oldTrial.getName()).append(" -> ")
.append(changedTrial.getName()).append(" | ");
}
if (!oldTrial.getAbbreviation().equals(changedTrial.getAbbreviation())) {
sb.append("Abbreviation: ").append(oldTrial.getAbbreviation())
.append(" -> ").append(changedTrial.getAbbreviation())
.append(" | ");
}
if (!oldTrial.getDescription().equals(changedTrial.getDescription())) {
sb.append("Description: ").append(oldTrial.getDescription())
.append(" -> ").append(changedTrial.getDescription())
.append(" | ");
}
if (!oldTrial.getStartDate().equals(changedTrial.getStartDate())) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sb.append("Start-Date: ")
.append(sdf.format(oldTrial.getStartDate().getTime()))
.append(" -> ")
.append(sdf.format(changedTrial.getStartDate().getTime()))
.append(" | ");
}
if (!oldTrial.getEndDate().equals(changedTrial.getEndDate())) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sb.append("End-Date: ")
.append(sdf.format(oldTrial.getEndDate().getTime()))
.append(" -> ")
.append(sdf.format(changedTrial.getEndDate().getTime()))
.append(" | ");
}
if (!oldTrial.getLeadingSite().equals(changedTrial.getLeadingSite())) {
sb.append("Leading Site: ")
.append(oldTrial.getLeadingSite().getName()).append(" -> ")
.append(changedTrial.getLeadingSite().getName())
.append(" | ");
}
if (!oldTrial.getSponsorInvestigator().equals(
changedTrial.getSponsorInvestigator())) {
sb.append("Sponsor investigator: ")
.append(oldTrial.getSponsorInvestigator().getUIName())
.append(" -> ")
.append(changedTrial.getSponsorInvestigator().getUIName())
.append(" | ");
}
if (!(oldTrial.getStatus() == changedTrial.getStatus())) {
sb.append("Status: ").append(oldTrial.getStatus()).append(" -> ")
.append(changedTrial.getStatus());
}
if (sb.length() == 0) {
sb.append(changedTrial.getAbbreviation());
}
entry.setUiName(sb.toString());
entry.setValue(sb.toString());
entityManager.persist(entry);
}
}