Polishing (#38)
This commit is contained in:
7
pom.xml
7
pom.xml
@@ -74,6 +74,7 @@
|
||||
<hamcrest.version>1.3</hamcrest.version>
|
||||
<jackson.version>2.9.1</jackson.version>
|
||||
<junit.version>4.12</junit.version>
|
||||
<lombok.version>1.18.0</lombok.version>
|
||||
<mockito.version>2.18.3</mockito.version>
|
||||
<mongo.version>3.8.0</mongo.version>
|
||||
<mongo-reactivestreams.version>1.9.0</mongo-reactivestreams.version>
|
||||
@@ -541,6 +542,12 @@
|
||||
<artifactId>spring-security-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Test dependencies -->
|
||||
|
||||
<dependency>
|
||||
|
||||
@@ -47,7 +47,7 @@ public abstract class AbstractMongoSessionConverter implements GenericConverter
|
||||
|
||||
private static final Log LOG = LogFactory.getLog(AbstractMongoSessionConverter.class);
|
||||
|
||||
protected static final String EXPIRE_AT_FIELD_NAME = "expireAt";
|
||||
static final String EXPIRE_AT_FIELD_NAME = "expireAt";
|
||||
|
||||
private static final String SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT";
|
||||
|
||||
|
||||
@@ -145,12 +145,14 @@ public class JacksonMongoSessionConverter extends AbstractMongoSessionConverter
|
||||
|
||||
@Override
|
||||
public String translate(String propertyName) {
|
||||
if (propertyName.equals("id")) {
|
||||
return "_id";
|
||||
} else if (propertyName.equals("_id")) {
|
||||
return "id";
|
||||
} else {
|
||||
return propertyName;
|
||||
|
||||
switch (propertyName) {
|
||||
case "id":
|
||||
return "_id";
|
||||
case "_id":
|
||||
return "id";
|
||||
default:
|
||||
return propertyName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,12 +18,13 @@ package org.springframework.session.data.mongo;
|
||||
|
||||
import static org.springframework.session.data.mongo.MongoSessionUtils.*;
|
||||
|
||||
import lombok.Setter;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.bson.Document;
|
||||
import org.slf4j.Logger;
|
||||
@@ -34,14 +35,11 @@ import org.springframework.context.ApplicationEventPublisher;
|
||||
import org.springframework.context.ApplicationEventPublisherAware;
|
||||
import org.springframework.data.mongodb.core.MongoOperations;
|
||||
import org.springframework.data.mongodb.core.index.IndexOperations;
|
||||
import org.springframework.data.mongodb.core.query.Query;
|
||||
import org.springframework.session.FindByIndexNameSessionRepository;
|
||||
import org.springframework.session.events.SessionCreatedEvent;
|
||||
import org.springframework.session.events.SessionDeletedEvent;
|
||||
import org.springframework.session.events.SessionExpiredEvent;
|
||||
|
||||
import com.mongodb.DBObject;
|
||||
|
||||
/**
|
||||
* Session repository implementation which stores sessions in Mongo. Uses
|
||||
* {@link AbstractMongoSessionConverter} to transform session objects from/to native Mongo
|
||||
@@ -57,6 +55,8 @@ import com.mongodb.DBObject;
|
||||
public class MongoOperationsSessionRepository
|
||||
implements FindByIndexNameSessionRepository<MongoSession>, ApplicationEventPublisherAware, InitializingBean {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(MongoOperationsSessionRepository.class);
|
||||
|
||||
/**
|
||||
* The default time period in seconds in which a session will expire.
|
||||
*/
|
||||
@@ -67,13 +67,11 @@ public class MongoOperationsSessionRepository
|
||||
*/
|
||||
public static final String DEFAULT_COLLECTION_NAME = "sessions";
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(MongoOperationsSessionRepository.class);
|
||||
|
||||
private final MongoOperations mongoOperations;
|
||||
|
||||
private Integer maxInactiveIntervalInSeconds = DEFAULT_INACTIVE_INTERVAL;
|
||||
private String collectionName = DEFAULT_COLLECTION_NAME;
|
||||
private AbstractMongoSessionConverter mongoSessionConverter = new JdkMongoSessionConverter(
|
||||
@Setter private Integer maxInactiveIntervalInSeconds = DEFAULT_INACTIVE_INTERVAL;
|
||||
@Setter private String collectionName = DEFAULT_COLLECTION_NAME;
|
||||
@Setter private AbstractMongoSessionConverter mongoSessionConverter = new JdkMongoSessionConverter(
|
||||
Duration.ofSeconds(this.maxInactiveIntervalInSeconds));
|
||||
private ApplicationEventPublisher eventPublisher;
|
||||
|
||||
@@ -91,15 +89,13 @@ public class MongoOperationsSessionRepository
|
||||
}
|
||||
|
||||
publishEvent(new SessionCreatedEvent(this, session));
|
||||
|
||||
|
||||
return session;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(MongoSession session) {
|
||||
|
||||
DBObject sessionDbObject = convertToDBObject(this.mongoSessionConverter, session);
|
||||
this.mongoOperations.save(sessionDbObject, this.collectionName);
|
||||
this.mongoOperations.save(convertToDBObject(this.mongoSessionConverter, session), this.collectionName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -114,8 +110,10 @@ public class MongoOperationsSessionRepository
|
||||
MongoSession session = convertToSession(this.mongoSessionConverter, sessionWrapper);
|
||||
|
||||
if (session.isExpired()) {
|
||||
|
||||
publishEvent(new SessionExpiredEvent(this, session));
|
||||
deleteById(id);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -134,26 +132,17 @@ public class MongoOperationsSessionRepository
|
||||
@Override
|
||||
public Map<String, MongoSession> findByIndexNameAndIndexValue(String indexName, String indexValue) {
|
||||
|
||||
HashMap<String, MongoSession> result = new HashMap<String, MongoSession>();
|
||||
|
||||
Query query = this.mongoSessionConverter.getQueryForIndex(indexName, indexValue);
|
||||
|
||||
if (query == null) {
|
||||
return Collections.emptyMap();
|
||||
return Optional.ofNullable(this.mongoSessionConverter.getQueryForIndex(indexName, indexValue))
|
||||
.map(query -> this.mongoOperations.find(query, Document.class, this.collectionName))
|
||||
.orElse(Collections.emptyList())
|
||||
.stream()
|
||||
.map(dbSession -> convertToSession(this.mongoSessionConverter, dbSession))
|
||||
.collect(Collectors.toMap(MongoSession::getId, mapSession -> mapSession));
|
||||
}
|
||||
|
||||
List<Document> mapSessions = this.mongoOperations.find(query, Document.class, this.collectionName);
|
||||
|
||||
for (Document dbSession : mapSessions) {
|
||||
MongoSession mapSession = convertToSession(this.mongoSessionConverter, dbSession);
|
||||
result.put(mapSession.getId(), mapSession);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteById(String id) {
|
||||
|
||||
Optional.ofNullable(findSession(id))
|
||||
.ifPresent(document -> {
|
||||
publishEvent(new SessionDeletedEvent(this, convertToSession(this.mongoSessionConverter, document)));
|
||||
@@ -168,22 +157,10 @@ public class MongoOperationsSessionRepository
|
||||
this.mongoSessionConverter.ensureIndexes(indexOperations);
|
||||
}
|
||||
|
||||
Document findSession(String id) {
|
||||
private Document findSession(String id) {
|
||||
return this.mongoOperations.findById(id, Document.class, this.collectionName);
|
||||
}
|
||||
|
||||
public void setMongoSessionConverter(AbstractMongoSessionConverter mongoSessionConverter) {
|
||||
this.mongoSessionConverter = mongoSessionConverter;
|
||||
}
|
||||
|
||||
public void setMaxInactiveIntervalInSeconds(Integer maxInactiveIntervalInSeconds) {
|
||||
this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds;
|
||||
}
|
||||
|
||||
public void setCollectionName(String collectionName) {
|
||||
this.collectionName = collectionName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher) {
|
||||
this.eventPublisher = eventPublisher;
|
||||
|
||||
@@ -15,14 +15,18 @@
|
||||
*/
|
||||
package org.springframework.session.data.mongo;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
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.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.session.Session;
|
||||
|
||||
@@ -33,6 +37,7 @@ import org.springframework.session.Session;
|
||||
* @author Greg Turnquist
|
||||
* @since 1.2
|
||||
*/
|
||||
@EqualsAndHashCode(of = {"id"})
|
||||
public class MongoSession implements Session {
|
||||
|
||||
/**
|
||||
@@ -40,12 +45,12 @@ public class MongoSession implements Session {
|
||||
*/
|
||||
private static final char DOT_COVER_CHAR = '\uF607';
|
||||
|
||||
private String id;
|
||||
@Getter private String id;
|
||||
private long createdMillis = System.currentTimeMillis();
|
||||
private long accessedMillis;
|
||||
private long intervalSeconds;
|
||||
private Date expireAt;
|
||||
private Map<String, Object> attrs = new HashMap<String, Object>();
|
||||
@Getter @Setter private Date expireAt;
|
||||
private Map<String, Object> attrs = new HashMap<>();
|
||||
|
||||
public MongoSession() {
|
||||
this(MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL);
|
||||
@@ -62,21 +67,13 @@ public class MongoSession implements Session {
|
||||
setLastAccessedTime(Instant.ofEpochMilli(this.createdMillis));
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
public String changeSessionId() {
|
||||
String changedId = generateId();
|
||||
|
||||
String changedId = UUID.randomUUID().toString();
|
||||
this.id = changedId;
|
||||
return changedId;
|
||||
}
|
||||
|
||||
private String generateId() {
|
||||
return UUID.randomUUID().toString();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public <T> T getAttribute(String attributeName) {
|
||||
return (T) this.attrs.get(coverDot(attributeName));
|
||||
@@ -84,13 +81,9 @@ public class MongoSession implements Session {
|
||||
|
||||
public Set<String> getAttributeNames() {
|
||||
|
||||
HashSet<String> result = new HashSet<>();
|
||||
|
||||
for (String key : this.attrs.keySet()) {
|
||||
result.add(uncoverDot(key));
|
||||
}
|
||||
|
||||
return result;
|
||||
return this.attrs.keySet().stream()
|
||||
.map(MongoSession::uncoverDot)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
public void setAttribute(String attributeName, Object attributeValue) {
|
||||
@@ -136,14 +129,6 @@ public class MongoSession implements Session {
|
||||
return this.intervalSeconds >= 0 && new Date().after(this.expireAt);
|
||||
}
|
||||
|
||||
public Date getExpireAt() {
|
||||
return this.expireAt;
|
||||
}
|
||||
|
||||
public void setExpireAt(Date expireAt) {
|
||||
this.expireAt = expireAt;
|
||||
}
|
||||
|
||||
static String coverDot(String attributeName) {
|
||||
return attributeName.replace('.', DOT_COVER_CHAR);
|
||||
}
|
||||
@@ -151,24 +136,4 @@ public class MongoSession implements Session {
|
||||
static String uncoverDot(String attributeName) {
|
||||
return attributeName.replace(DOT_COVER_CHAR, '.');
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
MongoSession that = (MongoSession) o;
|
||||
|
||||
return this.id.equals(that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return this.id.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,9 @@ package org.springframework.session.data.mongo;
|
||||
|
||||
import static org.springframework.session.data.mongo.MongoSessionUtils.*;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
import org.bson.Document;
|
||||
@@ -54,12 +57,12 @@ public class ReactiveMongoOperationsSessionRepository
|
||||
|
||||
private final ReactiveMongoOperations mongoOperations;
|
||||
|
||||
private Integer maxInactiveIntervalInSeconds = DEFAULT_INACTIVE_INTERVAL;
|
||||
private String collectionName = DEFAULT_COLLECTION_NAME;
|
||||
private AbstractMongoSessionConverter mongoSessionConverter = new JdkMongoSessionConverter(
|
||||
@Getter @Setter private Integer maxInactiveIntervalInSeconds = DEFAULT_INACTIVE_INTERVAL;
|
||||
@Getter @Setter private String collectionName = DEFAULT_COLLECTION_NAME;
|
||||
@Setter private AbstractMongoSessionConverter mongoSessionConverter = new JdkMongoSessionConverter(
|
||||
Duration.ofSeconds(this.maxInactiveIntervalInSeconds));
|
||||
|
||||
private MongoOperations blockingMongoOperations;
|
||||
@Setter private MongoOperations blockingMongoOperations;
|
||||
private ApplicationEventPublisher eventPublisher;
|
||||
|
||||
public ReactiveMongoOperationsSessionRepository(ReactiveMongoOperations mongoOperations) {
|
||||
@@ -110,11 +113,11 @@ public class ReactiveMongoOperationsSessionRepository
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the {@link MongoSession} by the {@link MongoSession#getId()} or null if no
|
||||
* Gets the {@link MongoSession} by the {@link MongoSession#getId()} or {@link Mono#empty()} if no
|
||||
* {@link MongoSession} is found.
|
||||
*
|
||||
* @param id the {@link MongoSession#getId()} to lookup
|
||||
* @return the {@link MongoSession} by the {@link MongoSession#getId()} or null if no
|
||||
* @return the {@link MongoSession} by the {@link MongoSession#getId()} or {@link Mono#empty()} if no
|
||||
* {@link MongoSession} is found.
|
||||
*/
|
||||
@Override
|
||||
@@ -159,34 +162,6 @@ public class ReactiveMongoOperationsSessionRepository
|
||||
return this.mongoOperations.findById(id, Document.class, this.collectionName);
|
||||
}
|
||||
|
||||
public void setMongoSessionConverter(AbstractMongoSessionConverter mongoSessionConverter) {
|
||||
this.mongoSessionConverter = mongoSessionConverter;
|
||||
}
|
||||
|
||||
public void setMaxInactiveIntervalInSeconds(Integer maxInactiveIntervalInSeconds) {
|
||||
this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds;
|
||||
}
|
||||
|
||||
public Integer getMaxInactiveIntervalInSeconds() {
|
||||
return maxInactiveIntervalInSeconds;
|
||||
}
|
||||
|
||||
public void setCollectionName(String collectionName) {
|
||||
this.collectionName = collectionName;
|
||||
}
|
||||
|
||||
public String getCollectionName() {
|
||||
return collectionName;
|
||||
}
|
||||
|
||||
public MongoOperations getBlockingMongoOperations() {
|
||||
return this.blockingMongoOperations;
|
||||
}
|
||||
|
||||
public void setBlockingMongoOperations(MongoOperations blockingMongoOperations) {
|
||||
this.blockingMongoOperations = blockingMongoOperations;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher) {
|
||||
this.eventPublisher = eventPublisher;
|
||||
|
||||
Reference in New Issue
Block a user