Skip to content

Commit f825471

Browse files
Overhaul of configuration completed
1 parent 440a01a commit f825471

14 files changed

Lines changed: 115 additions & 50 deletions

File tree

docs/modules/ROOT/pages/configuration.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation;
1515
import org.eclipse.store.storage.types.Storage;
1616
...
1717
@Configuration
18-
@EnableEclipseStoreRepositories(clientConfigurationClass = DemoConfiguration.class)
18+
@EnableEclipseStoreRepositories
1919
public class DemoConfiguration extends EclipseStoreClientConfiguration
2020
{
2121
@Override

spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/invoice/PersistenceInvoiceConfiguration.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@
2020
* {@link software.xdev.spring.data.eclipse.store.demo.dual.storage.person.PersistencePersonConfiguration}
2121
*/
2222
@Configuration
23-
@EnableEclipseStoreRepositories(
24-
basePackages = "software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice"
25-
)
23+
@EnableEclipseStoreRepositories
2624
public class PersistenceInvoiceConfiguration extends EclipseStoreClientConfiguration
2725
{
2826

spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/person/PersistencePersonConfiguration.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
* {@link software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice.PersistenceInvoiceConfiguration}
2020
*/
2121
@Configuration
22-
@EnableEclipseStoreRepositories(
23-
basePackages = "software.xdev.spring.data.eclipse.store.demo.dual.storage.person"
24-
)
22+
@EnableEclipseStoreRepositories
2523
public class PersistencePersonConfiguration extends EclipseStoreClientConfiguration
2624
{
2725
private final EmbeddedStorageFoundationFactory foundation;

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/DefaultEclipseStoreClientConfiguration.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties;
1919
import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory;
2020
import org.springframework.beans.factory.annotation.Autowired;
21-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2221
import org.springframework.context.annotation.Configuration;
2322

2423

@@ -28,7 +27,6 @@
2827
* he created a different {@link EclipseStoreClientConfiguration}.
2928
*/
3029
@Configuration(proxyBeanMethods = false)
31-
@ConditionalOnMissingBean(EclipseStoreClientConfiguration.class)
3230
public class DefaultEclipseStoreClientConfiguration extends EclipseStoreClientConfiguration
3331
{
3432
@Autowired

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2424
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
2525
import org.springframework.context.annotation.Bean;
26+
import org.springframework.context.annotation.ComponentScan;
2627
import org.springframework.context.annotation.Configuration;
2728
import org.springframework.transaction.PlatformTransactionManager;
2829
import org.springframework.transaction.TransactionManager;
@@ -46,6 +47,7 @@
4647
* </p>
4748
*/
4849
@Configuration(proxyBeanMethods = false)
50+
@ComponentScan("org.eclipse.store.integrations.spring.boot.types")
4951
public abstract class EclipseStoreClientConfiguration implements EclipseStoreStorageFoundationProvider
5052
{
5153
private final EclipseStoreProperties defaultEclipseStoreProperties;
@@ -86,19 +88,16 @@ public EmbeddedStorageFoundation<?> createEmbeddedStorageFoundation()
8688
@Bean
8789
@ConditionalOnMissingBean(TransactionManager.class)
8890
public PlatformTransactionManager transactionManager(
89-
final ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers,
90-
final EclipseStoreStorage storage)
91+
final ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers)
9192
{
9293
final EclipseStoreTransactionManager transactionManager =
93-
new EclipseStoreTransactionManager(storage);
94+
new EclipseStoreTransactionManager(this.getStorageInstance());
9495
transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize((TransactionManager)transactionManager));
9596
return transactionManager;
9697
}
9798

98-
@Bean
9999
public EclipseStoreStorage getStorageInstance()
100100
{
101-
// hier muss was gemacht werden.
102101
if(this.storageInstance == null)
103102
{
104103
this.storageInstance = new EclipseStoreStorage(this);

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreRepositoryConfigurationExtension.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222

2323
import jakarta.annotation.Nonnull;
2424

25+
import org.slf4j.Logger;
26+
import org.slf4j.LoggerFactory;
2527
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
28+
import org.springframework.core.type.AnnotationMetadata;
2629
import org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource;
2730
import org.springframework.data.repository.config.RepositoryConfigurationExtension;
2831
import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport;
@@ -42,6 +45,7 @@
4245
*/
4346
public class EclipseStoreRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport
4447
{
48+
private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreRepositoryConfigurationExtension.class);
4549
@Override
4650
@Nonnull
4751
public String getModuleName()
@@ -66,10 +70,31 @@ public String getRepositoryFactoryBeanClassName()
6670
return EclipseStoreRepositoryFactoryBean.class.getName();
6771
}
6872

73+
/**
74+
* This is surely not the perfect way to get the correct configuration of that context, but it works with multiple
75+
* configurations, with no configuration and with a single configuration.
76+
*/
6977
@Override
7078
public void postProcess(final BeanDefinitionBuilder builder, final AnnotationRepositoryConfigurationSource config)
7179
{
72-
80+
if(config.getSource() instanceof final AnnotationMetadata classMetadata)
81+
{
82+
try
83+
{
84+
final Class<?> possibleConfigurationClass = Class.forName(classMetadata.getClassName());
85+
if(EclipseStoreClientConfiguration.class.isAssignableFrom(possibleConfigurationClass))
86+
{
87+
builder.addPropertyValue("configurationClass", possibleConfigurationClass);
88+
}
89+
}
90+
catch(final ClassNotFoundException e)
91+
{
92+
LOG.warn(
93+
"Could not use {} as configuration.",
94+
classMetadata.getClassName()
95+
);
96+
}
97+
}
7398
}
7499

75100
@Override

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactory.java

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919

2020
import jakarta.annotation.Nonnull;
2121

22-
import org.springframework.beans.BeansException;
23-
import org.springframework.beans.factory.BeanFactory;
2422
import org.springframework.data.mapping.model.BasicPersistentEntity;
2523
import org.springframework.data.repository.core.EntityInformation;
2624
import org.springframework.data.repository.core.RepositoryInformation;
@@ -44,17 +42,11 @@
4442
*/
4543
public class EclipseStoreRepositoryFactory extends RepositoryFactorySupport
4644
{
47-
private BeanFactory beanFactory;
45+
private final EclipseStoreStorage storage;
4846

49-
public EclipseStoreRepositoryFactory()
47+
public EclipseStoreRepositoryFactory(final EclipseStoreStorage storage)
5048
{
51-
}
52-
53-
@Override
54-
public void setBeanFactory(final BeanFactory beanFactory) throws BeansException
55-
{
56-
super.setBeanFactory(beanFactory);
57-
this.beanFactory = beanFactory;
49+
this.storage = storage;
5850
}
5951

6052
@Override
@@ -70,23 +62,18 @@ protected Optional<QueryLookupStrategy> getQueryLookupStrategy(
7062
@Nullable final QueryLookupStrategy.Key key,
7163
@Nonnull final QueryMethodEvaluationContextProvider evaluationContextProvider)
7264
{
73-
return Optional.of(new EclipseStoreQueryLookupStrategy(this.getEclipseStoreStorage(), this::createWorkingCopier));
65+
return Optional.of(new EclipseStoreQueryLookupStrategy(this.storage, this::createWorkingCopier));
7466
}
7567

76-
private EclipseStoreStorage getEclipseStoreStorage()
77-
{
78-
return this.beanFactory.getBean(EclipseStoreStorage.class);
79-
}
8068

8169
@Override
8270
@Nonnull
8371
protected Object getTargetRepository(@Nonnull final RepositoryInformation metadata)
8472
{
85-
final EclipseStoreStorage eclipseStoreStorage = this.getEclipseStoreStorage();
8673
return this.getTargetRepositoryViaReflection(
8774
metadata,
88-
eclipseStoreStorage,
89-
this.createWorkingCopier(metadata.getDomainType(), eclipseStoreStorage),
75+
this.storage,
76+
this.createWorkingCopier(metadata.getDomainType(), this.storage),
9077
metadata.getDomainType()
9178
);
9279
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactoryBean.java

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,21 @@
1919

2020
import jakarta.annotation.Nonnull;
2121

22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
24+
import org.springframework.beans.BeansException;
25+
import org.springframework.beans.factory.BeanFactory;
26+
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
2227
import org.springframework.context.annotation.ComponentScan;
2328
import org.springframework.data.repository.Repository;
29+
import org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource;
2430
import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport;
2531
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
2632
import org.springframework.stereotype.Component;
2733

28-
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
34+
import software.xdev.spring.data.eclipse.store.repository.config.DefaultEclipseStoreClientConfiguration;
35+
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
36+
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreRepositoryConfigurationExtension;
2937

3038

3139
@ComponentScan({
@@ -36,21 +44,66 @@
3644
public class EclipseStoreRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable>
3745
extends RepositoryFactoryBeanSupport<T, S, ID>
3846
{
39-
private final EclipseStoreStorage storage;
47+
private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreRepositoryFactoryBean.class);
48+
private Class<?> configurationClass;
49+
private BeanFactory beanFactory;
4050

4151
public EclipseStoreRepositoryFactoryBean(
42-
final Class<? extends T> repositoryInterface,
43-
final EclipseStoreStorage storage
44-
)
52+
final Class<? extends T> repositoryInterface)
4553
{
4654
super(repositoryInterface);
47-
this.storage = storage;
55+
}
56+
57+
/**
58+
* Called by
59+
* {@link EclipseStoreRepositoryConfigurationExtension#postProcess(BeanDefinitionBuilder,
60+
* AnnotationRepositoryConfigurationSource)}
61+
*/
62+
public void setConfigurationClass(final Class<?> configurationClass)
63+
{
64+
this.configurationClass = configurationClass;
65+
}
66+
67+
@Override
68+
public void setBeanFactory(final BeanFactory beanFactory) throws BeansException
69+
{
70+
super.setBeanFactory(beanFactory);
71+
this.beanFactory = beanFactory;
4872
}
4973

5074
@Override
5175
@Nonnull
5276
protected RepositoryFactorySupport createRepositoryFactory()
5377
{
54-
return new EclipseStoreRepositoryFactory();
78+
return new EclipseStoreRepositoryFactory(this.getConfiguration().getStorageInstance());
79+
}
80+
81+
/**
82+
* This is surely not the perfect way to get the correct configuration of that context, but it works with multiple
83+
* configurations, with no configuration and with a single configuration.
84+
* <p>
85+
* It checks if there is a configuration class defined (through
86+
* {@link EclipseStoreRepositoryConfigurationExtension}) and then tries to get the bean for it. If no configuration
87+
* is set, the {@link DefaultEclipseStoreClientConfiguration} is used.
88+
* </p>
89+
*/
90+
private EclipseStoreClientConfiguration getConfiguration()
91+
{
92+
try
93+
{
94+
if(this.configurationClass != null
95+
&& this.beanFactory.getBean(this.configurationClass) instanceof final EclipseStoreClientConfiguration eclipseStoreConfiguration)
96+
{
97+
return eclipseStoreConfiguration;
98+
}
99+
}
100+
catch(final BeansException ex)
101+
{
102+
LOG.warn(
103+
"Could not initiate Bean {}. Using {} instead.",
104+
this.configurationClass.getSimpleName(),
105+
DefaultEclipseStoreClientConfiguration.class.getSimpleName());
106+
}
107+
return this.beanFactory.getBean(DefaultEclipseStoreClientConfiguration.class);
55108
}
56109
}

spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/deletion/DeletionTestConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626

2727
@Configuration
28-
@EnableEclipseStoreRepositories(clientConfigurationClass = DeletionTestConfiguration.class)
28+
@EnableEclipseStoreRepositories
2929
public class DeletionTestConfiguration extends TestConfiguration
3030
{
3131

spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/keywords/KeywordsTestConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626

2727
@Configuration
28-
@EnableEclipseStoreRepositories(clientConfigurationClass = KeywordsTestConfiguration.class)
28+
@EnableEclipseStoreRepositories
2929
public class KeywordsTestConfiguration extends TestConfiguration
3030
{
3131
@Autowired

0 commit comments

Comments
 (0)