From ab898a8b057d5758fd00ac8ba9f74c6284f7e860 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Sun, 18 Jun 2017 22:35:07 -0500 Subject: [PATCH] Adapt to Spring Session's merging of ExpiringSession into Session --- .../mongo/AbstractMongoSessionConverter.java | 13 ++-- .../data/mongo/AuthenticationParser.java | 16 ++-- .../mongo/JacksonMongoSessionConverter.java | 9 ++- .../data/mongo/JdkMongoSessionConverter.java | 38 ++++++++-- .../MongoOperationsSessionRepository.java | 32 ++++---- ...ExpiringSession.java => MongoSession.java} | 57 +++++++------- .../data/mongo/AuthenticationParserTest.java | 5 +- .../JacksonMongoSessionConverterTest.java | 3 +- .../mongo/JdkMongoSessionConverterTest.java | 20 ++--- .../MongoOperationsSessionRepositoryTest.java | 32 ++++---- ...SessionTest.java => MongoSessionTest.java} | 16 ++-- .../AbstractMongoRepositoryITest.java | 76 ++++++++++--------- .../MongoRepositoryJacksonITest.java | 7 +- .../MongoRepositoryJdkSerializationITest.java | 13 ++-- 14 files changed, 192 insertions(+), 145 deletions(-) rename src/main/java/org/springframework/session/data/mongo/{MongoExpiringSession.java => MongoSession.java} (65%) rename src/test/java/org/springframework/session/data/mongo/{MongoExpiringSessionTest.java => MongoSessionTest.java} (72%) diff --git a/src/main/java/org/springframework/session/data/mongo/AbstractMongoSessionConverter.java b/src/main/java/org/springframework/session/data/mongo/AbstractMongoSessionConverter.java index bcbeb98..3832c23 100644 --- a/src/main/java/org/springframework/session/data/mongo/AbstractMongoSessionConverter.java +++ b/src/main/java/org/springframework/session/data/mongo/AbstractMongoSessionConverter.java @@ -41,6 +41,7 @@ import com.mongodb.DBObject; * bean. * * @author Jakub Kubrynski + * @author Greg Turnquist * @since 1.2 */ public abstract class AbstractMongoSessionConverter implements GenericConverter { @@ -89,14 +90,16 @@ public abstract class AbstractMongoSessionConverter implements GenericConverter if (resolvedPrincipal != null) { return resolvedPrincipal; } else { - return expiringSession.getAttribute(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME); + return expiringSession.getAttribute(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME) + .map(Object::toString) + .orElse(""); } } public Set getConvertibleTypes() { return Collections.singleton( - new ConvertiblePair(DBObject.class, MongoExpiringSession.class)); + new ConvertiblePair(DBObject.class, MongoSession.class)); } @SuppressWarnings("unchecked") @@ -113,11 +116,11 @@ public abstract class AbstractMongoSessionConverter implements GenericConverter return convert((Document) source); } else { - return convert((MongoExpiringSession) source); + return convert((MongoSession) source); } } - protected abstract DBObject convert(MongoExpiringSession session); + protected abstract DBObject convert(MongoSession session); - protected abstract MongoExpiringSession convert(Document sessionWrapper); + protected abstract MongoSession convert(Document sessionWrapper); } diff --git a/src/main/java/org/springframework/session/data/mongo/AuthenticationParser.java b/src/main/java/org/springframework/session/data/mongo/AuthenticationParser.java index a02fcca..ee82371 100644 --- a/src/main/java/org/springframework/session/data/mongo/AuthenticationParser.java +++ b/src/main/java/org/springframework/session/data/mongo/AuthenticationParser.java @@ -15,6 +15,8 @@ */ package org.springframework.session.data.mongo; +import java.util.Optional; + import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; @@ -22,6 +24,7 @@ import org.springframework.expression.spel.standard.SpelExpressionParser; * Utility class to extract principal name from {@code Authentication} object. * * @author Jakub Kubrynski + * @author Greg Turnquist */ final class AuthenticationParser { @@ -35,13 +38,14 @@ final class AuthenticationParser { * @param authentication Authentication object * @return principal name */ - static String extractName(Object authentication) { + static String extractName(Optional authentication) { - if (authentication != null) { - Expression expression = PARSER.parseExpression(NAME_EXPRESSION); - return expression.getValue(authentication, String.class); - } - return null; + return authentication + .map(auth -> { + Expression expression = PARSER.parseExpression(NAME_EXPRESSION); + return expression.getValue(auth, String.class); + }) + .orElse(null); } private AuthenticationParser() {} diff --git a/src/main/java/org/springframework/session/data/mongo/JacksonMongoSessionConverter.java b/src/main/java/org/springframework/session/data/mongo/JacksonMongoSessionConverter.java index 99fd9d6..e7d88f6 100644 --- a/src/main/java/org/springframework/session/data/mongo/JacksonMongoSessionConverter.java +++ b/src/main/java/org/springframework/session/data/mongo/JacksonMongoSessionConverter.java @@ -40,6 +40,7 @@ import com.mongodb.util.JSON; * {@code AbstractMongoSessionConverter} implementation using Jackson. * * @author Jakub Kubrynski + * @author Greg Turnquist * @since 1.2 */ public class JacksonMongoSessionConverter extends AbstractMongoSessionConverter { @@ -67,7 +68,7 @@ public class JacksonMongoSessionConverter extends AbstractMongoSessionConverter return Query.query(Criteria.where(PRINCIPAL_FIELD_NAME).is(indexValue)); } return Query.query(Criteria.where(ATTRS_FIELD_NAME + - MongoExpiringSession.coverDot(indexName)).is(indexValue)); + MongoSession.coverDot(indexName)).is(indexValue)); } private ObjectMapper buildObjectMapper() { @@ -87,7 +88,7 @@ public class JacksonMongoSessionConverter extends AbstractMongoSessionConverter } @Override - protected DBObject convert(MongoExpiringSession source) { + protected DBObject convert(MongoSession source) { try { DBObject dbSession = (DBObject) JSON.parse(this.objectMapper.writeValueAsString(source)); @@ -100,12 +101,12 @@ public class JacksonMongoSessionConverter extends AbstractMongoSessionConverter } @Override - protected MongoExpiringSession convert(Document source) { + protected MongoSession convert(Document source) { String json = JSON.serialize(source); try { - return this.objectMapper.readValue(json, MongoExpiringSession.class); + return this.objectMapper.readValue(json, MongoSession.class); } catch (IOException e) { LOG.error("Error during Mongo Session deserialization", e); diff --git a/src/main/java/org/springframework/session/data/mongo/JdkMongoSessionConverter.java b/src/main/java/org/springframework/session/data/mongo/JdkMongoSessionConverter.java index 5932d8a..582d5c5 100644 --- a/src/main/java/org/springframework/session/data/mongo/JdkMongoSessionConverter.java +++ b/src/main/java/org/springframework/session/data/mongo/JdkMongoSessionConverter.java @@ -16,6 +16,8 @@ package org.springframework.session.data.mongo; +import java.time.Duration; +import java.time.Instant; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -40,6 +42,7 @@ import com.mongodb.DBObject; * * @author Jakub Kubrynski * @author Rob Winch + * @author Greg Turnquist * @since 1.2 */ public class JdkMongoSessionConverter extends AbstractMongoSessionConverter { @@ -78,13 +81,13 @@ public class JdkMongoSessionConverter extends AbstractMongoSessionConverter { } @Override - protected DBObject convert(MongoExpiringSession session) { + protected DBObject convert(MongoSession session) { BasicDBObject basicDBObject = new BasicDBObject(); basicDBObject.put(ID, session.getId()); basicDBObject.put(CREATION_TIME, session.getCreationTime()); basicDBObject.put(LAST_ACCESSED_TIME, session.getLastAccessedTime()); - basicDBObject.put(MAX_INTERVAL, session.getMaxInactiveIntervalInSeconds()); + basicDBObject.put(MAX_INTERVAL, session.getMaxInactiveInterval()); basicDBObject.put(PRINCIPAL_FIELD_NAME, extractPrincipal(session)); basicDBObject.put(EXPIRE_AT_FIELD_NAME, session.getExpireAt()); basicDBObject.put(ATTRIBUTES, serializeAttributes(session)); @@ -92,14 +95,33 @@ public class JdkMongoSessionConverter extends AbstractMongoSessionConverter { } @Override - protected MongoExpiringSession convert(Document sessionWrapper) { + protected MongoSession convert(Document sessionWrapper) { - MongoExpiringSession session = new MongoExpiringSession( - sessionWrapper.getString(ID), sessionWrapper.getInteger(MAX_INTERVAL)); + Object maxInterval = sessionWrapper.get(MAX_INTERVAL); + + Duration maxIntervalDuration = (maxInterval instanceof Duration) + ? (Duration) maxInterval + : Duration.parse(maxInterval.toString()); + + MongoSession session = new MongoSession( + sessionWrapper.getString(ID), maxIntervalDuration.getSeconds()); + + Object creationTime = sessionWrapper.get(CREATION_TIME); + if (creationTime instanceof Instant) { + session.setCreationTime(((Instant) creationTime).toEpochMilli()); + } else if (creationTime instanceof Date) { + session.setCreationTime(((Date) creationTime).getTime()); + } + + Object lastAccessedTime = sessionWrapper.get(LAST_ACCESSED_TIME); + if (lastAccessedTime instanceof Instant) { + session.setLastAccessedTime((Instant) lastAccessedTime); + } else if (lastAccessedTime instanceof Date) { + session.setLastAccessedTime(Instant.ofEpochMilli(((Date) lastAccessedTime).getTime())); + } - session.setCreationTime(sessionWrapper.getLong(CREATION_TIME)); - session.setLastAccessedTime(sessionWrapper.getLong(LAST_ACCESSED_TIME)); session.setExpireAt((Date) sessionWrapper.get(EXPIRE_AT_FIELD_NAME)); + deserializeAttributes(sessionWrapper, session); return session; @@ -110,7 +132,7 @@ public class JdkMongoSessionConverter extends AbstractMongoSessionConverter { Map attributes = new HashMap<>(); for (String attrName : session.getAttributeNames()) { - attributes.put(attrName, session.getAttribute(attrName)); + attributes.put(attrName, session.getAttribute(attrName).get()); } return this.serializer.convert(attributes); diff --git a/src/main/java/org/springframework/session/data/mongo/MongoOperationsSessionRepository.java b/src/main/java/org/springframework/session/data/mongo/MongoOperationsSessionRepository.java index a7550b8..de10d6d 100644 --- a/src/main/java/org/springframework/session/data/mongo/MongoOperationsSessionRepository.java +++ b/src/main/java/org/springframework/session/data/mongo/MongoOperationsSessionRepository.java @@ -16,6 +16,7 @@ package org.springframework.session.data.mongo; +import java.time.Duration; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -42,10 +43,11 @@ import com.mongodb.DBObject; * done every minute. * * @author Jakub Kubrynski + * @author Greg Turnquist * @since 1.2 */ public class MongoOperationsSessionRepository - implements FindByIndexNameSessionRepository { + implements FindByIndexNameSessionRepository { /** * The default time period in seconds in which a session will expire. @@ -69,24 +71,24 @@ public class MongoOperationsSessionRepository this.mongoOperations = mongoOperations; } - public MongoExpiringSession createSession() { + public MongoSession createSession() { - MongoExpiringSession session = new MongoExpiringSession(); + MongoSession session = new MongoSession(); if (this.maxInactiveIntervalInSeconds != null) { - session.setMaxInactiveIntervalInSeconds(this.maxInactiveIntervalInSeconds); + session.setMaxInactiveInterval(Duration.ofSeconds(this.maxInactiveIntervalInSeconds)); } return session; } - public void save(MongoExpiringSession session) { + public void save(MongoSession session) { DBObject sessionDbObject = convertToDBObject(session); this.mongoOperations.save(sessionDbObject, this.collectionName); } - public MongoExpiringSession getSession(String id) { + public MongoSession getSession(String id) { Document sessionWrapper = findSession(id); @@ -94,7 +96,7 @@ public class MongoOperationsSessionRepository return null; } - MongoExpiringSession session = convertToSession(sessionWrapper); + MongoSession session = convertToSession(sessionWrapper); if (session.isExpired()) { delete(id); @@ -113,9 +115,9 @@ public class MongoOperationsSessionRepository * @param indexValue the value of the index to search for. * @return sessions map */ - public Map findByIndexNameAndIndexValue(String indexName, String indexValue) { + public Map findByIndexNameAndIndexValue(String indexName, String indexValue) { - HashMap result = new HashMap(); + HashMap result = new HashMap(); Query query = this.mongoSessionConverter.getQueryForIndex(indexName, indexValue); @@ -126,7 +128,7 @@ public class MongoOperationsSessionRepository List mapSessions = this.mongoOperations.find(query, Document.class, this.collectionName); for (Document dbSession : mapSessions) { - MongoExpiringSession mapSession = convertToSession(dbSession); + MongoSession mapSession = convertToSession(dbSession); result.put(mapSession.getId(), mapSession); } @@ -148,17 +150,17 @@ public class MongoOperationsSessionRepository return this.mongoOperations.findById(id, Document.class, this.collectionName); } - MongoExpiringSession convertToSession(Document session) { + MongoSession convertToSession(Document session) { - return (MongoExpiringSession) this.mongoSessionConverter.convert(session, + return (MongoSession) this.mongoSessionConverter.convert(session, TypeDescriptor.valueOf(Document.class), - TypeDescriptor.valueOf(MongoExpiringSession.class)); + TypeDescriptor.valueOf(MongoSession.class)); } - DBObject convertToDBObject(MongoExpiringSession session) { + DBObject convertToDBObject(MongoSession session) { return (DBObject) this.mongoSessionConverter.convert(session, - TypeDescriptor.valueOf(MongoExpiringSession.class), + TypeDescriptor.valueOf(MongoSession.class), TypeDescriptor.valueOf(DBObject.class)); } diff --git a/src/main/java/org/springframework/session/data/mongo/MongoExpiringSession.java b/src/main/java/org/springframework/session/data/mongo/MongoSession.java similarity index 65% rename from src/main/java/org/springframework/session/data/mongo/MongoExpiringSession.java rename to src/main/java/org/springframework/session/data/mongo/MongoSession.java index fd049fc..30505f2 100644 --- a/src/main/java/org/springframework/session/data/mongo/MongoExpiringSession.java +++ b/src/main/java/org/springframework/session/data/mongo/MongoSession.java @@ -15,23 +15,26 @@ */ package org.springframework.session.data.mongo; +import java.time.Duration; +import java.time.Instant; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; -import java.util.concurrent.TimeUnit; -import org.springframework.session.ExpiringSession; +import org.springframework.session.Session; /** * Session object providing additional information about the datetime of expiration. * * @author Jakub Kubrynski + * @author Greg Turnquist * @since 1.2 */ -public class MongoExpiringSession implements ExpiringSession { +public class MongoSession implements Session { /** * Mongo doesn't support {@literal dot} in field names. We replace it with a very rarely used character @@ -39,25 +42,25 @@ public class MongoExpiringSession implements ExpiringSession { private static final char DOT_COVER_CHAR = '\uF607'; private final String id; - private long created = System.currentTimeMillis(); - private long accessed; - private int interval; + private long createdMillis = System.currentTimeMillis(); + private long accessedMillis; + private long intervalSeconds; private Date expireAt; private Map attrs = new HashMap(); - public MongoExpiringSession() { + public MongoSession() { this(MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL); } - public MongoExpiringSession(int maxInactiveIntervalInSeconds) { + public MongoSession(long maxInactiveIntervalInSeconds) { this(UUID.randomUUID().toString(), maxInactiveIntervalInSeconds); } - public MongoExpiringSession(String id, int maxInactiveIntervalInSeconds) { + public MongoSession(String id, long maxInactiveIntervalInSeconds) { this.id = id; - this.interval = maxInactiveIntervalInSeconds; - setLastAccessedTime(this.created); + this.intervalSeconds = maxInactiveIntervalInSeconds; + setLastAccessedTime(Instant.ofEpochMilli(this.createdMillis)); } public String getId() { @@ -65,8 +68,8 @@ public class MongoExpiringSession implements ExpiringSession { } @SuppressWarnings("unchecked") - public T getAttribute(String attributeName) { - return (T) this.attrs.get(coverDot(attributeName)); + public Optional getAttribute(String attributeName) { + return Optional.ofNullable((T) this.attrs.get(coverDot(attributeName))); } public Set getAttributeNames() { @@ -93,34 +96,34 @@ public class MongoExpiringSession implements ExpiringSession { this.attrs.remove(coverDot(attributeName)); } - public long getCreationTime() { - return this.created; + public Instant getCreationTime() { + return Instant.ofEpochMilli(this.createdMillis); } public void setCreationTime(long created) { - this.created = created; + this.createdMillis = created; } - public void setLastAccessedTime(long lastAccessedTime) { + public void setLastAccessedTime(Instant lastAccessedTime) { - this.accessed = lastAccessedTime; - this.expireAt = new Date(lastAccessedTime + TimeUnit.SECONDS.toMillis(this.interval)); + this.accessedMillis = lastAccessedTime.toEpochMilli(); + this.expireAt = Date.from(lastAccessedTime.plus(Duration.ofSeconds(this.intervalSeconds))); } - public long getLastAccessedTime() { - return this.accessed; + public Instant getLastAccessedTime() { + return Instant.ofEpochMilli(this.accessedMillis); } - public void setMaxInactiveIntervalInSeconds(int interval) { - this.interval = interval; + public void setMaxInactiveInterval(Duration interval) { + this.intervalSeconds = interval.getSeconds(); } - public int getMaxInactiveIntervalInSeconds() { - return this.interval; + public Duration getMaxInactiveInterval() { + return Duration.ofSeconds(this.intervalSeconds); } public boolean isExpired() { - return this.interval >= 0 && new Date().after(this.expireAt); + return this.intervalSeconds >= 0 && new Date().after(this.expireAt); } public Date getExpireAt() { @@ -149,7 +152,7 @@ public class MongoExpiringSession implements ExpiringSession { return false; } - MongoExpiringSession that = (MongoExpiringSession) o; + MongoSession that = (MongoSession) o; return this.id.equals(that.id); } diff --git a/src/test/java/org/springframework/session/data/mongo/AuthenticationParserTest.java b/src/test/java/org/springframework/session/data/mongo/AuthenticationParserTest.java index 16fa982..1ccd6b1 100644 --- a/src/test/java/org/springframework/session/data/mongo/AuthenticationParserTest.java +++ b/src/test/java/org/springframework/session/data/mongo/AuthenticationParserTest.java @@ -17,6 +17,8 @@ package org.springframework.session.data.mongo; import static org.assertj.core.api.Assertions.*; +import java.util.Optional; + import org.junit.Test; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -24,6 +26,7 @@ import org.springframework.security.core.context.SecurityContextImpl; /** * @author Jakub Kubrynski + * @author Greg Turnquist */ public class AuthenticationParserTest { @@ -36,7 +39,7 @@ public class AuthenticationParserTest { context.setAuthentication(new UsernamePasswordAuthenticationToken(principalName, null)); // when - String extractedName = AuthenticationParser.extractName(context); + String extractedName = AuthenticationParser.extractName(Optional.ofNullable(context)); // then assertThat(extractedName).isEqualTo(principalName); diff --git a/src/test/java/org/springframework/session/data/mongo/JacksonMongoSessionConverterTest.java b/src/test/java/org/springframework/session/data/mongo/JacksonMongoSessionConverterTest.java index 27c093a..6921433 100644 --- a/src/test/java/org/springframework/session/data/mongo/JacksonMongoSessionConverterTest.java +++ b/src/test/java/org/springframework/session/data/mongo/JacksonMongoSessionConverterTest.java @@ -25,6 +25,7 @@ import com.mongodb.DBObject; /** * @author Jakub Kubrynski + * @author Greg Turnquist */ public class JacksonMongoSessionConverterTest { @@ -34,7 +35,7 @@ public class JacksonMongoSessionConverterTest { public void shouldSaveIdField() throws Exception { //given - MongoExpiringSession session = new MongoExpiringSession(); + MongoSession session = new MongoSession(); //when DBObject convert = this.sut.convert(session); diff --git a/src/test/java/org/springframework/session/data/mongo/JdkMongoSessionConverterTest.java b/src/test/java/org/springframework/session/data/mongo/JdkMongoSessionConverterTest.java index fa58fdf..7a9a86d 100644 --- a/src/test/java/org/springframework/session/data/mongo/JdkMongoSessionConverterTest.java +++ b/src/test/java/org/springframework/session/data/mongo/JdkMongoSessionConverterTest.java @@ -24,7 +24,6 @@ import org.springframework.core.serializer.support.DeserializingConverter; import org.springframework.core.serializer.support.SerializingConverter; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextImpl; -import org.springframework.session.ExpiringSession; import org.springframework.session.FindByIndexNameSessionRepository; import com.mongodb.DBObject; @@ -32,6 +31,7 @@ import com.mongodb.DBObject; /** * @author Jakub Kubrynski * @author Rob Winch + * @author Greg Turnquist */ public class JdkMongoSessionConverterTest { @@ -51,12 +51,12 @@ public class JdkMongoSessionConverterTest { public void verifyRoundTripSerialization() throws Exception { // given - MongoExpiringSession toSerialize = new MongoExpiringSession(); + MongoSession toSerialize = new MongoSession(); toSerialize.setAttribute("username", "john_the_springer"); // when DBObject dbObject = convertToDBObject(toSerialize); - ExpiringSession deserialized = convertToSession(dbObject); + MongoSession deserialized = convertToSession(dbObject); // then assertThat(deserialized).isEqualToComparingFieldByField(toSerialize); @@ -66,7 +66,7 @@ public class JdkMongoSessionConverterTest { public void shouldExtractPrincipalNameFromAttributes() throws Exception { // given - MongoExpiringSession toSerialize = new MongoExpiringSession(); + MongoSession toSerialize = new MongoSession(); String principalName = "john_the_springer"; toSerialize.setAttribute( FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, @@ -83,7 +83,7 @@ public class JdkMongoSessionConverterTest { public void shouldExtractPrincipalNameFromAuthentication() throws Exception { // given - MongoExpiringSession toSerialize = new MongoExpiringSession(); + MongoSession toSerialize = new MongoSession(); String principalName = "john_the_springer"; SecurityContextImpl context = new SecurityContextImpl(); context.setAuthentication( @@ -97,15 +97,15 @@ public class JdkMongoSessionConverterTest { assertThat(dbObject.get("principal")).isEqualTo(principalName); } - MongoExpiringSession convertToSession(DBObject session) { - return (MongoExpiringSession) this.sut.convert(session, + MongoSession convertToSession(DBObject session) { + return (MongoSession) this.sut.convert(session, TypeDescriptor.valueOf(DBObject.class), - TypeDescriptor.valueOf(MongoExpiringSession.class)); + TypeDescriptor.valueOf(MongoSession.class)); } - DBObject convertToDBObject(MongoExpiringSession session) { + DBObject convertToDBObject(MongoSession session) { return (DBObject) this.sut.convert(session, - TypeDescriptor.valueOf(MongoExpiringSession.class), + TypeDescriptor.valueOf(MongoSession.class), TypeDescriptor.valueOf(DBObject.class)); } } diff --git a/src/test/java/org/springframework/session/data/mongo/MongoOperationsSessionRepositoryTest.java b/src/test/java/org/springframework/session/data/mongo/MongoOperationsSessionRepositoryTest.java index efd2fde..c325bbd 100644 --- a/src/test/java/org/springframework/session/data/mongo/MongoOperationsSessionRepositoryTest.java +++ b/src/test/java/org/springframework/session/data/mongo/MongoOperationsSessionRepositoryTest.java @@ -38,7 +38,6 @@ import org.mockito.junit.MockitoJUnitRunner; import org.springframework.core.convert.TypeDescriptor; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Query; -import org.springframework.session.ExpiringSession; import org.springframework.session.FindByIndexNameSessionRepository; import com.mongodb.BasicDBObject; @@ -49,6 +48,7 @@ import com.mongodb.DBObject; * * @author Jakub Kubrynski * @author Vedran Pavic + * @author Greg Turnquist */ @RunWith(MockitoJUnitRunner.class) public class MongoOperationsSessionRepositoryTest { @@ -70,11 +70,11 @@ public class MongoOperationsSessionRepositoryTest { @Test public void shouldCreateSession() throws Exception { // when - ExpiringSession session = this.repository.createSession(); + MongoSession session = this.repository.createSession(); // then assertThat(session.getId()).isNotEmpty(); - assertThat(session.getMaxInactiveIntervalInSeconds()) + assertThat(session.getMaxInactiveInterval().getSeconds()) .isEqualTo(MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL); } @@ -82,22 +82,22 @@ public class MongoOperationsSessionRepositoryTest { public void shouldCreateSessionWhenMaxInactiveIntervalNotDefined() throws Exception { // when this.repository.setMaxInactiveIntervalInSeconds(null); - ExpiringSession session = this.repository.createSession(); + MongoSession session = this.repository.createSession(); // then assertThat(session.getId()).isNotEmpty(); - assertThat(session.getMaxInactiveIntervalInSeconds()) + assertThat(session.getMaxInactiveInterval().getSeconds()) .isEqualTo(MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL); } @Test public void shouldSaveSession() throws Exception { // given - MongoExpiringSession session = new MongoExpiringSession(); + MongoSession session = new MongoSession(); BasicDBObject dbSession = new BasicDBObject(); given(this.converter.convert(session, - TypeDescriptor.valueOf(MongoExpiringSession.class), + TypeDescriptor.valueOf(MongoSession.class), TypeDescriptor.valueOf(DBObject.class))).willReturn(dbSession); // when this.repository.save(session); @@ -115,13 +115,13 @@ public class MongoOperationsSessionRepositoryTest { given(this.mongoOperations.findById(sessionId, Document.class, MongoOperationsSessionRepository.DEFAULT_COLLECTION_NAME)).willReturn(sessionDocument); - MongoExpiringSession session = new MongoExpiringSession(); + MongoSession session = new MongoSession(); given(this.converter.convert(sessionDocument, TypeDescriptor.valueOf(Document.class), - TypeDescriptor.valueOf(MongoExpiringSession.class))).willReturn(session); + TypeDescriptor.valueOf(MongoSession.class))).willReturn(session); // when - ExpiringSession retrievedSession = this.repository.getSession(sessionId); + MongoSession retrievedSession = this.repository.getSession(sessionId); // then assertThat(retrievedSession).isEqualTo(session); @@ -136,11 +136,11 @@ public class MongoOperationsSessionRepositoryTest { given(this.mongoOperations.findById(sessionId, Document.class, MongoOperationsSessionRepository.DEFAULT_COLLECTION_NAME)).willReturn(sessionDocument); - MongoExpiringSession session = mock(MongoExpiringSession.class); + MongoSession session = mock(MongoSession.class); given(session.isExpired()).willReturn(true); given(this.converter.convert(sessionDocument, TypeDescriptor.valueOf(Document.class), - TypeDescriptor.valueOf(MongoExpiringSession.class))).willReturn(session); + TypeDescriptor.valueOf(MongoSession.class))).willReturn(session); // when this.repository.getSession(sessionId); @@ -182,13 +182,13 @@ public class MongoOperationsSessionRepositoryTest { String sessionId = UUID.randomUUID().toString(); - MongoExpiringSession session = new MongoExpiringSession(sessionId, 1800); + MongoSession session = new MongoSession(sessionId, 1800); given(this.converter.convert(document, TypeDescriptor.valueOf(Document.class), - TypeDescriptor.valueOf(MongoExpiringSession.class))).willReturn(session); + TypeDescriptor.valueOf(MongoSession.class))).willReturn(session); // when - Map sessionsMap = + Map sessionsMap = this.repository.findByIndexNameAndIndexValue(principalNameIndexName, "john"); // then @@ -202,7 +202,7 @@ public class MongoOperationsSessionRepositoryTest { String index = "some_not_supported_index_name"; // when - Map sessionsMap = this.repository + Map sessionsMap = this.repository .findByIndexNameAndIndexValue(index, "some_value"); // then diff --git a/src/test/java/org/springframework/session/data/mongo/MongoExpiringSessionTest.java b/src/test/java/org/springframework/session/data/mongo/MongoSessionTest.java similarity index 72% rename from src/test/java/org/springframework/session/data/mongo/MongoExpiringSessionTest.java rename to src/test/java/org/springframework/session/data/mongo/MongoSessionTest.java index 20ddc83..43411b1 100644 --- a/src/test/java/org/springframework/session/data/mongo/MongoExpiringSessionTest.java +++ b/src/test/java/org/springframework/session/data/mongo/MongoSessionTest.java @@ -16,20 +16,24 @@ package org.springframework.session.data.mongo; -import org.junit.Test; +import static org.assertj.core.api.Assertions.*; -import static org.assertj.core.api.Assertions.assertThat; +import java.time.Duration; +import java.time.Instant; + +import org.junit.Test; /** * @author Rob Winch + * @author Greg Turnquist */ -public class MongoExpiringSessionTest { +public class MongoSessionTest { @Test public void isExpiredWhenIntervalNegativeThenFalse() { - MongoExpiringSession session = new MongoExpiringSession(); - session.setMaxInactiveIntervalInSeconds(-1); - session.setLastAccessedTime(0L); + MongoSession session = new MongoSession(); + session.setMaxInactiveInterval(Duration.ofSeconds(-1)); + session.setLastAccessedTime(Instant.ofEpochMilli(0L)); assertThat(session.isExpired()).isFalse(); } diff --git a/src/test/java/org/springframework/session/data/mongo/integration/AbstractMongoRepositoryITest.java b/src/test/java/org/springframework/session/data/mongo/integration/AbstractMongoRepositoryITest.java index dcabf74..00eb87f 100644 --- a/src/test/java/org/springframework/session/data/mongo/integration/AbstractMongoRepositoryITest.java +++ b/src/test/java/org/springframework/session/data/mongo/integration/AbstractMongoRepositoryITest.java @@ -19,9 +19,11 @@ import static org.assertj.core.api.Assertions.*; import java.io.IOException; import java.net.UnknownHostException; +import java.time.Duration; +import java.time.Instant; import java.util.Map; +import java.util.Optional; import java.util.UUID; -import java.util.concurrent.TimeUnit; import de.flapdoodle.embed.mongo.MongodExecutable; import org.junit.Test; @@ -38,8 +40,8 @@ import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.session.FindByIndexNameSessionRepository; import org.springframework.session.Session; -import org.springframework.session.data.mongo.MongoExpiringSession; import org.springframework.session.data.mongo.MongoOperationsSessionRepository; +import org.springframework.session.data.mongo.MongoSession; import org.springframework.util.SocketUtils; import com.mongodb.MongoClient; @@ -49,6 +51,7 @@ import com.mongodb.MongoClient; * * @author Jakub Kubrynski * @author Vedran Pavic + * @author Greg Turnquist */ abstract public class AbstractMongoRepositoryITest extends AbstractITest { @@ -63,7 +66,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { public void saves() throws InterruptedException { String username = "saves-" + System.currentTimeMillis(); - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); String expectedAttributeName = "a"; String expectedAttributeValue = "b"; toSave.setAttribute(expectedAttributeName, expectedAttributeValue); @@ -92,7 +95,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { @Test public void putAllOnSingleAttrDoesNotRemoveOld() { - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute("a", "b"); this.repository.save(toSave); @@ -105,8 +108,8 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { Session session = this.repository.getSession(toSave.getId()); assertThat(session.getAttributeNames().size()).isEqualTo(2); - assertThat(session.getAttribute("a")).isEqualTo("b"); - assertThat(session.getAttribute("1")).isEqualTo("2"); + assertThat(session.getAttribute("a")).isEqualTo(Optional.of("b")); + assertThat(session.getAttribute("1")).isEqualTo(Optional.of("2")); this.repository.delete(toSave.getId()); } @@ -115,12 +118,12 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { public void findByPrincipalName() throws Exception { String principalName = "findByPrincipalName" + UUID.randomUUID(); - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(INDEX_NAME, principalName); this.repository.save(toSave); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, principalName); assertThat(findByPrincipalName).hasSize(1); @@ -140,7 +143,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { String principalName = "findByPrincipalNameNoPrincipalNameChange" + UUID.randomUUID(); - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(INDEX_NAME, principalName); this.repository.save(toSave); @@ -148,7 +151,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { toSave.setAttribute("other", "value"); this.repository.save(toSave); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, principalName); assertThat(findByPrincipalName).hasSize(1); @@ -160,7 +163,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { String principalName = "findByPrincipalNameNoPrincipalNameChangeReload" + UUID.randomUUID(); - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(INDEX_NAME, principalName); this.repository.save(toSave); @@ -170,7 +173,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { toSave.setAttribute("other", "value"); this.repository.save(toSave); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, principalName); assertThat(findByPrincipalName).hasSize(1); @@ -181,7 +184,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { public void findByDeletedPrincipalName() throws Exception { String principalName = "findByDeletedPrincipalName" + UUID.randomUUID(); - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(INDEX_NAME, principalName); this.repository.save(toSave); @@ -189,7 +192,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { toSave.setAttribute(INDEX_NAME, null); this.repository.save(toSave); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, principalName); assertThat(findByPrincipalName).isEmpty(); @@ -200,7 +203,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { String principalName = "findByChangedPrincipalName" + UUID.randomUUID(); String principalNameChanged = "findByChangedPrincipalName" + UUID.randomUUID(); - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(INDEX_NAME, principalName); this.repository.save(toSave); @@ -208,7 +211,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { toSave.setAttribute(INDEX_NAME, principalNameChanged); this.repository.save(toSave); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, principalName); assertThat(findByPrincipalName).isEmpty(); @@ -223,16 +226,16 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { public void findByDeletedPrincipalNameReload() throws Exception { String principalName = "findByDeletedPrincipalName" + UUID.randomUUID(); - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(INDEX_NAME, principalName); this.repository.save(toSave); - MongoExpiringSession getSession = this.repository.getSession(toSave.getId()); + MongoSession getSession = this.repository.getSession(toSave.getId()); getSession.setAttribute(INDEX_NAME, null); this.repository.save(getSession); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, principalName); assertThat(findByPrincipalName).isEmpty(); @@ -243,17 +246,17 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { String principalName = "findByChangedPrincipalName" + UUID.randomUUID(); String principalNameChanged = "findByChangedPrincipalName" + UUID.randomUUID(); - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(INDEX_NAME, principalName); this.repository.save(toSave); - MongoExpiringSession getSession = this.repository.getSession(toSave.getId()); + MongoSession getSession = this.repository.getSession(toSave.getId()); getSession.setAttribute(INDEX_NAME, principalNameChanged); this.repository.save(getSession); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, principalName); assertThat(findByPrincipalName).isEmpty(); @@ -267,12 +270,12 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { @Test public void findBySecurityPrincipalName() throws Exception { - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(SPRING_SECURITY_CONTEXT, this.context); this.repository.save(toSave); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, getSecurityName()); assertThat(findByPrincipalName).hasSize(1); @@ -290,7 +293,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { @Test public void findByPrincipalNameNoSecurityPrincipalNameChange() throws Exception { - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(SPRING_SECURITY_CONTEXT, this.context); this.repository.save(toSave); @@ -298,7 +301,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { toSave.setAttribute("other", "value"); this.repository.save(toSave); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, getSecurityName()); assertThat(findByPrincipalName).hasSize(1); @@ -308,7 +311,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { @Test public void findByDeletedSecurityPrincipalName() throws Exception { - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(SPRING_SECURITY_CONTEXT, this.context); this.repository.save(toSave); @@ -316,7 +319,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { toSave.setAttribute(SPRING_SECURITY_CONTEXT, null); this.repository.save(toSave); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, getSecurityName()); assertThat(findByPrincipalName).isEmpty(); @@ -325,7 +328,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { @Test public void findByChangedSecurityPrincipalName() throws Exception { - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(SPRING_SECURITY_CONTEXT, this.context); this.repository.save(toSave); @@ -333,7 +336,7 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { toSave.setAttribute(SPRING_SECURITY_CONTEXT, this.changedContext); this.repository.save(toSave); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, getSecurityName()); assertThat(findByPrincipalName).isEmpty(); @@ -347,17 +350,17 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { @Test public void findByChangedSecurityPrincipalNameReload() throws Exception { - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(SPRING_SECURITY_CONTEXT, this.context); this.repository.save(toSave); - MongoExpiringSession getSession = this.repository.getSession(toSave.getId()); + MongoSession getSession = this.repository.getSession(toSave.getId()); getSession.setAttribute(SPRING_SECURITY_CONTEXT, this.changedContext); this.repository.save(getSession); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, getSecurityName()); assertThat(findByPrincipalName).isEmpty(); @@ -372,14 +375,13 @@ abstract public class AbstractMongoRepositoryITest extends AbstractITest { public void loadExpiredSession() throws Exception { // given - MongoExpiringSession expiredSession = this.repository.createSession(); - long thirtyOneMinutesAgo = System.currentTimeMillis() - - TimeUnit.MINUTES.toMillis(31); + MongoSession expiredSession = this.repository.createSession(); + Instant thirtyOneMinutesAgo = Instant.ofEpochMilli(System.currentTimeMillis()).minus(Duration.ofMinutes(31)); expiredSession.setLastAccessedTime(thirtyOneMinutesAgo); this.repository.save(expiredSession); // then - MongoExpiringSession expiredSessionFromDb = this.repository + MongoSession expiredSessionFromDb = this.repository .getSession(expiredSession.getId()); assertThat(expiredSessionFromDb).isNull(); } diff --git a/src/test/java/org/springframework/session/data/mongo/integration/MongoRepositoryJacksonITest.java b/src/test/java/org/springframework/session/data/mongo/integration/MongoRepositoryJacksonITest.java index 45871d3..ddeb3df 100644 --- a/src/test/java/org/springframework/session/data/mongo/integration/MongoRepositoryJacksonITest.java +++ b/src/test/java/org/springframework/session/data/mongo/integration/MongoRepositoryJacksonITest.java @@ -28,7 +28,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.geo.GeoModule; import org.springframework.session.data.mongo.AbstractMongoSessionConverter; import org.springframework.session.data.mongo.JacksonMongoSessionConverter; -import org.springframework.session.data.mongo.MongoExpiringSession; +import org.springframework.session.data.mongo.MongoSession; import org.springframework.session.data.mongo.config.annotation.web.http.EnableMongoHttpSession; import org.springframework.test.context.ContextConfiguration; @@ -40,6 +40,7 @@ import com.fasterxml.jackson.databind.Module; * * @author Jakub Kubrynski * @author Vedran Pavic + * @author Greg Turnquist */ @ContextConfiguration public class MongoRepositoryJacksonITest extends AbstractMongoRepositoryITest { @@ -47,13 +48,13 @@ public class MongoRepositoryJacksonITest extends AbstractMongoRepositoryITest { @Test public void findByCustomIndex() throws Exception { - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); String cartId = "cart-" + UUID.randomUUID(); toSave.setAttribute("cartId", cartId); this.repository.save(toSave); - Map findByCartId = this.repository + Map findByCartId = this.repository .findByIndexNameAndIndexValue("cartId", cartId); assertThat(findByCartId).hasSize(1); diff --git a/src/test/java/org/springframework/session/data/mongo/integration/MongoRepositoryJdkSerializationITest.java b/src/test/java/org/springframework/session/data/mongo/integration/MongoRepositoryJdkSerializationITest.java index a2d969f..202a993 100644 --- a/src/test/java/org/springframework/session/data/mongo/integration/MongoRepositoryJdkSerializationITest.java +++ b/src/test/java/org/springframework/session/data/mongo/integration/MongoRepositoryJdkSerializationITest.java @@ -25,7 +25,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.session.data.mongo.AbstractMongoSessionConverter; import org.springframework.session.data.mongo.JdkMongoSessionConverter; -import org.springframework.session.data.mongo.MongoExpiringSession; +import org.springframework.session.data.mongo.MongoSession; import org.springframework.session.data.mongo.config.annotation.web.http.EnableMongoHttpSession; import org.springframework.test.context.ContextConfiguration; @@ -35,6 +35,7 @@ import org.springframework.test.context.ContextConfiguration; * * @author Jakub Kubrynski * @author Vedran Pavic + * @author Greg Turnquist */ @ContextConfiguration public class MongoRepositoryJdkSerializationITest extends AbstractMongoRepositoryITest { @@ -42,16 +43,16 @@ public class MongoRepositoryJdkSerializationITest extends AbstractMongoRepositor @Test public void findByDeletedSecurityPrincipalNameReload() throws Exception { - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(SPRING_SECURITY_CONTEXT, this.context); this.repository.save(toSave); - MongoExpiringSession getSession = this.repository.getSession(toSave.getId()); + MongoSession getSession = this.repository.getSession(toSave.getId()); getSession.setAttribute(INDEX_NAME, null); this.repository.save(getSession); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, getChangedSecurityName()); assertThat(findByPrincipalName).isEmpty(); @@ -60,7 +61,7 @@ public class MongoRepositoryJdkSerializationITest extends AbstractMongoRepositor @Test public void findByPrincipalNameNoSecurityPrincipalNameChangeReload() throws Exception { - MongoExpiringSession toSave = this.repository.createSession(); + MongoSession toSave = this.repository.createSession(); toSave.setAttribute(SPRING_SECURITY_CONTEXT, this.context); this.repository.save(toSave); @@ -70,7 +71,7 @@ public class MongoRepositoryJdkSerializationITest extends AbstractMongoRepositor toSave.setAttribute("other", "value"); this.repository.save(toSave); - Map findByPrincipalName = this.repository + Map findByPrincipalName = this.repository .findByIndexNameAndIndexValue(INDEX_NAME, getSecurityName()); assertThat(findByPrincipalName).hasSize(1);