You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/08/03 12:20:48 UTC

[isis] branch master updated: ISIS-3109: store user's ZoneId from Login to session

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new b9f689441e ISIS-3109: store user's ZoneId from Login to session
b9f689441e is described below

commit b9f689441e7b8427c69e5c68e43cd69f87b552f3
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Aug 3 14:20:42 2022 +0200

    ISIS-3109: store user's ZoneId from Login to session
---
 .../keyvaluestore/KeyValueSessionStore.java        |  6 +--
 .../user/UserCurrentSessionTimeZoneHolder.java     | 53 ++++++++++++++++++++++
 .../IsisModuleCoreRuntimeServices.java             |  4 +-
 .../ImpersonatedUserHolderDefault.java             |  6 +--
 .../UserCurrentSessionTimeZoneHolderDefault.java}  | 42 +++++++----------
 .../wicket/ui/pages/login/IsisSignInPanel.java     | 36 ++++++++++-----
 .../wicket/ui/pages/login/SignInPanelAbstract.java |  1 +
 7 files changed, 103 insertions(+), 45 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/keyvaluestore/KeyValueSessionStore.java b/api/applib/src/main/java/org/apache/isis/applib/services/keyvaluestore/KeyValueSessionStore.java
index 6ea64c26f6..c2e7905b2a 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/keyvaluestore/KeyValueSessionStore.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/keyvaluestore/KeyValueSessionStore.java
@@ -47,7 +47,7 @@ public interface KeyValueSessionStore {
      * Puts given value onto the session store, overriding any existing value.
      * If value is null, removes the entry from the store.
      * <p>
-     * In case there is no session store available, acts as a no-op.
+     * In case there is no session for storing available, acts as a no-op.
      * @param key - unique key (required)
      * @param value - serializable value (optional)
      */
@@ -57,7 +57,7 @@ public interface KeyValueSessionStore {
      * Optionally returns the value that is stored under given key,
      * based on whether a corresponding entry exists.
      * <p>
-     * In case there is no session store available, will return {@link Optional#empty()}.
+     * In case there is no session for storing available, will return {@link Optional#empty()}.
      */
     <T extends Serializable>
     Optional<T> lookupAs(@NonNull String key, @NonNull Class<T> requiredType);
@@ -65,7 +65,7 @@ public interface KeyValueSessionStore {
     /**
      * Removes the entry from the store.
      * <p>
-     * In case there is no session store available, acts as a no-op.
+     * In case there is no session for storing available, acts as a no-op.
      */
     void clear(final @NonNull String key);
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/user/UserCurrentSessionTimeZoneHolder.java b/api/applib/src/main/java/org/apache/isis/applib/services/user/UserCurrentSessionTimeZoneHolder.java
new file mode 100644
index 0000000000..a52215246a
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/user/UserCurrentSessionTimeZoneHolder.java
@@ -0,0 +1,53 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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 org.apache.isis.applib.services.user;
+
+import java.time.ZoneId;
+import java.util.Optional;
+
+import lombok.NonNull;
+
+/**
+ * Stores the user's current {@link ZoneId} with session scope.
+ * <p>
+ * eg. on application login
+ *
+ * @since 2.0 {@index}
+ */
+public interface UserCurrentSessionTimeZoneHolder {
+
+    /**
+     * Sets the user's current {@link ZoneId}
+     * within the context of the current session.
+     */
+    void setUserTimeZone(@NonNull ZoneId zoneId);
+
+    /**
+     * Optionally returns the user's current {@link ZoneId},
+     * based on whether it was set before,
+     * within the context of the current session.
+     *
+     * @apiNote not meant to fallback to system defaults,
+     * instead return {@link Optional#empty()},
+     * if there is no specific time-zone information available
+     */
+    Optional<ZoneId> getUserTimeZone();
+
+
+}
\ No newline at end of file
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java
index 516960719d..d974c527a4 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java
@@ -40,7 +40,6 @@ import org.apache.isis.core.runtimeservices.homepage.HomePageResolverServiceDefa
 import org.apache.isis.core.runtimeservices.i18n.po.TranslationServicePo;
 import org.apache.isis.core.runtimeservices.i18n.po.TranslationServicePoMenu;
 import org.apache.isis.core.runtimeservices.icons.ObjectIconServiceDefault;
-import org.apache.isis.core.runtimeservices.impersonation.ImpersonatedUserHolderDefault;
 import org.apache.isis.core.runtimeservices.interaction.InteractionDtoFactoryDefault;
 import org.apache.isis.core.runtimeservices.jaxb.JaxbServiceDefault;
 import org.apache.isis.core.runtimeservices.locale.LanguageProviderDefault;
@@ -67,6 +66,8 @@ import org.apache.isis.core.runtimeservices.spring.SpringBeansService;
 import org.apache.isis.core.runtimeservices.transaction.TransactionServiceSpring;
 import org.apache.isis.core.runtimeservices.urlencoding.UrlEncodingServiceWithCompression;
 import org.apache.isis.core.runtimeservices.user.ImpersonateMenuAdvisorDefault;
+import org.apache.isis.core.runtimeservices.user.ImpersonatedUserHolderDefault;
+import org.apache.isis.core.runtimeservices.user.UserCurrentSessionTimeZoneHolderDefault;
 import org.apache.isis.core.runtimeservices.userreg.EmailNotificationServiceDefault;
 import org.apache.isis.core.runtimeservices.wrapper.WrapperFactoryDefault;
 import org.apache.isis.core.runtimeservices.xml.XmlServiceDefault;
@@ -115,6 +116,7 @@ import org.apache.isis.core.runtimeservices.xmlsnapshot.XmlSnapshotServiceDefaul
         TransactionServiceSpring.class,
         TranslationServicePo.class,
         UrlEncodingServiceWithCompression.class,
+        UserCurrentSessionTimeZoneHolderDefault.class,
         WrapperFactoryDefault.class,
         XmlServiceDefault.class,
         XmlSnapshotServiceDefault.class,
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/impersonation/ImpersonatedUserHolderDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/user/ImpersonatedUserHolderDefault.java
similarity index 95%
copy from core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/impersonation/ImpersonatedUserHolderDefault.java
copy to core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/user/ImpersonatedUserHolderDefault.java
index 111d09b9fe..1fb34681aa 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/impersonation/ImpersonatedUserHolderDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/user/ImpersonatedUserHolderDefault.java
@@ -16,14 +16,14 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.runtimeservices.impersonation;
+package org.apache.isis.core.runtimeservices.user;
 
 import java.util.Optional;
 
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.keyvaluestore.KeyValueSessionStore;
@@ -31,7 +31,7 @@ import org.apache.isis.applib.services.user.ImpersonatedUserHolder;
 import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices;
 
-@Component
+@Service
 @Named(IsisModuleCoreRuntimeServices.NAMESPACE + ".ImpersonatedUserHolderDefault")
 @javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
 public class ImpersonatedUserHolderDefault implements ImpersonatedUserHolder {
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/impersonation/ImpersonatedUserHolderDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/user/UserCurrentSessionTimeZoneHolderDefault.java
similarity index 53%
rename from core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/impersonation/ImpersonatedUserHolderDefault.java
rename to core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/user/UserCurrentSessionTimeZoneHolderDefault.java
index 111d09b9fe..1979cee4a8 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/impersonation/ImpersonatedUserHolderDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/user/UserCurrentSessionTimeZoneHolderDefault.java
@@ -16,54 +16,44 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.runtimeservices.impersonation;
+package org.apache.isis.core.runtimeservices.user;
 
+import java.time.ZoneId;
 import java.util.Optional;
 
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.keyvaluestore.KeyValueSessionStore;
-import org.apache.isis.applib.services.user.ImpersonatedUserHolder;
-import org.apache.isis.applib.services.user.UserMemento;
+import org.apache.isis.applib.services.user.UserCurrentSessionTimeZoneHolder;
 import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices;
 
-@Component
-@Named(IsisModuleCoreRuntimeServices.NAMESPACE + ".ImpersonatedUserHolderDefault")
+import lombok.NonNull;
+
+@Service
+@Named(IsisModuleCoreRuntimeServices.NAMESPACE + ".UserCurrentSessionTimeZoneHolderDefault")
 @javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
-public class ImpersonatedUserHolderDefault implements ImpersonatedUserHolder {
+public class UserCurrentSessionTimeZoneHolderDefault implements UserCurrentSessionTimeZoneHolder {
 
-    private static final String SESSION_KEY_IMPERSONATED_USER =
-            ImpersonatedUserHolderDefault.class.getName() + "#userMemento";
+    private static final String SESSION_KEY_ZONE_ID =
+            UserCurrentSessionTimeZoneHolderDefault.class.getName() + "#zoneId";
 
     @Inject private Optional<KeyValueSessionStore> keyValueSessionStore;
 
     @Override
-    public boolean supportsImpersonation() {
-        return keyValueSessionStore
-            .map(KeyValueSessionStore::isSessionAvailable)
-            .orElse(false);
-    }
-
-    @Override
-    public void setUserMemento(final UserMemento userMemento) {
+    public void setUserTimeZone(final @NonNull ZoneId zoneId) {
         keyValueSessionStore
-            .ifPresent(store->store.put(SESSION_KEY_IMPERSONATED_USER, userMemento));
-    }
+            .ifPresent(store->store.put(SESSION_KEY_ZONE_ID, zoneId));
 
-    @Override
-    public Optional<UserMemento> getUserMemento() {
-        return keyValueSessionStore
-            .flatMap(store->store.lookupAs(SESSION_KEY_IMPERSONATED_USER, UserMemento.class));
     }
 
     @Override
-    public void clearUserMemento() {
-        keyValueSessionStore
-            .ifPresent(store->store.clear(SESSION_KEY_IMPERSONATED_USER));
+    public Optional<ZoneId> getUserTimeZone() {
+        return keyValueSessionStore
+            .flatMap(store->store.lookupAs(SESSION_KEY_ZONE_ID, ZoneId.class));
     }
 
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/IsisSignInPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/IsisSignInPanel.java
index 4fca418c78..6c19a27077 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/IsisSignInPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/IsisSignInPanel.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.viewer.wicket.ui.pages.login;
 
+import java.util.Optional;
+
 import javax.inject.Inject;
 
 import org.apache.wicket.Component;
@@ -27,15 +29,17 @@ import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.services.user.UserCurrentSessionTimeZoneHolder;
 import org.apache.isis.applib.services.userreg.EmailNotificationService;
 import org.apache.isis.applib.services.userreg.UserRegistrationService;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.viewer.wicket.model.models.PageType;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
 
-import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import lombok.val;
 
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+
 /**
  * An extension of Wicket's default SignInPanel that provides
  * custom markup, based on Bootstrap, and uses
@@ -50,6 +54,8 @@ public class IsisSignInPanel extends SignInPanelAbstract {
     @Inject transient ServiceInjector serviceInjector;
     @Inject transient ServiceRegistry serviceRegistry;
     @Inject transient private PageClassRegistry pageClassRegistry;
+    @Inject transient private UserCurrentSessionTimeZoneHolder userCurrentSessionTimeZoneHolder;
+
     transient Can<UserRegistrationService> anyUserRegistrationService;
     transient Can<EmailNotificationService> anyEmailNotificationService;
 
@@ -97,6 +103,20 @@ public class IsisSignInPanel extends SignInPanelAbstract {
         setVisibilityAllowedBasedOnAvailableServices(signUpLink, passwordResetLink);
     }
 
+    @Override
+    protected void onSignInSucceeded() {
+        signInHook();
+        super.onSignInSucceeded();
+    }
+
+    @Override
+    protected void onSignInRemembered() {
+        signInHook();
+        super.onSignInRemembered();
+    }
+
+    // -- HELPER
+
     private BookmarkablePageLink<Void> addPasswordResetLink() {
         return addLink("passwdResetLink", PageType.PASSWORD_RESET, this.passwordResetLink);
     }
@@ -143,20 +163,12 @@ public class IsisSignInPanel extends SignInPanelAbstract {
         }
     }
 
-    @Override
-    protected void onSignInSucceeded() {
+    private void signInHook() {
         if(clearOriginalDestination) {
             clearOriginalDestination();
         }
-        super.onSignInSucceeded();
-    }
-
-    @Override
-    protected void onSignInRemembered() {
-        if(clearOriginalDestination) {
-            clearOriginalDestination();
-        }
-        super.onSignInRemembered();
+        Optional.ofNullable(getTimezone())
+            .ifPresent(userCurrentSessionTimeZoneHolder::setUserTimeZone);
     }
 
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/SignInPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/SignInPanelAbstract.java
index 889a3eaad3..d26ecdc33d 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/SignInPanelAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/SignInPanelAbstract.java
@@ -323,4 +323,5 @@ implements HasCommonContext {
         }
 
     }
+
 }