1616package software .xdev .spring .data .eclipse .store .repository .support ;
1717
1818import java .io .Serializable ;
19- import java .util .Objects ;
19+ import java .util .List ;
20+ import java .util .Optional ;
2021
2122import jakarta .annotation .Nonnull ;
2223
2324import org .slf4j .Logger ;
2425import org .slf4j .LoggerFactory ;
25- import org .springframework .beans .BeansException ;
26- import org .springframework .beans .factory .BeanFactory ;
26+ import org .springframework .beans .factory . NoSuchBeanDefinitionException ;
27+ import org .springframework .beans .factory .annotation . Autowired ;
2728import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
2829import org .springframework .context .annotation .ComponentScan ;
2930import org .springframework .data .repository .Repository ;
3031import org .springframework .data .repository .config .AnnotationRepositoryConfigurationSource ;
3132import org .springframework .data .repository .core .support .RepositoryFactoryBeanSupport ;
3233import org .springframework .data .repository .core .support .RepositoryFactorySupport ;
3334import org .springframework .stereotype .Component ;
35+ import org .springframework .util .ClassUtils ;
3436
35- import software .xdev .spring .data .eclipse .store .repository .config .DefaultEclipseStoreClientConfiguration ;
3637import software .xdev .spring .data .eclipse .store .repository .config .EclipseStoreClientConfiguration ;
3738import software .xdev .spring .data .eclipse .store .repository .config .EclipseStoreRepositoryConfigurationExtension ;
3839
@@ -47,9 +48,9 @@ public class EclipseStoreRepositoryFactoryBean<T extends Repository<S, ID>, S, I
4748 extends RepositoryFactoryBeanSupport <T , S , ID >
4849{
4950 private static final Logger LOG = LoggerFactory .getLogger (EclipseStoreRepositoryFactoryBean .class );
50- private EclipseStoreClientConfiguration configuration ;
51- private BeanFactory beanFactory ;
5251 private Class <?> configurationClass ;
52+ @ Autowired
53+ private List <EclipseStoreClientConfiguration > configurations ;
5354
5455 public EclipseStoreRepositoryFactoryBean (
5556 final Class <? extends T > repositoryInterface )
@@ -67,66 +68,52 @@ public void setConfigurationClass(final Class<?> configurationClass)
6768 this .configurationClass = configurationClass ;
6869 }
6970
70- @ Override
71- public void setBeanFactory (final BeanFactory beanFactory )
72- {
73- super .setBeanFactory (beanFactory );
74- this .beanFactory = beanFactory ;
75- }
76-
7771 @ Override
7872 @ Nonnull
7973 protected RepositoryFactorySupport createRepositoryFactory ()
8074 {
81- final EclipseStoreClientConfiguration ensuredConfiguration = this .ensureConfiguration ();
75+ final EclipseStoreClientConfiguration ensuredConfiguration = this .getSuitableConfiguration ();
8276 return new EclipseStoreRepositoryFactory (
8377 ensuredConfiguration .getStorageInstance (),
8478 ensuredConfiguration .getTransactionManagerInstance (),
8579 ensuredConfiguration .getValidator ()
8680 );
8781 }
8882
89- private EclipseStoreClientConfiguration ensureConfiguration ()
90- {
91- if (this .configuration == null )
92- {
93- this .configuration = this .createConfiguration ();
94- }
95- return this .configuration ;
96- }
97-
9883 /**
9984 * This is surely not the perfect way to get the correct configuration of that context, but it works with multiple
10085 * configurations, with no configuration and with a single configuration.
10186 * <p>
102- * It checks if there is a configuration class defined (through
103- * {@link EclipseStoreRepositoryConfigurationExtension}) and then tries to get the bean for it. If no configuration
104- * is set, the {@link DefaultEclipseStoreClientConfiguration} is used.
87+ * It checks if any of the available configurations are suitable from the {@link #configurationClass}
88+ * and if so, returns it. Otherwise the
89+ * {@link software.xdev.spring.data.eclipse.store.repository.config.DefaultEclipseStoreClientConfiguration}
90+ * should be injected into the {@link #configurations} and get returned.
10591 * </p>
10692 */
107- private EclipseStoreClientConfiguration createConfiguration ()
93+ private EclipseStoreClientConfiguration getSuitableConfiguration ()
10894 {
109- Objects .requireNonNull (this .beanFactory );
110- try
95+ if (this .configurationClass == null && this .configurations .size () == 1 )
11196 {
112- if (this .configurationClass != null
113- && this .beanFactory .getBean (this .configurationClass )
114- instanceof final EclipseStoreClientConfiguration eclipseStoreConfiguration
115- )
116- {
117- return eclipseStoreConfiguration ;
118- }
97+ return this .configurations .get (0 );
11998 }
120- catch (final BeansException ex )
99+ final Optional <EclipseStoreClientConfiguration > definedConfiguration = this .configurations
100+ .stream ()
101+ .filter (
102+ configuration ->
103+ {
104+ if (this .configurationClass != null )
105+ {
106+ return this .configurationClass .getName ()
107+ .equals (ClassUtils .getUserClass (configuration ).getName ());
108+ }
109+ return false ;
110+ }
111+ )
112+ .findAny ();
113+ if (definedConfiguration .isEmpty ())
121114 {
122- LOG .warn (
123- "Could not initiate Bean %s. Using %s instead."
124- .formatted (
125- this .configurationClass .getSimpleName (),
126- DefaultEclipseStoreClientConfiguration .class .getSimpleName ()
127- ),
128- ex );
115+ throw new NoSuchBeanDefinitionException (this .configurationClass );
129116 }
130- return this . beanFactory . getBean ( DefaultEclipseStoreClientConfiguration . class );
117+ return definedConfiguration . get ( );
131118 }
132119}
0 commit comments