org.kiwiproject.consul.SessionClient Maven / Gradle / Ivy
package org.kiwiproject.consul;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import org.kiwiproject.consul.config.ClientConfig;
import org.kiwiproject.consul.model.session.Session;
import org.kiwiproject.consul.model.session.SessionCreatedResponse;
import org.kiwiproject.consul.model.session.SessionInfo;
import org.kiwiproject.consul.monitoring.ClientEventCallback;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.PUT;
import retrofit2.http.Path;
import retrofit2.http.QueryMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* HTTP Client for /v1/session/ endpoints.
*
* @see The Consul API Docs
*/
public class SessionClient extends BaseClient {
private static final String CLIENT_NAME = "session";
private final Api api;
/**
* Constructs an instance of this class.
*
* @param retrofit The {@link Retrofit} to build a client from.
*/
SessionClient(Retrofit retrofit, ClientConfig config, ClientEventCallback eventCallback) {
super(CLIENT_NAME, config, eventCallback);
this.api = retrofit.create(Api.class);
}
/**
* Create Session.
*
* PUT /v1/session/create
*
* @param value The session to create.
* @return ID of the newly created session.
*/
public SessionCreatedResponse createSession(final Session value) {
return createSession(value, null);
}
/**
* Create Session.
*
* PUT /v1/session/create
*
* @param value The session to create.
* @param dc The data center.
* @return Response containing the session ID.
*/
public SessionCreatedResponse createSession(final Session value, final String dc) {
return http.extract(api.createSession(value, dcQuery(dc)));
}
private Map dcQuery(String dc) {
return nonNull(dc) ? Map.of("dc", dc) : Map.of();
}
public Optional renewSession(final String sessionId) {
return renewSession(null, sessionId);
}
/**
* Renews a session.
*
* @param dc The datacenter.
* @param sessionId The session ID to renew.
* @return The {@link SessionInfo} object for the renewed session.
*/
public Optional renewSession(final String dc, final String sessionId) {
List sessionInfo = http.extract(api.renewSession(sessionId,
Map.of(), dcQuery(dc)));
return isNull(sessionInfo) || sessionInfo.isEmpty() ? Optional.empty() :
Optional.of(sessionInfo.get(0));
}
/**
* Destroys a session.
*
* PUT /v1/session/destroy/{sessionId}
*
* @param sessionId The session ID to destroy.
*/
public void destroySession(final String sessionId) {
destroySession(sessionId, null);
}
/**
* Destroys a session.
*
* PUT /v1/session/destroy/{sessionId}
*
* @param sessionId The session ID to destroy.
* @param dc The data center.
*/
public void destroySession(final String sessionId, final String dc) {
http.handle(api.destroySession(sessionId, dcQuery(dc)));
}
/**
* Retrieves session info.
*
* GET /v1/session/info/{sessionId}
*
* @param sessionId the session ID
* @return {@link SessionInfo}.
*/
public Optional getSessionInfo(final String sessionId) {
return getSessionInfo(sessionId, null);
}
/**
* Retrieves session info.
*
* GET /v1/session/info/{sessionId}
*
* @param sessionId the session ID
* @param dc Data center
* @return {@link SessionInfo}.
*/
public Optional getSessionInfo(final String sessionId, final String dc) {
List sessionInfo = http.extract(api.getSessionInfo(sessionId, dcQuery(dc)));
return isNull(sessionInfo) || sessionInfo.isEmpty() ? Optional.empty() :
Optional.of(sessionInfo.get(0));
}
/**
* Lists all sessions.
*
* GET /v1/session/list
*
* @param dc The data center.
* @return A list of available sessions.
*/
public List listSessions(final String dc) {
return http.extract(api.listSessions(dcQuery(dc)));
}
/**
* Lists all sessions.
*
* GET /v1/session/list
*
* @return A list of available sessions.
*/
public List listSessions() {
return listSessions(null);
}
/**
* Retrofit API interface.
*/
interface Api {
@PUT("session/create")
Call createSession(@Body Session value,
@QueryMap Map query);
@PUT("session/renew/{sessionId}")
Call> renewSession(@Path("sessionId") String sessionId,
@Body Map body,
@QueryMap Map query);
@PUT("session/destroy/{sessionId}")
Call destroySession(@Path("sessionId") String sessionId,
@QueryMap Map query);
@GET("session/info/{sessionId}")
Call> getSessionInfo(@Path("sessionId") String sessionId,
@QueryMap Map query);
@GET("session/list")
Call> listSessions(@QueryMap Map query);
}
}