diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java index 5c5d41990b933324d0c671c0402a3c442e1fd7c9..0219b08469b3e6f5fbcac365bfc61d0adbf35803 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java @@ -131,7 +131,7 @@ public class DisplaySettingsManager * persistent. */ public <C> void registerGridSettingsChangesListener(final String displayTypeID, - final IDisplaySettingsGetter<C> grid) + final IDisplaySettingsGetter grid) { Listener<ColumnModelEvent> listener = new Listener<ColumnModelEvent>() { @@ -218,7 +218,7 @@ public class DisplaySettingsManager * display type ID. Stored settings (if any) override the current settings. */ public GridDisplaySettings tryApplySettings(String displayTypeID, ColumnModel columnModel, - List<String> filteredColumnIds, SortInfo<?> sortInfo) + List<String> filteredColumnIds, SortInfo sortInfo) { List<ColumnSetting> columnSettings = getColumnSettings(displayTypeID); if (columnSettings == null) @@ -295,7 +295,7 @@ public class DisplaySettingsManager * defaults */ private static GridDisplaySettings tryApplySettings(List<ColumnSetting> columnSettings, - ColumnModel columnModel, List<String> filteredColumnIds, SortInfo<?> sortInfo) + ColumnModel columnModel, List<String> filteredColumnIds, SortInfo sortInfo) { boolean refreshNeeded = false; List<ColumnConfig> newColumnConfigList = new ArrayList<ColumnConfig>(); @@ -304,7 +304,7 @@ public class DisplaySettingsManager String sortField = sortInfo == null ? null : sortInfo.getSortField() == null ? null : sortInfo - .getSortField().getIdentifier(); + .getSortField(); SortDir sortDirection = sortInfo == null ? null : sortInfo.getSortDir(); for (int i = 0; i < columnSettings.size(); i++) @@ -312,6 +312,12 @@ public class DisplaySettingsManager ColumnSetting columnSetting = columnSettings.get(i); // update column using the settings stored for it String columnID = columnSetting.getColumnID(); + SortDir settingSortDirection = columnSetting.getSortDir(); + if (settingSortDirection != null) + { + sortField = columnID; + sortDirection = settingSortDirection; + } ColumnConfig columnConfig = columnModel.getColumnById(columnID); if (columnConfig != null) { @@ -338,14 +344,11 @@ public class DisplaySettingsManager newFilteredColumnIds.add(columnID); } - SortDir columnSortDir = columnSetting.getSortDir(); - if (columnSortDir != null) + if (settingSortDirection != null) { - if (sortInfo == null || columnSortDir != sortInfo.getSortDir() - || columnID.equals(sortInfo.getSortField().getIdentifier()) == false) + if (sortInfo == null || settingSortDirection != sortInfo.getSortDir() + || columnID.equals(sortInfo.getSortField()) == false) { - sortField = columnID; - sortDirection = columnSetting.getSortDir(); refreshNeeded = true; } } @@ -368,13 +371,16 @@ public class DisplaySettingsManager { return new GridDisplaySettings(newColumnConfigList, newFilteredColumnIds, sortField, sortDirection); + } else if (sortDirection != null) + { + return new GridDisplaySettings(null, null, sortField, sortDirection); } else { return null; } } - public <C> void storeSettings(final String displayTypeID, final IDisplaySettingsGetter<C> grid, + public void storeSettings(final String displayTypeID, final IDisplaySettingsGetter grid, boolean delayed) { int delayMs = delayed ? QUITE_TIME_BEFORE_SETTINGS_SAVED_MS : 1; // zero not allowed @@ -390,7 +396,7 @@ public class DisplaySettingsManager } private <C> void storeSettings(String displayTypeID, ColumnModel columnModel, - List<String> filteredColumnIds, Object modifier, SortInfo<C> sortInfo, int delayMs) + List<String> filteredColumnIds, Object modifier, SortInfo sortInfo, int delayMs) { List<ColumnSetting> columnSettings = createColumnsSettings(columnModel, filteredColumnIds, sortInfo); @@ -409,8 +415,8 @@ public class DisplaySettingsManager updater.executeDelayed(1); // 0 not allowed } - private static <C> List<ColumnSetting> createColumnsSettings(ColumnModel columnModel, - List<String> filteredColumnIdsList, SortInfo<C> sortInfo) + private static List<ColumnSetting> createColumnsSettings(ColumnModel columnModel, + List<String> filteredColumnIdsList, SortInfo sortInfo) { Set<String> filteredColumnIds = new HashSet<String>(filteredColumnIdsList); List<ColumnSetting> columnSettings = new ArrayList<ColumnSetting>(); @@ -424,7 +430,7 @@ public class DisplaySettingsManager boolean hasFilter = filteredColumnIds.contains(columnConfig.getId()); columnSetting.setHasFilter(hasFilter); if (sortInfo != null && sortInfo.getSortField() != null - && columnSetting.getColumnID().equals(sortInfo.getSortField().getIdentifier())) + && columnSetting.getColumnID().equals(sortInfo.getSortField())) { columnSetting.setSortDir(sortInfo.getSortDir()); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/IDisplaySettingsGetter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/IDisplaySettingsGetter.java index 2265736819498671a7f846885f417b963c3d9831..c76f8fcda82c795cdf59aa4e2327abe0aa64b985 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/IDisplaySettingsGetter.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/IDisplaySettingsGetter.java @@ -27,7 +27,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SortInfo; * * @author Franz-Josef Elmer */ -public interface IDisplaySettingsGetter<T> +public interface IDisplaySettingsGetter { ColumnModel getColumnModel(); @@ -35,5 +35,5 @@ public interface IDisplaySettingsGetter<T> Object getModifier(); - SortInfo<T> getSortState(); + SortInfo getSortState(); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java index 160f1ee70d207b8e29317b83380773b11d8f5d58..f0f6b7bb1e9539ae17f3065b4845eb9f4d36eca9 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java @@ -690,7 +690,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod resultSetConfig.setLimit(limit); resultSetConfig.setOffset(offset); resultSetConfig.setAvailableColumns(columnDefinitions); - SortInfo<T> translatedSortInfo = translateSortInfo(sortInfo, columnDefinitions); + SortInfo translatedSortInfo = translateSortInfo(sortInfo); Set<String> columnIDs = getIDsOfColumnsToBeShown(); resultSetConfig.setIDsOfPresentedColumns(columnIDs); resultSetConfig.setSortInfo(translatedSortInfo); @@ -725,30 +725,17 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod return columnIDs; } - private static <T> SortInfo<T> translateSortInfo( - com.extjs.gxt.ui.client.data.SortInfo sortInfo, - Set<IColumnDefinition<T>> availableColumns) + private static <T> SortInfo translateSortInfo(com.extjs.gxt.ui.client.data.SortInfo sortInfo) { - return translateSortInfo(sortInfo.getSortField(), sortInfo.getSortDir(), availableColumns); + return translateSortInfo(sortInfo.getSortField(), sortInfo.getSortDir()); } - private static <T> SortInfo<T> translateSortInfo(String sortFieldId, - com.extjs.gxt.ui.client.Style.SortDir sortDir, - Set<IColumnDefinition<T>> availableColumns) + private static <T> SortInfo translateSortInfo(String sortFieldId, + com.extjs.gxt.ui.client.Style.SortDir sortDir) { - IColumnDefinition<T> sortColumnDefinition = null; - if (sortFieldId != null) - { - Map<String, IColumnDefinition<T>> availableColumnsMap = asColumnIdMap(availableColumns); - sortColumnDefinition = availableColumnsMap.get(sortFieldId); - } - - SortInfo<T> sortInfo = new SortInfo<T>(); - if (sortColumnDefinition != null) - { - sortInfo.setSortField(sortColumnDefinition); - sortInfo.setSortDir(translate(sortDir)); - } + SortInfo sortInfo = new SortInfo(); + sortInfo.setSortField(sortFieldId); + sortInfo.setSortDir(translate(sortDir)); return sortInfo; } @@ -885,6 +872,9 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod saveCacheKey(key); GridRowModels<T> rowModels = result.getList(); boolean partial = result.isPartial(); + List<GridCustomColumnInfo> customColumnMetadata = rowModels.getCustomColumnsMetadata(); + customColumnsMetadataProvider.setCustomColumnsMetadata(customColumnMetadata); + if (reloadingPhase) { reloadingPhase = false; @@ -894,13 +884,13 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod BasePagingLoadConfig loadConfig = new BasePagingLoadConfig(); loadConfig.setLimit(resultSetConfig.getLimit()); loadConfig.setOffset(resultSetConfig.getOffset()); - SortInfo<T> sortInfo = resultSetConfig.getSortInfo(); + SortInfo sortInfo = resultSetConfig.getSortInfo(); if (sortInfo != null) { - IColumnDefinition<T> sortField = sortInfo.getSortField(); + String sortField = sortInfo.getSortField(); if (sortField != null) { - loadConfig.setSortField(sortField.getIdentifier()); + loadConfig.setSortField(sortField); loadConfig.setSortDir(translate(sortInfo.getSortDir())); } } @@ -912,8 +902,6 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod this.reuse(); listEntities(resultSetConfig, this); } - List<GridCustomColumnInfo> customColumnMetadata = rowModels.getCustomColumnsMetadata(); - customColumnsMetadataProvider.setCustomColumnsMetadata(customColumnMetadata); // convert the result to the model data for the grid control final List<M> models = createModels(rowModels); final PagingLoadResult<M> loadResult = @@ -1315,10 +1303,8 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod } } - protected final void recreateColumnModelAndRefreshColumnsWithFilters() + private ColumnDefsAndConfigs<T> createColumnDefsAndConfigs() { - int logId = log("recreateColumnModelAndRefreshColumnsWithFilters"); - ColumnDefsAndConfigs<T> defsAndConfigs = createColumnsDefinition(); // add custom columns List<GridCustomColumnInfo> customColumnsMetadata = @@ -1341,6 +1327,15 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod } } + return defsAndConfigs; + } + + protected final void recreateColumnModelAndRefreshColumnsWithFilters() + { + int logId = log("recreateColumnModelAndRefreshColumnsWithFilters"); + + ColumnDefsAndConfigs<T> defsAndConfigs = createColumnDefsAndConfigs(); + this.columnDefinitions = defsAndConfigs.getColumnDefs(); ColumnModel columnModel = createColumnModel(defsAndConfigs.getColumnConfigs()); @@ -1365,19 +1360,16 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod { ColumnModel newColumnModel = columnModel; GridDisplaySettings settings = tryApplyDisplaySettings(newColumnModel); - if (settings != null) + if (settings != null && settings.getColumnConfigs() != null) { newColumnModel = createColumnModel(settings.getColumnConfigs()); rebuildFiltersFromIds(settings.getFilteredColumnIds()); - if (settings.getSortDir() != null && settings.getSortField() != null) - { - setGridSortInfo(settings.getSortField(), settings.getSortDir()); - } } else { filterToolbar.rebuildColumnFilters(getInitialFilters()); } - changeColumnModel(newColumnModel); + changeColumnModel(newColumnModel, settings != null ? settings.getSortField() : null, + settings != null ? settings.getSortDir() : null); } private void hideLoadingMask() @@ -1395,14 +1387,37 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod columnModel, extractColumnIds(initialFilters), getGridSortInfo()); } - private void changeColumnModel(ColumnModel columnModel) + private void reconfigureGrid(ColumnModel columnModelOfVisible) + { + List<Listener<?>> sortlisteners = + new ArrayList<Listener<?>>(grid.getListeners(Events.SortChange)); + for (Listener<?> listener : sortlisteners) + { + grid.removeListener(Events.SortChange, listener); + } + + grid.reconfigure(grid.getStore(), columnModelOfVisible); + + for (Listener<?> listener : sortlisteners) + { + grid.addListener(Events.SortChange, listener); + } + } + + private void changeColumnModel(ColumnModel columnModel, String sortField, SortDir sortDir) { fullColumnModel = columnModel; int logId = log("grid reconfigure"); ColumnModel columnModelOfVisible = trimToVisibleColumns(columnModel); - grid.reconfigure(grid.getStore(), columnModelOfVisible); + if (sortDir != null && sortField != null) + { + pagingLoader.setSortDir(translate(sortDir)); + pagingLoader.setSortField(sortField); + } + reconfigureGrid(columnModelOfVisible); + viewContext.logStop(logId); registerGridSettingsChangesListener(); // add listeners of full column model to trimmed model @@ -1471,9 +1486,9 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod pagingLoader.load(0, PAGE_SIZE); } - private IDisplaySettingsGetter<T> createDisplaySettingsUpdater() + private IDisplaySettingsGetter createDisplaySettingsUpdater() { - return new IDisplaySettingsGetter<T>() + return new IDisplaySettingsGetter() { public ColumnModel getColumnModel() { @@ -1490,7 +1505,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod return AbstractBrowserGrid.this; } - public SortInfo<T> getSortState() + public SortInfo getSortState() { return AbstractBrowserGrid.this.getGridSortInfo(); } @@ -1635,7 +1650,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod // Default visibility so that friend classes can use -- should otherwise be considered private void saveColumnDisplaySettings() { - IDisplaySettingsGetter<T> settingsUpdater = createDisplaySettingsUpdater(); + IDisplaySettingsGetter settingsUpdater = createDisplaySettingsUpdater(); viewContext.getDisplaySettingsManager().storeSettings(getGridDisplayTypeID(), settingsUpdater, false); } @@ -1662,7 +1677,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod final List<IColumnDefinition<T>> columnDefs = allColumns ? new ArrayList<IColumnDefinition<T>>(columnDefinitions) : getVisibleColumns(columnDefinitions); - SortInfo<T> sortInfo = getGridSortInfo(); + SortInfo sortInfo = getGridSortInfo(); final TableExportCriteria<T> exportCriteria = new TableExportCriteria<T>(resultSetKeyOrNull, sortInfo, filterToolbar.getFilters(), columnDefs, columnDefinitions, @@ -1671,23 +1686,10 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod } // returns info about sorting in current grid - SortInfo<T> getGridSortInfo() + SortInfo getGridSortInfo() { ListStore<M> store = grid.getStore(); - return translateSortInfo(store.getSortField(), store.getSortDir(), columnDefinitions); - } - - private void setGridSortInfo(String sortField, SortDir sortDir) - { - com.extjs.gxt.ui.client.data.SortInfo old = grid.getStore().getSortState(); - grid.getStore().setDefaultSort(sortField, translate(sortDir)); - - if (old.getSortDir() != translate(sortDir) - || (sortField == null && old.getSortField() != null) - || (sortField != null && sortField.equals(old.getSortField()) == false)) - { - grid.getStore().sort(sortField, translate(sortDir)); - } + return translateSortInfo(store.getSortField(), store.getSortDir()); } /** @return the number of all objects cached in the browser */ diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java index 02fa5d0f91068a41f1225afcc6c5e0b994635110..3129306578523f4b5ba934411a131b56de23d6b3 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java @@ -93,7 +93,7 @@ class ColumnSettingsConfigurer<T, M extends BaseEntityModel<T>> DisplaySettingsManager displaySettingsManager = viewContext.getDisplaySettingsManager(); displaySettingsManager.storeSettings(gridDisplayTypeID, - new IDisplaySettingsGetter<T>() + new IDisplaySettingsGetter() { public Object getModifier() { @@ -110,7 +110,7 @@ class ColumnSettingsConfigurer<T, M extends BaseEntityModel<T>> return newColumnModel; } - public SortInfo<T> getSortState() + public SortInfo getSortState() { return browserGrid.getGridSortInfo(); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DefaultResultSetConfig.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DefaultResultSetConfig.java index a83719f05bd8253c5b176fa654e68bd6ac36748e..56cd7fb1cf36f3e43c534d4e68b8f477ffd44d72 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DefaultResultSetConfig.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DefaultResultSetConfig.java @@ -36,12 +36,12 @@ public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsS private int offset = 0; - private SortInfo<T> sortInfo = new SortInfo<T>(); + private SortInfo sortInfo = new SortInfo(); private ResultSetFetchConfig<K> cacheConfig = ResultSetFetchConfig.createComputeAndCache(); private Set<IColumnDefinition<T>> availableColumns; - + private Set<String> idsOfPresentedColumns; private GridFilters<T> filters = GridFilters.createEmptyFilter(); @@ -71,7 +71,7 @@ public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsS this.offset = offset; } - public final void setSortInfo(final SortInfo<T> sortInfo) + public final void setSortInfo(final SortInfo sortInfo) { this.sortInfo = sortInfo; } @@ -95,7 +95,7 @@ public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsS { return idsOfPresentedColumns; } - + public void setPresentedColumns(List<IColumnDefinition<T>> presentedColumns) { Set<String> ids = new HashSet<String>(); @@ -110,7 +110,7 @@ public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsS { this.idsOfPresentedColumns = idsOfPresentedColumns; } - + public final void copyPagingConfig(DefaultResultSetConfig<K, T> resultSetConfig) { setLimit(resultSetConfig.getLimit()); @@ -143,7 +143,7 @@ public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsS return availableColumns; } - public final SortInfo<T> getSortInfo() + public final SortInfo getSortInfo() { return sortInfo; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IResultSetConfig.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IResultSetConfig.java index 5aa2dafbcd9deeebc8c75925a15d0827c62fe0cd..94cdf8a473f29d9591846257cea36c19aca9abf2 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IResultSetConfig.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IResultSetConfig.java @@ -54,7 +54,7 @@ public interface IResultSetConfig<K, T> * include custom columns only if this information was already fetched. */ public Set<IColumnDefinition<T>> getAvailableColumns(); - + /** * Returns the IDs of those columns which will be shown at the client. */ @@ -63,7 +63,7 @@ public interface IResultSetConfig<K, T> /** * Returns the sort info. */ - public SortInfo<T> getSortInfo(); + public SortInfo getSortInfo(); /** The filters which should be applied for the result. */ public GridFilters<T> getFilters(); @@ -73,7 +73,7 @@ public interface IResultSetConfig<K, T> * to compute them. */ public String tryGetGridDisplayId(); - + /** * Should the error message from the server be long or short? */ diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/TableExportCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/TableExportCriteria.java index 94c2baea853eb6b23c31f1c3ada2c5924c9243fa..7811768e7a6c1781f5c213f8124d3c670a758c69 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/TableExportCriteria.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/TableExportCriteria.java @@ -35,7 +35,7 @@ public class TableExportCriteria<T/* exported entity */> implements IsSerializab // a key at which data are stored in the server cache private String resultSetKey; - private SortInfo<T> sortInfo = new SortInfo<T>(); + private SortInfo sortInfo = new SortInfo(); /** @see IResultSetConfig#getFilters() */ private GridFilters<T> filters; @@ -57,7 +57,7 @@ public class TableExportCriteria<T/* exported entity */> implements IsSerializab { } - public TableExportCriteria(String resultSetKey, SortInfo<T> sortInfo, GridFilters<T> filters, + public TableExportCriteria(String resultSetKey, SortInfo sortInfo, GridFilters<T> filters, List<IColumnDefinition<T>> columnDefs, Set<IColumnDefinition<T>> availableColumns, String gridDisplayId) { @@ -77,7 +77,7 @@ public class TableExportCriteria<T/* exported entity */> implements IsSerializab return resultSetKey; } - public SortInfo<T> getSortInfo() + public SortInfo getSortInfo() { return sortInfo; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java index 9af619f9699a4adeef9cfa4c5ada45b5d502ebd7..eff4ecd8b8c749ca553f7e5450cb4e3801a47b19 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java @@ -324,10 +324,10 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se { ids.addAll(idsOfPresentedColumns); } - IColumnDefinition<T> sortField = resultConfig.getSortInfo().getSortField(); + String sortField = resultConfig.getSortInfo().getSortField(); if (sortField != null) { - ids.add(sortField.getIdentifier()); + ids.add(sortField); } GridFilters<T> filters = resultConfig.getFilters(); List<GridColumnFilterInfo<T>> filterInfos = filters.tryGetFilterInfos(); @@ -601,7 +601,8 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se return true; } - private static <T> void sortData(final GridRowModels<T> data, final SortInfo<T> sortInfo) + private static <T> void sortData(final GridRowModels<T> data, final SortInfo sortInfo, + final Set<IColumnDefinition<T>> availableColumns) { assert data != null : "Unspecified data."; assert sortInfo != null : "Unspecified sort information."; @@ -610,14 +611,26 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se return; } final SortDir sortDir = sortInfo.getSortDir(); - final IColumnDefinition<T> sortField = sortInfo.getSortField(); + final String sortField = sortInfo.getSortField(); if (sortDir == SortDir.NONE || sortField == null) { return; + } else + { + IColumnDefinition<T> sortFieldDefinition = null; + for (IColumnDefinition<T> column : availableColumns) + { + if (sortField.equals(column.getIdentifier())) + { + sortFieldDefinition = column; + Comparator<GridRowModel<T>> comparator = + ColumnSortUtils.createComparator(sortDir, sortFieldDefinition); + Collections.sort(data, comparator); + break; + } + } + } - Comparator<GridRowModel<T>> comparator = - ColumnSortUtils.createComparator(sortDir, sortField); - Collections.sort(data, comparator); } private static int getLimit(final int size, final int limit, final int offset) @@ -735,7 +748,7 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se return calculateSortAndFilterResult(sessionToken, tableData, createMatchingConfig(resultConfig, headers), dataKey, partial); } - + private <T> IResultSetConfig<K, T> createMatchingConfig(IResultSetConfig<K, T> resultSetConfig, List<TableModelColumnHeader> headers) { @@ -751,7 +764,7 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se Set<IColumnDefinition<T>> newAvailableColumns = new HashSet<IColumnDefinition<T>>(); Set<String> idsOfPresentedColumns = resultSetConfig.getIDsOfPresentedColumns(); Set<String> newIdsOfPresentedColumns = new HashSet<String>(); - SortInfo<T> sortInfo = resultSetConfig.getSortInfo(); + SortInfo sortInfo = resultSetConfig.getSortInfo(); TableMap<String, GridColumnFilterInfo<T>> columnFilterInfos = getColumFilters(resultSetConfig); List<GridColumnFilterInfo<T>> newColumnFilterInfos = @@ -770,10 +783,10 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se } if (sortInfo != null) { - IColumnDefinition<T> sortField = sortInfo.getSortField(); - if (sortField != null && sortField.getIdentifier().equals(id)) + String sortField = sortInfo.getSortField(); + if (sortField != null && sortField.equals(id)) { - sortInfo.setSortField(definition); + sortInfo.setSortField(id); } } GridColumnFilterInfo<T> filterInfo = columnFilterInfos.tryGet(id); @@ -783,7 +796,7 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se newColumnFilterInfos.add(new GridColumnFilterInfo<T>(definition, pattern)); } } - + DefaultResultSetConfig<K, T> newConfig = new DefaultResultSetConfig<K, T>(); newConfig.setAvailableColumns(newAvailableColumns); newConfig.setCacheConfig(resultSetConfig.getCacheConfig()); @@ -811,17 +824,17 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se filterInfosOrNull = Collections.emptyList(); } TableMap<String, GridColumnFilterInfo<T>> columnFilterInfos = - new TableMap<String, GridColumnFilterInfo<T>>(filterInfosOrNull, - new IKeyExtractor<String, GridColumnFilterInfo<T>>() - { - public String getKey(GridColumnFilterInfo<T> e) - { - return e.getFilteredField().getIdentifier(); - } - }); + new TableMap<String, GridColumnFilterInfo<T>>(filterInfosOrNull, + new IKeyExtractor<String, GridColumnFilterInfo<T>>() + { + public String getKey(GridColumnFilterInfo<T> e) + { + return e.getFilteredField().getIdentifier(); + } + }); return columnFilterInfos; } - + private <T> boolean hasNoStaleAvailableColumn(IResultSetConfig<K, T> resultSetConfig, List<TableModelColumnHeader> headers) { @@ -833,6 +846,10 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se Set<IColumnDefinition<T>> availableColumns = resultSetConfig.getAvailableColumns(); if (availableColumns != null) { + if (availableColumns.size() != headers.size()) + { + return false; + } for (IColumnDefinition<T> definition : availableColumns) { if (headerIds.contains(definition.getIdentifier()) == false) @@ -941,8 +958,8 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se final int size = filteredData.size(); final int offset = getOffset(size, resultConfig.getOffset()); final int limit = getLimit(size, resultConfig.getLimit(), offset); - final SortInfo<T> sortInfo = resultConfig.getSortInfo(); - sortData(filteredData, sortInfo); + final SortInfo sortInfo = resultConfig.getSortInfo(); + sortData(filteredData, sortInfo, resultConfig.getAvailableColumns()); final GridRowModels<T> list = subList(filteredData, offset, limit); return new DefaultResultSet<K, T>(dataKey, list, size, partial); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SortInfo.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SortInfo.java index 305bdfaa92a1cd743af7403be4ebad5f12a2dc8a..f96fdceefc3a9b696533e8df6424ef77ca728ec7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SortInfo.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SortInfo.java @@ -18,7 +18,6 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; import com.google.gwt.user.client.rpc.IsSerializable; -import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition; import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable; /** @@ -26,20 +25,20 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable; * * @author Christian Ribeaud */ -public final class SortInfo<T> implements ISerializable +public final class SortInfo implements ISerializable { private static final long serialVersionUID = 1L; - private IColumnDefinition<T> sortField; + private String sortField; private SortDir sortDir = SortDir.NONE; - public final IColumnDefinition<T> getSortField() + public final String getSortField() { return sortField; } - public final void setSortField(final IColumnDefinition<T> sortField) + public final void setSortField(final String sortField) { this.sortField = sortField; } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/clientnonjs/DisplaySettingsManagerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/clientnonjs/DisplaySettingsManagerTest.java index bef048fd1b34a875e6747caf438b31456b018ecd..ff2bc2592cbadc4351bfe9c669675ce94f88669a 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/clientnonjs/DisplaySettingsManagerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/clientnonjs/DisplaySettingsManagerTest.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.apache.poi.hssf.record.formula.functions.T; import org.jmock.Expectations; import org.jmock.Mockery; import org.testng.AssertJUnit; @@ -84,7 +83,7 @@ public class DisplaySettingsManagerTest extends AssertJUnit private IDelayedUpdater updater; - private IDisplaySettingsGetter<T> grid; + private IDisplaySettingsGetter grid; private DisplaySettingsManager manager; @@ -94,7 +93,6 @@ public class DisplaySettingsManagerTest extends AssertJUnit private WebClientConfiguration webClientConfiguration; - @SuppressWarnings("unchecked") @BeforeMethod public void setUp() { diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java index 74bbb35a033f08e2ae50397c4291f8e89fc2c9e7..838abc9bb63fe8a6411fd77309422ab6906046e4 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java @@ -225,11 +225,10 @@ public final class CachedResultSetManagerTest extends AssertJUnit return this; } - private SortInfo<DataHolder> createSortInfo(String columnDefinitionID, - SortDir sortingDirection) + private SortInfo createSortInfo(String columnDefinitionID, SortDir sortingDirection) { - SortInfo<DataHolder> sortInfo = new SortInfo<DataHolder>(); - sortInfo.setSortField(getDefinition(columnDefinitionID)); + SortInfo sortInfo = new SortInfo(); + sortInfo.setSortField(getDefinition(columnDefinitionID).getIdentifier()); sortInfo.setSortDir(sortingDirection); return sortInfo; } @@ -282,16 +281,20 @@ public final class CachedResultSetManagerTest extends AssertJUnit return recordedColumnCodes.toString(); } } - - private static final class MockOriginalDataProvider implements IOriginalDataProvider<DataHolder> + + private static final class MockOriginalDataProvider implements + IOriginalDataProvider<DataHolder> { private final List<DataHolder> data; + private final int maxSizeThresholdForSlowDelivery; + private final long timeToDeliver; - + private List<Integer> recordedMaxSizes = new ArrayList<Integer>(); - MockOriginalDataProvider(List<DataHolder> data, int maxSizeThresholdForSlowDelivery, long timeToDeliver) + MockOriginalDataProvider(List<DataHolder> data, int maxSizeThresholdForSlowDelivery, + long timeToDeliver) { this.data = data; this.maxSizeThresholdForSlowDelivery = maxSizeThresholdForSlowDelivery; @@ -318,7 +321,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit { return Arrays.asList(); } - + } private IOriginalDataProvider<DataHolder> originalDataProvider; @@ -385,16 +388,16 @@ public final class CachedResultSetManagerTest extends AssertJUnit context.assertIsSatisfied(); } - + @Test public void testOffsetAndLimit() { prepareDataAndCustomColumnDefinitions(20, 10); ResultSetConfigBuilder builder = - new ResultSetConfigBuilder(COL_DEFS).displayID(GRID_DISPLAY_ID); - + new ResultSetConfigBuilder(COL_DEFS).displayID(GRID_DISPLAY_ID); + getAndCheckRows(10, 0, builder.offset(-1).limit(10)); - + builder.fetchFromCache(KEY); getAndCheckRows(10, 9, builder.offset(9).limit(10)); getAndCheckRows(10, 10, builder.offset(10).limit(10)); @@ -402,7 +405,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit getAndCheckRows(1, 19, builder.offset(19).limit(10)); getAndCheckRows(1, 19, builder.offset(20).limit(10)); getAndCheckRows(1, 19, builder.offset(21).limit(10)); - + context.assertIsSatisfied(); } @@ -880,7 +883,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit context.assertIsSatisfied(); } - + @Test public void testWaitingForFuture() { @@ -895,35 +898,34 @@ public final class CachedResultSetManagerTest extends AssertJUnit will(returnValue(KEY)); } }); - + // First call gets only first page IResultSet<Long, DataHolder> resultSet = - resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider); + resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider); assertEquals(true, resultSet.isPartial()); assertEquals(1, resultSet.getList().size()); assertEquals(1, resultSet.getTotalLength()); assertEquals("a", getData(resultSet, 0)); - + // Second call has to wait builder.fetchFromCache(KEY); - resultSet = - resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider); + resultSet = resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider); assertEquals(false, resultSet.isPartial()); assertEquals(1, resultSet.getList().size()); assertEquals(4, resultSet.getTotalLength()); assertEquals("a", getData(resultSet, 0)); - + // Third call get sorted value builder.sortDesc("col1"); - resultSet = - resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider); + resultSet = resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider); assertEquals(false, resultSet.isPartial()); assertEquals(1, resultSet.getList().size()); assertEquals(4, resultSet.getTotalLength()); assertEquals("d", getData(resultSet, 0)); - - assertEquals(Arrays.asList(1, Integer.MAX_VALUE).toString(), dataProvider.recordedMaxSizes.toString()); - + + assertEquals(Arrays.asList(1, Integer.MAX_VALUE).toString(), + dataProvider.recordedMaxSizes.toString()); + context.assertIsSatisfied(); } @@ -1027,7 +1029,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit { prepareDataAndCustomColumnDefinitions(size, Integer.MAX_VALUE, columns); } - + private void prepareDataAndCustomColumnDefinitions(final int size, final int maxSize, final GridCustomColumn... columns) { @@ -1044,10 +1046,10 @@ public final class CachedResultSetManagerTest extends AssertJUnit rows[i] = new DataHolder(i + "-a" + i % 2); } will(returnValue(Arrays.asList(rows))); - + one(originalDataProvider).getHeaders(); will(returnValue(Arrays.asList())); - + if (size >= maxSize) { one(originalDataProvider).getOriginalData(Integer.MAX_VALUE); @@ -1131,7 +1133,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit { return null; // unused } - + public DataTypeCode tryToGetDataType() { return null; diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java index 4fbbefc0b2974020974da470a82b5914663527e8..8813a2bbab20070eb88117b07ea38a96f34c0288 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java @@ -21,7 +21,9 @@ import static org.testng.AssertJUnit.assertEquals; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.testng.annotations.Test; @@ -34,7 +36,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewColumnOrFilter; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ParameterWithValue; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableGridColumnDefinition; /** * @author Franz-Josef Elmer @@ -119,8 +123,9 @@ public class FilterSystemTest extends SystemTestCase { DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>> config = new DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>>(); - config.setAvailableColumns(Collections - .<IColumnDefinition<TableModelRowWithObject<GridCustomFilter>>> emptySet()); + config.setAvailableColumns(createAvailableColumnsDefinition()); + config.setIDsOfPresentedColumns(new HashSet<String>(Arrays.asList("NAME", "DESCRIPTION", + "EXPRESSION", "IS_PUBLIC", "REGISTRATOR", "REGISTRATION_DATE"))); CustomFilterInfo<TableModelRowWithObject<GridCustomFilter>> customFilterInfo = new CustomFilterInfo<TableModelRowWithObject<GridCustomFilter>>(); customFilterInfo.setExpression("${threshold} < 42"); @@ -132,6 +137,26 @@ public class FilterSystemTest extends SystemTestCase return config; } + private Set<IColumnDefinition<TableModelRowWithObject<GridCustomFilter>>> createAvailableColumnsDefinition() + { + Set<IColumnDefinition<TableModelRowWithObject<GridCustomFilter>>> result = + new HashSet<IColumnDefinition<TableModelRowWithObject<GridCustomFilter>>>(); + + String[] headerIds = + { "NAME", "DESCRIPTION", "EXPRESSION", "IS_PUBLIC", "REGISTRATOR", + "REGISTRATION_DATE" }; + + for (int i = 0; i < headerIds.length; i++) + { + TableModelColumnHeader header = + new TableModelColumnHeader(headerIds[i], headerIds[i], i); + IColumnDefinition<TableModelRowWithObject<GridCustomFilter>> definition = + new TypedTableGridColumnDefinition<GridCustomFilter>(header, null, "", null); + result.add(definition); + } + return result; + } + private NewColumnOrFilter createFilter() { NewColumnOrFilter filter = new NewColumnOrFilter();