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