Skip to content

Commit 936de20

Browse files
authored
DATAES-739 - Introduce nullable annotations for API validation.
Original PR: spring-projects#387
1 parent 4fc4d91 commit 936de20

File tree

94 files changed

+612
-357
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+612
-357
lines changed

src/main/java/org/springframework/data/elasticsearch/ElasticsearchException.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@
1717

1818
import java.util.Map;
1919

20+
import org.springframework.lang.Nullable;
21+
2022
/**
2123
* ElasticsearchException
2224
*
2325
* @author Rizwan Idrees
2426
* @author Mohsin Husen
27+
* @author Peter-Josef Meisch
2528
*/
2629
public class ElasticsearchException extends RuntimeException {
2730

28-
private Map<String, String> failedDocuments;
31+
@Nullable private Map<String, String> failedDocuments;
2932

3033
public ElasticsearchException(String message) {
3134
super(message);
@@ -45,6 +48,7 @@ public ElasticsearchException(String message, Map<String, String> failedDocument
4548
this.failedDocuments = failedDocuments;
4649
}
4750

51+
@Nullable
4852
public Map<String, String> getFailedDocuments() {
4953
return failedDocuments;
5054
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@org.springframework.lang.NonNullApi
2+
@org.springframework.lang.NonNullFields
3+
package org.springframework.data.elasticsearch.annotations;

src/main/java/org/springframework/data/elasticsearch/client/ClientConfigurationBuilder.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@ class ClientConfigurationBuilder
5454
private @Nullable HostnameVerifier hostnameVerifier;
5555
private Duration connectTimeout = Duration.ofSeconds(10);
5656
private Duration soTimeout = Duration.ofSeconds(5);
57-
private String username;
58-
private String password;
59-
private String pathPrefix;
60-
private String proxy;
61-
private Function<WebClient, WebClient> webClientConfigurer;
57+
private @Nullable String username;
58+
private @Nullable String password;
59+
private @Nullable String pathPrefix;
60+
private @Nullable String proxy;
61+
private @Nullable Function<WebClient, WebClient> webClientConfigurer;
6262

6363
/*
6464
* (non-Javadoc)

src/main/java/org/springframework/data/elasticsearch/client/NodeClientFactoryBean.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
import org.slf4j.LoggerFactory;
3333
import org.springframework.beans.factory.DisposableBean;
3434
import org.springframework.beans.factory.FactoryBean;
35+
import org.springframework.beans.factory.FactoryBeanNotInitializedException;
3536
import org.springframework.beans.factory.InitializingBean;
37+
import org.springframework.lang.Nullable;
3638
import org.springframework.util.StringUtils;
3739

3840
/**
@@ -48,12 +50,12 @@ public class NodeClientFactoryBean implements FactoryBean<Client>, InitializingB
4850
private static final Logger logger = LoggerFactory.getLogger(NodeClientFactoryBean.class);
4951
private boolean local;
5052
private boolean enableHttp;
51-
private String clusterName;
52-
private Node node;
53-
private NodeClient nodeClient;
54-
private String pathData;
55-
private String pathHome;
56-
private String pathConfiguration;
53+
private @Nullable String clusterName;
54+
private @Nullable Node node;
55+
private @Nullable NodeClient nodeClient;
56+
private @Nullable String pathData;
57+
private @Nullable String pathHome;
58+
private @Nullable String pathConfiguration;
5759

5860
public static class TestNode extends Node {
5961

@@ -82,6 +84,11 @@ public NodeClientFactoryBean(boolean local) {
8284

8385
@Override
8486
public NodeClient getObject() {
87+
88+
if (nodeClient == null) {
89+
throw new FactoryBeanNotInitializedException();
90+
}
91+
8592
return nodeClient;
8693
}
8794

src/main/java/org/springframework/data/elasticsearch/client/RestClientFactoryBean.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,21 @@
2525
import org.elasticsearch.client.RestHighLevelClient;
2626
import org.springframework.beans.factory.DisposableBean;
2727
import org.springframework.beans.factory.FactoryBean;
28+
import org.springframework.beans.factory.FactoryBeanNotInitializedException;
2829
import org.springframework.beans.factory.InitializingBean;
30+
import org.springframework.lang.Nullable;
2931
import org.springframework.util.Assert;
3032

3133
/**
3234
* RestClientFactoryBean
3335
*
3436
* @author Don Wellington
37+
* @author Peter-Josef Meisch
3538
*/
3639
@Slf4j
3740
public class RestClientFactoryBean implements FactoryBean<RestHighLevelClient>, InitializingBean, DisposableBean {
3841

39-
private RestHighLevelClient client;
42+
private @Nullable RestHighLevelClient client;
4043
private String hosts = "http://localhost:9200";
4144
static final String COMMA = ",";
4245

@@ -59,6 +62,11 @@ public void afterPropertiesSet() throws Exception {
5962

6063
@Override
6164
public RestHighLevelClient getObject() {
65+
66+
if (client == null) {
67+
throw new FactoryBeanNotInitializedException();
68+
}
69+
6270
return client;
6371
}
6472

@@ -75,6 +83,7 @@ public boolean isSingleton() {
7583
protected void buildClient() throws Exception {
7684

7785
Assert.hasText(hosts, "[Assertion Failed] At least one host must be set.");
86+
7887
ArrayList<HttpHost> httpHosts = new ArrayList<>();
7988
for (String host : hosts.split(COMMA)) {
8089
URL hostUrl = new URL(host);

src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import org.slf4j.LoggerFactory;
2525
import org.springframework.beans.factory.DisposableBean;
2626
import org.springframework.beans.factory.FactoryBean;
27+
import org.springframework.beans.factory.FactoryBeanNotInitializedException;
2728
import org.springframework.beans.factory.InitializingBean;
29+
import org.springframework.lang.Nullable;
2830

2931
/**
3032
* TransportClientFactoryBean
@@ -48,8 +50,8 @@ public class TransportClientFactoryBean implements FactoryBean<TransportClient>,
4850
private Boolean clientIgnoreClusterName = Boolean.FALSE;
4951
private String clientPingTimeout = "5s";
5052
private String clientNodesSamplerInterval = "5s";
51-
private TransportClient client;
52-
private Properties properties;
53+
private @Nullable TransportClient client;
54+
private @Nullable Properties properties;
5355

5456
@Override
5557
public void destroy() {
@@ -65,6 +67,10 @@ public void destroy() {
6567

6668
@Override
6769
public TransportClient getObject() {
70+
71+
if (clientTransportSniff == null) {
72+
throw new FactoryBeanNotInitializedException();
73+
}
6874
return client;
6975
}
7076

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@org.springframework.lang.NonNullApi
2+
@org.springframework.lang.NonNullFields
3+
package org.springframework.data.elasticsearch.client;

src/main/java/org/springframework/data/elasticsearch/client/reactive/DefaultReactiveElasticsearchClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,8 +865,9 @@ private static class ScrollState {
865865
private final Object lock = new Object();
866866

867867
private final List<String> pastIds = new ArrayList<>(1);
868-
private String scrollId;
868+
@Nullable private String scrollId;
869869

870+
@Nullable
870871
String getScrollId() {
871872
return scrollId;
872873
}

src/main/java/org/springframework/data/elasticsearch/client/reactive/WebClientProvider.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ static WebClientProvider create(String scheme, @Nullable ClientHttpConnector con
105105
* @return the pathPrefix if set.
106106
* @since 4.0
107107
*/
108+
@Nullable
108109
String getPathPrefix();
109110

110111
/**
@@ -133,7 +134,9 @@ static WebClientProvider create(String scheme, @Nullable ClientHttpConnector con
133134
WebClientProvider withPathPrefix(String pathPrefix);
134135

135136
/**
136-
* Create a new instance of {@link WebClientProvider} calling the given {@link Function} to configure the {@link WebClient}.
137+
* Create a new instance of {@link WebClientProvider} calling the given {@link Function} to configure the
138+
* {@link WebClient}.
139+
*
137140
* @param webClientConfigurer configuration function
138141
* @return new instance of {@link WebClientProvider}
139142
* @since 4.0
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
/**
2-
* Everything required for a Reactive Elasticsearch client.
3-
*/
41
@org.springframework.lang.NonNullApi
52
@org.springframework.lang.NonNullFields
63
package org.springframework.data.elasticsearch.client.reactive;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@org.springframework.lang.NonNullApi
2+
@org.springframework.lang.NonNullFields
3+
package org.springframework.data.elasticsearch.client.util;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@org.springframework.lang.NonNullApi
2+
@org.springframework.lang.NonNullFields
3+
package org.springframework.data.elasticsearch.config;

src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
3232
import org.springframework.data.elasticsearch.core.query.Query;
3333
import org.springframework.data.util.CloseableIterator;
34+
import org.springframework.lang.Nullable;
3435
import org.springframework.util.Assert;
3536

3637
/**
@@ -41,9 +42,9 @@
4142
*/
4243
public abstract class AbstractElasticsearchTemplate implements ElasticsearchOperations, ApplicationContextAware {
4344

44-
protected ElasticsearchConverter elasticsearchConverter;
45-
protected RequestFactory requestFactory;
46-
protected IndexOperations indexOperations;
45+
protected @Nullable ElasticsearchConverter elasticsearchConverter;
46+
protected @Nullable RequestFactory requestFactory;
47+
protected @Nullable IndexOperations indexOperations;
4748

4849
// region Initialization
4950
protected void initialize(ElasticsearchConverter elasticsearchConverter, IndexOperations indexOperations) {
@@ -74,6 +75,9 @@ public void setApplicationContext(ApplicationContext context) throws BeansExcept
7475
// region getter/setter
7576
@Override
7677
public IndexOperations getIndexOperations() {
78+
79+
Assert.notNull("indexOperations are not initialized");
80+
7781
return indexOperations;
7882
}
7983
// endregion
@@ -159,13 +163,19 @@ public List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class
159163
// region Helper methods
160164
@Override
161165
public ElasticsearchConverter getElasticsearchConverter() {
166+
167+
Assert.notNull(elasticsearchConverter, "elasticsearchConverter is not initialized.");
168+
162169
return elasticsearchConverter;
163170
}
164171

165172
/**
166173
* @since 4.0
167174
*/
168175
public RequestFactory getRequestFactory() {
176+
177+
Assert.notNull(requestFactory, "requestfactory not initialized");
178+
169179
return requestFactory;
170180
}
171181

src/main/java/org/springframework/data/elasticsearch/core/CriteriaFilterProcessor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.data.geo.Distance;
3535
import org.springframework.data.geo.Metrics;
3636
import org.springframework.data.geo.Point;
37+
import org.springframework.lang.Nullable;
3738
import org.springframework.util.Assert;
3839

3940
/**
@@ -100,7 +101,9 @@ private List<QueryBuilder> createFilterFragmentForCriteria(Criteria chainedCrite
100101
return filterList;
101102
}
102103

104+
@Nullable
103105
private QueryBuilder processCriteriaEntry(OperationKey key, Object value, String fieldName) {
106+
104107
if (value == null) {
105108
return null;
106109
}

src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.elasticsearch.index.query.BoolQueryBuilder;
3131
import org.elasticsearch.index.query.QueryBuilder;
3232
import org.springframework.data.elasticsearch.core.query.Criteria;
33+
import org.springframework.lang.Nullable;
3334
import org.springframework.util.Assert;
3435

3536
/**
@@ -46,8 +47,8 @@
4647
class CriteriaQueryProcessor {
4748

4849
QueryBuilder createQueryFromCriteria(Criteria criteria) {
49-
if (criteria == null)
50-
return null;
50+
51+
Assert.notNull(criteria, "criteria must not be null");
5152

5253
List<QueryBuilder> shouldQueryBuilderList = new LinkedList<>();
5354
List<QueryBuilder> mustNotQueryBuilderList = new LinkedList<>();
@@ -109,6 +110,7 @@ QueryBuilder createQueryFromCriteria(Criteria criteria) {
109110
return query;
110111
}
111112

113+
@Nullable
112114
private QueryBuilder createQueryFragmentForCriteria(Criteria chainedCriteria) {
113115
if (chainedCriteria.getQueryCriteriaEntries().isEmpty())
114116
return null;
@@ -135,6 +137,7 @@ private QueryBuilder createQueryFragmentForCriteria(Criteria chainedCriteria) {
135137
return query;
136138
}
137139

140+
@Nullable
138141
private QueryBuilder processCriteriaEntry(Criteria.CriteriaEntry entry, String fieldName) {
139142
OperationKey key = entry.getKey();
140143
Object value = entry.getValue();

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplate.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,12 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
9393

9494
// region Initialization
9595
public ElasticsearchRestTemplate(RestHighLevelClient client) {
96+
this.client = client;
9697
initialize(client, createElasticsearchConverter());
9798
}
9899

99100
public ElasticsearchRestTemplate(RestHighLevelClient client, ElasticsearchConverter elasticsearchConverter) {
101+
this.client = client;
100102
initialize(client, elasticsearchConverter);
101103
}
102104

@@ -210,7 +212,7 @@ private void doBulkOperation(List<?> queries, BulkOptions bulkOptions, IndexCoor
210212

211213
// region SearchOperations
212214
@Override
213-
public long count(Query query, Class<?> clazz, IndexCoordinates index) {
215+
public long count(Query query,@Nullable Class<?> clazz, IndexCoordinates index) {
214216

215217
Assert.notNull(query, "query must not be null");
216218
Assert.notNull(index, "index must not be null");

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,16 @@ public class ElasticsearchTemplate extends AbstractElasticsearchTemplate {
8383
.getLogger("org.springframework.data.elasticsearch.core.QUERY");
8484

8585
private Client client;
86-
private String searchTimeout;
86+
@Nullable private String searchTimeout;
8787

8888
// region Initialization
8989
public ElasticsearchTemplate(Client client) {
90+
this.client = client;
9091
initialize(client, createElasticsearchConverter());
9192
}
9293

9394
public ElasticsearchTemplate(Client client, ElasticsearchConverter elasticsearchConverter) {
95+
this.client = client;
9496
initialize(client, elasticsearchConverter);
9597
}
9698

@@ -102,6 +104,7 @@ private void initialize(Client client, ElasticsearchConverter elasticsearchConve
102104
// endregion
103105

104106
// region getter/setter
107+
@Nullable
105108
public String getSearchTimeout() {
106109
return searchTimeout;
107110
}

src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,7 @@ private ElasticsearchPersistentEntity<?> getPersistentEntity(@Nullable Class<?>
867867
return clazz != null ? elasticsearchConverter.getMappingContext().getPersistentEntity(clazz) : null;
868868
}
869869

870+
@Nullable
870871
private String getPersistentEntityId(Object entity) {
871872

872873
Object identifier = elasticsearchConverter.getMappingContext() //

src/main/java/org/springframework/data/elasticsearch/core/ResourceUtil.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
2323
import org.springframework.core.io.ClassPathResource;
24+
import org.springframework.lang.Nullable;
2425
import org.springframework.util.StreamUtils;
2526

2627
/**
@@ -40,6 +41,7 @@ public abstract class ResourceUtil {
4041
* @param url
4142
* @return
4243
*/
44+
@Nullable
4345
public static String readFileFromClasspath(String url) {
4446

4547
ClassPathResource classPathResource = new ClassPathResource(url);

0 commit comments

Comments
 (0)