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 {
}
}
+
}