Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix issues #230 & #233 #238

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
12 changes: 6 additions & 6 deletions pom.xml 100755 → 100644
Expand Up @@ -40,9 +40,9 @@
<spring.version>5.1.2.RELEASE</spring.version>
<spring-data.version>2.1.2.RELEASE</spring-data.version>

<hibernate-validator.version>6.0.9.Final</hibernate-validator.version>
<aws-java-sdk.version>1.11.443</aws-java-sdk.version>
<junit.version>4.12</junit.version>
<hibernate-validator.version>6.1.0.Final</hibernate-validator.version>
<aws-java-sdk.version>1.11.515</aws-java-sdk.version>
<junit.version>4.13.1</junit.version>
<mockito.version>2.23.0</mockito.version>
<cdi.version>1.2</cdi.version>
<slf4j-test.version>1.2.0</slf4j-test.version>
Expand Down Expand Up @@ -252,7 +252,7 @@
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
<version>2.21.0</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
Expand Down Expand Up @@ -362,7 +362,7 @@
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</version>
<version>0.8.3</version>
<executions>
<execution>
<goals>
Expand Down Expand Up @@ -438,7 +438,7 @@
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>3.1.5</version>
<version>3.1.11</version>
<configuration>
<effort>Max</effort>
<!-- Reports all bugs (other values are medium and max) -->
Expand Down
Expand Up @@ -15,22 +15,23 @@
*/
package org.socialsignin.spring.data.dynamodb.repository.config;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;

