// $HeadURL$
// $Id$
// Copyright © 2006, 2010, 2011, 2012 by the President and Fellows of Harvard College.
// ScreensaverUsersaver is an open-source project developed by the ICCB-L and NSRB labs
// at Harvard Medical School. This software is distributed under the terms of
// the GNU General Public License.
package edu.harvard.med.screensaver.ui.users;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.joda.time.LocalDate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import edu.harvard.med.iccbl.screensaver.IccblScreensaverConstants;
import edu.harvard.med.screensaver.db.GenericEntityDAO;
import edu.harvard.med.screensaver.db.datafetcher.DataFetcherUtil;
import edu.harvard.med.screensaver.db.datafetcher.EntityDataFetcher;
import edu.harvard.med.screensaver.db.hqlbuilder.HqlBuilder;
import edu.harvard.med.screensaver.model.Entity;
import edu.harvard.med.screensaver.model.activities.AdministrativeActivityType;
import edu.harvard.med.screensaver.model.meta.PropertyPath;
import edu.harvard.med.screensaver.model.meta.RelationshipPath;
import edu.harvard.med.screensaver.model.users.FacilityUsageRole;
import edu.harvard.med.screensaver.model.users.Gender;
import edu.harvard.med.screensaver.model.users.ScreeningRoomUser;
import edu.harvard.med.screensaver.model.users.ScreensaverUser;
import edu.harvard.med.screensaver.model.users.ScreensaverUserRole;
import edu.harvard.med.screensaver.ui.arch.datatable.column.TableColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.DateEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.EnumEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.IntegerEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.TextEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.TextSetEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.UserNameColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.VocabularyEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.model.InMemoryEntityDataModel;
import edu.harvard.med.screensaver.ui.arch.searchresults.EntityBasedEntitySearchResults;
import edu.harvard.med.screensaver.ui.arch.searchresults.SearchResults;
import edu.harvard.med.screensaver.ui.arch.util.converter.VocabularyConverter;
import edu.harvard.med.screensaver.ui.arch.view.EntityViewer;
/**
* A {@link SearchResults} for {@link ScreensaverUser Users}.
*
* @author <a mailto="andrew_tolopko@hms.harvard.edu">Andrew Tolopko</a>
*/
public class UserSearchResults<E extends ScreensaverUser> extends EntityBasedEntitySearchResults<E,Integer>
{
private GenericEntityDAO _dao;
private Class<E> _type;
private String _title;
/**
* @motivation for CGLIB2
*/
protected UserSearchResults()
{
}
public UserSearchResults(Class<E> type,
GenericEntityDAO dao,
UserViewer userViewer)
{
super((EntityViewer<E>) userViewer);
_type = type;
_dao = dao;
}
@Override
public void searchAll()
{
searchAll("Screeners");
}
public void searchAll(String title)
{
setTitle(title);
initialize(new InMemoryEntityDataModel<E,Integer,E>(new EntityDataFetcher<E,Integer>(_type, _dao)));
// default to descending sort order on user ID, to show last created first
getColumnManager().setSortAscending(false);
}
public void searchUsers(final Set<ScreeningRoomUser> users, String title)
{
setTitle(title);
initialize(new InMemoryEntityDataModel<E,Integer,E>(new EntityDataFetcher<E,Integer>(_type, _dao) {
@Override
public void addDomainRestrictions(HqlBuilder hql)
{
DataFetcherUtil.addDomainRestrictions(hql, getRootAlias(), Sets.newHashSet(Iterables.transform(users, Entity.ToEntityId)));
}
}));
// default to ascending sort order on user name
getColumnManager().setSortColumnName("Name");
getColumnManager().setSortAscending(true);
}
// implementations of the SearchResults abstract methods
@Override
protected List<? extends TableColumn<E,?>> buildColumns()
{
ArrayList<TableColumn<E,?>> columns = Lists.newArrayList();
RelationshipPath<E> pathRoot = RelationshipPath.from(_type);
columns.add(new IntegerEntityColumn<E>(pathRoot.toProperty("userId"),
"User ID",
"The user ID",
TableColumn.UNGROUPED) {
@Override
public Integer getCellValue(E user) { return user.getScreensaverUserId(); }
@Override
public Object cellAction(E activity) { return viewSelectedEntity(); }
@Override
public boolean isCommandLink() { return true; }
});
columns.add(new UserNameColumn<E,E>(pathRoot,
"Name",
"The full name of the user (last, first)",
TableColumn.UNGROUPED,
(UserViewer) getEntityViewer()) {
@Override
protected E getUser(E user)
{
return user;
}
});
columns.add(new TextEntityColumn<E>(pathRoot.toProperty("email"),
"Email",
"The email of the user",
TableColumn.UNGROUPED) {
@Override
public String getCellValue(ScreensaverUser user) { return user.getEmail(); }
});
columns.add(new TextEntityColumn<E>(pathRoot.toProperty("phone"),
"Phone",
"The phone number for this user",
TableColumn.UNGROUPED) {
@Override
public String getCellValue(ScreensaverUser user) { return user.getPhone(); }
});
columns.get(columns.size() - 1).setAdministrative(true);
columns.add(new TextEntityColumn<E>(pathRoot.toProperty("mailingAddress"),
"Mailing Address",
"The mailing address of the user",
TableColumn.UNGROUPED) {
@Override
public String getCellValue(ScreensaverUser user) { return user.getMailingAddress(); }
});
columns.get(columns.size() - 1).setAdministrative(true);
columns.add(new VocabularyEntityColumn<E, Gender>(
pathRoot.toProperty("Gender"),
"Gender", "The gender of the user",
TableColumn.UNGROUPED,
new VocabularyConverter<Gender>(Gender.values()),
Gender.values()) {
@Override
public Gender getCellValue(E user) {
return user.getGender();
}
});
columns.get(columns.size() - 1).setVisible(false);
if (getApplicationProperties().isFeatureEnabled("manage_authentication_credentials")) {
columns.add(new TextEntityColumn<E>(pathRoot.toProperty("loginId"),
"Login ID",
"The login ID of the user",
TableColumn.UNGROUPED) {
@Override
public String getCellValue(ScreensaverUser user)
{
return user.getLoginId();
}
});
columns.get(columns.size() - 1).setAdministrative(true);
columns.get(columns.size() - 1).setVisible(false);
}
if (IccblScreensaverConstants.FACILITY_KEY.equals(getApplicationProperties().getFacilityKey())) {
columns.add(new TextEntityColumn<E>(pathRoot.toProperty("ECommonsId"),
"eCommons ID",
"The eCommons ID of the user",
TableColumn.UNGROUPED) {
@Override
public String getCellValue(ScreensaverUser user)
{
return user.getECommonsId();
}
});
columns.get(columns.size() - 1).setAdministrative(true);
columns.add(new TextEntityColumn<E>(pathRoot.toProperty("harvardId"),
"Harvard ID",
"The Harvard ID of the user",
TableColumn.UNGROUPED) {
@Override
public String getCellValue(ScreensaverUser user)
{
return user.getHarvardId();
}
});
columns.get(columns.size() - 1).setAdministrative(true);
columns.add(new DateEntityColumn<E>(pathRoot.toProperty("harvardIdExpirationDate"),
"Harvard ID Initial Expiration Date",
"The date this user's Harvard ID is initially set to expire",
TableColumn.UNGROUPED) {
protected LocalDate getDate(E user)
{
return user.getHarvardIdExpirationDate();
}
});
columns.get(columns.size() - 1).setAdministrative(true);
columns.get(columns.size() - 1).setVisible(false);
}
columns.add(new TextSetEntityColumn<E>(pathRoot.to(ScreeningRoomUser.facilityUsageRoles), // convert to a path with same root type as all other column paths
"Facility Usage Roles",
"Record of what the user is doing at the facility",
TableColumn.UNGROUPED) {
public Set<String> getCellValue(ScreensaverUser user)
{
if (user instanceof ScreeningRoomUser) {
Set<FacilityUsageRole> facilityUsages = Sets.newTreeSet(((ScreeningRoomUser) user).getFacilityUsageRoles());
return Sets.newHashSet(Iterables.transform(facilityUsages, FacilityUsageRole.ToDisplayableName));
}
return null;
}
});
columns.get(columns.size() - 1).setAdministrative(true);
columns.get(columns.size() - 1).setVisible(false);
columns.add(new TextSetEntityColumn<E>(pathRoot.to(ScreensaverUser.roles), // convert to a path with same root type as all other column paths
"Data Access Roles",
"The primary data access roles assigned to this user's account",
TableColumn.UNGROUPED) {
public Set<String> getCellValue(ScreensaverUser user)
{
Set<ScreensaverUserRole> roles = Sets.newHashSet(user.getPrimaryScreensaverUserRoles());
if (roles.isEmpty()) {
return Sets.newHashSet("<not yet specified>");
}
return Sets.newHashSet(Iterables.transform(roles, ScreensaverUserRole.ToDisplayableRoleName));
}
});
columns.get(columns.size() - 1).setAdministrative(true);
columns.get(columns.size() - 1).setVisible(false);
columns.add(new DateEntityColumn<E>(pathRoot.toProperty("dateCreated"),
"Date Recorded",
"The date the user's account was first recorded in Screensaver",
TableColumn.UNGROUPED) {
public LocalDate getDate(ScreensaverUser user) { return user.getDateCreated().toLocalDate(); }
});
columns.get(columns.size() - 1).setAdministrative(true);
return columns;
}
public String getTitle()
{
return _title;
}
public void setTitle( String value )
{
_title = value;
}
}