From 7e708be7dbf9edbe3068ba2025a75d3ee083a0f6 Mon Sep 17 00:00:00 2001 From: Matt Magoffin Date: Sun, 20 Oct 2024 13:44:56 +1300 Subject: [PATCH 1/5] Do not reset poll task state to Completed for certain IO or HTTP client exceptions. --- .../c2c/biz/impl/DaoCloudDatumStreamPollService.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/DaoCloudDatumStreamPollService.java b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/DaoCloudDatumStreamPollService.java index 9e1c73620..74d63ecf5 100644 --- a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/DaoCloudDatumStreamPollService.java +++ b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/DaoCloudDatumStreamPollService.java @@ -27,6 +27,7 @@ import static net.solarnetwork.central.domain.BasicClaimableJobState.Executing; import static net.solarnetwork.central.domain.BasicClaimableJobState.Queued; import static net.solarnetwork.util.ObjectUtils.requireNonNullArgument; +import java.io.IOException; import java.time.Clock; import java.time.Duration; import java.time.Instant; @@ -44,6 +45,8 @@ import org.springframework.scheduling.Trigger; import org.springframework.scheduling.support.PeriodicTrigger; import org.springframework.scheduling.support.SimpleTriggerContext; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestClientException; import net.solarnetwork.central.biz.UserEventAppenderBiz; import net.solarnetwork.central.c2c.biz.CloudDatumStreamPollService; import net.solarnetwork.central.c2c.biz.CloudDatumStreamService; @@ -67,7 +70,7 @@ * DAO based implementation of {@link CloudDatumStreamPollService}. * * @author matt - * @version 1.0 + * @version 1.1 */ public class DaoCloudDatumStreamPollService implements CloudDatumStreamPollService, ServiceLifecycleObserver, CloudIntegrationsUserEvents { @@ -205,7 +208,11 @@ public CloudDatumStreamPollTaskEntity call() throws Exception { var oldState = taskInfo.getState(); taskInfo.setMessage(errMsg); taskInfo.putServiceProps(errData); - taskInfo.setState(Completed); // stop processing job + if ( !((e instanceof RestClientException && !(e instanceof HttpClientErrorException)) + || t instanceof IOException) ) { + // stop processing job if not what appears to be a API IO exception + taskInfo.setState(Completed); + } userEventAppenderBiz.addEvent(taskInfo.getUserId(), eventForConfiguration(taskInfo.getId(), POLL_ERROR_TAGS, errMsg, errData)); taskDao.updateTask(taskInfo, oldState); From d3d3152e179f619be02569fa181016203b036ec2 Mon Sep 17 00:00:00 2001 From: Matt Magoffin Date: Tue, 22 Oct 2024 07:18:53 +1300 Subject: [PATCH 2/5] Refactor /data-values API to be based on integration ID, not datum stream ID. This API is intended to help design a datum stream mapping, before a datum stream might even exist. --- .../c2c/biz/CloudDatumStreamService.java | 9 +-- .../LocusEnergyCloudDatumStreamService.java | 16 ++--- .../SolarEdgeCloudDatumStreamService.java | 10 +-- .../SolrenViewCloudDatumStreamService.java | 29 +++----- .../v1/UserCloudIntegrationsController.java | 67 ++++++++++++------- .../c2c/biz/UserCloudIntegrationsBiz.java | 14 ++-- .../biz/impl/DaoUserCloudIntegrationsBiz.java | 53 ++++++++++++--- 7 files changed, 123 insertions(+), 75 deletions(-) diff --git a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/CloudDatumStreamService.java b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/CloudDatumStreamService.java index 5f5ab2741..5be8c17dd 100644 --- a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/CloudDatumStreamService.java +++ b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/CloudDatumStreamService.java @@ -28,6 +28,7 @@ import net.solarnetwork.central.c2c.domain.CloudDatumStreamConfiguration; import net.solarnetwork.central.c2c.domain.CloudDatumStreamQueryFilter; import net.solarnetwork.central.c2c.domain.CloudDatumStreamQueryResult; +import net.solarnetwork.central.c2c.domain.CloudIntegrationConfiguration; import net.solarnetwork.central.domain.UserLongCompositePK; import net.solarnetwork.domain.Identity; import net.solarnetwork.domain.LocalizedServiceInfo; @@ -39,7 +40,7 @@ * API for a cloud datum stream service. * * @author matt - * @version 1.1 + * @version 1.2 */ public interface CloudDatumStreamService extends Identity, SettingSpecifierProvider, LocalizedServiceInfoProvider { @@ -62,8 +63,8 @@ public interface CloudDatumStreamService /** * List data values. * - * @param datumStreamId - * the ID of the {@link CloudDatumStreamConfiguration} to get the + * @param integrationId + * the ID of the {@link CloudIntegrationConfiguration} to get the * data values for * @param filters * an optional set of search filters to limit the data value groups @@ -72,7 +73,7 @@ public interface CloudDatumStreamService * @return the available values, never {@literal null} * */ - Iterable dataValues(UserLongCompositePK datumStreamId, Map filters); + Iterable dataValues(UserLongCompositePK integrationId, Map filters); /** * Get the latest available datum for a datum stream configuration. diff --git a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.java b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.java index 8a62bd5a4..0f1a459cd 100644 --- a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.java +++ b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.java @@ -139,7 +139,7 @@ * }} * * @author matt - * @version 1.5 + * @version 1.6 */ public class LocusEnergyCloudDatumStreamService extends BaseOAuth2ClientCloudDatumStreamService { @@ -246,15 +246,11 @@ public Iterable dataValueFilters(Locale locale) { } @Override - public Iterable dataValues(UserLongCompositePK id, Map filters) { - final CloudDatumStreamConfiguration datumStream = requireNonNullObject( - datumStreamDao.get(requireNonNullArgument(id, "id")), "datumStream"); - final CloudDatumStreamMappingConfiguration mapping = requireNonNullObject( - datumStreamMappingDao.get(new UserLongCompositePK(datumStream.getUserId(), - datumStream.getDatumStreamMappingId())), - "datumStreamMapping"); - final CloudIntegrationConfiguration integration = integrationDao - .get(new UserLongCompositePK(datumStream.getUserId(), mapping.getIntegrationId())); + public Iterable dataValues(UserLongCompositePK integrationId, + Map filters) { + final CloudIntegrationConfiguration integration = requireNonNullObject( + integrationDao.get(requireNonNullArgument(integrationId, "integrationId")), + "integration"); List result = Collections.emptyList(); if ( filters != null && filters.get(SITE_ID_FILTER) != null && filters.get(COMPONENT_ID_FILTER) != null ) { diff --git a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolarEdgeCloudDatumStreamService.java b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolarEdgeCloudDatumStreamService.java index 920d60024..10eb14d18 100644 --- a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolarEdgeCloudDatumStreamService.java +++ b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolarEdgeCloudDatumStreamService.java @@ -124,11 +124,11 @@ public Iterable dataValueFilters(Locale locale) { } @Override - public Iterable dataValues(UserLongCompositePK id, Map filters) { - final CloudDatumStreamConfiguration datumStream = requireNonNullObject( - datumStreamDao.get(requireNonNullArgument(id, "id")), "datumStream"); - final CloudIntegrationConfiguration integration = integrationDao.get( - new UserLongCompositePK(datumStream.getUserId(), datumStream.getDatumStreamMappingId())); + public Iterable dataValues(UserLongCompositePK integrationId, + Map filters) { + final CloudIntegrationConfiguration integration = requireNonNullObject( + integrationDao.get(requireNonNullArgument(integrationId, "integrationId")), + "integration"); List result = Collections.emptyList(); if ( filters != null && filters.get(SITE_ID_FILTER) != null ) { // TODO diff --git a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.java b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.java index 69d50b15f..5fcf7ded9 100644 --- a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.java +++ b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.java @@ -191,7 +191,7 @@ * * * @author matt - * @version 1.3 + * @version 1.4 */ public class SolrenViewCloudDatumStreamService extends BaseRestOperationsCloudDatumStreamService { @@ -290,20 +290,14 @@ public Iterable dataValueFilters(Locale locale) { } @Override - public Iterable dataValues(UserLongCompositePK datumStreamId, + public Iterable dataValues(UserLongCompositePK integrationId, Map filters) { - final CloudDatumStreamConfiguration datumStream = requireNonNullObject( - datumStreamDao.get(requireNonNullArgument(datumStreamId, "datumStreamId")), - "datumStream"); - final CloudDatumStreamMappingConfiguration mapping = requireNonNullObject( - datumStreamMappingDao.get(new UserLongCompositePK(datumStream.getUserId(), - datumStream.getDatumStreamMappingId())), - "datumStreamMapping"); - final CloudIntegrationConfiguration integration = integrationDao - .get(new UserLongCompositePK(datumStream.getUserId(), mapping.getIntegrationId())); + final CloudIntegrationConfiguration integration = requireNonNullObject( + integrationDao.get(requireNonNullArgument(integrationId, "integrationId")), + "integration"); List result = Collections.emptyList(); if ( filters != null && filters.get(SITE_ID_FILTER) != null ) { - result = componentsForSite(integration, datumStream, filters); + result = componentsForSite(integration, filters); } Collections.sort(result); return result; @@ -492,8 +486,8 @@ private Instant nextDate(Instant date, SolrenViewGranularity granularity) { } private List componentsForSite(CloudIntegrationConfiguration integration, - CloudDatumStreamConfiguration datumStream, Map filters) { - final SolrenViewGranularity granularity = resolveGranularity(datumStream, null); + Map filters) { + final SolrenViewGranularity granularity = resolveGranularity(null, filters); final Clock queryClock = Clock.tick(clock, granularity.getTickDuration()); final Instant endDate = queryEndDate(queryClock, granularity); final Instant startDate = queryStartDate(endDate, granularity); @@ -539,14 +533,13 @@ private Instant queryStartDate(Instant endDate, SolrenViewGranularity granularit } private SolrenViewGranularity resolveGranularity(CloudDatumStreamConfiguration datumStream, - CloudDatumStreamQueryFilter filter) { + Map parameters) { SolrenViewGranularity granularity = null; try { String granSetting = null; - if ( filter != null && filter.hasParameterCriteria() - && filter.getParameters().get(GRANULARITY_SETTING) instanceof String s ) { + if ( parameters != null && parameters.get(GRANULARITY_SETTING) instanceof String s ) { granSetting = s; - } else { + } else if ( datumStream != null ) { granSetting = datumStream.serviceProperty(GRANULARITY_SETTING, String.class); } if ( granSetting != null && !granSetting.isEmpty() ) { diff --git a/solarnet/solaruser/src/main/java/net/solarnetwork/central/reg/web/api/v1/UserCloudIntegrationsController.java b/solarnet/solaruser/src/main/java/net/solarnetwork/central/reg/web/api/v1/UserCloudIntegrationsController.java index 0518f2789..9fe33d61b 100644 --- a/solarnet/solaruser/src/main/java/net/solarnetwork/central/reg/web/api/v1/UserCloudIntegrationsController.java +++ b/solarnet/solaruser/src/main/java/net/solarnetwork/central/reg/web/api/v1/UserCloudIntegrationsController.java @@ -76,7 +76,7 @@ * Web service API for cloud integrations management. * * @author matt - * @version 1.3 + * @version 1.4 */ @Profile(SolarNetCloudIntegrationsConfiguration.CLOUD_INTEGRATIONS) @GlobalExceptionRestController @@ -230,6 +230,46 @@ public Result validateIntegrationConfiguration( return userCloudIntegrationsBiz.validateIntegrationConfigurationForId(id, locale); } + /*-======================= + * Data Values + *-======================= */ + + /** + * List the data values for a datum stream service and an optional filter. + * + * @param integrationId + * the integration ID + * @param datumStreamServiceIdentifier + * the service identifier of the {@link CloudDatumStreamService} to + * use; if not provided then the first service available for the + * {@link CloudIntegrationService} specified in the specified + * {@link CloudIntegrationConfiguration} will be used + * @param req + * the HTTP request to obtain filter parameters from + * @return the values + */ + @RequestMapping(value = "/integrations/{integrationId}/data-values", method = RequestMethod.GET) + public Result> listCloudDatumStreamDataValues( + @PathVariable("integrationId") Long integrationId, + @RequestParam(value = "datumStreamServiceIdentifier", required = false) String datumStreamServiceIdentifier, + WebRequest req) { + var filter = new LinkedHashMap(4); + for ( Iterator itr = req.getParameterNames(); itr.hasNext(); ) { + String param = itr.next(); + if ( "datumStreamServiceIdentifier".equals(param) ) { + continue; + } + Object val = req.getParameter(param); + if ( val != null ) { + filter.put(param, val); + } + } + var result = userCloudIntegrationsBiz.listDatumStreamDataValues( + new UserLongCompositePK(getCurrentActorUserId(), integrationId), + datumStreamServiceIdentifier, filter); + return success(result); + } + /*-======================= * Datum Stream Mapping *-======================= */ @@ -395,31 +435,6 @@ public Result deleteCloudDatumStreamConfiguration( * Datum Stream datum *-======================= */ - /** - * List the data values for a datum stream service and an optional filter. - * - * @param datumStreamId - * the datum stream ID - * @param req - * the HTTP request to obtain filter parameters from - * @return the values - */ - @RequestMapping(value = "/datum-streams/{datumStreamId}/data-values", method = RequestMethod.GET) - public Result> listCloudDatumStreamDataValues( - @PathVariable("datumStreamId") Long datumStreamId, WebRequest req) { - var filter = new LinkedHashMap(4); - for ( Iterator itr = req.getParameterNames(); itr.hasNext(); ) { - String param = itr.next(); - Object val = req.getParameter(param); - if ( val != null ) { - filter.put(param, val); - } - } - var result = userCloudIntegrationsBiz.listDatumStreamDataValues( - new UserLongCompositePK(getCurrentActorUserId(), datumStreamId), filter); - return success(result); - } - /** * List the data values for a datum stream service and an optional filter. * diff --git a/solarnet/user-cloud-integrations/src/main/java/net/solarnetwork/central/user/c2c/biz/UserCloudIntegrationsBiz.java b/solarnet/user-cloud-integrations/src/main/java/net/solarnetwork/central/user/c2c/biz/UserCloudIntegrationsBiz.java index 54f3af5bb..2138b6e03 100644 --- a/solarnet/user-cloud-integrations/src/main/java/net/solarnetwork/central/user/c2c/biz/UserCloudIntegrationsBiz.java +++ b/solarnet/user-cloud-integrations/src/main/java/net/solarnetwork/central/user/c2c/biz/UserCloudIntegrationsBiz.java @@ -51,7 +51,7 @@ * Service API for SolarUser cloud integrations support. * * @author matt - * @version 1.1 + * @version 1.2 */ public interface UserCloudIntegrationsBiz { @@ -199,9 +199,14 @@ , K extends UserRelatedComp /** * List data values. * - * @param id - * the ID of the {@link CloudDatumStreamConfiguration} to get the + * @param integrationId + * the ID of the {@link CloudIntegrationConfiguration} to get the * data values for + * @param datumStreamServiceIdentifier + * the service identifier of the {@link CloudDatumStreamService} to + * use; if not provided then the first service available for the + * {@link CloudIntegrationService} specified in the specified + * {@link CloudIntegrationConfiguration} will be used * @param filters * an optional set of search filters to limit the data value groups * to; the available key values come from the identifiers returned by @@ -209,7 +214,8 @@ , K extends UserRelatedComp * @return the available values, never {@literal null} * */ - Iterable listDatumStreamDataValues(UserLongCompositePK id, Map filters); + Iterable listDatumStreamDataValues(UserLongCompositePK integrationId, + String datumStreamServiceIdentifier, Map filters); /** * Get the latest available datum from a datum stream. diff --git a/solarnet/user-cloud-integrations/src/main/java/net/solarnetwork/central/user/c2c/biz/impl/DaoUserCloudIntegrationsBiz.java b/solarnet/user-cloud-integrations/src/main/java/net/solarnetwork/central/user/c2c/biz/impl/DaoUserCloudIntegrationsBiz.java index 31e56e71d..9e79b519b 100644 --- a/solarnet/user-cloud-integrations/src/main/java/net/solarnetwork/central/user/c2c/biz/impl/DaoUserCloudIntegrationsBiz.java +++ b/solarnet/user-cloud-integrations/src/main/java/net/solarnetwork/central/user/c2c/biz/impl/DaoUserCloudIntegrationsBiz.java @@ -82,7 +82,7 @@ * DAO based implementation of {@link UserCloudIntegrationsBiz}. * * @author matt - * @version 1.2 + * @version 1.3 */ public class DaoUserCloudIntegrationsBiz implements UserCloudIntegrationsBiz { @@ -287,13 +287,50 @@ public , K extends UserRela } @Override - public Iterable listDatumStreamDataValues(UserLongCompositePK id, - Map filters) { - var datumStream = requireNonNullObject(datumStreamDao.get(requireNonNullArgument(id, "id")), - "datumStream"); - var service = requireNonNullObject(datumStreamService(datumStream.getServiceIdentifier()), - "datumStreamService"); - return service.dataValues(id, filters); + public Iterable listDatumStreamDataValues(UserLongCompositePK integrationId, + String datumStreamServiceIdentifier, Map filters) { + var integration = requireNonNullObject( + integrationDao.get(requireNonNullArgument(integrationId, "integrationId")), + "integration"); + var service = requireNonNullObject(resolveDatumStreamService(integration.getServiceIdentifier(), + datumStreamServiceIdentifier), "datumStreamService"); + return service.dataValues(integration.getId(), filters); + } + + private CloudDatumStreamService resolveDatumStreamService(String integrationServiceIdentifier, + String datumStreamServiceIdentifier) { + CloudDatumStreamService result = null; + if ( datumStreamServiceIdentifier != null ) { + result = datumStreamServices.get(datumStreamServiceIdentifier); + if ( result != null && integrationServiceIdentifier != null ) { + // verify service belongs to integration + CloudIntegrationService integrationService = integrationServices + .get(integrationServiceIdentifier); + if ( integrationService != null ) { + boolean found = false; + for ( CloudDatumStreamService service : integrationService.datumStreamServices() ) { + if ( service.getId().equals(datumStreamServiceIdentifier) ) { + found = true; + break; + } + } + if ( !found ) { + throw new IllegalArgumentException( + "CloudDatumStreamService [%s] not supported by CloudIntegrationService [%s]" + .formatted(datumStreamServiceIdentifier, + integrationService.getId())); + } + } + } + } else if ( integrationServiceIdentifier != null ) { + // get first provided by integration + CloudIntegrationService integrationService = integrationServices + .get(integrationServiceIdentifier); + if ( integrationService != null ) { + result = integrationService.datumStreamServices().iterator().next(); + } + } + return result; } @Override From b5f1164bfa138547ac0b07d7a57602efe54b261d Mon Sep 17 00:00:00 2001 From: Matt Magoffin Date: Tue, 22 Oct 2024 07:19:05 +1300 Subject: [PATCH 3/5] Fix typo. --- .../c2c/biz/impl/LocusEnergyCloudDatumStreamService.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.properties b/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.properties index ebb1cae99..c7d167c81 100644 --- a/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.properties +++ b/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.properties @@ -15,5 +15,5 @@ granularity.yearly = Yearly dataValueFilter.siteId.key = Site ID dataValueFilter.siteId.desc = The site identifier to restrict the results to. -dataValueFilter.componentId.key = Collection ID +dataValueFilter.componentId.key = Component ID dataValueFilter.componentId.desc = The component identifier to restrict the results to. From e5be65246ea5f1c80580ac3b36d6de0d41834ee1 Mon Sep 17 00:00:00 2001 From: Matt Magoffin Date: Tue, 22 Oct 2024 10:08:26 +1300 Subject: [PATCH 4/5] Bump versions. --- solarnet/cloud-integrations/build.gradle | 2 +- solarnet/solaruser/build.gradle | 2 +- solarnet/user-cloud-integrations/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/solarnet/cloud-integrations/build.gradle b/solarnet/cloud-integrations/build.gradle index 1534330dd..5d3d5365f 100644 --- a/solarnet/cloud-integrations/build.gradle +++ b/solarnet/cloud-integrations/build.gradle @@ -14,7 +14,7 @@ dependencyManagement { } description = 'SolarNet: Cloud Integrations' -version = '1.3.1' +version = '1.4.0' base { archivesName = 'solarnet-cloud-integrations' diff --git a/solarnet/solaruser/build.gradle b/solarnet/solaruser/build.gradle index c33e929d7..4803d015a 100644 --- a/solarnet/solaruser/build.gradle +++ b/solarnet/solaruser/build.gradle @@ -11,7 +11,7 @@ apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' description = 'SolarUser' -version = '2.21.0' +version = '2.22.0' base { archivesName = 'solaruser' diff --git a/solarnet/user-cloud-integrations/build.gradle b/solarnet/user-cloud-integrations/build.gradle index 0e8b3de11..516e098ea 100644 --- a/solarnet/user-cloud-integrations/build.gradle +++ b/solarnet/user-cloud-integrations/build.gradle @@ -14,7 +14,7 @@ dependencyManagement { } description = 'SolarNet: User Cloud Integrations' -version = '1.2.0' +version = '1.3.0' base { archivesName = 'solarnet-user-cloud-integrations' From 43c6e4044257ff7ed441b075bb33a83ac6ec435d Mon Sep 17 00:00:00 2001 From: Matt Magoffin Date: Wed, 23 Oct 2024 07:00:38 +1300 Subject: [PATCH 5/5] Standardize multi-value setting i18n messages. --- solarnet/build.gradle | 2 +- .../LocusEnergyCloudDatumStreamService.java | 19 +----------------- .../SolrenViewCloudDatumStreamService.java | 7 +++++-- ...usEnergyCloudDatumStreamService.properties | 16 +++++++-------- ...lrenViewCloudDatumStreamService.properties | 20 +++++++++++++++++++ 5 files changed, 35 insertions(+), 29 deletions(-) diff --git a/solarnet/build.gradle b/solarnet/build.gradle index 23c2ecd56..260a6cb5f 100644 --- a/solarnet/build.gradle +++ b/solarnet/build.gradle @@ -78,7 +78,7 @@ subprojects { jsonSchemaValidatorVersion = '1.3.2' myBatisStarterVersion = '3.0.3' saxonVersion = '12.4' - snCommonVersion = '3.24.0' + snCommonVersion = '3.24.1' snCommonExprSpelVersion = '3.1.0' snCommonMqttVersion = '5.0.0' snCommonMqttNettyVersion = '4.0.2' diff --git a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.java b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.java index 0f1a459cd..76c0adab3 100644 --- a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.java +++ b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.java @@ -105,8 +105,6 @@ import net.solarnetwork.domain.datum.DatumSamples; import net.solarnetwork.domain.datum.DatumSamplesType; import net.solarnetwork.domain.datum.GeneralDatum; -import net.solarnetwork.settings.KeyedSettingSpecifier; -import net.solarnetwork.settings.MultiValueSettingSpecifier; import net.solarnetwork.settings.SettingSpecifier; import net.solarnetwork.settings.support.BasicMultiValueSettingSpecifier; @@ -139,7 +137,7 @@ * }} * * @author matt - * @version 1.6 + * @version 1.7 */ public class LocusEnergyCloudDatumStreamService extends BaseOAuth2ClientCloudDatumStreamService { @@ -218,21 +216,6 @@ public LocusEnergyCloudDatumStreamService(AsyncTaskExecutor executor, this.executor = requireNonNullArgument(executor, "executor"); } - @Override - protected void populateInfoMessages(Locale locale, SettingSpecifier spec, Map msgs, - MessageSource ms) { - super.populateInfoMessages(locale, spec, msgs, ms); - if ( spec instanceof KeyedSettingSpecifier k ) { - if ( GRANULARITY_SETTING.equals(k.getKey()) ) { - MultiValueSettingSpecifier mv = (MultiValueSettingSpecifier) spec; - for ( String valueKey : mv.getValueTitles().keySet() ) { - String titleKey = "granularity." + valueKey; - msgs.put(titleKey, ms.getMessage(titleKey, null, valueKey, locale)); - } - } - } - } - @Override public Iterable dataValueFilters(Locale locale) { MessageSource ms = requireNonNullArgument(getMessageSource(), "messageSource"); diff --git a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.java b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.java index 5fcf7ded9..a8bfeb528 100644 --- a/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.java +++ b/solarnet/cloud-integrations/src/main/java/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.java @@ -112,6 +112,7 @@ import net.solarnetwork.service.RemoteServiceException; import net.solarnetwork.settings.SettingSpecifier; import net.solarnetwork.settings.support.BasicMultiValueSettingSpecifier; +import net.solarnetwork.settings.support.BasicTextAreaSettingSpecifier; import net.solarnetwork.support.XmlSupport; import net.solarnetwork.util.StringUtils; @@ -191,7 +192,7 @@ * * * @author matt - * @version 1.4 + * @version 1.5 */ public class SolrenViewCloudDatumStreamService extends BaseRestOperationsCloudDatumStreamService { @@ -221,7 +222,9 @@ public class SolrenViewCloudDatumStreamService extends BaseRestOperationsCloudDa (l, r) -> r, () -> new LinkedHashMap<>(SolrenViewGranularity.values().length)))); granularitySpec.setValueTitles(granularityTitles); - SETTINGS = List.of(granularitySpec); + var sourceIdMapSpec = new BasicTextAreaSettingSpecifier(SOURCE_ID_MAP_SETTING, null, true); + + SETTINGS = List.of(granularitySpec, sourceIdMapSpec); } private static final XmlSupport XML_SUPPORT; diff --git a/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.properties b/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.properties index c7d167c81..341e95f72 100644 --- a/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.properties +++ b/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/LocusEnergyCloudDatumStreamService.properties @@ -3,14 +3,14 @@ title = Locus Energy Datum Stream granularity.key = Granularity granularity.desc = The resolution of the data to request. -granularity.latest = Latest -granularity.1min = 1 minute -granularity.5min = 5 minute -granularity.15min = 15 minute -granularity.hourly = Hourly -granularity.daily = Daily -granularity.monthly = Monthly -granularity.yearly = Yearly +granularity.latest.key = Latest +granularity.1min.key = 1 minute +granularity.5min.key = 5 minute +granularity.15min.key = 15 minute +granularity.hourly.key = Hourly +granularity.daily.key = Daily +granularity.monthly.key = Monthly +granularity.yearly.key = Yearly dataValueFilter.siteId.key = Site ID dataValueFilter.siteId.desc = The site identifier to restrict the results to. diff --git a/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.properties b/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.properties index 02b7ad928..56d652a3d 100644 --- a/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.properties +++ b/solarnet/cloud-integrations/src/main/resources/net/solarnetwork/central/c2c/biz/impl/SolrenViewCloudDatumStreamService.properties @@ -3,3 +3,23 @@ title = SolrenView Datum Stream dataValueFilter.siteId.key = Site ID dataValueFilter.siteId.desc = The site identifier to restrict the results to. +granularity.key = Granularity +granularity.desc = The resolution of the data to request. + +granularity.latest.key = Latest +granularity.1min.key = 1 minute +granularity.5min.key = 5 minute +granularity.10min.key = 10 minute +granularity.15min.key = 15 minute +granularity.20min.key = 15 minute +granularity.30min.key = 15 minute +granularity.hourly.key = Hourly +granularity.daily.key = Daily +granularity.monthly.key = Monthly +granularity.yearly.key = Yearly + +sourceIdMap.key = Source ID Mapping +sourceIdMap.desc = A map or comma-delimited mapping list of component IDs to associated source ID values. \ + For example as JSON {"12345":"INV/1","23456":"INV/2"} or as a string \ + 12345=INV/1,23456=INV/2. +