From 46cab83b4eeaff0dc139a2d90c2ab070aeaedc32 Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Tue, 22 Mar 2011 09:10:55 +0000 Subject: [PATCH] LMS-2146 DisplaySettings extended. Joining of visits handled. SVN: 20432 --- .../framework/DisplaySettingsManager.java | 12 +++ .../web/server/AbstractClientService.java | 6 +- .../WebClientConfigurationProvider.java | 9 +- .../generic/server/AbstractServer.java | 26 +++++- .../generic/shared/AbstractServerLogger.java | 2 +- .../cisd/openbis/generic/shared/IServer.java | 2 +- .../shared/basic/dto/DisplaySettings.java | 17 ++++ .../generic/shared/basic/dto/EntityVisit.java | 90 +++++++++++++++++++ .../basic/dto/WebClientConfiguration.java | 12 +++ .../web/server/CommonClientServiceTest.java | 8 +- .../generic/server/CommonServerTest.java | 37 +++++++- 11 files changed, 211 insertions(+), 10 deletions(-) create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityVisit.java 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 f8168512503..b73deb5586f 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 @@ -39,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailViewConfiguration; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityVisit; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebClientConfiguration; @@ -521,5 +522,16 @@ public class DisplaySettingsManager { displaySettings.getDropDownSettings().put(dropDownSettingsID, newValue); } + + @SuppressWarnings("deprecation") + public void rememberVisit(EntityVisit visit) + { + displaySettings.addEntityVisit(visit); + } + @SuppressWarnings("deprecation") + public List<EntityVisit> getVisits() + { + return displaySettings.getVisits(); + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java index 93720c8804b..14cc7bff635 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java @@ -549,7 +549,8 @@ public abstract class AbstractClientService implements IClientService, { final String sessionToken = getSessionToken(); IServer server = getServer(); - server.saveDisplaySettings(sessionToken, displaySettings); + int maxEntityVisits = getWebClientConfiguration().getMaxEntityVisits(); + server.saveDisplaySettings(sessionToken, displaySettings, maxEntityVisits); } catch (InvalidSessionException e) { // ignored @@ -611,7 +612,8 @@ public abstract class AbstractClientService implements IClientService, if (simpleViewMode == false) { // only save settings for "normal" view - server.saveDisplaySettings(sessionToken, displaySettings); + int maxEntityVisits = getWebClientConfiguration().getMaxEntityVisits(); + server.saveDisplaySettings(sessionToken, displaySettings, maxEntityVisits); } server.logout(sessionToken); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java index 0530aec0c92..e82db8c89e4 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java @@ -58,9 +58,13 @@ public class WebClientConfigurationProvider private static final ViewMode DEFAULT_VIEW_MODE_VALUE = ViewMode.NORMAL; private static final String MAX_VISIBLE_COLUMNS = "max-visible-columns"; - + private static final int DEFAULT_MAX_VISIBLE_COLUMNS = 50; + private static final String MAX_ENTITY_VISITS = "max-entity-visits"; + + private static final int DEFAULT_MAX_ENTITY_VISITS = 20; + private static final String DATA_SET_TYPES_WITH_IMAGE_OVERVIEW = "data-set-types-with-image-overview"; @@ -89,12 +93,15 @@ public class WebClientConfigurationProvider { webClientConfiguration.setDefaultViewMode(DEFAULT_VIEW_MODE_VALUE); webClientConfiguration.setMaxVisibleColumns(DEFAULT_MAX_VISIBLE_COLUMNS); + webClientConfiguration.setMaxEntityVisits(DEFAULT_MAX_ENTITY_VISITS); } private void init(Properties properties) { webClientConfiguration.setDefaultViewMode(extractDefaultViewMode(properties)); webClientConfiguration.setMaxVisibleColumns(extractMaxVisibleColumns(properties)); + webClientConfiguration.setMaxEntityVisits(PropertyUtils.getInt(properties, + MAX_ENTITY_VISITS, DEFAULT_MAX_ENTITY_VISITS)); webClientConfiguration .setDataSetTypesWithImageOverview(extractDataSetTypesWithImageOverview(properties)); webClientConfiguration.setViews(extractHiddenSections(properties)); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java index f917a7efe9f..df590950ab2 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.server; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Set; @@ -44,6 +45,7 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.validator.Expressio import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityVisit; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomColumn; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSamplesWithTypes; @@ -351,7 +353,7 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp return false; } - public void saveDisplaySettings(String sessionToken, DisplaySettings displaySettings) + public void saveDisplaySettings(String sessionToken, DisplaySettings displaySettings, int maxEntityVisits) { try { @@ -359,6 +361,20 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp PersonPE person = session.tryGetPerson(); if (person != null) { + List<EntityVisit> visits = joinVisits(displaySettings, person); + Collections.sort(visits, new Comparator<EntityVisit>() + { + public int compare(EntityVisit o1, EntityVisit o2) + { + long t1 = o1.getTimeStamp(); + long t2 = o2.getTimeStamp(); + return t1 < t2 ? 1 : (t1 > t2 ? -1 : 0); + } + }); + for (int i = visits.size() - 1; i >= maxEntityVisits; i--) + { + visits.remove(i); + } person.setDisplaySettings(displaySettings); getDAOFactory().getPersonDAO().updatePerson(person); } @@ -368,6 +384,14 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp } } + @SuppressWarnings("deprecation") + private List<EntityVisit> joinVisits(DisplaySettings displaySettings, PersonPE person) + { + List<EntityVisit> visits = displaySettings.getVisits(); + visits.addAll(person.getDisplaySettings().getVisits()); + return visits; + } + public DisplaySettings getDefaultDisplaySettings(String sessionToken) { PersonPE systemUser = diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java index 84ba5738502..980b0709ec2 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java @@ -239,7 +239,7 @@ public abstract class AbstractServerLogger implements IServer return false; } - public void saveDisplaySettings(String sessionToken, DisplaySettings displaySettings) + public void saveDisplaySettings(String sessionToken, DisplaySettings displaySettings, int maxEntityVisits) { logTracking(sessionToken, "save_display_settings", ""); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IServer.java index b4086e0ea5b..c8f01326107 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IServer.java @@ -77,7 +77,7 @@ public interface IServer extends ISessionProvider public DisplaySettings getDefaultDisplaySettings(String sessionToken); @Transactional - public void saveDisplaySettings(String sessionToken, DisplaySettings displaySettings); + public void saveDisplaySettings(String sessionToken, DisplaySettings displaySettings, int maxEntityVisits); /** * Lists grid custom columns for a given grid id. diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DisplaySettings.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DisplaySettings.java index cd0ee1186b7..abf8f587334 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DisplaySettings.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DisplaySettings.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; import java.io.Serializable; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -68,6 +69,8 @@ public class DisplaySettings implements ISerializable private Map<String, Boolean> panelCollapsedSettings = new HashMap<String, Boolean>(); private Map<String, Integer> panelSizeSettings = new HashMap<String, Integer>(); + + private List<EntityVisit> visits = new ArrayList<EntityVisit>(); /** @deprecated Should be used only by DisplaySettingsManager. */ @Deprecated @@ -254,5 +257,19 @@ public class DisplaySettings implements ISerializable { this.ignoreLastHistoryToken = ignoreLastHistoryToken; } + + /** @deprecated Should be used only by DisplaySettingsManager. */ + @Deprecated + public void addEntityVisit(EntityVisit entityVisit) + { + visits.add(entityVisit); + } + + /** @deprecated Should be used only by DisplaySettingsManager. */ + @Deprecated + public List<EntityVisit> getVisits() + { + return visits; + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityVisit.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityVisit.java new file mode 100644 index 00000000000..5f4db6546f1 --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityVisit.java @@ -0,0 +1,90 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.generic.shared.basic.dto; + +import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable; + +/** + * Visit of an entity. Objects of this class are created when the detail view of an entity is + * opened in the GUI. + * + * @author Franz-Josef Elmer + */ +public class EntityVisit implements ISerializable +{ + private static final long serialVersionUID = 1L; + + private String entityKind; + + private String entityTypeCode; + + private String identifier; + + private String permID; + + private long timeStamp; + + public String getEntityKind() + { + return entityKind; + } + + public void setEntityKind(String entityKind) + { + this.entityKind = entityKind; + } + + public String getEntityTypeCode() + { + return entityTypeCode; + } + + public void setEntityTypeCode(String entityTypeCode) + { + this.entityTypeCode = entityTypeCode; + } + + public String getIdentifier() + { + return identifier; + } + + public void setIdentifier(String identifier) + { + this.identifier = identifier; + } + + public String getPermID() + { + return permID; + } + + public void setPermID(String permID) + { + this.permID = permID; + } + + public long getTimeStamp() + { + return timeStamp; + } + + public void setTimeStamp(long timeStamp) + { + this.timeStamp = timeStamp; + } +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java index 358911e4d73..b4f55ae6ef9 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java @@ -48,6 +48,8 @@ public class WebClientConfiguration implements ISerializable private ViewMode defaultViewMode; private int maxVisibleColumns; + + private int maxEntityVisits; public String getPropertyOrNull(String technology, String key) { @@ -100,6 +102,16 @@ public class WebClientConfiguration implements ISerializable this.maxVisibleColumns = maxVisibleColumns; } + public int getMaxEntityVisits() + { + return maxEntityVisits; + } + + public void setMaxEntityVisits(int maxEntityVisits) + { + this.maxEntityVisits = maxEntityVisits; + } + public WebClientConfiguration() { } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java index 88f2f4300c2..7fbc22145a8 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Properties; import org.jmock.Expectations; import org.testng.annotations.BeforeMethod; @@ -156,6 +157,9 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest commonClientService = new CommonClientService(commonServer, requestContextProvider); commonClientService.setCifexURL(CIFEX_URL); commonClientService.setCifexRecipient(CIFEX_RECIPIENT); + commonClientService.webClientConfigurationProvider = + new WebClientConfigurationProvider(new Properties()); + } @Test @@ -543,7 +547,7 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest { prepareGetSessionToken(this); - one(commonServer).saveDisplaySettings(SESSION_TOKEN, displaySettings); + one(commonServer).saveDisplaySettings(SESSION_TOKEN, displaySettings, 20); } }); commonClientService.updateDisplaySettings(displaySettings); @@ -593,7 +597,7 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest one(httpSession).removeAttribute(SessionConstants.OPENBIS_EXPORT_MANAGER); one(httpSession).invalidate(); - one(commonServer).saveDisplaySettings(SESSION_TOKEN, displaySettings); + one(commonServer).saveDisplaySettings(SESSION_TOKEN, displaySettings, 20); one(commonServer).logout(SESSION_TOKEN); } }); diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java index af278137a74..17b2bf54930 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java @@ -46,6 +46,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityVisit; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; @@ -1450,8 +1451,11 @@ public final class CommonServerTest extends AbstractServerTestCase @Test public void testSaveDisplaySettings() { - final DisplaySettings displaySettings = new DisplaySettings(); final PersonPE person = new PersonPE(); + EntityVisit v1 = visit(EntityKind.EXPERIMENT, 1); + EntityVisit v2 = visit(EntityKind.SAMPLE, 2); + DisplaySettings currentDisplaySettings = displaySettingsWithVisits(v1, v2); + person.setDisplaySettings(currentDisplaySettings); context.checking(new Expectations() { { @@ -1463,13 +1467,42 @@ public final class CommonServerTest extends AbstractServerTestCase one(personDAO).updatePerson(person); } }); + EntityVisit v3 = visit(EntityKind.DATA_SET, 3); + DisplaySettings displaySettings = displaySettingsWithVisits(v3); - createServer().saveDisplaySettings(SESSION_TOKEN, displaySettings); + createServer().saveDisplaySettings(SESSION_TOKEN, displaySettings, 2); assertSame(displaySettings, person.getDisplaySettings()); + @SuppressWarnings("deprecation") + List<EntityVisit> visits = displaySettings.getVisits(); + assertEquals("DATA_SET-3", visits.get(0).getEntityTypeCode()); + assertEquals("SAMPLE-2", visits.get(1).getEntityTypeCode()); + assertEquals(2, visits.size()); context.assertIsSatisfied(); } + + @SuppressWarnings("deprecation") + private DisplaySettings displaySettingsWithVisits(EntityVisit... entityVisits) + { + DisplaySettings settings = new DisplaySettings(); + for (EntityVisit entityVisit : entityVisits) + { + settings.addEntityVisit(entityVisit); + } + return settings; + } + + private EntityVisit visit(EntityKind kind, long timeStamp) + { + EntityVisit entityVisit = new EntityVisit(); + entityVisit.setEntityKind(kind.toString()); + entityVisit.setEntityTypeCode(kind + "-" + timeStamp); + entityVisit.setIdentifier("E" + timeStamp); + entityVisit.setPermID("id-" + timeStamp); + entityVisit.setTimeStamp(timeStamp); + return entityVisit; + } @Test public void testChangeUserHomeGroup() -- GitLab