// $HeadURL$
// $Id$
//
// Copyright © 2006, 2010, 2011, 2012 by the President and Fellows of Harvard College.
//
// Screensaver 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.arch.searchresults;
import java.io.Serializable;
import java.util.List;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import edu.harvard.med.screensaver.db.GenericEntityDAO;
import edu.harvard.med.screensaver.db.SortDirection;
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.AuditedAbstractEntity;
import edu.harvard.med.screensaver.model.Entity;
import edu.harvard.med.screensaver.model.activities.AdministrativeActivity;
import edu.harvard.med.screensaver.model.activities.AdministrativeActivityType;
import edu.harvard.med.screensaver.model.meta.RelationshipPath;
import edu.harvard.med.screensaver.model.users.AdministratorUser;
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.DateTimeEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.TextEntityColumn;
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.util.converter.VocabularyConverter;
public class EntityUpdateSearchResults<AE extends AuditedAbstractEntity<K>, K extends Serializable>
extends EntityBasedEntitySearchResults<AdministrativeActivity,Integer>
{
private static Logger log = Logger.getLogger(EntityUpdateSearchResults.class);
private GenericEntityDAO _dao;
private AE _auditedEntity;
protected EntityUpdateSearchResults() {}
public EntityUpdateSearchResults(GenericEntityDAO dao)
{
_dao = dao;
}
@Override
public void searchAll()
{
setTitle("");
throw new UnsupportedOperationException("should only be used to find update activities for a single entity");
}
public void searchForParentEntity(AE auditedEntity)
{
setTitle("Update History for " + auditedEntity); // TODO: need user-friendly toString(), see [#2560]
_auditedEntity = (AE) _dao.reloadEntity(auditedEntity, true, AuditedAbstractEntity.updateActivities.castToSubtype((Class<AE>) auditedEntity.getClass()));
EntityDataFetcher<AdministrativeActivity,Integer> dataFetcher =
new EntityDataFetcher<AdministrativeActivity,Integer>(AdministrativeActivity.class, _dao) {
@Override
public void addDomainRestrictions(HqlBuilder hql)
{
DataFetcherUtil.addDomainRestrictions(hql, getRootAlias(), Sets.newHashSet(Iterables.transform(_auditedEntity.getUpdateActivities(), Entity.ToEntityId)));
}
};
initialize(new InMemoryEntityDataModel<AdministrativeActivity,Integer,AdministrativeActivity>(dataFetcher));
getColumnManager().setSortColumnName("Date");
getColumnManager().setSortDirection(SortDirection.DESCENDING);
}
public AE getAuditedEntity()
{
return _auditedEntity;
}
@Override
protected List<? extends TableColumn<AdministrativeActivity,?>> buildColumns()
{
List<TableColumn<AdministrativeActivity,?>> columns = Lists.newArrayList();
columns.add(new DateTimeEntityColumn<AdministrativeActivity>(RelationshipPath.from(AdministrativeActivity.class).toProperty("dateCreated"),
"Date Recorded", "The date the update was recorded",
TableColumn.UNGROUPED) {
@Override
protected DateTime getDateTime(AdministrativeActivity activity)
{
return activity.getDateCreated();
}
});
columns.add(new DateEntityColumn<AdministrativeActivity>(RelationshipPath.from(AdministrativeActivity.class).toProperty("dateOfActivity"),
"Date of Activity", "The date that a corresponding real-world activity was performed",
TableColumn.UNGROUPED) {
@Override
protected LocalDate getDate(AdministrativeActivity activity)
{
return activity.getDateOfActivity();
}
});
columns.add(new UserNameColumn<AdministrativeActivity,AdministratorUser>(
RelationshipPath.from(AdministrativeActivity.class).to("performedBy"),
"Updated By", "The person who made the update",
TableColumn.UNGROUPED,
null) {
@Override public AdministratorUser getUser(AdministrativeActivity a) { return (AdministratorUser) a.getPerformedBy(); }
});
columns.add(new VocabularyEntityColumn<AdministrativeActivity,AdministrativeActivityType>(RelationshipPath.from(AdministrativeActivity.class).toProperty("type"),
"Update Type", "The type of the update",
TableColumn.UNGROUPED,
new VocabularyConverter<AdministrativeActivityType>(AdministrativeActivityType.values()),
AdministrativeActivityType.values()) {
@Override
public AdministrativeActivityType getCellValue(AdministrativeActivity activity)
{
return activity.getType();
}
});
columns.add(new TextEntityColumn<AdministrativeActivity>(RelationshipPath.from(AdministrativeActivity.class).toProperty("comments"),
"Change", "Description of the change",
TableColumn.UNGROUPED) {
@Override
public String getCellValue(AdministrativeActivity activity) { return activity.getComments(); }
});
return columns;
}
}