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 2020/12/04 15:44:23 UTC

[isis] branch master updated: ISIS-2464: toString, equals and hashCode for VirtualClock(s)

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 87b3bdc  ISIS-2464: toString, equals and hashCode for VirtualClock(s)
87b3bdc is described below

commit 87b3bdcf434fbc0ad6584528caaa01ab4b713d5c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Dec 4 16:44:08 2020 +0100

    ISIS-2464: toString, equals and hashCode for VirtualClock(s)
---
 .../org/apache/isis/applib/clock/VirtualClock.java |  2 +-
 .../isis/applib/clock/VirtualClock_frozen.java     | 31 ++++++++++++++++-
 ...lClock_frozen.java => VirtualClock_system.java} | 30 ++++++++++++++---
 .../isis/applib/clock/VirtualClock_withOffset.java | 31 ++++++++++++++++-
 .../isis/applib/services/sudo/SudoService.java     |  8 +++--
 .../isis/applib/services/user/UserMemento.java     |  2 +-
 .../authentication/AuthenticationSession.java      |  7 ----
 .../AuthenticationSessionAbstract.java             | 39 ++++++----------------
 .../manager/AuthorizationManager.java              |  2 +-
 .../SimpleSessionEncodabilityTestAbstract.java     | 16 ++++++---
 .../viewer/resources/UserReprRenderer.java         |  2 +-
 .../AuthenticatedWebSessionForIsis.java            |  2 +-
 12 files changed, 117 insertions(+), 55 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java
