• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

FIWARE / contract-management / #35

08 Apr 2025 12:16PM UTC coverage: 1.745% (+0.8%) from 0.982%
#35

Pull #5

wistefan
implement idsa
Pull Request #5: integrate contract negotiation

25 of 340 new or added lines in 12 files covered. (7.35%)

16673 existing lines in 365 files now uncovered.

588 of 33695 relevant lines covered (1.75%)

0.02 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

33.33
/src/main/java/org/fiware/iam/tmforum/NotificationSubscriber.java
1
package org.fiware.iam.tmforum;
2

3
import io.micronaut.context.annotation.Context;
4
import io.micronaut.context.annotation.Value;
5
import io.micronaut.http.HttpMethod;
6
import io.micronaut.http.HttpRequest;
7
import io.micronaut.http.HttpStatus;
8
import io.micronaut.http.client.exceptions.HttpClientResponseException;
9
import io.micronaut.http.client.netty.DefaultHttpClient;
10
import io.micronaut.runtime.event.annotation.EventListener;
11
import io.micronaut.runtime.server.event.ServerStartupEvent;
12
import io.micronaut.scheduling.TaskScheduler;
13
import lombok.RequiredArgsConstructor;
14
import lombok.extern.slf4j.Slf4j;
15
import org.fiware.iam.configuration.NotificationProperties;
16
import org.fiware.iam.tmforum.party.model.EventSubscriptionInputVO;
17
import org.fiware.iam.tmforum.party.model.EventSubscriptionVO;
18
import reactor.core.publisher.Mono;
19

20
import java.time.Duration;
21
import java.util.List;
22
import java.util.Optional;
23

24

25
@Context
26
@RequiredArgsConstructor
27
@Slf4j
1✔
28
public class NotificationSubscriber {
29

30
        private static final String QUERY_TEMPLATE = "eventType=%s%s";
31
        private static final String LISTENER_ADDRESS_TEMPLATE = "%s/hub";
32
        private static final String LISTENER_PATH = "/listener/event";
33

34
        private final SubscriptionHealthIndicator subscriptionHealthIndicator;
35
        private final NotificationProperties notificationProperties;
36
        private final DefaultHttpClient httpClient;
37
        private final TaskScheduler taskScheduler;
38

39
        @Value("${general.basepath:}")
40
        private String controllerPath;
41

42
        @Value("${micronaut.server.port:8080}")
43
        private String servicePort;
44

45
        @Value("${general.host:contract-management}")
46
        private String serviceUrl;
47

48
        @EventListener
49
        public void onApplicationEvent(ServerStartupEvent e) {
50

51
                notificationProperties.getEntities()
1✔
52
                                .forEach(tmForumEntity ->
1✔
53
                                                Optional.ofNullable(tmForumEntity.getEventTypes())
1✔
54
                                                                .orElse(List.of())
1✔
55
                                                                .forEach(eventType -> {
1✔
56
                                                                        subscriptionHealthIndicator.initiateSubscriptionInMap(tmForumEntity.getEntityType() + eventType.getValue());
1✔
57
                                                                        taskScheduler.scheduleAtFixedRate(Duration.ofSeconds(5), Duration.ofSeconds(10), () -> createSubscription(tmForumEntity.getEntityType(), eventType.getValue(), tmForumEntity.getApiAddress()));
1✔
58
                                                                }));
1✔
59
        }
1✔
60

61
        public void createSubscription(String entityType, String eventType, String apiAddress) {
62
                String callbackUrl = String.format("http://%s:%s%s%s", serviceUrl, servicePort, controllerPath, LISTENER_PATH);
×
63
                log.debug("Attempting to register subscription with callback {}", callbackUrl);
×
64

65
                EventSubscriptionInputVO subscription = new EventSubscriptionInputVO()
×
66
                                .callback(callbackUrl)
×
67
                                .query(String.format(QUERY_TEMPLATE, entityType, eventType));
×
68

69
                HttpRequest<?> request = HttpRequest.create(HttpMethod.POST, String.format(LISTENER_ADDRESS_TEMPLATE, apiAddress)).body(subscription);
×
70

71
                Mono.from(httpClient.exchange(request, EventSubscriptionVO.class))
×
72
                                .doOnSuccess(res -> subscriptionHealthIndicator.setSubscriptionHealthy(entityType + eventType))
×
73
                                .onErrorResume(t -> {
×
74
                                        if (t instanceof HttpClientResponseException e) {
×
75
                                                if (e.getStatus() == HttpStatus.CONFLICT) {
×
76
                                                        subscriptionHealthIndicator.setSubscriptionHealthy(entityType + eventType);
×
NEW
77
                                                        return Mono.empty();
×
78
                                                }
79
                                                if (e.getStatus() != HttpStatus.CONFLICT) {
×
80
                                                        log.info("Event registration failed for {} at {} - Cause: {} : {}", entityType, request.getUri(), e.getStatus(), e.getMessage());
×
81
                                                }
82
                                                return Mono.empty();
×
83
                                        }
84
                                        log.info("Could not create subscription for {} in TM Forum API", entityType, t);
×
85
                                        return Mono.empty();
×
86
                                }).subscribe();
×
87

88
        }
×
89
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc