diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClientBeanDefinitionParser.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClientBeanDefinitionParser.java new file mode 100644 index 000000000..fe5c999f6 --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClientBeanDefinitionParser.java @@ -0,0 +1,47 @@ +/* + * Copyright 2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.elasticsearch.client.elc; + +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.w3c.dom.Element; + +/** + * @author Peter-Josef Meisch + * @since 5.0 + */ +public class ElasticsearchClientBeanDefinitionParser extends AbstractBeanDefinitionParser { + + @Override + protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(ElasticsearchClientFactoryBean.class); + setConfigurations(element, builder); + return getSourcedBeanDefinition(builder, element, parserContext); + } + + private void setConfigurations(Element element, BeanDefinitionBuilder builder) { + builder.addPropertyValue("hosts", element.getAttribute("hosts")); + } + + private AbstractBeanDefinition getSourcedBeanDefinition(BeanDefinitionBuilder builder, Element source, + ParserContext context) { + AbstractBeanDefinition definition = builder.getBeanDefinition(); + definition.setSource(context.extractSource(source)); + return definition; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClientFactoryBean.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClientFactoryBean.java new file mode 100644 index 000000000..c17f831e7 --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClientFactoryBean.java @@ -0,0 +1,97 @@ +/* + * Copyright 2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.elasticsearch.client.elc; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.FactoryBeanNotInitializedException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.data.elasticsearch.client.ClientConfiguration; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; + +/** + * ElasticsearchClientFactoryBean + * + * @author Peter-Josef Meisch + * @since 5.0 + */ +public class ElasticsearchClientFactoryBean + implements FactoryBean, InitializingBean, DisposableBean { + + private static final Log LOGGER = LogFactory.getLog(ElasticsearchClientFactoryBean.class); + + private @Nullable AutoCloseableElasticsearchClient client; + private String hosts = "http://localhost:9200"; + static final String COMMA = ","; + + @Override + public void destroy() { + try { + LOGGER.info("Closing elasticSearch client"); + if (client != null) { + client.close(); + } + } catch (final Exception e) { + LOGGER.error("Error closing ElasticSearch client: ", e); + } + } + + @Override + public void afterPropertiesSet() throws Exception { + buildClient(); + } + + @Override + public ElasticsearchClient getObject() { + + if (client == null) { + throw new FactoryBeanNotInitializedException(); + } + + return client; + } + + @Override + public Class getObjectType() { + return ElasticsearchClient.class; + } + + @Override + public boolean isSingleton() { + return false; + } + + protected void buildClient() throws Exception { + + Assert.hasText(hosts, "[Assertion Failed] At least one host must be set."); + + var clientConfiguration = ClientConfiguration.builder().connectedTo(hosts).build(); + client = (AutoCloseableElasticsearchClient) ElasticsearchClients.createImperative(clientConfiguration); + } + + public void setHosts(String hosts) { + this.hosts = hosts; + } + + public String getHosts() { + return this.hosts; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/config/RestClientBeanDefinitionParser.java b/src/main/java/org/springframework/data/elasticsearch/client/erhlc/RestHighLevelClientBeanDefinitionParser.java similarity index 86% rename from src/main/java/org/springframework/data/elasticsearch/config/RestClientBeanDefinitionParser.java rename to src/main/java/org/springframework/data/elasticsearch/client/erhlc/RestHighLevelClientBeanDefinitionParser.java index 48847c07b..d176f8e44 100644 --- a/src/main/java/org/springframework/data/elasticsearch/config/RestClientBeanDefinitionParser.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/erhlc/RestHighLevelClientBeanDefinitionParser.java @@ -13,23 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.elasticsearch.config; +package org.springframework.data.elasticsearch.client.erhlc; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.data.elasticsearch.client.erhlc.RestClientFactoryBean; import org.w3c.dom.Element; /** * @author Don Wellington + * @deprecated since 5.0 */ -public class RestClientBeanDefinitionParser extends AbstractBeanDefinitionParser { +@Deprecated +public class RestHighLevelClientBeanDefinitionParser extends AbstractBeanDefinitionParser { @Override protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(RestClientFactoryBean.class); + BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(RestHighLevelClientFactoryBean.class); setConfigurations(element, builder); return getSourcedBeanDefinition(builder, element, parserContext); } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/erhlc/RestClientFactoryBean.java b/src/main/java/org/springframework/data/elasticsearch/client/erhlc/RestHighLevelClientFactoryBean.java similarity index 91% rename from src/main/java/org/springframework/data/elasticsearch/client/erhlc/RestClientFactoryBean.java rename to src/main/java/org/springframework/data/elasticsearch/client/erhlc/RestHighLevelClientFactoryBean.java index 202a83e82..7bf6f6a05 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/erhlc/RestClientFactoryBean.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/erhlc/RestHighLevelClientFactoryBean.java @@ -31,16 +31,17 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** - * RestClientFactoryBean + * RestHighLevelClientFactoryBean * * @author Don Wellington * @author Peter-Josef Meisch * @deprecated since 5.0 */ @Deprecated -public class RestClientFactoryBean implements FactoryBean, InitializingBean, DisposableBean { +public class RestHighLevelClientFactoryBean + implements FactoryBean, InitializingBean, DisposableBean { - private static final Log LOGGER = LogFactory.getLog(RestClientFactoryBean.class); + private static final Log LOGGER = LogFactory.getLog(RestHighLevelClientFactoryBean.class); private @Nullable RestHighLevelClient client; private String hosts = "http://localhost:9200"; diff --git a/src/main/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandler.java b/src/main/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandler.java index feb5d346b..56b728c29 100644 --- a/src/main/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandler.java +++ b/src/main/java/org/springframework/data/elasticsearch/config/ElasticsearchNamespaceHandler.java @@ -16,6 +16,7 @@ package org.springframework.data.elasticsearch.config; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchClientBeanDefinitionParser; import org.springframework.data.elasticsearch.repository.config.ElasticsearchRepositoryConfigExtension; import org.springframework.data.repository.config.RepositoryBeanDefinitionParser; import org.springframework.data.repository.config.RepositoryConfigurationExtension; @@ -35,6 +36,6 @@ public class ElasticsearchNamespaceHandler extends NamespaceHandlerSupport { RepositoryBeanDefinitionParser parser = new RepositoryBeanDefinitionParser(extension); registerBeanDefinitionParser("repositories", parser); - registerBeanDefinitionParser("rest-client", new RestClientBeanDefinitionParser()); + registerBeanDefinitionParser("elasticsearch-client", new ElasticsearchClientBeanDefinitionParser()); } } diff --git a/src/main/resources/META-INF/spring.schemas b/src/main/resources/META-INF/spring.schemas index 52a61168e..603d13a25 100644 --- a/src/main/resources/META-INF/spring.schemas +++ b/src/main/resources/META-INF/spring.schemas @@ -1,8 +1,10 @@ http\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd http\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-3.2.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-3.2.xsd http\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-4.0.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-4.0.xsd +http\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-5.0.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-5.0.xsd http\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-4.0.xsd https\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd https\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-3.2.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-3.2.xsd https\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-4.0.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-4.0.xsd -https\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-4.0.xsd +https\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-5.0.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-5.0.xsd +https\://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd=org/springframework/data/elasticsearch/config/spring-elasticsearch-5.0.xsd diff --git a/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-5.0.xsd b/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-5.0.xsd new file mode 100644 index 000000000..791faee18 --- /dev/null +++ b/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-5.0.xsd @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/org/springframework/data/elasticsearch/config/namespace/ElasticsearchNamespaceHandlerTests.java b/src/test/java/org/springframework/data/elasticsearch/config/namespace/ElasticsearchNamespaceHandlerTests.java index 54e5256ab..3ab9da28e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/config/namespace/ElasticsearchNamespaceHandlerTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/config/namespace/ElasticsearchNamespaceHandlerTests.java @@ -24,7 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.client.erhlc.RestClientFactoryBean; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchClientFactoryBean; import org.springframework.data.elasticsearch.junit.jupiter.Tags; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.test.context.ContextConfiguration; @@ -50,10 +50,11 @@ public class ElasticsearchNamespaceHandlerTests { } @Test - public void shouldCreateRestClient() { + public void shouldCreateElasticsearchClient() { - assertThat(context.getBean(RestClientFactoryBean.class)).isNotNull(); - assertThat(context.getBean(RestClientFactoryBean.class)).isInstanceOf(RestClientFactoryBean.class); + assertThat(context.getBean(ElasticsearchClientFactoryBean.class)).isNotNull(); + assertThat(context.getBean(ElasticsearchClientFactoryBean.class)) + .isInstanceOf(ElasticsearchClientFactoryBean.class); } @Document(indexName = "test-index-config-namespace", createIndex = false) diff --git a/src/test/resources/org/springframework/data/elasticsearch/config/namespace/namespace.xml b/src/test/resources/org/springframework/data/elasticsearch/config/namespace/namespace.xml index 2803870dc..bf02e0592 100644 --- a/src/test/resources/org/springframework/data/elasticsearch/config/namespace/namespace.xml +++ b/src/test/resources/org/springframework/data/elasticsearch/config/namespace/namespace.xml @@ -1,19 +1,19 @@ - + class="org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate"> + + base-package="org.springframework.data.elasticsearch.config.namespace" + consider-nested-repositories="true"/> - +