// $HeadURL$ // $Id$ // // Copyright © 2010 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.libraries; import java.util.Collections; import java.util.List; import java.util.Set; import javax.faces.model.SelectItem; import edu.harvard.med.screensaver.model.meta.PropertyPath; import edu.harvard.med.screensaver.model.meta.RelationshipPath; import edu.harvard.med.screensaver.model.screenresults.DataColumn; import edu.harvard.med.screensaver.model.screenresults.ResultValue; import edu.harvard.med.screensaver.ui.arch.datatable.column.BooleanColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.HasVocabulary; import edu.harvard.med.screensaver.ui.arch.datatable.column.TableColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.HasFetchPaths; public abstract class ViewPolicyAwareResultValueColumn<R,T extends Object> extends TableColumn<R,T> implements HasFetchPaths<ResultValue>, HasVocabulary<T> { private TableColumn<R,T> _baseColumn; private DataColumn _dataColumn; public ViewPolicyAwareResultValueColumn(TableColumn<R,T> baseColumn, DataColumn dataColumn) { super(baseColumn.getName(), baseColumn.getDescription(), baseColumn.getColumnType(), baseColumn.getGroup(), baseColumn.isMultiValued()); setAdministrative(baseColumn.isAdministrative()); setConverter(baseColumn.getConverter()); setMultiValued(baseColumn.isMultiValued()); _baseColumn = baseColumn; _dataColumn = dataColumn; initialize(); } abstract protected void initialize(); abstract protected boolean isResultValueRestricted(R row); public boolean isCommandLink() { return _baseColumn.isCommandLink(); } public Object cellAction(R row) { return _baseColumn.cellAction(row); } public T getCellValue(R row) { if (isResultValueRestricted(row)) { return null; } return _baseColumn.getCellValue(row); } public void setCellValue(R row, T value) { _baseColumn.setCellValue(row, value); } public boolean isSortableSearchable() { // if related screen result is restricted, this means that we're // only allowed to share mutual positives; in this case we do not // allow sorting or filtering on this column, since it would allow // hidden values to be inferred by the user if (_dataColumn.getScreenResult().isRestricted()) { return false; } return _baseColumn.isSortableSearchable(); } @Override public void addRelationshipPath(RelationshipPath<ResultValue> path) { if (!(_baseColumn instanceof HasFetchPaths)) { throw new UnsupportedOperationException("base column does not implement HasFetchPaths"); } ((HasFetchPaths<ResultValue>) _baseColumn).addRelationshipPath(path); } @Override public PropertyPath<ResultValue> getPropertyPath() { if (!(_baseColumn instanceof HasFetchPaths)) { throw new UnsupportedOperationException("base column does not implement HasFetchPaths"); } return ((HasFetchPaths<ResultValue>) _baseColumn).getPropertyPath(); } @Override public Set<RelationshipPath<ResultValue>> getRelationshipPaths() { if (!(_baseColumn instanceof HasFetchPaths)) { throw new UnsupportedOperationException("base column does not implement HasFetchPaths"); } return ((HasFetchPaths<ResultValue>) _baseColumn).getRelationshipPaths(); } @Override public boolean isFetchableProperty() { if (!(_baseColumn instanceof HasFetchPaths)) { throw new UnsupportedOperationException("base column does not implement HasFetchPaths"); } return ((HasFetchPaths) _baseColumn).isFetchableProperty(); } public Set<T> getVocabulary() { if (_baseColumn instanceof HasVocabulary) { return ((HasVocabulary<T>) _baseColumn).getVocabulary(); } return Collections.emptySet(); } public List<SelectItem> getVocabularySelections() { if (_baseColumn instanceof HasVocabulary) { return ((HasVocabulary<T>) _baseColumn).getVocabularySelections(); } return Collections.emptyList(); } public List<SelectItem> getBooleanSelections() { if (_baseColumn instanceof BooleanColumn) { return ((BooleanColumn<R>) _baseColumn).getBooleanSelections(); } return Collections.emptyList(); } }