package edu.ualberta.med.biobank.common.wrappers;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import edu.ualberta.med.biobank.common.wrappers.base.ReportBaseWrapper;
import edu.ualberta.med.biobank.model.EntityColumn;
import edu.ualberta.med.biobank.model.EntityFilter;
import edu.ualberta.med.biobank.model.Report;
import edu.ualberta.med.biobank.model.ReportColumn;
import edu.ualberta.med.biobank.model.ReportFilter;
import edu.ualberta.med.biobank.model.ReportFilterValue;
import gov.nih.nci.system.applicationservice.WritableApplicationService;
public class ReportWrapper extends ReportBaseWrapper {
public static final String PROPERTY_NAME = "name"; //$NON-NLS-1$
public static final String PROPERTY_DESCRIPTION = "description"; //$NON-NLS-1$
public static final String PROPERTY_IS_COUNT = "isCount"; //$NON-NLS-1$
public static final String PROPERTY_IS_PUBLIC = "isPublic"; //$NON-NLS-1$
public static final String PROPERTY_USER_ID = "userId"; //$NON-NLS-1$
public static final String REPORT_COLUMN_COLLECTION_CACHE_KEY =
"reportColumns"; //$NON-NLS-1$
public static final String REPORT_FILTER_COLLECTION_CACHE_KEY =
"reportFilterCollection"; //$NON-NLS-1$
public ReportWrapper(WritableApplicationService appService, Report report) {
super(appService, report);
}
public ReportWrapper(WritableApplicationService appService) {
super(appService);
}
private static <E> Collection<E> notNull(Collection<E> collection) {
if (collection == null) {
return new ArrayList<E>();
}
return collection;
}
public ReportWrapper(ReportWrapper report) {
super(report.getAppService());
setName(report.wrappedObject.getName());
setDescription(report.wrappedObject.getDescription());
setIsCount(report.wrappedObject.getIsCount());
setIsPublic(report.wrappedObject.getIsPublic());
wrappedObject.setId(null);
wrappedObject.setEntity(report.wrappedObject.getEntity());
wrappedObject.setUserId(report.wrappedObject.getUserId());
Collection<ReportColumn> reportColumns = new ArrayList<ReportColumn>();
for (ReportColumn column : notNull(report.wrappedObject
.getReportColumns())) {
ReportColumn columnCopy = new ReportColumn();
columnCopy.setEntityColumn(column.getEntityColumn());
columnCopy.setPosition(column.getPosition());
columnCopy.setPropertyModifier(column.getPropertyModifier());
reportColumns.add(columnCopy);
}
setReportColumnCollection(reportColumns);
Collection<ReportFilter> reportFilters = new ArrayList<ReportFilter>();
for (ReportFilter filter : notNull(report.wrappedObject
.getReportFilters())) {
ReportFilter filterCopy = new ReportFilter();
filterCopy.setEntityFilter(filter.getEntityFilter());
filterCopy.setOperator(filter.getOperator());
filterCopy.setPosition(filter.getPosition());
Set<ReportFilterValue> values = new HashSet<ReportFilterValue>();
for (ReportFilterValue value : notNull(filter
.getReportFilterValues())) {
ReportFilterValue valueCopy = new ReportFilterValue();
valueCopy.setPosition(value.getPosition());
valueCopy.setValue(value.getValue());
valueCopy.setSecondValue(value.getSecondValue());
values.add(valueCopy);
}
filterCopy.setReportFilterValues(values);
reportFilters.add(filterCopy);
}
setReportFilterCollection(reportFilters);
}
public List<ReportColumn> getReportColumnCollection() {
@SuppressWarnings("unchecked")
List<ReportColumn> columns = (List<ReportColumn>) cache
.get(REPORT_COLUMN_COLLECTION_CACHE_KEY);
if (columns == null) {
columns = new ArrayList<ReportColumn>();
Collection<ReportColumn> rcc = wrappedObject
.getReportColumns();
if (rcc != null) {
columns.addAll(rcc);
}
Collections.sort(columns, new Comparator<ReportColumn>() {
@Override
public int compare(ReportColumn lhs, ReportColumn rhs) {
return lhs.getPosition() - rhs.getPosition();
}
});
cache.put(REPORT_COLUMN_COLLECTION_CACHE_KEY, columns);
}
return columns;
}
public void setReportColumnCollection(Collection<ReportColumn> reportColumns) {
Collection<ReportColumn> oldReportColumns = wrappedObject
.getReportColumns();
Set<ReportColumn> newReportColumns = new HashSet<ReportColumn>();
newReportColumns.addAll(reportColumns);
wrappedObject.setReportColumns(newReportColumns);
cache.remove(REPORT_COLUMN_COLLECTION_CACHE_KEY);
propertyChangeSupport
.firePropertyChange(REPORT_COLUMN_COLLECTION_CACHE_KEY,
oldReportColumns, reportColumns);
}
public List<ReportFilter> getReportFilterCollection() {
@SuppressWarnings("unchecked")
List<ReportFilter> filters = (List<ReportFilter>) cache
.get(REPORT_FILTER_COLLECTION_CACHE_KEY);
if (filters == null) {
filters = new ArrayList<ReportFilter>();
Collection<ReportFilter> rfc = wrappedObject
.getReportFilters();
if (rfc != null) {
filters.addAll(rfc);
}
Collections.sort(filters, new Comparator<ReportFilter>() {
@Override
public int compare(ReportFilter lhs, ReportFilter rhs) {
return lhs.getPosition() - rhs.getPosition();
}
});
cache.put(REPORT_FILTER_COLLECTION_CACHE_KEY, filters);
}
return filters;
}
public void setReportFilterCollection(Collection<ReportFilter> reportFilters) {
Collection<ReportFilter> oldReportFilters = wrappedObject
.getReportFilters();
Set<ReportFilter> newReportFilters = new HashSet<ReportFilter>();
newReportFilters.addAll(reportFilters);
wrappedObject.setReportFilters(newReportFilters);
cache.remove(REPORT_FILTER_COLLECTION_CACHE_KEY);
propertyChangeSupport
.firePropertyChange(REPORT_FILTER_COLLECTION_CACHE_KEY,
oldReportFilters, reportFilters);
}
public static Collection<String> getFilterValueStrings(
ReportFilter reportFilter) {
Collection<String> strings = new ArrayList<String>();
Collection<ReportFilterValue> rfvCollection = reportFilter
.getReportFilterValues();
if (rfvCollection != null) {
for (ReportFilterValue rfv : rfvCollection) {
strings.add(rfv.getValue());
}
}
return strings;
}
public Collection<EntityColumn> getEntityColumnCollection() {
EntityWrapper entity = getEntity();
if (entity != null) {
return entity.getEntityColumnCollection();
}
return Arrays.asList();
}
public Collection<EntityFilter> getEntityFilterCollection() {
EntityWrapper entity = getEntity();
if (entity != null) {
return entity.getEntityFilterCollection();
}
return Arrays.asList();
}
@Override
public Boolean getIsCount() {
Boolean isCount = super.getIsCount();
return isCount == null || !isCount ? Boolean.FALSE : Boolean.TRUE;
}
@Override
public int compareTo(ModelWrapper<Report> o) {
if (o instanceof ReportWrapper) {
return getName().compareTo(((ReportWrapper) o).getName());
}
return 0;
}
}