Skip to content

Commit 62b2701

Browse files
committed
Extract generic service interface to derive missin integration test methods
Signed-off-by: Sven Strittmatter <sven.strittmatter@iteratec.com>
1 parent 150bd6d commit 62b2701

File tree

2 files changed

+53
-11
lines changed

2 files changed

+53
-11
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// SPDX-FileCopyrightText: the secureCodeBox authors
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
package io.securecodebox.persistence.defectdojo.service;
5+
6+
import com.fasterxml.jackson.core.JsonProcessingException;
7+
import io.securecodebox.persistence.defectdojo.model.Model;
8+
9+
import java.net.URISyntaxException;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.Optional;
13+
14+
/**
15+
* Basic CRUD interface for DefectDojo REST API
16+
*/
17+
public interface DefectDojoService<T extends Model> {
18+
T get(long id);
19+
20+
List<T> search(Map<String, Object> queryParams) throws URISyntaxException, JsonProcessingException;
21+
22+
List<T> search() throws URISyntaxException, JsonProcessingException;
23+
24+
Optional<T> searchUnique(T searchObject) throws URISyntaxException, JsonProcessingException;
25+
26+
Optional<T> searchUnique(Map<String, Object> queryParams) throws URISyntaxException, JsonProcessingException;
27+
28+
T create(T object);
29+
30+
void delete(long id);
31+
32+
T update(T object, long objectId);
33+
}

src/main/java/io/securecodebox/persistence/defectdojo/service/GenericDefectDojoService.java

+20-11
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.securecodebox.persistence.defectdojo.model.Model;
1919
import io.securecodebox.persistence.defectdojo.model.PaginatedResult;
2020
import lombok.Getter;
21+
import lombok.NonNull;
2122
import lombok.extern.slf4j.Slf4j;
2223
import org.springframework.http.HttpEntity;
2324
import org.springframework.http.HttpHeaders;
@@ -35,10 +36,9 @@
3536
import java.net.URISyntaxException;
3637
import java.util.*;
3738

38-
// FIXME: Should be package private bc implementation detail.
3939
// TODO: Remove JsonProcessingException, URISyntaxException from public API and use a own runtime exception type bc these checked exceptions clutter the client coe.
4040
@Slf4j
41-
public abstract class GenericDefectDojoService<T extends Model> {
41+
abstract class GenericDefectDojoService<T extends Model> implements DefectDojoService<T>{
4242
private static final String API_PREFIX = "/api/v2/";
4343
private static final long DEFECT_DOJO_OBJET_LIMIT = 100L;
4444
protected Config config;
@@ -49,7 +49,8 @@ public abstract class GenericDefectDojoService<T extends Model> {
4949
@Getter
5050
protected RestTemplate restTemplate;
5151

52-
public GenericDefectDojoService(Config config) {
52+
public GenericDefectDojoService(@NonNull Config config) {
53+
super();
5354
this.config = config;
5455

5556
this.objectMapper = new ObjectMapper();
@@ -92,7 +93,8 @@ private RestTemplate setupRestTemplate() {
9293

9394
protected abstract PaginatedResult<T> deserializeList(String response) throws JsonProcessingException;
9495

95-
public T get(long id) {
96+
@Override
97+
public final T get(long id) {
9698
var restTemplate = this.getRestTemplate();
9799
HttpEntity<String> payload = new HttpEntity<>(getDefectDojoAuthorizationHeaders());
98100

@@ -136,7 +138,8 @@ protected PaginatedResult<T> internalSearch(Map<String, Object> queryParams, lon
136138
return deserializeList(responseString.getBody());
137139
}
138140

139-
public List<T> search(Map<String, Object> queryParams) throws URISyntaxException, JsonProcessingException {
141+
@Override
142+
public final List<T> search(Map<String, Object> queryParams) throws URISyntaxException, JsonProcessingException {
140143
List<T> objects = new LinkedList<>();
141144

142145
boolean hasNext;
@@ -154,12 +157,14 @@ public List<T> search(Map<String, Object> queryParams) throws URISyntaxException
154157
return objects;
155158
}
156159

157-
public List<T> search() throws URISyntaxException, JsonProcessingException {
160+
@Override
161+
public final List<T> search() throws URISyntaxException, JsonProcessingException {
158162
return search(new LinkedHashMap<>());
159163
}
160164

165+
@Override
161166
@SuppressWarnings("unchecked")
162-
public Optional<T> searchUnique(T searchObject) throws URISyntaxException, JsonProcessingException {
167+
public final Optional<T> searchUnique(T searchObject) throws URISyntaxException, JsonProcessingException {
163168
Map<String, Object> queryParams = searchStringMapper.convertValue(searchObject, Map.class);
164169

165170
var objects = search(queryParams);
@@ -169,30 +174,34 @@ public Optional<T> searchUnique(T searchObject) throws URISyntaxException, JsonP
169174
.findFirst();
170175
}
171176

172-
public Optional<T> searchUnique(Map<String, Object> queryParams) throws URISyntaxException, JsonProcessingException {
177+
@Override
178+
public final Optional<T> searchUnique(Map<String, Object> queryParams) throws URISyntaxException, JsonProcessingException {
173179
var objects = search(queryParams);
174180

175181
return objects.stream()
176182
.filter(object -> object.equalsQueryString(queryParams))
177183
.findFirst();
178184
}
179185

180-
public T create(T object) {
186+
@Override
187+
public final T create(T object) {
181188
var restTemplate = this.getRestTemplate();
182189
HttpEntity<T> payload = new HttpEntity<>(object, getDefectDojoAuthorizationHeaders());
183190

184191
ResponseEntity<T> response = restTemplate.exchange(this.config.getUrl() + API_PREFIX + getUrlPath() + "/", HttpMethod.POST, payload, getModelClass());
185192
return response.getBody();
186193
}
187194

188-
public void delete(long id) {
195+
@Override
196+
public final void delete(long id) {
189197
var restTemplate = this.getRestTemplate();
190198
HttpEntity<String> payload = new HttpEntity<>(getDefectDojoAuthorizationHeaders());
191199

192200
restTemplate.exchange(this.config.getUrl() + API_PREFIX + getUrlPath() + "/" + id + "/", HttpMethod.DELETE, payload, String.class);
193201
}
194202

195-
public T update(T object, long objectId) {
203+
@Override
204+
public final T update(T object, long objectId) {
196205
var restTemplate = this.getRestTemplate();
197206
HttpEntity<T> payload = new HttpEntity<>(object, getDefectDojoAuthorizationHeaders());
198207

0 commit comments

Comments
 (0)