This is an automated email from the ASF dual-hosted git repository.
sergeychugunov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite-extensions.git
The following commit(s) were added to refs/heads/master by this push:
new a25117b IGNITE-13169 Remove Ignite bean name requirement for Spring
Data Repository - Fixes #55.
a25117b is described below
commit a25117b7ce4c156bf29d207e43002d35b9ff70cc
Author: Semyon Danilov <[email protected]>
AuthorDate: Fri Apr 16 10:14:30 2021 +0300
IGNITE-13169 Remove Ignite bean name requirement for Spring Data Repository
- Fixes #55.
Signed-off-by: Sergey Chugunov <[email protected]>
---
.../examples/SpringApplicationConfiguration.java | 6 +-
.../repository/support/IgniteProxyFactory.java | 73 ++++++++++-----
.../support/IgniteRepositoryFactoryBean.java | 4 +-
...gniteSpringDataConnectionConfigurationTest.java | 99 ++++++++++++++++++++
.../repository/support/IgniteProxyFactory.java | 73 ++++++++++-----
.../support/IgniteRepositoryFactoryBean.java | 4 +-
...gniteSpringDataConnectionConfigurationTest.java | 100 +++++++++++++++++++++
.../repository/support/IgniteProxyFactory.java | 63 +++++++++----
...gniteSpringDataConnectionConfigurationTest.java | 82 +++++++++++++++++
9 files changed, 433 insertions(+), 71 deletions(-)
diff --git
a/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java
b/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java
index d7b4a91..15ded04 100644
---
a/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java
+++
b/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java
@@ -29,10 +29,10 @@ import org.springframework.context.annotation.Configuration;
/**
* Every {@link IgniteRepository} is bound to a specific Apache Ignite that it
communicates to in order to mutate and
* read data via Spring Data API. To pass an instance of Apache Ignite cache
to an {@link IgniteRepository} it's
- * required to initialize {@link IgniteRepositoryFactoryBean} with on of the
following:
+ * required to initialize {@link IgniteRepositoryFactoryBean} with one of the
following:
* <ul>
- * <li>{@link Ignite} instance bean named "igniteInstance"</li>
- * <li>{@link IgniteConfiguration} bean named "igniteCfg"</li>
+ * <li>{@link Ignite} instance bean</li>
+ * <li>{@link IgniteConfiguration} bean</li>
* <li>A path to Ignite's Spring XML configuration named
"igniteSpringCfgPath"</li>
* <ul/>
* In this example the first approach is utilized.
diff --git
a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java
b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java
index d571cc2..b5280ee 100644
---
a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java
+++
b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java
@@ -19,8 +19,14 @@ package org.apache.ignite.springdata20.repository.support;
import java.util.HashSet;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.springdata.proxy.IgniteProxy;
import org.apache.ignite.springdata20.repository.config.RepositoryConfig;
import org.springframework.beans.BeansException;
@@ -103,29 +109,25 @@ public class IgniteProxyFactory implements
ApplicationContextAware, DisposableBe
private IgniteProxy createIgniteProxy(Class<?> repoInterface) {
RepositoryConfig repoCfg = getRepositoryConfiguration(repoInterface);
- Object connCfg;
-
- try {
- connCfg =
ctx.getBean(evaluateExpression(repoCfg.igniteInstance()));
- }
- catch (BeansException ex) {
- try {
- connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteCfg()));
- }
- catch (BeansException ex2) {
- try {
- connCfg =
ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class);
- }
- catch (BeansException ex3) {
- throw new IllegalArgumentException("Invalid configuration
for repository " +
- repoInterface.getName() + ". No beans were found that
provide connection configuration to the" +
- " Ignite cluster. Check \"igniteInstance\",
\"igniteCfg\", \"igniteSpringCfgPath\" parameters" +
- " of " + RepositoryConfig.class.getName() + "
repository annotation.");
- }
- }
- }
-
- return IgniteProxy.of(connCfg);
+ return Stream.<BeanFinder>of(
+ () -> ctx.getBean(evaluateExpression(repoCfg.igniteInstance())),
+ () -> ctx.getBean(evaluateExpression(repoCfg.igniteCfg())),
+ () ->
ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class),
+ () -> ctx.getBean(Ignite.class),
+ () -> ctx.getBean(IgniteClient.class),
+ () -> ctx.getBean(IgniteConfiguration.class),
+ () -> ctx.getBean(ClientConfiguration.class)
+ ).map(BeanFinder::getBean)
+ .filter(Objects::nonNull)
+ .findFirst()
+ .map(IgniteProxy::of)
+ .orElseThrow(() -> {
+ return new IllegalArgumentException("Invalid configuration for
repository " +
+ repoInterface.getName() + ". No beans were found that
provide connection configuration to the" +
+ " Ignite cluster. Check \"igniteInstance\", \"igniteCfg\",
\"igniteSpringCfgPath\" parameters" +
+ " of " + RepositoryConfig.class.getName() + " repository
annotation or provide Ignite, IgniteClient, " +
+ " ClientConfiguration or IgniteConfiguration bean to
application context.");
+ });
}
/**
@@ -137,4 +139,29 @@ public class IgniteProxyFactory implements
ApplicationContextAware, DisposableBe
private String evaluateExpression(String spelExpression) {
return (String)expressionResolver.evaluate(spelExpression,
beanExpressionCtx);
}
+
+ /**
+ * Helper interface that wraps getBean method.
+ */
+ @FunctionalInterface
+ private interface BeanFinder {
+ /**
+ * Get bean.
+ * @return Bean or null if {@link BeansException} was thrown.
+ */
+ default Object getBean() {
+ try {
+ return get();
+ } catch (BeansException ex) {
+ return null;
+ }
+ }
+
+ /**
+ * Get bean.
+ * @return Bean.
+ * @throws BeansException If bean was not found.
+ */
+ Object get() throws BeansException;
+ }
}
diff --git
a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java
b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java
index bce6dda..0ec1313 100644
---
a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java
+++
b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java
@@ -34,8 +34,8 @@ import
org.springframework.data.repository.core.support.RepositoryFactorySupport
* The {@link
org.apache.ignite.springdata20.repository.config.RepositoryConfig} requires to
define one of the
* parameters below in your Spring application configuration in order to get
an access to Apache Ignite cluster:
* <ul>
- * <li>{@link Ignite} instance bean named "igniteInstance" by default</li>
- * <li>{@link IgniteConfiguration} bean named "igniteCfg" by default</li>
+ * <li>{@link Ignite} instance bean</li>
+ * <li>{@link IgniteConfiguration} bean</li>
* <li>A path to Ignite's Spring XML configuration named "igniteSpringCfgPath"
by default</li>
* <ul/>
*
diff --git
a/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
b/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
index 4187e28..10d016d 100644
---
a/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
+++
b/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
@@ -21,6 +21,7 @@ import java.io.Serializable;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.ClientConfiguration;
import org.apache.ignite.configuration.ClientConnectorConfiguration;
@@ -75,6 +76,30 @@ public class IgniteSpringDataConnectionConfigurationTest
extends GridCommonAbstr
checkRepositoryConfiguration(ClientConfigurationApplication.class,
IgniteClientConfigRepository.class);
}
+ /** Tests repository configuration in case {@link Ignite} with non default
is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteInstanceParameter() {
+ checkRepositoryConfiguration(DefaultIgniteBeanApplication.class,
IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteClient} with non
default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteClientInstanceParameter() {
+ checkRepositoryConfiguration(DefaultIgniteClientBeanApplication.class,
IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link ClientConfiguration}
with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgnitClientConfigurationParameter() {
+
checkRepositoryConfiguration(DefaultIgniteClientConfigurationBeanApplication.class,
IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteConfiguration}
with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteConfigurationParameter() {
+
checkRepositoryConfiguration(DefaultIgniteConfigurationBeanApplication.class,
IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
/**
* Tests repository configuration in case {@link IgniteConfiguration} that
refers to existing Ignite node instance
* used to access the Ignite cluster.
@@ -205,6 +230,80 @@ public class IgniteSpringDataConnectionConfigurationTest
extends GridCommonAbstr
}
}
+ /**
+ * Spring Application configuration for repository testing in case if
Ignite bean name was not provided
+ * through {@link RepositoryConfig#igniteInstance()} ()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes =
IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteBeanApplication {
+ /** Ignite bean. */
+ @Bean
+ public Ignite someIgnite() {
+ return Ignition.start(getIgniteConfiguration("test", false));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if
IgniteClient bean name was not provided
+ * through {@link RepositoryConfig#igniteInstance()} ()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes =
IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteClientBeanApplication {
+ /** Ignite client bean. */
+ @Bean
+ public IgniteClient someIgnite() {
+ return Ignition.startClient(new
ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if
ClientConfiguration bean name was not provided
+ * through {@link RepositoryConfig#igniteCfg()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes =
IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteClientConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public ClientConfiguration someCfg() {
+ return new ClientConfiguration().setAddresses(LOCAL_HOST + ':' +
CLI_CONN_PORT);
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if
IgniteConfiguration bean name was not provided
+ * through {@link RepositoryConfig#igniteCfg()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes =
IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public IgniteConfiguration someCfg() {
+ return getIgniteConfiguration("test", false);
+ }
+ }
+
+ /** Repository for testing configuration approach through default ignite
beans. */
+ @RepositoryConfig(cacheName = "PersonCache")
+ public interface IgniteRepositoryWithoutExplicitIgnite extends
IgniteRepository<Object, Serializable> {
+ // No-op.
+ }
+
/** Repository for testing configuration approach through {@link
IgniteConfiguration}. */
@RepositoryConfig(cacheName = "PersonCache", igniteCfg =
"igniteConfiguration")
public interface IgniteConfigRepository extends IgniteRepository<Object,
Serializable> {
diff --git
a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java
b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java
index ac56e00..33d3757 100644
---
a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java
+++
b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java
@@ -19,8 +19,14 @@ package org.apache.ignite.springdata22.repository.support;
import java.util.HashSet;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.springdata.proxy.IgniteProxy;
import org.apache.ignite.springdata22.repository.config.RepositoryConfig;
import org.springframework.beans.BeansException;
@@ -103,29 +109,25 @@ public class IgniteProxyFactory implements
ApplicationContextAware, DisposableBe
private IgniteProxy createIgniteProxy(Class<?> repoInterface) {
RepositoryConfig repoCfg = getRepositoryConfiguration(repoInterface);
- Object connCfg;
-
- try {
- connCfg =
ctx.getBean(evaluateExpression(repoCfg.igniteInstance()));
- }
- catch (BeansException ex) {
- try {
- connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteCfg()));
- }
- catch (BeansException ex2) {
- try {
- connCfg =
ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class);
- }
- catch (BeansException ex3) {
- throw new IllegalArgumentException("Invalid configuration
for repository " +
- repoInterface.getName() + ". No beans were found that
provide connection configuration to the" +
- " Ignite cluster. Check \"igniteInstance\",
\"igniteCfg\", \"igniteSpringCfgPath\" parameters" +
- " of " + RepositoryConfig.class.getName() + "
repository annotation.");
- }
- }
- }
-
- return IgniteProxy.of(connCfg);
+ return Stream.<BeanFinder>of(
+ () -> ctx.getBean(evaluateExpression(repoCfg.igniteInstance())),
+ () -> ctx.getBean(evaluateExpression(repoCfg.igniteCfg())),
+ () ->
ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class),
+ () -> ctx.getBean(Ignite.class),
+ () -> ctx.getBean(IgniteClient.class),
+ () -> ctx.getBean(IgniteConfiguration.class),
+ () -> ctx.getBean(ClientConfiguration.class)
+ ).map(BeanFinder::getBean)
+ .filter(Objects::nonNull)
+ .findFirst()
+ .map(IgniteProxy::of)
+ .orElseThrow(() -> {
+ return new IllegalArgumentException("Invalid configuration for
repository " +
+ repoInterface.getName() + ". No beans were found that
provide connection configuration to the" +
+ " Ignite cluster. Check \"igniteInstance\", \"igniteCfg\",
\"igniteSpringCfgPath\" parameters" +
+ " of " + RepositoryConfig.class.getName() + " repository
annotation or provide Ignite, IgniteClient, " +
+ " ClientConfiguration or IgniteConfiguration bean to
application context.");
+ });
}
/**
@@ -137,4 +139,29 @@ public class IgniteProxyFactory implements
ApplicationContextAware, DisposableBe
private String evaluateExpression(String spelExpression) {
return (String)expressionResolver.evaluate(spelExpression,
beanExpressionCtx);
}
+
+ /**
+ * Helper interface that wraps getBean method.
+ */
+ @FunctionalInterface
+ private interface BeanFinder {
+ /**
+ * Get bean.
+ * @return Bean or null if {@link BeansException} was thrown.
+ */
+ default Object getBean() {
+ try {
+ return get();
+ } catch (BeansException ex) {
+ return null;
+ }
+ }
+
+ /**
+ * Get bean.
+ * @return Bean.
+ * @throws BeansException If bean was not found.
+ */
+ Object get() throws BeansException;
+ }
}
diff --git
a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java
b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java
index 9d6794d..4f6b7a9 100644
---
a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java
+++
b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java
@@ -34,8 +34,8 @@ import
org.springframework.data.repository.core.support.RepositoryFactorySupport
* The {@link
org.apache.ignite.springdata22.repository.config.RepositoryConfig} requires to
define one of the
* parameters below in your Spring application configuration in order to get
an access to Apache Ignite cluster:
* <ul>
- * <li>{@link Ignite} instance bean named "igniteInstance" by default</li>
- * <li>{@link IgniteConfiguration} bean named "igniteCfg" by default</li>
+ * <li>{@link Ignite} instance bean</li>
+ * <li>{@link IgniteConfiguration} bean</li>
* <li>A path to Ignite's Spring XML configuration named "igniteSpringCfgPath"
by default</li>
* <ul/>
*
diff --git
a/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
b/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
index 68c421a..c91dbe1 100644
---
a/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
+++
b/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
@@ -21,6 +21,7 @@ import java.io.Serializable;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.ClientConfiguration;
import org.apache.ignite.configuration.ClientConnectorConfiguration;
@@ -28,6 +29,7 @@ import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.springdata.misc.PersonRepository;
import org.apache.ignite.springdata22.repository.IgniteRepository;
import
org.apache.ignite.springdata22.repository.config.EnableIgniteRepositories;
import org.apache.ignite.springdata22.repository.config.RepositoryConfig;
@@ -75,6 +77,30 @@ public class IgniteSpringDataConnectionConfigurationTest
extends GridCommonAbstr
checkRepositoryConfiguration(ClientConfigurationApplication.class,
IgniteClientConfigRepository.class);
}
+ /** Tests repository configuration in case {@link Ignite} with non default
is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteInstanceParameter() {
+ checkRepositoryConfiguration(DefaultIgniteBeanApplication.class,
IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteClient} with non
default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteClientInstanceParameter() {
+ checkRepositoryConfiguration(DefaultIgniteClientBeanApplication.class,
IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link ClientConfiguration}
with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgnitClientConfigurationParameter() {
+
checkRepositoryConfiguration(DefaultIgniteClientConfigurationBeanApplication.class,
IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteConfiguration}
with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteConfigurationParameter() {
+
checkRepositoryConfiguration(DefaultIgniteConfigurationBeanApplication.class,
IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
/**
* Tests repository configuration in case {@link IgniteConfiguration} that
refers to existing Ignite node instance
* used to access the Ignite cluster.
@@ -205,6 +231,80 @@ public class IgniteSpringDataConnectionConfigurationTest
extends GridCommonAbstr
}
}
+ /**
+ * Spring Application configuration for repository testing in case if
Ignite bean name was not provided
+ * through {@link RepositoryConfig#igniteInstance()} ()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes =
IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteBeanApplication {
+ /** Ignite bean. */
+ @Bean
+ public Ignite someIgnite() {
+ return Ignition.start(getIgniteConfiguration("test", false));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if
IgniteClient bean name was not provided
+ * through {@link RepositoryConfig#igniteInstance()} ()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes =
IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteClientBeanApplication {
+ /** Ignite client bean. */
+ @Bean
+ public IgniteClient someIgnite() {
+ return Ignition.startClient(new
ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if
ClientConfiguration bean name was not provided
+ * through {@link RepositoryConfig#igniteCfg()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes =
IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteClientConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public ClientConfiguration someCfg() {
+ return new ClientConfiguration().setAddresses(LOCAL_HOST + ':' +
CLI_CONN_PORT);
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if
IgniteConfiguration bean name was not provided
+ * through {@link RepositoryConfig#igniteCfg()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes =
IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public IgniteConfiguration someCfg() {
+ return getIgniteConfiguration("test", false);
+ }
+ }
+
+ /** Repository for testing configuration approach through default ignite
beans. */
+ @RepositoryConfig(cacheName = "PersonCache")
+ public interface IgniteRepositoryWithoutExplicitIgnite extends
IgniteRepository<Object, Serializable> {
+ // No-op.
+ }
+
/** Repository for testing configuration approach through {@link
IgniteConfiguration}. */
@RepositoryConfig(cacheName = "PersonCache", igniteCfg =
"igniteConfiguration")
public interface IgniteConfigRepository extends IgniteRepository<Object,
Serializable> {
diff --git
a/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java
b/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java
index 3585287..ba19f93 100644
---
a/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java
+++
b/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java
@@ -17,6 +17,12 @@
package org.apache.ignite.springdata.repository.support;
+import java.util.Objects;
+import java.util.stream.Stream;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.springdata.proxy.IgniteProxy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.AbstractFactoryBean;
@@ -60,28 +66,49 @@ public class IgniteProxyFactory extends
AbstractFactoryBean<IgniteProxy> impleme
/** {@inheritDoc} */
@Override protected IgniteProxy createInstance() {
- Object connCfg;
+ return Stream.<BeanFinder>of(
+ () -> ctx.getBean(IGNITE_INSTANCE_BEAN_NAME),
+ () -> ctx.getBean(IGNITE_CONFIG_BEAN_NAME),
+ () -> ctx.getBean(IGNITE_SPRING_CONFIG_PATH_BEAN_NAME,
String.class),
+ () -> ctx.getBean(Ignite.class),
+ () -> ctx.getBean(IgniteClient.class),
+ () -> ctx.getBean(IgniteConfiguration.class),
+ () -> ctx.getBean(ClientConfiguration.class)
+ ).map(BeanFinder::getBean)
+ .filter(Objects::nonNull)
+ .findFirst()
+ .map(IgniteProxy::of)
+ .orElseThrow(() -> {
+ return new IllegalArgumentException("No beans were found that
provide connection configuration to" +
+ " the Ignite cluster. One of the beans with the following
names is required : \"" +
+ IGNITE_INSTANCE_BEAN_NAME + "\", \"" +
IGNITE_CONFIG_BEAN_NAME + "\" or \"" +
+ IGNITE_SPRING_CONFIG_PATH_BEAN_NAME + "\". You can also
provide Ignite, IgniteClient," +
+ " IgniteConfiguration or ClientConfiguration bean to
application context.");
+ });
+ }
- try {
- connCfg = ctx.getBean(IGNITE_INSTANCE_BEAN_NAME);
- }
- catch (BeansException ex) {
+ /**
+ * Helper interface that wraps getBean method.
+ */
+ @FunctionalInterface
+ private interface BeanFinder {
+ /**
+ * Get bean.
+ * @return Bean or null if {@link BeansException} was thrown.
+ */
+ default Object getBean() {
try {
- connCfg = ctx.getBean(IGNITE_CONFIG_BEAN_NAME);
- }
- catch (BeansException ex2) {
- try {
- connCfg = ctx.getBean(IGNITE_SPRING_CONFIG_PATH_BEAN_NAME,
String.class);
- }
- catch (BeansException ex3) {
- throw new IllegalArgumentException("No beans were found
that provide connection configuration to" +
- " the Ignite cluster. One of the beans with the
following names is required : \"" +
- IGNITE_INSTANCE_BEAN_NAME + "\", \"" +
IGNITE_CONFIG_BEAN_NAME + "\" or \"" +
- IGNITE_SPRING_CONFIG_PATH_BEAN_NAME + "\".");
- }
+ return get();
+ } catch (BeansException ex) {
+ return null;
}
}
- return IgniteProxy.of(connCfg);
+ /**
+ * Get bean.
+ * @return Bean.
+ * @throws BeansException If bean was not found.
+ */
+ Object get() throws BeansException;
}
}
diff --git
a/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
b/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
index aa3d6a7..5d5fbae 100644
---
a/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
+++
b/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.springdata;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.ClientConfiguration;
import org.apache.ignite.configuration.ClientConnectorConfiguration;
@@ -32,6 +33,7 @@ import org.apache.ignite.springdata.misc.PersonRepository;
import org.apache.ignite.springdata.repository.IgniteRepository;
import org.apache.ignite.springdata.repository.config.EnableIgniteRepositories;
import org.apache.ignite.springdata.repository.config.RepositoryConfig;
+import org.apache.ignite.springdata.repository.support.IgniteProxyFactory;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.junit.Test;
import
org.springframework.context.annotation.AnnotationConfigApplicationContext;
@@ -76,6 +78,30 @@ public class IgniteSpringDataConnectionConfigurationTest
extends GridCommonAbstr
checkRepositoryConfiguration(ClientConfigurationApplication.class);
}
+ /** Tests repository configuration in case {@link Ignite} with non default
is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithNonDefaultIgniteBean() {
+ checkRepositoryConfiguration(NonDefaultIgniteBeanApplication.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteClient} with non
default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithNonDefaultIgniteClientBean() {
+
checkRepositoryConfiguration(NonDefaultIgniteClientBeanApplication.class);
+ }
+
+ /** Tests repository configuration in case {@link ClientConfiguration}
with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithNonDefaultIgniteClientConfigurationBean() {
+
checkRepositoryConfiguration(NonDefaultIgniteClientConfigurationBeanApplication.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteConfiguration}
with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithNonDefaultIgniteConfigurationBean() {
+
checkRepositoryConfiguration(NonDefaultIgniteConfigurationBeanApplication.class);
+ }
+
/**
* Tests repository configuration in case {@link IgniteConfiguration} that
refers to existing Ignite node instance
* is used to access the Ignite cluster.
@@ -198,6 +224,62 @@ public class IgniteSpringDataConnectionConfigurationTest
extends GridCommonAbstr
}
}
+ /**
+ * Spring Application configuration for repository testing in case {@link
Ignite} bean with name different from
+ * {@link IgniteProxyFactory#IGNITE_INSTANCE_BEAN_NAME} is used for
accessing the cluster.
+ */
+ @Configuration
+ @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE,
classes = PersonRepository.class))
+ public static class NonDefaultIgniteBeanApplication {
+ /** Ignite bean. */
+ @Bean
+ public Ignite someIgnite() {
+ return Ignition.start(getIgniteConfiguration("test", false));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case {@link
IgniteClient} bean with name different from
+ * {@link IgniteProxyFactory#IGNITE_INSTANCE_BEAN_NAME} is used for
accessing the cluster.
+ */
+ @Configuration
+ @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE,
classes = PersonRepository.class))
+ public static class NonDefaultIgniteClientBeanApplication {
+ /** Ignite client bean. */
+ @Bean
+ public IgniteClient someIgnite() {
+ return Ignition.startClient(new
ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case {@link
ClientConfiguration} bean with name different from
+ * {@link IgniteProxyFactory#IGNITE_CONFIG_BEAN_NAME} is used for
accessing the cluster.
+ */
+ @Configuration
+ @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE,
classes = PersonRepository.class))
+ public static class NonDefaultIgniteClientConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public ClientConfiguration someCfg() {
+ return new ClientConfiguration().setAddresses(LOCAL_HOST + ':' +
CLI_CONN_PORT);
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case {@link
IgniteConfiguration} bean with name different from
+ * {@link IgniteProxyFactory#IGNITE_CONFIG_BEAN_NAME} is used for
accessing the cluster.
+ */
+ @Configuration
+ @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE,
classes = PersonRepository.class))
+ public static class NonDefaultIgniteConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public IgniteConfiguration someCfg() {
+ return getIgniteConfiguration("test", false);
+ }
+ }
+
/** Repository for testing application behavior in case the cache name is
not specified in the repository configuration. */
@RepositoryConfig
interface InvalidCacheRepository extends IgniteRepository<Person, Integer>
{