From ab4bfdc419dcce5592f9766858bc12f8d53f44fe Mon Sep 17 00:00:00 2001 From: Sascha Doemer Date: Wed, 25 Nov 2020 07:44:16 +0100 Subject: [PATCH 1/3] Add dynamic sequence numbering for messages. --- .../impl/messaging/MessageEncoder.java | 766 +++++++++--------- .../impl/messaging/SequenceNumberService.java | 28 + .../messaging/SequenceNumberServiceTest.java | 49 ++ 3 files changed, 461 insertions(+), 382 deletions(-) create mode 100644 agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberService.java create mode 100644 agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java diff --git a/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java b/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java index f82bb84b..82a9b2b7 100644 --- a/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java +++ b/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java @@ -14,399 +14,401 @@ import com.dke.data.agrirouter.api.service.parameters.*; import com.dke.data.agrirouter.api.util.TimestampUtil; import com.dke.data.agrirouter.impl.common.MessageIdService; + import java.util.Objects; public interface MessageEncoder extends LoggingEnabledService { - /** - * Encode a message to delete messages. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(DeleteMessageParameters parameters) { - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber()); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_FEED_DELETE); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - FeedRequests.MessageDelete.Builder messageContent = FeedRequests.MessageDelete.newBuilder(); - if (parameters.getMessageIds() != null) { - messageContent.addAllMessageIds(parameters.getMessageIds()); + /** + * Encode a message to delete messages. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(DeleteMessageParameters parameters) { + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + + messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_FEED_DELETE); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + FeedRequests.MessageDelete.Builder messageContent = FeedRequests.MessageDelete.newBuilder(); + if (parameters.getMessageIds() != null) { + messageContent.addAllMessageIds(parameters.getMessageIds()); + } + if (parameters.getSenderIds() != null) { + messageContent.addAllSenders(parameters.getSenderIds()); + } + if (null != parameters.getSentFromInSeconds() || null != parameters.getSentToInSeconds()) { + FeedRequests.ValidityPeriod.Builder validityPeriod = FeedRequests.ValidityPeriod.newBuilder(); + if (null != parameters.getSentFromInSeconds()) { + validityPeriod.setSentFrom(new TimestampUtil().seconds(parameters.getSentFromInSeconds())); + } + if (null != parameters.getSentToInSeconds()) { + validityPeriod.setSentTo(new TimestampUtil().seconds(parameters.getSentToInSeconds())); + } + messageContent.setValidityPeriod(validityPeriod); + } + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl(FeedRequests.MessageDelete.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); + } + + /** + * Encode a message to list endpoints. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(ListEndpointsParameters parameters) { + + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + + messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); + + if (parameters.getUnfilteredList()) { + messageHeaderParameters.setTechnicalMessageType( + TechnicalMessageType.DKE_LIST_ENDPOINTS_UNFILTERED); + } else { + messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_LIST_ENDPOINTS); + } + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + Endpoints.ListEndpointsQuery.Builder messageContent = Endpoints.ListEndpointsQuery.newBuilder(); + messageContent.setDirection(Objects.requireNonNull(parameters.getDirection())); + messageContent.setTechnicalMessageType( + Objects.requireNonNull(parameters.getTechnicalMessageType()).getKey()); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl(Endpoints.ListEndpointsQuery.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + + return new EncodedMessage(applicationMessageID, encodedMessage); } - if (parameters.getSenderIds() != null) { - messageContent.addAllSenders(parameters.getSenderIds()); + + /** + * Encode a message to send a message confirmation. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(MessageConfirmationParameters parameters) { + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + + messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); + messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_FEED_CONFIRM); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + FeedRequests.MessageConfirm.Builder messageContent = FeedRequests.MessageConfirm.newBuilder(); + messageContent.addAllMessageIds(Objects.requireNonNull(parameters.getMessageIds())); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl(FeedRequests.MessageConfirm.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); } - if (null != parameters.getSentFromInSeconds() || null != parameters.getSentToInSeconds()) { - FeedRequests.ValidityPeriod.Builder validityPeriod = FeedRequests.ValidityPeriod.newBuilder(); - if (null != parameters.getSentFromInSeconds()) { - validityPeriod.setSentFrom(new TimestampUtil().seconds(parameters.getSentFromInSeconds())); - } - if (null != parameters.getSentToInSeconds()) { - validityPeriod.setSentTo(new TimestampUtil().seconds(parameters.getSentToInSeconds())); - } - messageContent.setValidityPeriod(validityPeriod); + + /** + * Encode a message to set capabilities. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(SetCapabilitiesParameters parameters) { + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + + messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); + messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_CAPABILITIES); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + Capabilities.CapabilitySpecification.Builder builder = + Capabilities.CapabilitySpecification.newBuilder(); + builder.setAppCertificationId(Objects.requireNonNull(parameters.getApplicationId())); + builder.setAppCertificationVersionId( + Objects.requireNonNull(parameters.getCertificationVersionId())); + builder.setEnablePushNotifications(parameters.getEnablePushNotifications()); + + parameters.getCapabilitiesParameters(); + Objects.requireNonNull(parameters.getCapabilitiesParameters()) + .forEach( + p -> { + Capabilities.CapabilitySpecification.Capability.Builder capabilityBuilder = + Capabilities.CapabilitySpecification.Capability.newBuilder(); + capabilityBuilder.setTechnicalMessageType( + Objects.requireNonNull(p.getTechnicalMessageType()).getKey()); + capabilityBuilder.setDirection(Objects.requireNonNull(p.getDirection())); + Capabilities.CapabilitySpecification.Capability capability = + capabilityBuilder.build(); + builder.addCapabilities(capability); + }); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl( + Capabilities.CapabilitySpecification.getDescriptor().getFullName()); + payloadParameters.setValue(builder.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); } - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl(FeedRequests.MessageDelete.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); - } - - /** - * Encode a message to list endpoints. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(ListEndpointsParameters parameters) { - - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber()); - - if (parameters.getUnfilteredList()) { - messageHeaderParameters.setTechnicalMessageType( - TechnicalMessageType.DKE_LIST_ENDPOINTS_UNFILTERED); - } else { - messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_LIST_ENDPOINTS); + /** + * Encode a message to set a subscription. + * + * @param parameters - + * @return - + */ + default EncodedMessage encodeMessage(SetSubscriptionParameters parameters) { + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + + messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); + messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_SUBSCRIPTION); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + SubscriptionOuterClass.Subscription.Builder messageContent = + SubscriptionOuterClass.Subscription.newBuilder(); + parameters + .getSubscriptions() + .forEach( + parameter -> { + SubscriptionOuterClass.Subscription.MessageTypeSubscriptionItem.Builder + technicalMessageType = + SubscriptionOuterClass.Subscription.MessageTypeSubscriptionItem.newBuilder(); + technicalMessageType.setTechnicalMessageType( + Objects.requireNonNull(parameter.getTechnicalMessageType()).getKey()); + technicalMessageType.addAllDdis(parameter.getDdis()); + technicalMessageType.setPosition(parameter.getPosition()); + messageContent.addTechnicalMessageTypes(technicalMessageType); + }); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl(SubscriptionOuterClass.Subscription.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); } - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - Endpoints.ListEndpointsQuery.Builder messageContent = Endpoints.ListEndpointsQuery.newBuilder(); - messageContent.setDirection(Objects.requireNonNull(parameters.getDirection())); - messageContent.setTechnicalMessageType( - Objects.requireNonNull(parameters.getTechnicalMessageType()).getKey()); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl(Endpoints.ListEndpointsQuery.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - - return new EncodedMessage(applicationMessageID, encodedMessage); - } - - /** - * Encode a message to send a message confirmation. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(MessageConfirmationParameters parameters) { - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber()); - messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_FEED_CONFIRM); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - FeedRequests.MessageConfirm.Builder messageContent = FeedRequests.MessageConfirm.newBuilder(); - messageContent.addAllMessageIds(Objects.requireNonNull(parameters.getMessageIds())); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl(FeedRequests.MessageConfirm.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); - } - - /** - * Encode a message to set capabilities. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(SetCapabilitiesParameters parameters) { - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber()); - messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_CAPABILITIES); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - Capabilities.CapabilitySpecification.Builder builder = - Capabilities.CapabilitySpecification.newBuilder(); - builder.setAppCertificationId(Objects.requireNonNull(parameters.getApplicationId())); - builder.setAppCertificationVersionId( - Objects.requireNonNull(parameters.getCertificationVersionId())); - builder.setEnablePushNotifications(parameters.getEnablePushNotifications()); - - parameters.getCapabilitiesParameters(); - Objects.requireNonNull(parameters.getCapabilitiesParameters()) - .forEach( - p -> { - Capabilities.CapabilitySpecification.Capability.Builder capabilityBuilder = - Capabilities.CapabilitySpecification.Capability.newBuilder(); - capabilityBuilder.setTechnicalMessageType( - Objects.requireNonNull(p.getTechnicalMessageType()).getKey()); - capabilityBuilder.setDirection(Objects.requireNonNull(p.getDirection())); - Capabilities.CapabilitySpecification.Capability capability = - capabilityBuilder.build(); - builder.addCapabilities(capability); - }); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl( - Capabilities.CapabilitySpecification.getDescriptor().getFullName()); - payloadParameters.setValue(builder.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); - } - - /** - * Encode a message to set a subscription. - * - * @param parameters - - * @return - - */ - default EncodedMessage encodeMessage(SetSubscriptionParameters parameters) { - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber()); - messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_SUBSCRIPTION); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - SubscriptionOuterClass.Subscription.Builder messageContent = - SubscriptionOuterClass.Subscription.newBuilder(); - parameters - .getSubscriptions() - .forEach( - parameter -> { - SubscriptionOuterClass.Subscription.MessageTypeSubscriptionItem.Builder - technicalMessageType = - SubscriptionOuterClass.Subscription.MessageTypeSubscriptionItem.newBuilder(); - technicalMessageType.setTechnicalMessageType( - Objects.requireNonNull(parameter.getTechnicalMessageType()).getKey()); - technicalMessageType.addAllDdis(parameter.getDdis()); - technicalMessageType.setPosition(parameter.getPosition()); - messageContent.addTechnicalMessageTypes(technicalMessageType); - }); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl(SubscriptionOuterClass.Subscription.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); - } - - /** - * Encode a message to query messages. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode( - TechnicalMessageType technicalMessageType, MessageQueryParameters parameters) { - this.logMethodBegin(parameters); - - this.getNativeLogger().trace("Build message header parameters."); - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber()); - messageHeaderParameters.setTechnicalMessageType(technicalMessageType); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - this.getNativeLogger().trace("Build message query parameters."); - FeedRequests.MessageQuery.Builder messageContent = FeedRequests.MessageQuery.newBuilder(); - if (parameters.getMessageIds() != null) { - messageContent.addAllMessageIds(parameters.getMessageIds()); + + /** + * Encode a message to query messages. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode( + TechnicalMessageType technicalMessageType, MessageQueryParameters parameters) { + this.logMethodBegin(parameters); + + this.getNativeLogger().trace("Build message header parameters."); + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); + messageHeaderParameters.setTechnicalMessageType(technicalMessageType); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + this.getNativeLogger().trace("Build message query parameters."); + FeedRequests.MessageQuery.Builder messageContent = FeedRequests.MessageQuery.newBuilder(); + if (parameters.getMessageIds() != null) { + messageContent.addAllMessageIds(parameters.getMessageIds()); + } + if (parameters.getSenderIds() != null) { + messageContent.addAllSenders(parameters.getSenderIds()); + } + if (null != parameters.getSentFromInSeconds() || null != parameters.getSentToInSeconds()) { + FeedRequests.ValidityPeriod.Builder validityPeriod = FeedRequests.ValidityPeriod.newBuilder(); + if (null != parameters.getSentFromInSeconds()) { + validityPeriod.setSentFrom(new TimestampUtil().seconds(parameters.getSentFromInSeconds())); + } + if (null != parameters.getSentToInSeconds()) { + validityPeriod.setSentTo(new TimestampUtil().seconds(parameters.getSentToInSeconds())); + } + messageContent.setValidityPeriod(validityPeriod); + } + + this.getNativeLogger().trace("Build message payload parameters."); + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl(FeedRequests.MessageQuery.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + this.getNativeLogger().trace("Encode message."); + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + + this.logMethodEnd(encodedMessage); + return new EncodedMessage(applicationMessageID, encodedMessage); } - if (parameters.getSenderIds() != null) { - messageContent.addAllSenders(parameters.getSenderIds()); + + /** + * Encode message for cloud onboarding of virtual CUs. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(CloudOnboardingParameters parameters) { + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + + int sequenceNumber = parameters.getSequenceNumber(); + + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + messageHeaderParameters.setApplicationMessageId(applicationMessageID); + messageHeaderParameters.setTeamSetContextId(teamsetContextId); + messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + messageHeaderParameters.setTechnicalMessageType( + TechnicalMessageType.DKE_CLOUD_ONBOARD_ENDPOINTS); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + CloudVirtualizedAppRegistration.OnboardingRequest.Builder messageContent = + CloudVirtualizedAppRegistration.OnboardingRequest.newBuilder(); + Objects.requireNonNull(parameters.getEndpointDetails()) + .forEach( + p -> { + CloudVirtualizedAppRegistration.OnboardingRequest.EndpointRegistrationDetails.Builder + builder = + CloudVirtualizedAppRegistration.OnboardingRequest.EndpointRegistrationDetails + .newBuilder(); + builder.setId(Objects.requireNonNull(p.getEndpointId())); + builder.setName(Objects.requireNonNull(p.getEndpointName())); + messageContent.addOnboardingRequests(builder.build()); + }); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl( + CloudVirtualizedAppRegistration.OnboardingRequest.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); } - if (null != parameters.getSentFromInSeconds() || null != parameters.getSentToInSeconds()) { - FeedRequests.ValidityPeriod.Builder validityPeriod = FeedRequests.ValidityPeriod.newBuilder(); - if (null != parameters.getSentFromInSeconds()) { - validityPeriod.setSentFrom(new TimestampUtil().seconds(parameters.getSentFromInSeconds())); - } - if (null != parameters.getSentToInSeconds()) { - validityPeriod.setSentTo(new TimestampUtil().seconds(parameters.getSentToInSeconds())); - } - messageContent.setValidityPeriod(validityPeriod); + + /** + * Encode cloud offboarding message. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(CloudOffboardingParameters parameters) { + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + CloudVirtualizedAppRegistration.OffboardingRequest.Builder messageContent = + CloudVirtualizedAppRegistration.OffboardingRequest.newBuilder(); + messageContent.addAllEndpoints(Objects.requireNonNull(parameters.getEndpointIds())); + + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + messageHeaderParameters.setApplicationMessageId(applicationMessageID); + messageHeaderParameters.setTechnicalMessageType( + TechnicalMessageType.DKE_CLOUD_OFFBOARD_ENDPOINTS); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl( + CloudVirtualizedAppRegistration.OffboardingRequest.getDescriptor().getFullName()); + + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); } - this.getNativeLogger().trace("Build message payload parameters."); - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl(FeedRequests.MessageQuery.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - this.getNativeLogger().trace("Encode message."); - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - - this.logMethodEnd(encodedMessage); - return new EncodedMessage(applicationMessageID, encodedMessage); - } - - /** - * Encode message for cloud onboarding of virtual CUs. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(CloudOnboardingParameters parameters) { - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - - int sequenceNumber = parameters.getSequenceNumber(); - - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - messageHeaderParameters.setApplicationMessageId(applicationMessageID); - messageHeaderParameters.setTeamSetContextId(teamsetContextId); - messageHeaderParameters.setApplicationMessageSeqNo(sequenceNumber); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - messageHeaderParameters.setTechnicalMessageType( - TechnicalMessageType.DKE_CLOUD_ONBOARD_ENDPOINTS); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - CloudVirtualizedAppRegistration.OnboardingRequest.Builder messageContent = - CloudVirtualizedAppRegistration.OnboardingRequest.newBuilder(); - Objects.requireNonNull(parameters.getEndpointDetails()) - .forEach( - p -> { - CloudVirtualizedAppRegistration.OnboardingRequest.EndpointRegistrationDetails.Builder - builder = - CloudVirtualizedAppRegistration.OnboardingRequest.EndpointRegistrationDetails - .newBuilder(); - builder.setId(Objects.requireNonNull(p.getEndpointId())); - builder.setName(Objects.requireNonNull(p.getEndpointName())); - messageContent.addOnboardingRequests(builder.build()); - }); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl( - CloudVirtualizedAppRegistration.OnboardingRequest.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); - } - - /** - * Encode cloud offboarding message. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(CloudOffboardingParameters parameters) { - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - CloudVirtualizedAppRegistration.OffboardingRequest.Builder messageContent = - CloudVirtualizedAppRegistration.OffboardingRequest.newBuilder(); - messageContent.addAllEndpoints(Objects.requireNonNull(parameters.getEndpointIds())); - - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - messageHeaderParameters.setApplicationMessageId(applicationMessageID); - messageHeaderParameters.setTechnicalMessageType( - TechnicalMessageType.DKE_CLOUD_OFFBOARD_ENDPOINTS); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl( - CloudVirtualizedAppRegistration.OffboardingRequest.getDescriptor().getFullName()); - - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); - } - - /** - * Get the service to encode messages. - * - * @return - - */ - EncodeMessageService getEncodeMessageService(); + /** + * Get the service to encode messages. + * + * @return - + */ + EncodeMessageService getEncodeMessageService(); } diff --git a/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberService.java b/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberService.java new file mode 100644 index 00000000..068fad74 --- /dev/null +++ b/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberService.java @@ -0,0 +1,28 @@ +package com.dke.data.agrirouter.impl.messaging; + +import com.dke.data.agrirouter.api.dto.onboard.OnboardingResponse; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * Service to generate sequence numbers while sending messages to the agrirouter. + * The sequence number generation is based on the ID of the endpoint, therefore a sequence number can be used multiple times for different endpoints. + */ +public class SequenceNumberService { + + private static final ConcurrentHashMap sequenceNumbersForEndpoints = new ConcurrentHashMap<>(); + + /** + * Generate the sequence number for the onboarding response. + * + * @param onboardingResponse - + * @return 1 if this was the first call, 1+n for the n-th call. + */ + public static synchronized long generateSequenceNumberForEndpoint(OnboardingResponse onboardingResponse) { + sequenceNumbersForEndpoints.putIfAbsent(onboardingResponse.getSensorAlternateId(), 1L); + Long currentSequenceNumber = sequenceNumbersForEndpoints.get(onboardingResponse.getSensorAlternateId()); + sequenceNumbersForEndpoints.put(onboardingResponse.getSensorAlternateId(), currentSequenceNumber + 1); + return currentSequenceNumber; + } + +} diff --git a/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java b/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java new file mode 100644 index 00000000..bd5b8f45 --- /dev/null +++ b/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java @@ -0,0 +1,49 @@ +package com.dke.data.agrirouter.impl.messaging; + +import com.dke.data.agrirouter.api.dto.onboard.OnboardingResponse; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class SequenceNumberServiceTest { + + @Test + void givenOnboardingResponseWhenGeneratingSequenceNumberForTheFirstTimeThenTheResultShouldBe1() { + OnboardingResponse onboardingResponse = new OnboardingResponse(); + onboardingResponse.setSensorAlternateId("this-is-my-id"); + Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(onboardingResponse)); + } + + @Test + void givenOnboardingResponseWhenGeneratingSequenceNumberForTwoTimesInARowThenTheResultShouldBe1And2() { + OnboardingResponse onboardingResponse = new OnboardingResponse(); + onboardingResponse.setSensorAlternateId("this-is-another-id"); + Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(onboardingResponse)); + Assertions.assertEquals(2, SequenceNumberService.generateSequenceNumberForEndpoint(onboardingResponse)); + } + + @Test + void givenTwoOnboardingResponsesWhenGeneratingSequenceNumberForTheFirstTimeThenTheResultShouldBe1ForBoth() { + OnboardingResponse firstOnboardingResponse = new OnboardingResponse(); + firstOnboardingResponse.setSensorAlternateId("this-is-the-first-id"); + OnboardingResponse secondOnboardingResponse = new OnboardingResponse(); + secondOnboardingResponse.setSensorAlternateId("this-is-the-second-id"); + Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); + } + + @Test + void givenTwoOnboardingResponsesWhenGeneratingSequenceNumberForMultipleTimesThenTheResultShouldBeMatchingTheTimesTheMethodWasCalled() { + OnboardingResponse firstOnboardingResponse = new OnboardingResponse(); + firstOnboardingResponse.setSensorAlternateId("this-is-the-first-id-for-multiple-calls"); + OnboardingResponse secondOnboardingResponse = new OnboardingResponse(); + secondOnboardingResponse.setSensorAlternateId("this-is-the-second-id-multiple-calls"); + Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals(2, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals(3, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals(4, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); + Assertions.assertEquals(2, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); + Assertions.assertEquals(3, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); + } + +} From adaaf8e891b2409cef7041aa5800717bdd35b5ed Mon Sep 17 00:00:00 2001 From: Sascha Doemer Date: Wed, 25 Nov 2020 07:49:32 +0100 Subject: [PATCH 2/3] Format. Assertions for NULL checks. --- .../api/exception/OnboardingException.java | 1 - .../api/exception/RevokingException.java | 33 +- .../impl/messaging/MessageEncoder.java | 813 +++++++++--------- .../impl/messaging/SequenceNumberService.java | 37 +- .../messaging/SequenceNumberServiceTest.java | 88 +- 5 files changed, 516 insertions(+), 456 deletions(-) diff --git a/agrirouter-api-java-api/src/main/java/com/dke/data/agrirouter/api/exception/OnboardingException.java b/agrirouter-api-java-api/src/main/java/com/dke/data/agrirouter/api/exception/OnboardingException.java index 13e868d7..c879b8b4 100644 --- a/agrirouter-api-java-api/src/main/java/com/dke/data/agrirouter/api/exception/OnboardingException.java +++ b/agrirouter-api-java-api/src/main/java/com/dke/data/agrirouter/api/exception/OnboardingException.java @@ -23,5 +23,4 @@ public String getMessage() { onboardingError.getError().getCode(), onboardingError.getError().message) : "There was an error during the onboarding process."; } - } diff --git a/agrirouter-api-java-api/src/main/java/com/dke/data/agrirouter/api/exception/RevokingException.java b/agrirouter-api-java-api/src/main/java/com/dke/data/agrirouter/api/exception/RevokingException.java index 80125363..2ea74318 100644 --- a/agrirouter-api-java-api/src/main/java/com/dke/data/agrirouter/api/exception/RevokingException.java +++ b/agrirouter-api-java-api/src/main/java/com/dke/data/agrirouter/api/exception/RevokingException.java @@ -1,27 +1,26 @@ package com.dke.data.agrirouter.api.exception; import com.dke.data.agrirouter.api.dto.revoke.RevokingError; - import java.util.Optional; public class RevokingException extends RuntimeException { - private final RevokingError revokingError; + private final RevokingError revokingError; - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") - public RevokingException(Optional lastError) { - this.revokingError = lastError.orElse(null); - } + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + public RevokingException(Optional lastError) { + this.revokingError = lastError.orElse(null); + } - public RevokingError getRevokingError() { - return revokingError; - } + public RevokingError getRevokingError() { + return revokingError; + } - @Override - public String getMessage() { - return null != revokingError - ? String.format( - "There was an error '%s' during the revoking, details were '%s'", - revokingError.getError().getCode(), revokingError.getError().message) - : "There was an error during the revoking process."; - } + @Override + public String getMessage() { + return null != revokingError + ? String.format( + "There was an error '%s' during the revoking, details were '%s'", + revokingError.getError().getCode(), revokingError.getError().message) + : "There was an error during the revoking process."; + } } diff --git a/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java b/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java index 82a9b2b7..f47693c3 100644 --- a/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java +++ b/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java @@ -14,401 +14,446 @@ import com.dke.data.agrirouter.api.service.parameters.*; import com.dke.data.agrirouter.api.util.TimestampUtil; import com.dke.data.agrirouter.impl.common.MessageIdService; - import java.util.Objects; public interface MessageEncoder extends LoggingEnabledService { - /** - * Encode a message to delete messages. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(DeleteMessageParameters parameters) { - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_FEED_DELETE); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - FeedRequests.MessageDelete.Builder messageContent = FeedRequests.MessageDelete.newBuilder(); - if (parameters.getMessageIds() != null) { - messageContent.addAllMessageIds(parameters.getMessageIds()); - } - if (parameters.getSenderIds() != null) { - messageContent.addAllSenders(parameters.getSenderIds()); - } - if (null != parameters.getSentFromInSeconds() || null != parameters.getSentToInSeconds()) { - FeedRequests.ValidityPeriod.Builder validityPeriod = FeedRequests.ValidityPeriod.newBuilder(); - if (null != parameters.getSentFromInSeconds()) { - validityPeriod.setSentFrom(new TimestampUtil().seconds(parameters.getSentFromInSeconds())); - } - if (null != parameters.getSentToInSeconds()) { - validityPeriod.setSentTo(new TimestampUtil().seconds(parameters.getSentToInSeconds())); - } - messageContent.setValidityPeriod(validityPeriod); - } - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl(FeedRequests.MessageDelete.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); - } - - /** - * Encode a message to list endpoints. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(ListEndpointsParameters parameters) { - - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); - - if (parameters.getUnfilteredList()) { - messageHeaderParameters.setTechnicalMessageType( - TechnicalMessageType.DKE_LIST_ENDPOINTS_UNFILTERED); - } else { - messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_LIST_ENDPOINTS); - } - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - Endpoints.ListEndpointsQuery.Builder messageContent = Endpoints.ListEndpointsQuery.newBuilder(); - messageContent.setDirection(Objects.requireNonNull(parameters.getDirection())); - messageContent.setTechnicalMessageType( - Objects.requireNonNull(parameters.getTechnicalMessageType()).getKey()); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl(Endpoints.ListEndpointsQuery.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - - return new EncodedMessage(applicationMessageID, encodedMessage); + /** + * Encode a message to delete messages. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(DeleteMessageParameters parameters) { + assert parameters.getOnboardingResponse() != null; + + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + + messageHeaderParameters.setApplicationMessageSeqNo( + parameters.getSequenceNumber() != 0 + ? parameters.getSequenceNumber() + : SequenceNumberService.generateSequenceNumberForEndpoint( + parameters.getOnboardingResponse())); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_FEED_DELETE); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + FeedRequests.MessageDelete.Builder messageContent = FeedRequests.MessageDelete.newBuilder(); + if (parameters.getMessageIds() != null) { + messageContent.addAllMessageIds(parameters.getMessageIds()); } - - /** - * Encode a message to send a message confirmation. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(MessageConfirmationParameters parameters) { - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); - messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_FEED_CONFIRM); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - FeedRequests.MessageConfirm.Builder messageContent = FeedRequests.MessageConfirm.newBuilder(); - messageContent.addAllMessageIds(Objects.requireNonNull(parameters.getMessageIds())); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl(FeedRequests.MessageConfirm.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); + if (parameters.getSenderIds() != null) { + messageContent.addAllSenders(parameters.getSenderIds()); } - - /** - * Encode a message to set capabilities. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(SetCapabilitiesParameters parameters) { - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); - messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_CAPABILITIES); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - Capabilities.CapabilitySpecification.Builder builder = - Capabilities.CapabilitySpecification.newBuilder(); - builder.setAppCertificationId(Objects.requireNonNull(parameters.getApplicationId())); - builder.setAppCertificationVersionId( - Objects.requireNonNull(parameters.getCertificationVersionId())); - builder.setEnablePushNotifications(parameters.getEnablePushNotifications()); - - parameters.getCapabilitiesParameters(); - Objects.requireNonNull(parameters.getCapabilitiesParameters()) - .forEach( - p -> { - Capabilities.CapabilitySpecification.Capability.Builder capabilityBuilder = - Capabilities.CapabilitySpecification.Capability.newBuilder(); - capabilityBuilder.setTechnicalMessageType( - Objects.requireNonNull(p.getTechnicalMessageType()).getKey()); - capabilityBuilder.setDirection(Objects.requireNonNull(p.getDirection())); - Capabilities.CapabilitySpecification.Capability capability = - capabilityBuilder.build(); - builder.addCapabilities(capability); - }); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl( - Capabilities.CapabilitySpecification.getDescriptor().getFullName()); - payloadParameters.setValue(builder.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); + if (null != parameters.getSentFromInSeconds() || null != parameters.getSentToInSeconds()) { + FeedRequests.ValidityPeriod.Builder validityPeriod = FeedRequests.ValidityPeriod.newBuilder(); + if (null != parameters.getSentFromInSeconds()) { + validityPeriod.setSentFrom(new TimestampUtil().seconds(parameters.getSentFromInSeconds())); + } + if (null != parameters.getSentToInSeconds()) { + validityPeriod.setSentTo(new TimestampUtil().seconds(parameters.getSentToInSeconds())); + } + messageContent.setValidityPeriod(validityPeriod); } - /** - * Encode a message to set a subscription. - * - * @param parameters - - * @return - - */ - default EncodedMessage encodeMessage(SetSubscriptionParameters parameters) { - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); - messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_SUBSCRIPTION); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - SubscriptionOuterClass.Subscription.Builder messageContent = - SubscriptionOuterClass.Subscription.newBuilder(); - parameters - .getSubscriptions() - .forEach( - parameter -> { - SubscriptionOuterClass.Subscription.MessageTypeSubscriptionItem.Builder - technicalMessageType = - SubscriptionOuterClass.Subscription.MessageTypeSubscriptionItem.newBuilder(); - technicalMessageType.setTechnicalMessageType( - Objects.requireNonNull(parameter.getTechnicalMessageType()).getKey()); - technicalMessageType.addAllDdis(parameter.getDdis()); - technicalMessageType.setPosition(parameter.getPosition()); - messageContent.addTechnicalMessageTypes(technicalMessageType); - }); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl(SubscriptionOuterClass.Subscription.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl(FeedRequests.MessageDelete.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); + } + + /** + * Encode a message to list endpoints. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(ListEndpointsParameters parameters) { + assert parameters.getOnboardingResponse() != null; + + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + + messageHeaderParameters.setApplicationMessageSeqNo( + parameters.getSequenceNumber() != 0 + ? parameters.getSequenceNumber() + : SequenceNumberService.generateSequenceNumberForEndpoint( + parameters.getOnboardingResponse())); + + if (parameters.getUnfilteredList()) { + messageHeaderParameters.setTechnicalMessageType( + TechnicalMessageType.DKE_LIST_ENDPOINTS_UNFILTERED); + } else { + messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_LIST_ENDPOINTS); } - - /** - * Encode a message to query messages. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode( - TechnicalMessageType technicalMessageType, MessageQueryParameters parameters) { - this.logMethodBegin(parameters); - - this.getNativeLogger().trace("Build message header parameters."); - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); - messageHeaderParameters.setTechnicalMessageType(technicalMessageType); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - this.getNativeLogger().trace("Build message query parameters."); - FeedRequests.MessageQuery.Builder messageContent = FeedRequests.MessageQuery.newBuilder(); - if (parameters.getMessageIds() != null) { - messageContent.addAllMessageIds(parameters.getMessageIds()); - } - if (parameters.getSenderIds() != null) { - messageContent.addAllSenders(parameters.getSenderIds()); - } - if (null != parameters.getSentFromInSeconds() || null != parameters.getSentToInSeconds()) { - FeedRequests.ValidityPeriod.Builder validityPeriod = FeedRequests.ValidityPeriod.newBuilder(); - if (null != parameters.getSentFromInSeconds()) { - validityPeriod.setSentFrom(new TimestampUtil().seconds(parameters.getSentFromInSeconds())); - } - if (null != parameters.getSentToInSeconds()) { - validityPeriod.setSentTo(new TimestampUtil().seconds(parameters.getSentToInSeconds())); - } - messageContent.setValidityPeriod(validityPeriod); - } - - this.getNativeLogger().trace("Build message payload parameters."); - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl(FeedRequests.MessageQuery.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - this.getNativeLogger().trace("Encode message."); - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - - this.logMethodEnd(encodedMessage); - return new EncodedMessage(applicationMessageID, encodedMessage); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + Endpoints.ListEndpointsQuery.Builder messageContent = Endpoints.ListEndpointsQuery.newBuilder(); + messageContent.setDirection(Objects.requireNonNull(parameters.getDirection())); + messageContent.setTechnicalMessageType( + Objects.requireNonNull(parameters.getTechnicalMessageType()).getKey()); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl(Endpoints.ListEndpointsQuery.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + + return new EncodedMessage(applicationMessageID, encodedMessage); + } + + /** + * Encode a message to send a message confirmation. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(MessageConfirmationParameters parameters) { + assert parameters.getOnboardingResponse() != null; + + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + + messageHeaderParameters.setApplicationMessageSeqNo( + parameters.getSequenceNumber() != 0 + ? parameters.getSequenceNumber() + : SequenceNumberService.generateSequenceNumberForEndpoint( + parameters.getOnboardingResponse())); + messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_FEED_CONFIRM); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + FeedRequests.MessageConfirm.Builder messageContent = FeedRequests.MessageConfirm.newBuilder(); + messageContent.addAllMessageIds(Objects.requireNonNull(parameters.getMessageIds())); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl(FeedRequests.MessageConfirm.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); + } + + /** + * Encode a message to set capabilities. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(SetCapabilitiesParameters parameters) { + assert parameters.getOnboardingResponse() != null; + + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + + messageHeaderParameters.setApplicationMessageSeqNo( + parameters.getSequenceNumber() != 0 + ? parameters.getSequenceNumber() + : SequenceNumberService.generateSequenceNumberForEndpoint( + parameters.getOnboardingResponse())); + messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_CAPABILITIES); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + Capabilities.CapabilitySpecification.Builder builder = + Capabilities.CapabilitySpecification.newBuilder(); + builder.setAppCertificationId(Objects.requireNonNull(parameters.getApplicationId())); + builder.setAppCertificationVersionId( + Objects.requireNonNull(parameters.getCertificationVersionId())); + builder.setEnablePushNotifications(parameters.getEnablePushNotifications()); + + parameters.getCapabilitiesParameters(); + Objects.requireNonNull(parameters.getCapabilitiesParameters()) + .forEach( + p -> { + Capabilities.CapabilitySpecification.Capability.Builder capabilityBuilder = + Capabilities.CapabilitySpecification.Capability.newBuilder(); + capabilityBuilder.setTechnicalMessageType( + Objects.requireNonNull(p.getTechnicalMessageType()).getKey()); + capabilityBuilder.setDirection(Objects.requireNonNull(p.getDirection())); + Capabilities.CapabilitySpecification.Capability capability = + capabilityBuilder.build(); + builder.addCapabilities(capability); + }); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl( + Capabilities.CapabilitySpecification.getDescriptor().getFullName()); + payloadParameters.setValue(builder.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); + } + + /** + * Encode a message to set a subscription. + * + * @param parameters - + * @return - + */ + default EncodedMessage encodeMessage(SetSubscriptionParameters parameters) { + assert parameters.getOnboardingResponse() != null; + + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + + messageHeaderParameters.setApplicationMessageSeqNo( + parameters.getSequenceNumber() != 0 + ? parameters.getSequenceNumber() + : SequenceNumberService.generateSequenceNumberForEndpoint( + parameters.getOnboardingResponse())); + messageHeaderParameters.setTechnicalMessageType(TechnicalMessageType.DKE_SUBSCRIPTION); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + SubscriptionOuterClass.Subscription.Builder messageContent = + SubscriptionOuterClass.Subscription.newBuilder(); + parameters + .getSubscriptions() + .forEach( + parameter -> { + SubscriptionOuterClass.Subscription.MessageTypeSubscriptionItem.Builder + technicalMessageType = + SubscriptionOuterClass.Subscription.MessageTypeSubscriptionItem.newBuilder(); + technicalMessageType.setTechnicalMessageType( + Objects.requireNonNull(parameter.getTechnicalMessageType()).getKey()); + technicalMessageType.addAllDdis(parameter.getDdis()); + technicalMessageType.setPosition(parameter.getPosition()); + messageContent.addTechnicalMessageTypes(technicalMessageType); + }); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl(SubscriptionOuterClass.Subscription.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); + } + + /** + * Encode a message to query messages. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode( + TechnicalMessageType technicalMessageType, MessageQueryParameters parameters) { + assert parameters.getOnboardingResponse() != null; + + this.logMethodBegin(parameters); + + this.getNativeLogger().trace("Build message header parameters."); + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + messageHeaderParameters.setApplicationMessageId(Objects.requireNonNull(applicationMessageID)); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + messageHeaderParameters.setTeamSetContextId(Objects.requireNonNull(teamsetContextId)); + messageHeaderParameters.setApplicationMessageSeqNo( + parameters.getSequenceNumber() != 0 + ? parameters.getSequenceNumber() + : SequenceNumberService.generateSequenceNumberForEndpoint( + parameters.getOnboardingResponse())); + + messageHeaderParameters.setTechnicalMessageType(technicalMessageType); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + this.getNativeLogger().trace("Build message query parameters."); + FeedRequests.MessageQuery.Builder messageContent = FeedRequests.MessageQuery.newBuilder(); + if (parameters.getMessageIds() != null) { + messageContent.addAllMessageIds(parameters.getMessageIds()); } - - /** - * Encode message for cloud onboarding of virtual CUs. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(CloudOnboardingParameters parameters) { - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - final String teamsetContextId = - parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); - - int sequenceNumber = parameters.getSequenceNumber(); - - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - messageHeaderParameters.setApplicationMessageId(applicationMessageID); - messageHeaderParameters.setTeamSetContextId(teamsetContextId); - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - messageHeaderParameters.setTechnicalMessageType( - TechnicalMessageType.DKE_CLOUD_ONBOARD_ENDPOINTS); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - - CloudVirtualizedAppRegistration.OnboardingRequest.Builder messageContent = - CloudVirtualizedAppRegistration.OnboardingRequest.newBuilder(); - Objects.requireNonNull(parameters.getEndpointDetails()) - .forEach( - p -> { - CloudVirtualizedAppRegistration.OnboardingRequest.EndpointRegistrationDetails.Builder - builder = - CloudVirtualizedAppRegistration.OnboardingRequest.EndpointRegistrationDetails - .newBuilder(); - builder.setId(Objects.requireNonNull(p.getEndpointId())); - builder.setName(Objects.requireNonNull(p.getEndpointName())); - messageContent.addOnboardingRequests(builder.build()); - }); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl( - CloudVirtualizedAppRegistration.OnboardingRequest.getDescriptor().getFullName()); - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); + if (parameters.getSenderIds() != null) { + messageContent.addAllSenders(parameters.getSenderIds()); } - - /** - * Encode cloud offboarding message. - * - * @param parameters - - * @return - - */ - default EncodedMessage encode(CloudOffboardingParameters parameters) { - final String applicationMessageID = - parameters.getApplicationMessageId() == null - ? MessageIdService.generateMessageId() - : parameters.getApplicationMessageId(); - - CloudVirtualizedAppRegistration.OffboardingRequest.Builder messageContent = - CloudVirtualizedAppRegistration.OffboardingRequest.newBuilder(); - messageContent.addAllEndpoints(Objects.requireNonNull(parameters.getEndpointIds())); - - MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); - messageHeaderParameters.setApplicationMessageId(applicationMessageID); - messageHeaderParameters.setTechnicalMessageType( - TechnicalMessageType.DKE_CLOUD_OFFBOARD_ENDPOINTS); - messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); - messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); - messageHeaderParameters.setApplicationMessageSeqNo(parameters.getSequenceNumber() != 0 ? parameters.getSequenceNumber() : SequenceNumberService.generateSequenceNumberForEndpoint(parameters.getOnboardingResponse())); - - PayloadParameters payloadParameters = new PayloadParameters(); - payloadParameters.setTypeUrl( - CloudVirtualizedAppRegistration.OffboardingRequest.getDescriptor().getFullName()); - - payloadParameters.setValue(messageContent.build().toByteString()); - - String encodedMessage = - this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); - return new EncodedMessage(applicationMessageID, encodedMessage); + if (null != parameters.getSentFromInSeconds() || null != parameters.getSentToInSeconds()) { + FeedRequests.ValidityPeriod.Builder validityPeriod = FeedRequests.ValidityPeriod.newBuilder(); + if (null != parameters.getSentFromInSeconds()) { + validityPeriod.setSentFrom(new TimestampUtil().seconds(parameters.getSentFromInSeconds())); + } + if (null != parameters.getSentToInSeconds()) { + validityPeriod.setSentTo(new TimestampUtil().seconds(parameters.getSentToInSeconds())); + } + messageContent.setValidityPeriod(validityPeriod); } - /** - * Get the service to encode messages. - * - * @return - - */ - EncodeMessageService getEncodeMessageService(); + this.getNativeLogger().trace("Build message payload parameters."); + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl(FeedRequests.MessageQuery.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + this.getNativeLogger().trace("Encode message."); + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + + this.logMethodEnd(encodedMessage); + return new EncodedMessage(applicationMessageID, encodedMessage); + } + + /** + * Encode message for cloud onboarding of virtual CUs. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(CloudOnboardingParameters parameters) { + assert parameters.getOnboardingResponse() != null; + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + final String teamsetContextId = + parameters.getTeamsetContextId() == null ? "" : parameters.getTeamsetContextId(); + + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + messageHeaderParameters.setApplicationMessageId(applicationMessageID); + messageHeaderParameters.setTeamSetContextId(teamsetContextId); + messageHeaderParameters.setApplicationMessageSeqNo( + parameters.getSequenceNumber() != 0 + ? parameters.getSequenceNumber() + : SequenceNumberService.generateSequenceNumberForEndpoint( + parameters.getOnboardingResponse())); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + messageHeaderParameters.setTechnicalMessageType( + TechnicalMessageType.DKE_CLOUD_ONBOARD_ENDPOINTS); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + + CloudVirtualizedAppRegistration.OnboardingRequest.Builder messageContent = + CloudVirtualizedAppRegistration.OnboardingRequest.newBuilder(); + Objects.requireNonNull(parameters.getEndpointDetails()) + .forEach( + p -> { + CloudVirtualizedAppRegistration.OnboardingRequest.EndpointRegistrationDetails.Builder + builder = + CloudVirtualizedAppRegistration.OnboardingRequest.EndpointRegistrationDetails + .newBuilder(); + builder.setId(Objects.requireNonNull(p.getEndpointId())); + builder.setName(Objects.requireNonNull(p.getEndpointName())); + messageContent.addOnboardingRequests(builder.build()); + }); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl( + CloudVirtualizedAppRegistration.OnboardingRequest.getDescriptor().getFullName()); + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); + } + + /** + * Encode cloud offboarding message. + * + * @param parameters - + * @return - + */ + default EncodedMessage encode(CloudOffboardingParameters parameters) { + assert parameters.getOnboardingResponse() != null; + + final String applicationMessageID = + parameters.getApplicationMessageId() == null + ? MessageIdService.generateMessageId() + : parameters.getApplicationMessageId(); + + CloudVirtualizedAppRegistration.OffboardingRequest.Builder messageContent = + CloudVirtualizedAppRegistration.OffboardingRequest.newBuilder(); + messageContent.addAllEndpoints(Objects.requireNonNull(parameters.getEndpointIds())); + + MessageHeaderParameters messageHeaderParameters = new MessageHeaderParameters(); + messageHeaderParameters.setApplicationMessageId(applicationMessageID); + messageHeaderParameters.setTechnicalMessageType( + TechnicalMessageType.DKE_CLOUD_OFFBOARD_ENDPOINTS); + messageHeaderParameters.setMode(Request.RequestEnvelope.Mode.DIRECT); + messageHeaderParameters.setMetadata(MessageOuterClass.Metadata.newBuilder().build()); + messageHeaderParameters.setApplicationMessageSeqNo( + parameters.getSequenceNumber() != 0 + ? parameters.getSequenceNumber() + : SequenceNumberService.generateSequenceNumberForEndpoint( + parameters.getOnboardingResponse())); + + PayloadParameters payloadParameters = new PayloadParameters(); + payloadParameters.setTypeUrl( + CloudVirtualizedAppRegistration.OffboardingRequest.getDescriptor().getFullName()); + + payloadParameters.setValue(messageContent.build().toByteString()); + + String encodedMessage = + this.getEncodeMessageService().encode(messageHeaderParameters, payloadParameters); + return new EncodedMessage(applicationMessageID, encodedMessage); + } + + /** + * Get the service to encode messages. + * + * @return - + */ + EncodeMessageService getEncodeMessageService(); } diff --git a/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberService.java b/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberService.java index 068fad74..cfc8f974 100644 --- a/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberService.java +++ b/agrirouter-api-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberService.java @@ -1,28 +1,31 @@ package com.dke.data.agrirouter.impl.messaging; import com.dke.data.agrirouter.api.dto.onboard.OnboardingResponse; - import java.util.concurrent.ConcurrentHashMap; /** - * Service to generate sequence numbers while sending messages to the agrirouter. - * The sequence number generation is based on the ID of the endpoint, therefore a sequence number can be used multiple times for different endpoints. + * Service to generate sequence numbers while sending messages to the agrirouter. The sequence + * number generation is based on the ID of the endpoint, therefore a sequence number can be used + * multiple times for different endpoints. */ public class SequenceNumberService { - private static final ConcurrentHashMap sequenceNumbersForEndpoints = new ConcurrentHashMap<>(); - - /** - * Generate the sequence number for the onboarding response. - * - * @param onboardingResponse - - * @return 1 if this was the first call, 1+n for the n-th call. - */ - public static synchronized long generateSequenceNumberForEndpoint(OnboardingResponse onboardingResponse) { - sequenceNumbersForEndpoints.putIfAbsent(onboardingResponse.getSensorAlternateId(), 1L); - Long currentSequenceNumber = sequenceNumbersForEndpoints.get(onboardingResponse.getSensorAlternateId()); - sequenceNumbersForEndpoints.put(onboardingResponse.getSensorAlternateId(), currentSequenceNumber + 1); - return currentSequenceNumber; - } + private static final ConcurrentHashMap sequenceNumbersForEndpoints = + new ConcurrentHashMap<>(); + /** + * Generate the sequence number for the onboarding response. + * + * @param onboardingResponse - + * @return 1 if this was the first call, 1+n for the n-th call. + */ + public static synchronized long generateSequenceNumberForEndpoint( + OnboardingResponse onboardingResponse) { + sequenceNumbersForEndpoints.putIfAbsent(onboardingResponse.getSensorAlternateId(), 1L); + Long currentSequenceNumber = + sequenceNumbersForEndpoints.get(onboardingResponse.getSensorAlternateId()); + sequenceNumbersForEndpoints.put( + onboardingResponse.getSensorAlternateId(), currentSequenceNumber + 1); + return currentSequenceNumber; + } } diff --git a/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java b/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java index bd5b8f45..b69cbc0f 100644 --- a/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java +++ b/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java @@ -6,44 +6,58 @@ class SequenceNumberServiceTest { - @Test - void givenOnboardingResponseWhenGeneratingSequenceNumberForTheFirstTimeThenTheResultShouldBe1() { - OnboardingResponse onboardingResponse = new OnboardingResponse(); - onboardingResponse.setSensorAlternateId("this-is-my-id"); - Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(onboardingResponse)); - } + @Test + void givenOnboardingResponseWhenGeneratingSequenceNumberForTheFirstTimeThenTheResultShouldBe1() { + OnboardingResponse onboardingResponse = new OnboardingResponse(); + onboardingResponse.setSensorAlternateId("this-is-my-id"); + Assertions.assertEquals( + 1, SequenceNumberService.generateSequenceNumberForEndpoint(onboardingResponse)); + } - @Test - void givenOnboardingResponseWhenGeneratingSequenceNumberForTwoTimesInARowThenTheResultShouldBe1And2() { - OnboardingResponse onboardingResponse = new OnboardingResponse(); - onboardingResponse.setSensorAlternateId("this-is-another-id"); - Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(onboardingResponse)); - Assertions.assertEquals(2, SequenceNumberService.generateSequenceNumberForEndpoint(onboardingResponse)); - } + @Test + void + givenOnboardingResponseWhenGeneratingSequenceNumberForTwoTimesInARowThenTheResultShouldBe1And2() { + OnboardingResponse onboardingResponse = new OnboardingResponse(); + onboardingResponse.setSensorAlternateId("this-is-another-id"); + Assertions.assertEquals( + 1, SequenceNumberService.generateSequenceNumberForEndpoint(onboardingResponse)); + Assertions.assertEquals( + 2, SequenceNumberService.generateSequenceNumberForEndpoint(onboardingResponse)); + } - @Test - void givenTwoOnboardingResponsesWhenGeneratingSequenceNumberForTheFirstTimeThenTheResultShouldBe1ForBoth() { - OnboardingResponse firstOnboardingResponse = new OnboardingResponse(); - firstOnboardingResponse.setSensorAlternateId("this-is-the-first-id"); - OnboardingResponse secondOnboardingResponse = new OnboardingResponse(); - secondOnboardingResponse.setSensorAlternateId("this-is-the-second-id"); - Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); - Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); - } - - @Test - void givenTwoOnboardingResponsesWhenGeneratingSequenceNumberForMultipleTimesThenTheResultShouldBeMatchingTheTimesTheMethodWasCalled() { - OnboardingResponse firstOnboardingResponse = new OnboardingResponse(); - firstOnboardingResponse.setSensorAlternateId("this-is-the-first-id-for-multiple-calls"); - OnboardingResponse secondOnboardingResponse = new OnboardingResponse(); - secondOnboardingResponse.setSensorAlternateId("this-is-the-second-id-multiple-calls"); - Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); - Assertions.assertEquals(2, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); - Assertions.assertEquals(3, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); - Assertions.assertEquals(4, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); - Assertions.assertEquals(1, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); - Assertions.assertEquals(2, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); - Assertions.assertEquals(3, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); - } + @Test + void + givenTwoOnboardingResponsesWhenGeneratingSequenceNumberForTheFirstTimeThenTheResultShouldBe1ForBoth() { + OnboardingResponse firstOnboardingResponse = new OnboardingResponse(); + firstOnboardingResponse.setSensorAlternateId("this-is-the-first-id"); + OnboardingResponse secondOnboardingResponse = new OnboardingResponse(); + secondOnboardingResponse.setSensorAlternateId("this-is-the-second-id"); + Assertions.assertEquals( + 1, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals( + 1, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); + } + @Test + void + givenTwoOnboardingResponsesWhenGeneratingSequenceNumberForMultipleTimesThenTheResultShouldBeMatchingTheTimesTheMethodWasCalled() { + OnboardingResponse firstOnboardingResponse = new OnboardingResponse(); + firstOnboardingResponse.setSensorAlternateId("this-is-the-first-id-for-multiple-calls"); + OnboardingResponse secondOnboardingResponse = new OnboardingResponse(); + secondOnboardingResponse.setSensorAlternateId("this-is-the-second-id-multiple-calls"); + Assertions.assertEquals( + 1, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals( + 2, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals( + 3, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals( + 4, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals( + 1, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); + Assertions.assertEquals( + 2, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); + Assertions.assertEquals( + 3, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); + } } From adfe0c491696e7ff7224458e6e88e8097d43ebd2 Mon Sep 17 00:00:00 2001 From: Sascha Doemer Date: Fri, 27 Nov 2020 07:57:38 +0100 Subject: [PATCH 3/3] Format. Resolve comments. --- .../agrirouter/impl/messaging/SequenceNumberServiceTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java b/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java index b69cbc0f..f755ebea 100644 --- a/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java +++ b/agrirouter-api-java-impl/src/test/java/com/dke/data/agrirouter/impl/messaging/SequenceNumberServiceTest.java @@ -53,11 +53,15 @@ void givenOnboardingResponseWhenGeneratingSequenceNumberForTheFirstTimeThenTheRe 3, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); Assertions.assertEquals( 4, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); + Assertions.assertEquals( 1, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); Assertions.assertEquals( 2, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); Assertions.assertEquals( 3, SequenceNumberService.generateSequenceNumberForEndpoint(secondOnboardingResponse)); + + Assertions.assertEquals( + 5, SequenceNumberService.generateSequenceNumberForEndpoint(firstOnboardingResponse)); } }