public class DynamoDBMapperFactory implements FactoryBean<DynamoDBMapper> {

private final AmazonDynamoDB amazonDynamoDB;
private final DynamoDBMapperConfig dynamoDBMapperConfig;
// fix issue #230
@Autowired
private AmazonDynamoDB amazonDynamoDB;

// fix issue #230
@Autowired
public DynamoDBMapperFactory(AmazonDynamoDB amazonDynamoDB, DynamoDBMapperConfig dynamoDBMapperConfig) {
this.amazonDynamoDB = amazonDynamoDB;
this.dynamoDBMapperConfig = dynamoDBMapperConfig;
private DynamoDBMapperConfig dynamoDBMapperConfig;

public DynamoDBMapperFactory() {
}

@Override
Expand All @@ -42,5 +43,4 @@ public DynamoDBMapper getObject() throws Exception {
public Class<?> getObjectType() {
return DynamoDBMapper.class;
}

}
Expand Up @@ -15,9 +15,6 @@
*/
package org.socialsignin.spring.data.dynamodb.repository.config;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.socialsignin.spring.data.dynamodb.core.DynamoDBTemplate;
Expand All @@ -37,6 +34,11 @@
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

/**
* @author Michael Lavelle
* @author Sebastian Just
Expand All @@ -57,6 +59,8 @@ public class DynamoDBRepositoryConfigExtension extends RepositoryConfigurationEx

private BeanDefinitionRegistry registry;
private String defaultDynamoDBMappingContext;
private String dynamoDBMapperName;
private String dynamoDBMapperConfigName;

@Override
public String getRepositoryFactoryBeanClassName() {
Expand All @@ -76,7 +80,7 @@ public void postProcess(BeanDefinitionBuilder builder, AnnotationRepositoryConfi

/*
* (non-Javadoc)
*
*
* @see org.springframework.data.repository.config.
* RepositoryConfigurationExtensionSupport
* #postProcess(org.springframework.beans
Expand All @@ -99,14 +103,13 @@ public void postProcess(BeanDefinitionBuilder builder, XmlRepositoryConfiguratio
defaultDynamoDBMappingContext = registerDynamoDBMappingContext(registry);
}
dynamoDBMappingContextRef = defaultDynamoDBMappingContext;

}
registerAndSetPostProcessingBeans(builder, registry, dynamoDBMappingContextRef);
}

private Map<String, String> dynamoDBTemplateCache = new HashMap<>();
private void postProcess(BeanDefinitionBuilder builder, String repositoryName, String amazonDynamoDBRef,
String dynamoDBMapperConfigRef, String dynamoDBOperationsRef, String dynamoDBMappingContextRef) {
String dynamoDBMapperConfigRef, String dynamoDBOperationsRef, String dynamoDBMappingContextRef) {

if (StringUtils.hasText(dynamoDBOperationsRef)) {
builder.addPropertyReference("dynamoDBOperations", dynamoDBOperationsRef);
Expand All @@ -129,18 +132,23 @@ private void postProcess(BeanDefinitionBuilder builder, String repositoryName, S
.computeIfAbsent(getBeanNameWithModulePrefix("DynamoDBTemplate-" + dynamoDBRef), ref -> {
BeanDefinitionBuilder dynamoDBTemplateBuilder = BeanDefinitionBuilder
.genericBeanDefinition(DynamoDBTemplate.class);
// AmazonDynamoDB amazonDynamoDB, DynamoDBMapper dynamoDBMapper,
// DynamoDBMapperConfig dynamoDBMapperConfig
dynamoDBTemplateBuilder.addConstructorArgReference(dynamoDBRef);
dynamoDBTemplateBuilder.addConstructorArgReference(this.dynamoDBMapperName);

if (StringUtils.hasText(dynamoDBMapperConfigRef)) {
dynamoDBTemplateBuilder.addConstructorArgReference(dynamoDBMapperConfigRef);
} else {
dynamoDBTemplateBuilder.addConstructorArgReference(this.dynamoDBMapperConfigName);
}

registry.registerBeanDefinition(ref, dynamoDBTemplateBuilder.getBeanDefinition());
return ref;
});
}

builder.addPropertyReference("dynamoDBOperations", dynamoDBOperationsRef);

if (StringUtils.hasText(dynamoDBMapperConfigRef)) {
builder.addPropertyReference("dynamoDBMapperConfig", dynamoDBMapperConfigRef);
}
}

if (!StringUtils.hasText(dynamoDBMappingContextRef)) {
Expand All @@ -149,15 +157,14 @@ private void postProcess(BeanDefinitionBuilder builder, String repositoryName, S
defaultDynamoDBMappingContext = registerDynamoDBMappingContext(registry);
}
dynamoDBMappingContextRef = defaultDynamoDBMappingContext;

}

builder.addPropertyReference("dynamoDBMappingContext", dynamoDBMappingContextRef);
registerAndSetPostProcessingBeans(builder, registry, dynamoDBMappingContextRef);
}

protected void registerAndSetPostProcessingBeans(BeanDefinitionBuilder builder, BeanDefinitionRegistry registry,
String dynamoDBMappingContextRef) {
String dynamoDBMappingContextRef) {
String tableSynchronizerName = registerEntity2DynamoDBTableSynchronizer(registry, dynamoDBMappingContextRef);
builder.addPropertyReference("entity2DynamoDBTableSynchronizer", tableSynchronizerName);

Expand All @@ -168,7 +175,7 @@ protected void registerAndSetPostProcessingBeans(BeanDefinitionBuilder builder,

private final Map<String, String> entity2DynamoDBTableSynchronizerCache = new ConcurrentHashMap<>();
private String registerEntity2DynamoDBTableSynchronizer(BeanDefinitionRegistry registry,
String dynamoDBMappingContextRef) {
String dynamoDBMappingContextRef) {
assert registry != null;

return entity2DynamoDBTableSynchronizerCache.computeIfAbsent(dynamoDBMappingContextRef, ref -> {
Expand All @@ -184,8 +191,9 @@ private String registerEntity2DynamoDBTableSynchronizer(BeanDefinitionRegistry r
}

private final Map<String, String> dynamoDBMappingContextProcessorCache = new ConcurrentHashMap<>();

private String registerDynamoDBMappingContextProcessor(BeanDefinitionRegistry registry,
String dynamoDBMappingContextRef) {
String dynamoDBMappingContextRef) {
assert registry != null;

return dynamoDBMappingContextProcessorCache.computeIfAbsent(dynamoDBMappingContextRef, ref -> {
Expand Down Expand Up @@ -220,21 +228,25 @@ private String registerDynamoDBMappingContext(BeanDefinitionRegistry registry) {

@Override
public void registerBeansForRoot(BeanDefinitionRegistry registry,
RepositoryConfigurationSource configurationSource) {
RepositoryConfigurationSource configurationSource) {
super.registerBeansForRoot(registry, configurationSource);

// Store for later to be used by #postProcess, too
this.registry = registry;

BeanDefinitionBuilder dynamoDBMapperConfigBuiilder = BeanDefinitionBuilder
.genericBeanDefinition(DynamoDBMapperConfigFactory.class);
registry.registerBeanDefinition(getBeanNameWithModulePrefix("DynamoDBMapperConfig"),
dynamoDBMapperConfigBuiilder.getBeanDefinition());
// Fix issue #233
Optional dynamoDBMapperConfigRef = configurationSource.getAttribute("dynamoDBMapperConfigRef");
if (!dynamoDBMapperConfigRef.isPresent()) {
BeanDefinitionBuilder dynamoDBMapperConfigBuilder = BeanDefinitionBuilder
.genericBeanDefinition(DynamoDBMapperConfigFactory.class);
registry.registerBeanDefinition(getBeanNameWithModulePrefix("DynamoDBMapperConfig"),
dynamoDBMapperConfigBuilder.getBeanDefinition());
}

this.dynamoDBMapperName = getBeanNameWithModulePrefix("DynamoDBMapper");
BeanDefinitionBuilder dynamoDBMapperBuilder = BeanDefinitionBuilder
.genericBeanDefinition(DynamoDBMapperFactory.class);
registry.registerBeanDefinition(getBeanNameWithModulePrefix("DynamoDBMapper"),
dynamoDBMapperBuilder.getBeanDefinition());
registry.registerBeanDefinition(this.dynamoDBMapperName, dynamoDBMapperBuilder.getBeanDefinition());
}

protected String getBeanNameWithModulePrefix(String baseBeanName) {
Expand All @@ -245,5 +257,4 @@ protected String getBeanNameWithModulePrefix(String baseBeanName) {
protected String getModulePrefix() {
return "dynamoDB";
}

}
@@ -0,0 +1,96 @@
/**
* Copyright © 2018 spring-data-dynamodb (https://github.com/derjust/spring-data-dynamodb)
*
* 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
*
* http://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.socialsignin.spring.data.dynamodb.repository.config;

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.UnsatisfiedDependencyException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

/**
* Test Issue #233 fix
*/
public class DynamoDBMapperConfigTest {

static class BaseTestConfig {
@Bean
public AmazonDynamoDB amazonDynamoDB() {
return Mockito.mock(AmazonDynamoDB.class);
}

@Bean
public DynamoDBMapper dynamoDBMapper() {
return Mockito.mock(DynamoDBMapper.class);
}
}

@Configuration
@EnableDynamoDBRepositories(dynamoDBMapperConfigRef = "customDynamoDBMapperConfig")
static class TestConfigWithDynamoDBMapperConfigRef extends BaseTestConfig {
@Bean("customDynamoDBMapperConfig")
public DynamoDBMapperConfig dynamoDBMapperConfig() {
return DynamoDBMapperConfig.DEFAULT;
}
}

@Configuration
@EnableDynamoDBRepositories
static class TestConfigWithoutDynamoDBMapperConfigRef extends TestConfigWithDynamoDBMapperConfigRef {
}

@Configuration
@EnableDynamoDBRepositories
static class TestConfigWithoutDynamoDBMapperConfigBean extends BaseTestConfig {
}

@Test
public void testConfigWithDynamoDBMapperConfigRef() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
TestConfigWithDynamoDBMapperConfigRef.class);

boolean containsBean = ctx.containsBean("customDynamoDBMapperConfig");
assertTrue(containsBean);
}

@Test(expected = UnsatisfiedDependencyException.class)
public void testConfigWithoutDynamoDBMapperConfigRef() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
TestConfigWithoutDynamoDBMapperConfigRef.class);

boolean containsBean = ctx.containsBean("customDynamoDBMapperConfig");
assertTrue(containsBean);
}

@Test
public void testConfigWithoutDynamoDBMapperConfigBean() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
TestConfigWithoutDynamoDBMapperConfigBean.class);

boolean containsBean = ctx.containsBean("customDynamoDBMapperConfig");
assertFalse(containsBean);

containsBean = ctx.containsBean("dynamoDB-DynamoDBMapperConfig");
assertTrue(containsBean);
}
}