com.hltech.pact.gen.PactGenerator   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 71
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 48
dl 0
loc 71
rs 10
c 0
b 0
f 0
wmc 9

7 Methods

Rating   Name   Duplication   Size   Complexity  
A combinePactsToOne(Collection) 0 17 3
A writePactFiles(String,String,ObjectMapper,File) 0 5 1
A writePactFiles(String,String,ObjectMapper) 0 4 1
A write(String,String,ObjectMapper,File) 0 9 1
A generatePacts(String,String,ObjectMapper) 0 8 1
A PactGenerator(FeignClientsFinder,PactFactory,PactJsonGenerator) 0 6 1
A PactGenerator() 0 4 1
1
package com.hltech.pact.gen;
2
3
import com.fasterxml.jackson.databind.ObjectMapper;
4
import com.google.common.collect.HashMultimap;
5
import com.google.common.collect.Multimap;
6
import com.hltech.pact.gen.domain.client.feign.FeignClientsFinder;
7
import com.hltech.pact.gen.domain.pact.PactFactory;
8
import com.hltech.pact.gen.domain.pact.PactJsonGenerator;
9
import com.hltech.pact.gen.domain.pact.Service;
10
import com.hltech.pact.gen.domain.pact.model.Pact;
11
12
import javax.validation.constraints.NotNull;
13
import java.io.File;
14
import java.util.ArrayList;
15
import java.util.Collection;
16
import java.util.List;
17
import java.util.stream.Collectors;
18
19
public class PactGenerator {
20
21
    private final FeignClientsFinder feignClientsFinder;
22
    private final PactFactory pactFactory;
23
    private final PactJsonGenerator pactJsonGenerator;
24
25
    public PactGenerator() {
26
        this.feignClientsFinder = new FeignClientsFinder();
27
        this.pactFactory = new PactFactory();
28
        this.pactJsonGenerator = new PactJsonGenerator();
29
    }
30
31
    public PactGenerator(FeignClientsFinder feignClientsFinder,
32
                         PactFactory pactFactory,
33
                         PactJsonGenerator pactJsonGenerator) {
34
        this.feignClientsFinder = feignClientsFinder;
35
        this.pactFactory = pactFactory;
36
        this.pactJsonGenerator = pactJsonGenerator;
37
    }
38
39
    public void writePactFiles(@NotNull String packageRoot,
40
                               @NotNull String consumerName,
41
                               @NotNull ObjectMapper objectMapper) {
42
        this.write(packageRoot, consumerName, objectMapper, null);
43
    }
44
45
    public void writePactFiles(@NotNull String packageRoot,
46
                               @NotNull String consumerName,
47
                               @NotNull ObjectMapper objectMapper,
48
                               @NotNull File pactFilesDestinationDir) {
49
        this.write(packageRoot, consumerName, objectMapper, pactFilesDestinationDir);
50
    }
51
52
    private void write(String packageRoot, String consumerName, ObjectMapper mapper, File pactFilesDestinationDir) {
53
        Multimap<Service, Pact> providerToPactMap = generatePacts(packageRoot, consumerName, mapper);
54
55
        List<Pact> pacts = providerToPactMap.keySet().stream()
56
            .map(providerToPactMap::get)
57
            .map(this::combinePactsToOne)
58
            .collect(Collectors.toList());
59
60
        pactJsonGenerator.writePactFiles(pactFilesDestinationDir, pacts);
61
    }
62
63
    private Multimap<Service, Pact> generatePacts(String packageRoot, String consumerName, ObjectMapper objectMapper) {
64
        Multimap<Service, Pact> providerToPactMap = HashMultimap.create();
65
66
        feignClientsFinder.findFeignClients(packageRoot).stream()
67
            .map(feignClient -> pactFactory.createFromFeignClient(feignClient, consumerName, objectMapper))
68
            .forEach(pact -> providerToPactMap.put(pact.getProvider(), pact));
69
70
        return providerToPactMap;
71
    }
72
73
    private Pact combinePactsToOne(Collection<Pact> pacts) {
74
        if (pacts == null || pacts.isEmpty()) {
75
            return null;
76
        }
77
78
        Pact referencePact = pacts.iterator().next();
79
80
        Pact combinedPact = Pact.builder()
81
                                .metadata(referencePact.getMetadata())
82
                                .consumer(referencePact.getConsumer())
83
                                .provider(referencePact.getProvider())
84
                                .interactions(new ArrayList<>())
85
                                .build();
86
87
        pacts.forEach(pact -> combinedPact.getInteractions().addAll(pact.getInteractions()));
88
89
        return combinedPact;
90
    }
91
92
}
93