diff --git a/spring-session-core/spring-session-core.gradle b/spring-session-core/spring-session-core.gradle index 171204c9..b0ed7dfd 100644 --- a/spring-session-core/spring-session-core.gradle +++ b/spring-session-core/spring-session-core.gradle @@ -5,6 +5,7 @@ description = "Spring Session" dependencies { compile "org.springframework:spring-jcl" + optional "io.projectreactor:reactor-core" optional "org.springframework:spring-context" optional "org.springframework:spring-jdbc" optional "org.springframework:spring-messaging" diff --git a/spring-session-core/src/main/java/org/springframework/session/ReactorSessionRepository.java b/spring-session-core/src/main/java/org/springframework/session/ReactorSessionRepository.java new file mode 100644 index 00000000..d7506d10 --- /dev/null +++ b/spring-session-core/src/main/java/org/springframework/session/ReactorSessionRepository.java @@ -0,0 +1,75 @@ +/* + * Copyright 2014-2017 the original author or authors. + * + * Licensed 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.springframework.session; + +import reactor.core.publisher.Mono; + +/** + * A repository interface for managing {@link Session} instances. + * + * @param the {@link Session} type + * @author Rob Winch + * @since 2.0 + */ +public interface ReactorSessionRepository { + + /** + * Creates a new {@link Session} that is capable of being persisted by this + * {@link ReactorSessionRepository}. + * + *

+ * This allows optimizations and customizations in how the {@link Session} is + * persisted. For example, the implementation returned might keep track of the changes + * ensuring that only the delta needs to be persisted on a save. + *

+ * + * @return a new {@link Session} that is capable of being persisted by this + * {@link ReactorSessionRepository} + */ + Mono createSession(); + + /** + * Ensures the {@link Session} created by + * {@link ReactorSessionRepository#createSession()} is saved. + * + *

+ * Some implementations may choose to save as the {@link Session} is updated by + * returning a {@link Session} that immediately persists any changes. In this case, + * this method may not actually do anything. + *

+ * + * @param session the {@link Session} to save + */ + Mono save(S session); + + /** + * Gets the {@link Session} by the {@link Session#getId()} or null if no + * {@link Session} is found. + * + * @param id the {@link Session#getId()} to lookup + * @return the {@link Session} by the {@link Session#getId()} or null if no + * {@link Session} is found. + */ + Mono findById(String id); + + /** + * Deletes the {@link Session} with the given {@link Session#getId()} or does nothing + * if the {@link Session} is not found. + * @param id the {@link Session#getId()} to delete + */ + Mono delete(String id); +}