Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ public class TrolieApiConstants {
private TrolieApiConstants() {
}

/**
* Path to <a href="https://trolie.energy/spec-1.0#tag/Seasonal/operation/getSeasonalRatingsSnapshot">getSeasonalRatings</a>
*/
public static final String PATH_SEASONAL_SNAPSHOT = "/seasonal-ratings/snapshot";

/**
* Path to <a href="https://trolie.energy/spec-1.0#tag/Real-Time/operation/getRealTimeLimits">getRealTimeLimits</a>
*/
Expand Down Expand Up @@ -48,6 +53,11 @@ private TrolieApiConstants() {
*/
public static final String PATH_DEFAULT_MONITORING_SET = "/default-monitoring-set";

/**
* Content type for seasonal rating snapshots
*/
public static final String CONTENT_TYPE_SEASONAL_SNAPSHOT = "application/vnd.trolie.seasonal-rating-snapshot.v1+json";

/**
* Content type for real-time limit snapshots
*/
Expand Down
56 changes: 56 additions & 0 deletions java-client/src/main/java/energy/trolie/client/TrolieClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import energy.trolie.client.request.operatingsnapshots.ForecastSnapshotSubscribedReceiver;
import energy.trolie.client.request.operatingsnapshots.RealTimeSnapshotReceiver;
import energy.trolie.client.request.operatingsnapshots.RealTimeSnapshotSubscribedReceiver;
import energy.trolie.client.request.operatingsnapshots.SeasonalSnapshotReceiver;
import energy.trolie.client.request.operatingsnapshots.SeasonalSnapshotSubscribedReceiver;
import energy.trolie.client.request.ratingproposals.ForecastRatingProposalUpdate;
import energy.trolie.client.request.ratingproposals.RealTimeRatingProposalUpdate;
import lombok.NonNull;
Expand Down Expand Up @@ -385,6 +387,60 @@ RequestSubscription subscribeToRegionalRealTimeLimits(
*/
RealTimeRatingProposalUpdate createRealTimeRatingProposalStreamingUpdate();

/**
* Execute a synchronous
* request for the current seasonal limits with a streaming response handler,
* assuming this user's default monitoring set.
*
* @param receiver Streaming data receiver for snapshot data
*/
void getInUseSeasonalSnapshots(
SeasonalSnapshotReceiver receiver);

/**
* Execute a request for the current seasonal limits with a streaming response handler
* with the given monitoring set.
*
* @param receiver Streaming data receiver for snapshot data
* @param monitoringSet filter for monitoring set name
*/
void getInUseSeasonalSnapshots(
SeasonalSnapshotReceiver receiver,
String monitoringSet);

/**
* Execute a request for the current seasonal limits with a streaming response handler
*
* @param receiver Streaming data receiver for snapshot data
* @param monitoringSet filter for monitoring set name
* @param resourceId Only return snapshots for this power system resource
*/
void getInUseSeasonalSnapshots(
SeasonalSnapshotReceiver receiver,
String monitoringSet,
String resourceId
);

/**
* Create a polling subscription for seasonal limits data updates
*
* @param receiver Streaming data receiver for snapshot data
* @param monitoringSet filter for monitoring set name
* @return request handle
*/
RequestSubscription subscribeToInUseSeasonalSnapshotUpdates(
SeasonalSnapshotSubscribedReceiver receiver,
String monitoringSet);

/**
* Create a polling subscription for seasonal snapshot data updates
*
* @param receiver Streaming data receiver for snapshot data
* @return request handle
*/
RequestSubscription subscribeToInUseSeasonalSnapshotUpdates(
SeasonalSnapshotSubscribedReceiver receiver);

/**
* Un-subscribe an active polling request
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import energy.trolie.client.impl.TrolieClientImpl;
import energy.trolie.client.request.monitoringsets.MonitoringSetsSubscribedReceiver;
import energy.trolie.client.request.operatingsnapshots.ForecastSnapshotSubscribedReceiver;
import energy.trolie.client.request.operatingsnapshots.SeasonalSnapshotSubscribedReceiver;
import energy.trolie.client.request.operatingsnapshots.RealTimeSnapshotSubscribedReceiver;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
Expand Down Expand Up @@ -54,6 +55,7 @@ public class TrolieClientBuilder {
private int realTimeRatingsPollMs = 10000;
private int forecastRatingsPollMs = 30000;
private int monitoringSetPollMs = 60000;
private int seasonalRatingsPollMs = 30000;

/**
* Initializes a new builder with a preconfigured apache HTTP client
Expand Down Expand Up @@ -178,6 +180,18 @@ public TrolieClientBuilder monitoringSetPollMs(int monitoringSetPollMs) {
return this;
}

/**
* Sets the period at which
* {@link TrolieClient#subscribeToInUseSeasonalSnapshotUpdates(SeasonalSnapshotSubscribedReceiver)}
* and similar methods for forecast ratings poll for new ratings. Defaults to 30 seconds
* @param seasonalRatingsPollMs new poll periodicity in milliseconds
* @return fluent builder
*/
public TrolieClientBuilder seasonalRatingsPollMs(int seasonalRatingsPollMs) {
this.seasonalRatingsPollMs = seasonalRatingsPollMs;
return this;
}

/**
* Construct a new client
* @return new client
Expand All @@ -204,6 +218,6 @@ public TrolieClient build() {
return new TrolieClientImpl(httpClient, host, requestConfig, bufferSize,
objectMapper, eTagStore, httpHeaders, periodLengthMinutes,
realTimeRatingsPollMs,
forecastRatingsPollMs, monitoringSetPollMs);
forecastRatingsPollMs, monitoringSetPollMs, seasonalRatingsPollMs);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,16 @@
import energy.trolie.client.impl.request.operatingsnapshots.RegionalForecastSubscribedSnapshotRequest;
import energy.trolie.client.impl.request.operatingsnapshots.RegionalRealTimeSnapshotRequest;
import energy.trolie.client.impl.request.operatingsnapshots.RegionalRealTimeSnapshotSubscribedRequest;
import energy.trolie.client.impl.request.operatingsnapshots.SeasonalSnapshotRequest;
import energy.trolie.client.impl.request.operatingsnapshots.SeasonalSnapshotSubscribedRequest;
import energy.trolie.client.request.monitoringsets.MonitoringSetsReceiver;
import energy.trolie.client.request.monitoringsets.MonitoringSetsSubscribedReceiver;
import energy.trolie.client.request.operatingsnapshots.ForecastSnapshotReceiver;
import energy.trolie.client.request.operatingsnapshots.ForecastSnapshotSubscribedReceiver;
import energy.trolie.client.request.operatingsnapshots.RealTimeSnapshotReceiver;
import energy.trolie.client.request.operatingsnapshots.RealTimeSnapshotSubscribedReceiver;
import energy.trolie.client.request.operatingsnapshots.SeasonalSnapshotReceiver;
import energy.trolie.client.request.operatingsnapshots.SeasonalSnapshotSubscribedReceiver;
import energy.trolie.client.request.ratingproposals.ForecastRatingProposalUpdate;
import energy.trolie.client.request.ratingproposals.RealTimeRatingProposalUpdate;
import org.apache.hc.client5.http.config.RequestConfig;
Expand Down Expand Up @@ -54,13 +58,15 @@ public class TrolieClientImpl implements TrolieClient {
private final int realTimeRatingsPollMs;
private final int forecastRatingsPollMs;
private final int monitoringSetPollMs;
private final int seasonalRatingsPollMs;

public TrolieClientImpl(CloseableHttpClient httpClient, TrolieHost host, RequestConfig requestConfig, int bufferSize,
ObjectMapper objectMapper, ETagStore eTagStore, Map<String, String> httpHeaders,
int defaultIntervalMinutes,
int realTimeRatingsPollMs,
int forecastRatingsPollMs,
int monitoringSetPollMs) {
int monitoringSetPollMs,
int seasonalRatingsPollMs) {
super();
this.httpClient = httpClient;
this.host = host;
Expand All @@ -73,6 +79,7 @@ public TrolieClientImpl(CloseableHttpClient httpClient, TrolieHost host, Request
this.realTimeRatingsPollMs = realTimeRatingsPollMs;
this.forecastRatingsPollMs = forecastRatingsPollMs;
this.monitoringSetPollMs = monitoringSetPollMs;
this.seasonalRatingsPollMs = seasonalRatingsPollMs;
}

final Set<RequestSubscriptionInternal> activeSubscriptions = new HashSet<>();
Expand Down Expand Up @@ -373,6 +380,63 @@ public DefaultMonitoringSetSubscribedRequest subscribeToDefaultMonitoringSetUpda
return subscription;
}

@Override
public void getInUseSeasonalSnapshots(SeasonalSnapshotReceiver receiver) {
getInUseSeasonalSnapshots(receiver, null, null);
}

@Override
public void getInUseSeasonalSnapshots(SeasonalSnapshotReceiver receiver, String monitoringSet) {
getInUseSeasonalSnapshots(receiver, monitoringSet, null);
}

@Override
public void getInUseSeasonalSnapshots(
SeasonalSnapshotReceiver receiver,
String monitoringSet,
String resourceId) {

new SeasonalSnapshotRequest(
httpClient,
host,
requestConfig,
bufferSize,
objectMapper,
httpHeaders,
receiver,
monitoringSet,
resourceId).executeRequest();
}

@Override
public SeasonalSnapshotSubscribedRequest subscribeToInUseSeasonalSnapshotUpdates(
SeasonalSnapshotSubscribedReceiver receiver) {
return subscribeToInUseSeasonalSnapshotUpdates(receiver, null);
}

@Override
public SeasonalSnapshotSubscribedRequest subscribeToInUseSeasonalSnapshotUpdates(
SeasonalSnapshotSubscribedReceiver receiver,
String monitoringSet) {

SeasonalSnapshotSubscribedRequest subscription = new SeasonalSnapshotSubscribedRequest(
httpClient,
host,
requestConfig,
bufferSize,
objectMapper,
httpHeaders,
seasonalRatingsPollMs,
receiver,
eTagStore,
monitoringSet);

addSubscription(subscription);
return subscription;

}


@Override
public void close() throws IOException {
logger.info("Closing all subscriptions");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package energy.trolie.client.impl.request.operatingsnapshots;

import com.fasterxml.jackson.databind.ObjectMapper;
import energy.trolie.client.TrolieApiConstants;
import energy.trolie.client.TrolieHost;
import energy.trolie.client.impl.request.AbstractStreamingGet;
import energy.trolie.client.request.operatingsnapshots.SeasonalSnapshotReceiver;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.core5.net.URIBuilder;

import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.Map;

/**
* On-demand GET request for seasonal limits with ETAG usage
*/
public class SeasonalSnapshotRequest extends AbstractStreamingGet<SeasonalSnapshotReceiver> {

String monitoringSet;
String resourceId;

public SeasonalSnapshotRequest(
HttpClient httpClient,
TrolieHost host,
RequestConfig requestConfig,
int bufferSize,
ObjectMapper objectMapper,
Map<String, String> httpHeaders,
SeasonalSnapshotReceiver receiver, // seasonal
String monitoringSet,
String resourceId) {

super(httpClient, host, requestConfig, bufferSize, objectMapper, httpHeaders, receiver);
this.monitoringSet = monitoringSet;
this.resourceId = resourceId;
}

@Override
protected String getPath() {
return TrolieApiConstants.PATH_SEASONAL_SNAPSHOT;
}

@Override
protected String getContentType() {
return TrolieApiConstants.CONTENT_TYPE_SEASONAL_SNAPSHOT;
}

@Override
protected HttpGet createRequest() throws URISyntaxException {

HttpGet get = super.createRequest();
URIBuilder uriBuilder = new URIBuilder(get.getUri());

if (monitoringSet != null) {

//add the monitoring set parameter to the base URI
uriBuilder.addParameter(TrolieApiConstants.PARAM_MONITORING_SET, monitoringSet);
}

if (resourceId != null) {
//add the resource ID parameter to the base URI
uriBuilder.addParameter(TrolieApiConstants.PARAM_RESOURCE_ID, resourceId);
}

get.setUri(uriBuilder.build());
return get;
}

@Override
protected Boolean handleResponseContent(InputStream inputStream) {
return new SeasonalSnapshotResponseParser(receiver).parseResponse(inputStream, jsonFactory);
}


}
Loading