package edu.ualberta.med.biobank.common.action.logging;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import edu.ualberta.med.biobank.common.action.Action;
import edu.ualberta.med.biobank.common.action.ActionContext;
import edu.ualberta.med.biobank.common.action.ListResult;
import edu.ualberta.med.biobank.common.action.exception.ActionException;
import edu.ualberta.med.biobank.common.peer.LogPeer;
import edu.ualberta.med.biobank.common.permission.logging.LoggingPermission;
import edu.ualberta.med.biobank.model.Log;
public class LogQueryAction implements Action<ListResult<Log>> {
private static final long serialVersionUID = 8892328030007487709L;
private String center;
private String username;
private Date startDate;
private Date endDate;
private String action;
private String patientNumber;
private String inventoryId;
private String locationLabel;
private String details;
private String type;
public LogQueryAction(String center,
String username, Date startDate, Date endDate, String action,
String patientNumber, String inventoryId, String locationLabel,
String details, String type) {
this.center = center;
this.username = username;
this.startDate = startDate;
this.endDate = endDate;
this.action = action;
this.patientNumber = patientNumber;
this.inventoryId = inventoryId;
this.locationLabel = locationLabel;
this.details = details;
this.type = type;
}
@Override
public boolean isAllowed(ActionContext context) throws ActionException {
return new LoggingPermission().isAllowed(context);
}
@SuppressWarnings("unchecked")
@Override
public ListResult<Log> run(ActionContext context) throws ActionException {
StringBuffer parametersString = new StringBuffer();
List<Object> parametersArgs = new ArrayList<Object>();
addParam(parametersString, parametersArgs, LogPeer.USERNAME.getName(),
username, true);
StringBuffer datePart = new StringBuffer();
if ((startDate != null) && (endDate != null)) {
datePart.append(" ").append(LogPeer.CREATED_AT.getName())
.append(" >= ? and ").append(LogPeer.CREATED_AT.getName())
.append(" <= ?");
parametersArgs.add(startDate);
parametersArgs.add(endDate);
} else if (startDate != null) {
datePart.append(" ").append(LogPeer.CREATED_AT.getName())
.append(" >= ?");
parametersArgs.add(startDate);
} else if (endDate != null) {
datePart.append(" ").append(LogPeer.CREATED_AT.getName())
.append(" <= ?");
parametersArgs.add(endDate);
}
if (datePart.length() > 0) {
if (parametersString.length() > 0) {
parametersString.append(" and");
}
parametersString.append(" " + datePart);
}
addParam(parametersString, parametersArgs, LogPeer.CENTER.getName(),
center, true);
addParam(parametersString, parametersArgs, LogPeer.ACTION.getName(),
action, true);
addParam(parametersString, parametersArgs,
LogPeer.PATIENT_NUMBER.getName(), patientNumber, true);
addParam(parametersString, parametersArgs,
LogPeer.INVENTORY_ID.getName(), inventoryId, true);
addLocationLabelParam(parametersString, parametersArgs, locationLabel);
addParam(parametersString, parametersArgs, LogPeer.DETAILS.getName(),
details, false);
addParam(parametersString, parametersArgs, LogPeer.TYPE.getName(),
type, true);
StringBuilder qry = new StringBuilder("from ").append(Log.class
.getName());
if (parametersString.length() > 0) {
qry.append(" where").append(parametersString.toString());
}
Query query = context.getSession().createQuery(qry.toString());
for (int i = 0, n = parametersArgs.size(); i < n; i++) {
query.setParameter(i, parametersArgs.get(i));
}
List<Log> rows = query.list();
return new ListResult<Log>(rows);
}
private void addParam(StringBuffer sb, List<Object> parameters,
String property, Object value, boolean strict) {
if (value != null) {
if (sb.length() > 0) {
sb.append(" and");
}
sb.append(" ").append(property);
if (strict) {
sb.append("=?");
parameters.add(value);
} else {
sb.append(" like ?");
parameters.add("%" + value + "%");
}
}
}
private void addLocationLabelParam(StringBuffer sb,
List<Object> parameters, Object value) {
if (value != null) {
if (sb.length() > 0) {
sb.append(" and");
}
sb.append(" ").append(LogPeer.LOCATION_LABEL.getName())
.append(" like ?");
parameters.add(value + " (%");
}
}
}