2 * ========================LICENSE_START=================================
5 * Copyright (C) 2019 Nordix Foundation
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ========================LICENSE_END===================================
21 package org.oransc.enrichment.repository;
23 import java.lang.invoke.MethodHandles;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.HashMap;
28 import java.util.Vector;
30 import org.immutables.value.Value.Immutable;
31 import org.oransc.enrichment.controllers.consumer.ConsumerCallbacks;
32 import org.oransc.enrichment.controllers.producer.ProducerCallbacks;
33 import org.oransc.enrichment.exceptions.ServiceException;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36 import org.springframework.beans.factory.annotation.Autowired;
37 import org.springframework.stereotype.Component;
40 * Dynamic representation of all EiProducers.
42 @SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally
44 public class EiProducers {
45 private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
46 private final Map<String, EiProducer> allEiProducers = new HashMap<>();
47 private final MultiMap<EiProducer> producersByType = new MultiMap<>();
50 private ProducerCallbacks producerCallbacks;
53 private ConsumerCallbacks consumerCallbacks;
56 private EiJobs eiJobs;
59 public interface EiProducerRegistrationInfo {
62 Collection<EiType> supportedTypes();
64 String jobCallbackUrl();
66 String producerSupervisionCallbackUrl();
69 public EiProducer registerProducer(EiProducerRegistrationInfo producerInfo) {
70 final String producerId = producerInfo.id();
71 EiProducer previousDefinition = this.get(producerId);
72 if (previousDefinition != null) {
73 for (EiType type : previousDefinition.getEiTypes()) {
74 producersByType.remove(type.getId(), producerId);
76 allEiProducers.remove(producerId);
79 EiProducer producer = createProducer(producerInfo);
80 allEiProducers.put(producer.getId(), producer);
81 for (EiType type : producer.getEiTypes()) {
82 producersByType.put(type.getId(), producer.getId(), producer);
85 Collection<EiType> previousTypes =
86 previousDefinition != null ? previousDefinition.getEiTypes() : new ArrayList<>();
88 producerCallbacks.startEiJobs(producer, this.eiJobs) //
90 .flatMapMany(list -> consumerCallbacks.notifyJobStatus(producer.getEiTypes())) //
92 .flatMapMany(list -> consumerCallbacks.notifyJobStatus(previousTypes)) //
98 private EiProducer createProducer(EiProducerRegistrationInfo producerInfo) {
99 return new EiProducer(producerInfo.id(), producerInfo.supportedTypes(), producerInfo.jobCallbackUrl(),
100 producerInfo.producerSupervisionCallbackUrl());
103 public synchronized Collection<EiProducer> getAllProducers() {
104 return new Vector<>(allEiProducers.values());
107 public synchronized EiProducer getProducer(String id) throws ServiceException {
108 EiProducer p = allEiProducers.get(id);
110 throw new ServiceException("Could not find EI producer: " + id);
115 public synchronized EiProducer get(String id) {
116 return allEiProducers.get(id);
119 public synchronized int size() {
120 return allEiProducers.size();
123 public synchronized void clear() {
124 this.allEiProducers.clear();
125 this.producersByType.clear();
128 public void deregisterProducer(EiProducer producer) {
129 allEiProducers.remove(producer.getId());
130 for (EiType type : producer.getEiTypes()) {
131 if (producersByType.remove(type.getId(), producer.getId()) == null) {
132 this.logger.error("Bug, no producer found");
135 this.consumerCallbacks.notifyJobStatus(producer.getEiTypes()) //
139 public synchronized Collection<EiProducer> getProducersForType(EiType type) {
140 return this.producersByType.get(type.getId());
143 public synchronized Collection<EiProducer> getProducersForType(String typeId) {
144 return this.producersByType.get(typeId);
147 public synchronized Collection<String> getProducerIdsForType(String typeId) {
148 Collection<String> producerIds = new ArrayList<>();
149 for (EiProducer p : this.getProducersForType(typeId)) {
150 producerIds.add(p.getId());
155 public synchronized boolean isJobEnabled(EiJob job) {
156 for (EiProducer producer : this.producersByType.get(job.getTypeId())) {
157 if (producer.isJobEnabled(job)) {