diff --git a/pom.xml b/pom.xml
index 89d477dc9b4..3f284035f7d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -201,7 +201,6 @@
0.9.1
-
org.springframework.session
diff --git a/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java b/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java
index dbd923e5a51..7c4e99fb32f 100644
--- a/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java
+++ b/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java
@@ -1,61 +1,57 @@
package com.netgrif.application.engine.configuration;
+import com.netgrif.application.engine.configuration.properties.ElasticsearchProperties;
import com.netgrif.application.engine.configuration.properties.UriProperties;
import com.netgrif.application.engine.workflow.service.CaseEventHandler;
+import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.X509Certificate;
+
+@Slf4j
@Configuration
public class ElasticsearchConfiguration {
- @Value("${spring.data.elasticsearch.url}")
- private String url;
-
- @Value("${spring.data.elasticsearch.searchport}")
- private int port;
-
- @Value("${spring.data.elasticsearch.index.petriNet}")
- private String petriNetIndex;
-
- @Value("${spring.data.elasticsearch.index.case}")
- private String caseIndex;
-
- @Value("${spring.data.elasticsearch.index.task}")
- private String taskIndex;
+ protected final ElasticsearchProperties properties;
- @Value("${spring.data.elasticsearch.reindex}")
- private String cron;
+ protected final UriProperties uriProperties;
- private final UriProperties uriProperties;
-
- public ElasticsearchConfiguration(UriProperties uriProperties) {
+ public ElasticsearchConfiguration(UriProperties uriProperties, ElasticsearchProperties properties) {
this.uriProperties = uriProperties;
+ this.properties = properties;
}
@Bean
public String springElasticsearchReindex() {
- return cron;
+ return properties.getReindex();
}
@Bean
public String elasticPetriNetIndex() {
- return petriNetIndex;
+ return properties.getIndex().get("petriNet");
}
@Bean
public String elasticCaseIndex() {
- return caseIndex;
+ return properties.getIndex().get("case");
}
@Bean
public String elasticTaskIndex() {
- return taskIndex;
+ return properties.getIndex().get("task");
}
@Bean
@@ -64,15 +60,74 @@ public String elasticUriIndex() {
}
@Bean
- public RestHighLevelClient client() {
+ public RestHighLevelClient restClient() {
+ validateElasticsearchProperties();
+
+ RestClientBuilder builder = RestClient.builder(
+ new HttpHost(properties.getUrl(), properties.getSearchPort(), properties.isSsl() ? "https" : "http")
+ );
+
+ builder.setRequestConfigCallback(requestConfigBuilder ->
+ requestConfigBuilder
+ .setConnectTimeout(properties.getConnectTimeout())
+ .setConnectionRequestTimeout(properties.getConnectionRequestTimeout())
+ .setSocketTimeout(properties.getSocketTimeout()));
+
+ builder.setHttpClientConfigCallback(httpClientBuilder -> {
+ if (properties.isIgnoreSSL()) {
+ httpClientBuilder.setSSLContext(createDisabledSSLContext());
+ }
+ if (properties.getProxyHost() != null && properties.getProxyPort() > 0) {
+ httpClientBuilder.setProxy(new HttpHost(properties.getProxyHost(), properties.getProxyPort()));
+ }
+ if (properties.getUsername() != null && properties.getPassword() != null) {
+ BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+ credentialsProvider.setCredentials(
+ AuthScope.ANY,
+ new UsernamePasswordCredentials(properties.getUsername(), properties.getPassword())
+ );
+ httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
+ }
+ return httpClientBuilder;
+ });
+
+ return new RestHighLevelClient(builder);
+ }
+
+ protected SSLContext createDisabledSSLContext() {
+ try {
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ sslContext.init(null, new TrustManager[]{
+ new X509TrustManager() {
+ public X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+
+ public void checkClientTrusted(X509Certificate[] certs, String authType) {
+ }
+
+ public void checkServerTrusted(X509Certificate[] certs, String authType) {
+ }
+ }
+ }, new java.security.SecureRandom());
+ return sslContext;
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to create a disabled SSL context", e);
+ }
+ }
- return new RestHighLevelClient(
- RestClient.builder(new HttpHost(url, port, "http")));
+ protected void validateElasticsearchProperties() {
+ if (properties.getUrl() == null || properties.getUrl().isEmpty()) {
+ throw new IllegalStateException("Elasticsearch URL is not configured!");
+ }
+ if (properties.getSearchPort() <= 0) {
+ throw new IllegalStateException("Elasticsearch search port is invalid!");
+ }
}
@Bean
public ElasticsearchOperations elasticsearchTemplate() {
- return new ElasticsearchRestTemplate(client());
+ return new ElasticsearchRestTemplate(restClient());
}
@Bean
diff --git a/src/main/java/com/netgrif/application/engine/configuration/properties/ElasticsearchProperties.java b/src/main/java/com/netgrif/application/engine/configuration/properties/ElasticsearchProperties.java
index 4f77f278cb8..bb0858e6cd9 100644
--- a/src/main/java/com/netgrif/application/engine/configuration/properties/ElasticsearchProperties.java
+++ b/src/main/java/com/netgrif/application/engine/configuration/properties/ElasticsearchProperties.java
@@ -27,12 +27,30 @@ public class ElasticsearchProperties {
private boolean drop;
- private int port;
+ private boolean ignoreSSL;
- private int searchPort;
+ private int connectTimeout = -1;
+
+ private int socketTimeout = -1;
+
+ private int connectionRequestTimeout = -1;
+
+ private int port = 9300;
+
+ private int searchPort = 9200;
private String url;
+ private boolean ssl = false;
+
+ private String proxyHost;
+
+ private int proxyPort;
+
+ private String username;
+
+ private String password;
+
private Map index;
private boolean analyzerEnabled = false;