package edu.ualberta.med.biobank.logs;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.eclipse.osgi.util.NLS;
import edu.ualberta.med.biobank.SessionManager;
import edu.ualberta.med.biobank.common.action.ListResult;
import edu.ualberta.med.biobank.common.action.logging.LogQueryAction;
import edu.ualberta.med.biobank.common.formatters.DateFormatter;
import edu.ualberta.med.biobank.common.peer.LogPeer;
import edu.ualberta.med.biobank.common.wrappers.LogWrapper;
import edu.ualberta.med.biobank.gui.common.BgcPlugin;
import edu.ualberta.med.biobank.model.Log;
import gov.nih.nci.system.applicationservice.ApplicationException;
public class LogQuery {
private static LogQuery instance = null;
private HashMap<String, String> searchQuery = new HashMap<String, String>();
private ListResult<Log> dbResults;
public static final String START_DATE_KEY = "startDate"; //$NON-NLS-1$
public static final String END_DATE_KEY = "endDate"; //$NON-NLS-1$
// set the time on end date to midnight (00:00 AM)
public static final String DEFAULT_START_TIME = "00:00"; //$NON-NLS-1$
// set the time on end date to 11:59 PM
public static final String DEFAULT_END_TIME = "23:59"; //$NON-NLS-1$
public static final String NONE = "NONE"; //$NON-NLS-1$
public static final String ALL = "ALL"; //$NON-NLS-1$
protected LogQuery() {
/* Define all the keys to be used here */
searchQuery.put(LogPeer.CENTER.getName(), ""); //$NON-NLS-1$
searchQuery.put(LogPeer.USERNAME.getName(), ""); //$NON-NLS-1$
searchQuery.put(LogPeer.TYPE.getName(), ""); //$NON-NLS-1$
searchQuery.put(LogPeer.ACTION.getName(), ""); //$NON-NLS-1$
searchQuery.put(LogPeer.PATIENT_NUMBER.getName(), ""); //$NON-NLS-1$
searchQuery.put(LogPeer.INVENTORY_ID.getName(), ""); //$NON-NLS-1$
searchQuery.put(LogPeer.LOCATION_LABEL.getName(), ""); //$NON-NLS-1$
searchQuery.put(LogPeer.DETAILS.getName(), ""); //$NON-NLS-1$
searchQuery.put(START_DATE_KEY, ""); //$NON-NLS-1$
searchQuery.put(END_DATE_KEY, ""); //$NON-NLS-1$
}
public static LogQuery getInstance() {
if (instance == null)
instance = new LogQuery();
return instance;
}
public List<LogWrapper> getDatabaseResults() {
List<LogWrapper> logs = new ArrayList<LogWrapper>();
for (Log log : dbResults.getList()) {
logs.add(new LogWrapper(SessionManager.getAppService(), log));
}
return logs;
}
public void queryDatabase() {
String center = searchQuery.get(LogPeer.CENTER.getName());
center = getValueForNoneAll(center);
String user = searchQuery.get(LogPeer.USERNAME.getName());
user = getValueForNoneAll(user);
String action = searchQuery.get(LogPeer.ACTION.getName());
action = getValueForNoneAll(action);
String type = searchQuery.get(LogPeer.TYPE.getName());
type = getValueForNoneAll(type);
String patientNumber = searchQuery
.get(LogPeer.PATIENT_NUMBER.getName());
patientNumber = setValueIfEmpty(patientNumber);
String inventoryId = searchQuery.get(LogPeer.INVENTORY_ID.getName());
inventoryId = setValueIfEmpty(inventoryId);
String details = searchQuery.get(LogPeer.DETAILS.getName());
details = setValueIfEmpty(details);
String location = searchQuery.get(LogPeer.LOCATION_LABEL.getName());
location = setValueIfEmpty(location);
String startDateText = searchQuery.get(START_DATE_KEY);
startDateText = setValueIfEmpty(startDateText);
Date startDate = formatDate(startDateText, DEFAULT_START_TIME);
String endDateText = searchQuery.get(END_DATE_KEY);
endDateText = setValueIfEmpty(endDateText);
Date endDate = formatDate(endDateText, DEFAULT_END_TIME);
try {
dbResults =
SessionManager.getAppService().doAction(
new LogQueryAction(center,
user, startDate, endDate, action, patientNumber,
inventoryId,
location, details, type));
} catch (ApplicationException e) {
BgcPlugin.openAsyncError("Unable to retrieve logs", e);
}
}
private Date formatDate(String dateText, String time) {
Date date = null;
if (dateText != null) {
date = DateFormatter.parseToDateTime(dateText + " " + time); //$NON-NLS-1$
}
return date;
}
private String setValueIfEmpty(String value) {
if ("".equals(value)) //$NON-NLS-1$
return null;
return value;
}
private String getValueForNoneAll(String value) {
if (value.equals(NONE))
return ""; //$NON-NLS-1$
if (value.equals(ALL))
return null;
return value;
}
public String getSearchQueryItem(String key) throws Exception {
String value = searchQuery.get(key);
if (value == null) {
throw new NullPointerException(NLS.bind(
Messages.LogQuery_key_error_msg, key));
}
return value;
}
public void setSearchQueryItem(String field, String value) throws Exception {
if (searchQuery.get(field) == null || value == null)
throw new NullPointerException();
searchQuery.put(field, value);
}
}