index 4e2dcc1..6a863f3 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java
@@ -69,7 +69,7 @@ public interface VirtualClock extends Serializable {
      * Returns a the system's default ticking clock.
      */
     static VirtualClock system() {
-        return Instant::now;
+        return new VirtualClock_system();
     }
     
     /**
diff --git a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_frozen.java b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_frozen.java
index 7260dad..b01229e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_frozen.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_frozen.java
@@ -19,11 +19,12 @@
 package org.apache.isis.applib.clock;
 
 import java.time.Instant;
+import java.util.Objects;
 
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
-class VirtualClock_frozen implements VirtualClock {
+final class VirtualClock_frozen implements VirtualClock {
 
     private static final long serialVersionUID = -2589204298085221985L;
     
@@ -33,5 +34,33 @@ class VirtualClock_frozen implements VirtualClock {
     public Instant now() {
         return frozenInstant;
     }
+    
+    // -- TO STRING, EQUALS, HASHCODE
+    
+    @Override
+    public String toString() {
+        return String.format("%s: %s", this.getClass().getSimpleName(), xmlGregorianCalendar());
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if(obj==null) {
+            return false;
+        }
+        // equal if same class and same frozenInstant
+        if(!Objects.equals(this.getClass(), obj.getClass())) {
+            return false;
+        }
+        if(!Objects.equals(this.frozenInstant, ((VirtualClock_frozen)obj).frozenInstant)) {
+            return false;
+        }
+        return true;
+    }
+    
+    @Override
+    public int hashCode() {
+        // equal if same class and same frozenInstant
+        return Objects.hash(this.getClass(), frozenInstant);
+    }
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_frozen.java b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_system.java
similarity index 59%
copy from api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_frozen.java
copy to api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_system.java
index 7260dad..215eb4c 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_frozen.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_system.java
@@ -23,15 +23,35 @@ import java.time.Instant;
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
-class VirtualClock_frozen implements VirtualClock {
+final class VirtualClock_system implements VirtualClock {
 
-    private static final long serialVersionUID = -2589204298085221985L;
+    private static final long serialVersionUID = 4019699893189814294L;
+
+    @Override
+    public Instant now() {
+        return Instant.now();
+    }
+
+    // -- TO STRING, EQUALS, HASHCODE
     
-    private final Instant frozenInstant;
+    @Override
+    public String toString() {
+        return String.format("%s: %s", this.getClass().getSimpleName(), xmlGregorianCalendar());
+    }
     
     @Override
-    public Instant now() {
-        return frozenInstant;
+    public boolean equals(Object obj) {
+        if(obj==null) {
+            return false;
+        }
+        // equal if same class
+        return this.getClass().equals(obj.getClass());
+    }
+    
+    @Override
+    public int hashCode() {
+        // equal if same class
+        return this.getClass().hashCode();
     }
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_withOffset.java b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_withOffset.java
index 490d00c..9f4df40 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_withOffset.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock_withOffset.java
@@ -19,11 +19,12 @@
 package org.apache.isis.applib.clock;
 
 import java.time.Instant;
+import java.util.Objects;
 
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
-class VirtualClock_withOffset implements VirtualClock {
+final class VirtualClock_withOffset implements VirtualClock {
 
     private static final long serialVersionUID = -2589204298085221985L;
     
@@ -37,5 +38,33 @@ class VirtualClock_withOffset implements VirtualClock {
     public Instant now() {
         return Instant.now().plusMillis(millisOffset);
     }
+    
+    // -- TO STRING, EQUALS, HASHCODE
+    
+    @Override
+    public String toString() {
+        return String.format("%s: %s", this.getClass().getSimpleName(), xmlGregorianCalendar());
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if(obj==null) {
+            return false;
+        }
+        // equal if same class and same millisOffset
+        if(!Objects.equals(this.getClass(), obj.getClass())) {
+            return false;
+        }
+        if(!Objects.equals(this.millisOffset, ((VirtualClock_withOffset)obj).millisOffset)) {
+            return false;
+        }
+        return true;
+    }
+    
+    @Override
+    public int hashCode() {
+        // equal if same class and same millisOffset
+        return Objects.hash(this.getClass(), millisOffset);
+    }
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/sudo/SudoService.java b/api/applib/src/main/java/org/apache/isis/applib/services/sudo/SudoService.java
index 7ef9416..72518eb 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/sudo/SudoService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/sudo/SudoService.java
@@ -20,6 +20,7 @@ package org.apache.isis.applib.services.sudo;
 
 import java.util.concurrent.Callable;
 
+import org.apache.isis.applib.services.user.RoleMemento;
 import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.applib.services.user.UserService;
 
@@ -38,8 +39,11 @@ public interface SudoService {
      * If included in the list of roles, then will disable security checks (can view and use all object members).
      */
     // tag::refguide[]
-    String ACCESS_ALL_ROLE =                                // <.>
-            SudoService.class.getName() + "#accessAll";
+    RoleMemento ACCESS_ALL_ROLE =                                // <.>
+            new RoleMemento(
+                    SudoService.class.getName() + "#accessAll",
+                    "Sudo, can view and use all object members.");
+            
 
     // end::refguide[]
     /**
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java b/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java
index 9a15048..9157973 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java
@@ -178,7 +178,7 @@ public final class UserMemento implements Serializable {
     
     @Override
     public int hashCode() {
-        return getName().hashCode();
+        return getName().hashCode(); // its good enough to hash on just the user's name
     }
         
     
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSession.java b/core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSession.java
index fa6222f..daa7787 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSession.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSession.java
@@ -44,13 +44,6 @@ public interface AuthenticationSession extends Serializable {
     Can<String> getRoles();
 
     /**
-     * Whether this user has specified {@code role}
-     * @param role 
-     * @since 2.0
-     */
-    boolean hasRole(String role);
-
-    /**
      * A unique code given to this session during authentication.
      *
      * <p>
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSessionAbstract.java b/core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSessionAbstract.java
index a5d098f..feb5d49 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSessionAbstract.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/authentication/AuthenticationSessionAbstract.java
@@ -38,20 +38,20 @@ implements AuthenticationSession, Serializable {
     
     // -- Constructor, fields
 
-    @Getter(onMethod_ = {@Override}) @NonNull 
-    private final ExecutionContext executionContext;
+    @Getter(onMethod_ = {@Override})  
+    private final @NonNull ExecutionContext executionContext;
     
-    @Getter(onMethod_ = {@Override}) @NonNull 
-    private final String userName;
+    @Getter(onMethod_ = {@Override}) 
+    private final @NonNull String userName;
     
-    @Getter(onMethod_ = {@Override}) @NonNull
-    private final Can<String> roles;
+    @Getter(onMethod_ = {@Override})
+    private final @NonNull Can<String> roles;
     
-    @Getter(onMethod_ = {@Override}) @NonNull
-    private final String validationCode;
+    @Getter(onMethod_ = {@Override})
+    private final @NonNull String validationCode;
 
-    @Getter(onMethod_ = {@Override}) @NonNull
-    private final MessageBroker messageBroker;
+    @Getter(onMethod_ = {@Override})
+    private final @NonNull MessageBroker messageBroker;
     
     public AuthenticationSessionAbstract(
             @NonNull final ExecutionContext executionEnvironment,
@@ -74,25 +74,6 @@ implements AuthenticationSession, Serializable {
         return Objects.equals(userName, getUserName());
     }
 
-    // -- Roles
-
-    @Override
-    public boolean hasRole(String role) {
-        return roles.contains(role);
-    }
-
-    // -- Attributes
-
-//    @Override
-//    public Object getAttribute(final String attributeName) {
-//        return attributeByName.get(attributeName);
-//    }
-//
-//    @Override
-//    public void setAttribute(final String attributeName, final Object attribute) {
-//        attributeByName.put(attributeName, attribute);
-//    }
-
     // -- TO STRING, EQUALS, HASHCODE
 
     private static final ToString<AuthenticationSessionAbstract> toString = ToString
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java b/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java
index a4131ec..89e8f71 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java
@@ -107,7 +107,7 @@ public class AuthorizationManager {
         if(session==null) {
             return false;
         }
-        return session.hasRole(SudoService.ACCESS_ALL_ROLE);
+        return session.getRoles().contains(SudoService.ACCESS_ALL_ROLE.getName());
     }
     
     private boolean anyMatchOnRoles(
diff --git a/core/security/src/test/java/org/apache/isis/security/authentication/standard/SimpleSessionEncodabilityTestAbstract.java b/core/security/src/test/java/org/apache/isis/security/authentication/standard/SimpleSessionEncodabilityTestAbstract.java
index a8ea7dc..660706e 100644
--- a/core/security/src/test/java/org/apache/isis/security/authentication/standard/SimpleSessionEncodabilityTestAbstract.java
+++ b/core/security/src/test/java/org/apache/isis/security/authentication/standard/SimpleSessionEncodabilityTestAbstract.java
@@ -23,18 +23,24 @@ import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
+import org.apache.isis.core.security.authentication.AuthenticationSessionAbstract;
 import org.apache.isis.security.EncodabilityContractTest;
-import org.apache.isis.core.security.authentication.standard.SimpleSession;
 
 public abstract class SimpleSessionEncodabilityTestAbstract extends EncodabilityContractTest {
 
     @Override
     protected void assertRoundtripped(final Object decodedEncodable, final Object originalEncodable) {
-        final SimpleSession decoded = (SimpleSession) decodedEncodable;
-        final SimpleSession original = (SimpleSession) originalEncodable;
+        final AuthenticationSessionAbstract decoded = (AuthenticationSessionAbstract) decodedEncodable;
+        final AuthenticationSessionAbstract original = (AuthenticationSessionAbstract) originalEncodable;
 
-        assertThat(decoded.getUserName(), is(equalTo(original.getUserName())));
-        assertThat(decoded.getRoles(), is(equalTo(original.getRoles())));
+        assertThat(decoded.getUser(), is(equalTo(original.getUser()))); // redundant shortcut
+        
+        assertThat(decoded.getExecutionContext().getTimeZone(), is(equalTo(original.getExecutionContext().getTimeZone())));
+        assertThat(decoded.getExecutionContext().getLocale(), is(equalTo(original.getExecutionContext().getLocale())));
+        assertThat(decoded.getExecutionContext().getUser(), is(equalTo(original.getExecutionContext().getUser())));
+        assertThat(decoded.getExecutionContext().getClock(), is(equalTo(original.getExecutionContext().getClock())));
+        
+        assertThat(decoded.getExecutionContext(), is(equalTo(original.getExecutionContext())));
     }
 
 }
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/UserReprRenderer.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/UserReprRenderer.java
index db80745..39f3a44 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/UserReprRenderer.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/UserReprRenderer.java
@@ -38,7 +38,7 @@ public class UserReprRenderer extends ReprRendererAbstract<UserReprRenderer, Aut
         representation.mapPut("userName", authenticationSession.getUserName());
         final JsonRepresentation roles = JsonRepresentation.newArray();
 
-        authenticationSession.getRoles().stream()
+        authenticationSession.getUser().streamRoleNames()
         .forEach(roles::arrayAdd);
 
         representation.mapPut("roles", roles);
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java
index 2e50d5d..f5deb1b 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java
@@ -203,7 +203,7 @@ implements BreadcrumbModelProvider, BookmarkedPagesModelProvider, HasCommonConte
         }
 
         final Roles roles = new Roles();
-        getAuthenticationSession().getRoles().stream()
+        getAuthenticationSession().getUser().streamRoleNames()
         .forEach(roles::add);
         return roles;
     }