package org.akaza.openclinica.control.admin;
import org.akaza.openclinica.control.AbstractTableFactory;
import org.akaza.openclinica.control.DefaultActionsEditor;
import org.akaza.openclinica.dao.hibernate.AuditUserLoginDao;
import org.akaza.openclinica.dao.hibernate.AuditUserLoginFilter;
import org.akaza.openclinica.dao.hibernate.AuditUserLoginSort;
import org.akaza.openclinica.domain.technicaladmin.AuditUserLoginBean;
import org.akaza.openclinica.domain.technicaladmin.LoginStatus;
import org.akaza.openclinica.i18n.util.ResourceBundleProvider;
import org.jmesa.core.filter.DateFilterMatcher;
import org.jmesa.core.filter.FilterMatcher;
import org.jmesa.core.filter.MatcherKey;
import org.jmesa.facade.TableFacade;
import org.jmesa.limit.Filter;
import org.jmesa.limit.FilterSet;
import org.jmesa.limit.Limit;
import org.jmesa.limit.Sort;
import org.jmesa.limit.SortSet;
import org.jmesa.view.component.Row;
import org.jmesa.view.editor.BasicCellEditor;
import org.jmesa.view.editor.CellEditor;
import org.jmesa.view.editor.DateCellEditor;
import org.jmesa.view.html.editor.DroplistFilterEditor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.servlet.http.HttpServletResponse;
public class AuditUserLoginTableFactory extends AbstractTableFactory {
private AuditUserLoginDao auditUserLoginDao;
private ResourceBundle resword;
@Override
protected String getTableName() {
return "userLogins";
}
@Override
protected void configureColumns(TableFacade tableFacade, Locale locale) {
tableFacade.setColumnProperties("userName", "loginAttemptDate", "loginStatus","details", "actions");
Row row = tableFacade.getTable().getRow();
configureColumn(row.getColumn("userName"), "User Name", null, null);
configureColumn(row.getColumn("loginAttemptDate"), "Attempt Date", new DateCellEditor("yyyy-MM-dd HH:mm:ss"), null);
configureColumn(row.getColumn("loginStatus"), "Status", null, new AvailableDroplistFilterEditor());
configureColumn(row.getColumn("details"), "Details", null, null);
String actionsHeader = resword.getString("actions") + " ";
configureColumn(row.getColumn("actions"), actionsHeader, new ActionsCellEditor(), new DefaultActionsEditor(locale), true, false);
}
@Override
protected void configureExportColumns(TableFacade tableFacade, Locale locale) {
tableFacade.setColumnProperties("userName", "loginAttemptDate", "loginStatus");
Row row = tableFacade.getTable().getRow();
configureColumn(row.getColumn("userName"), "User Name", null, null);
configureColumn(row.getColumn("loginAttemptDate"), "Login Attempt Date", new DateCellEditor("yyyy-MM-dd HH:mm:ss"), null);
configureColumn(row.getColumn("loginStatus"), "Login Status", null, new AvailableDroplistFilterEditor());
}
@Override
public void configureTableFacade(HttpServletResponse response, TableFacade tableFacade) {
super.configureTableFacade(response, tableFacade);
tableFacade.addFilterMatcher(new MatcherKey(Date.class, "loginAttemptDate"), new DateFilterMatcher("yyyy-MM-dd HH:mm"));
tableFacade.addFilterMatcher(new MatcherKey(LoginStatus.class, "loginStatus"), new AvailableFilterMatcher());
}
@Override
public int getSize(Limit limit) {
return getAuditUserLoginDao().getCountWithFilter(new AuditUserLoginFilter());
}
@Override
public void setDataAndLimitVariables(TableFacade tableFacade) {
// initialize i18n
resword = ResourceBundleProvider.getWordsBundle(getLocale());
Limit limit = tableFacade.getLimit();
AuditUserLoginFilter auditUserLoginFilter = getAuditUserLoginFilter(limit);
/*
* Because we are using the State feature (via stateAttr) we can do a
* check to see if we have a complete limit already. See the State
* feature for more details Very important to set the totalRow before
* trying to get the row start and row end variables. Very important to
* set the totalRow before trying to get the row start and row end
* variables.
*/
if (!limit.isComplete()) {
int totalRows = getAuditUserLoginDao().getCountWithFilter(auditUserLoginFilter);
tableFacade.setTotalRows(totalRows);
}
AuditUserLoginSort auditUserLoginSort = getAuditUserLoginSort(limit);
if (auditUserLoginSort.getSorts().size() == 0) {
auditUserLoginSort.addSort("loginAttemptDate", "desc");
}
int rowStart = limit.getRowSelect().getRowStart();
int rowEnd = limit.getRowSelect().getRowEnd();
Collection<AuditUserLoginBean> items = getAuditUserLoginDao().getWithFilterAndSort(auditUserLoginFilter, auditUserLoginSort, rowStart, rowEnd);
tableFacade.setItems(items); // Do not forget to set the items back on
// the tableFacade.
}
/**
* A very custom way to filter the items. The AuditUserLoginFilter acts as a
* command for the Hibernate criteria object. Take the Limit information and
* filter the rows.
*
* @param limit
* The Limit to use.
*/
protected AuditUserLoginFilter getAuditUserLoginFilter(Limit limit) {
AuditUserLoginFilter auditUserLoginFilter = new AuditUserLoginFilter();
FilterSet filterSet = limit.getFilterSet();
if (filterSet != null) {
Collection<Filter> filters = filterSet.getFilters();
for (Filter filter : filters) {
String property = filter.getProperty();
String value = filter.getValue();
auditUserLoginFilter.addFilter(property, value);
}
}
return auditUserLoginFilter;
}
/**
* A very custom way to sort the items. The AuditUserLoginSort acts as a
* command for the Hibernate criteria object. Take the Limit information and
* sort the rows.
*
* @param limit
* The Limit to use.
*/
protected AuditUserLoginSort getAuditUserLoginSort(Limit limit) {
AuditUserLoginSort auditUserLoginSort = new AuditUserLoginSort();
SortSet sortSet = limit.getSortSet();
if (sortSet != null) {
Collection<Sort> sorts = sortSet.getSorts();
for (Sort sort : sorts) {
String property = sort.getProperty();
String order = sort.getOrder().toParam();
auditUserLoginSort.addSort(property, order);
}
}
return auditUserLoginSort;
}
public AuditUserLoginDao getAuditUserLoginDao() {
return auditUserLoginDao;
}
public void setAuditUserLoginDao(AuditUserLoginDao auditUserLoginDao) {
this.auditUserLoginDao = auditUserLoginDao;
}
private class AvailableDroplistFilterEditor extends DroplistFilterEditor {
@Override
protected List<Option> getOptions() {
List<Option> options = new ArrayList<Option>();
for (LoginStatus loginStatus : LoginStatus.values()) {
options.add(new Option(loginStatus.name(), loginStatus.toString()));
}
return options;
}
}
private class AvailableFilterMatcher implements FilterMatcher {
public boolean evaluate(Object itemValue, String filterValue) {
LoginStatus filter = LoginStatus.getByName(String.valueOf(filterValue));
LoginStatus item = (LoginStatus) itemValue;
if (item.equals(filter)) {
return true;
}
return false;
}
}
private class ActionsCellEditor implements CellEditor {
public Object getValue(Object item, String property, int rowcount) {
String value = "";
Integer userAccountId = (Integer) new BasicCellEditor().getValue(item, "userAccountId", rowcount);
if (userAccountId != null) {
StringBuilder url = new StringBuilder();
url
.append("<a onmouseup=\"javascript:setImage('bt_View1','images/bt_View.gif');\" onmousedown=\"javascript:setImage('bt_View1','images/bt_View_d.gif');\" href=\"ViewUserAccount?userId=");
url.append(userAccountId.toString());
url
.append("&viewFull=yes\"><img hspace=\"6\" border=\"0\" align=\"left\" title=\"View\" alt=\"View\" src=\"images/bt_View.gif\" name=\"bt_View1\"/></a>");
value = url.toString();
}
return value;
}
}
}