Skip to content

Commit d9737a6

Browse files
authored
Merge pull request derjust#219 from derjust/Issue-17
Issue derjust#17 - Create table when not exist
2 parents 03c017d + ff913ad commit d9737a6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1419
-702
lines changed

Diff for: pom.xml

+45-75
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@
101101
<artifactId>DynamoDBLocal</artifactId>
102102
<version>[1.11,2.0)</version>
103103
</dependency>
104+
<dependency>
105+
<groupId>org.apache.logging.log4j</groupId>
106+
<artifactId>log4j-to-slf4j</artifactId>
107+
<version>2.8.2</version>
108+
</dependency>
104109

105110
<dependency>
106111
<groupId>uk.org.lidalia</groupId>
@@ -175,7 +180,12 @@
175180
<groupId>com.amazonaws</groupId>
176181
<artifactId>DynamoDBLocal</artifactId>
177182
<scope>test</scope>
178-
</dependency>
183+
</dependency>
184+
<dependency>
185+
<groupId>org.apache.logging.log4j</groupId>
186+
<artifactId>log4j-to-slf4j</artifactId>
187+
<scope>test</scope>
188+
</dependency>
179189
<dependency>
180190
<groupId>junit</groupId>
181191
<artifactId>junit</artifactId>
@@ -248,6 +258,39 @@
248258
<artifactId>maven-jar-plugin</artifactId>
249259
<version>3.0.2</version>
250260
</plugin>
261+
<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
262+
<plugin>
263+
<groupId>org.eclipse.m2e</groupId>
264+
<artifactId>lifecycle-mapping</artifactId>
265+
<version>1.0.0</version>
266+
<configuration>
267+
<lifecycleMappingMetadata>
268+
<pluginExecutions>
269+
<pluginExecution>
270+
<pluginExecutionFilter>
271+
<groupId>
272+
net.revelc.code.formatter
273+
</groupId>
274+
<artifactId>
275+
formatter-maven-plugin
276+
</artifactId>
277+
<versionRange>
278+
[2.7.2,)
279+
</versionRange>
280+
<goals>
281+
<goal>validate</goal>
282+
</goals>
283+
</pluginExecutionFilter>
284+
<action>
285+
<execute>
286+
<runOnIncremental>true</runOnIncremental>
287+
</execute>
288+
</action>
289+
</pluginExecution>
290+
</pluginExecutions>
291+
</lifecycleMappingMetadata>
292+
</configuration>
293+
</plugin>
251294
</plugins>
252295
</pluginManagement>
253296
<plugins>
@@ -401,6 +444,7 @@
401444
<!-- Reports all bugs (other values are medium and max) -->
402445
<threshold>Max</threshold>
403446
<!-- Produces XML report <xmlOutput>true</xmlOutput> -->
447+
<excludeFilterFile>src/spotbugs-exclude.xml</excludeFilterFile>
404448
</configuration>
405449
<executions>
406450
<execution>
@@ -434,26 +478,6 @@
434478
<groupId>org.apache.maven.plugins</groupId>
435479
<artifactId>maven-dependency-plugin</artifactId>
436480
<executions>
437-
<execution>
438-
<!-- Prepare standalone DynamoDB instance (Integration testing) -->
439-
<id>unpack-dynamodb-local</id>
440-
<goals>
441-
<goal>unpack</goal>
442-
</goals>
443-
<phase>pre-integration-test</phase>
444-
<configuration>
445-
<artifactItems>
446-
<artifactItem>
447-
<groupId>com.jcabi</groupId>
448-
<artifactId>DynamoDBLocal</artifactId>
449-
<version>2015-07-16</version>
450-
<type>zip</type>
451-
<outputDirectory>${project.build.directory}/dynamodb-dist</outputDirectory>
452-
<overWrite>false</overWrite>
453-
</artifactItem>
454-
</artifactItems>
455-
</configuration>
456-
</execution>
457481
<execution>
458482
<!-- Prepare SQLite for in-memory DynamoDB instance (Unit testing) -->
459483
<id>copy</id>
@@ -476,60 +500,6 @@
476500
</execution>
477501
</executions>
478502
</plugin>
479-
<plugin>
480-
<groupId>org.codehaus.mojo</groupId>
481-
<artifactId>build-helper-maven-plugin</artifactId>
482-
<executions>
483-
<execution>
484-
<id>reserver-dynamodb-port</id>
485-
<goals>
486-
<goal>reserve-network-port</goal>
487-
</goals>
488-
<phase>pre-integration-test</phase>
489-
<configuration>
490-
<portNames>
491-
<portName>dynamodblocal.port</portName>
492-
</portNames>
493-
</configuration>
494-
</execution>
495-
</executions>
496-
</plugin>
497-
<plugin>
498-
<groupId>com.jcabi</groupId>
499-
<artifactId>jcabi-dynamodb-maven-plugin</artifactId>
500-
<version>0.9.1</version>
501-
<configuration>
502-
<tables>
503-
<table>src/test/resources/user_table.json</table>
504-
<table>src/test/resources/playlist_table.json</table>
505-
<table>src/test/resources/feeduser_table.json</table>
506-
<table>src/test/resources/customerhistory_table.json</table>
507-
<table>src/test/resources/installation_table.json</table>
508-
<table>src/test/resources/auditable_user_table.json</table>
509-
</tables>
510-
<port>${dynamodblocal.port}</port>
511-
<dist>${project.build.directory}/dynamodb-dist</dist>
512-
<arguments>
513-
<argument>-inMemory</argument>
514-
</arguments>
515-
</configuration>
516-
<executions>
517-
<execution>
518-
<id>pre-integration-test</id>
519-
<goals>
520-
<goal>start</goal>
521-
<goal>create-tables</goal>
522-
</goals>
523-
</execution>
524-
<execution>
525-
<id>post-integration-test</id>
526-
<goals>
527-
<goal>stop</goal>
528-
</goals>
529-
<phase>post-integration-test</phase>
530-
</execution>
531-
</executions>
532-
</plugin>
533503
<plugin>
534504
<groupId>org.apache.maven.plugins</groupId>
535505
<artifactId>maven-surefire-plugin</artifactId>

Diff for: src/main/java/org/socialsignin/spring/data/dynamodb/core/DynamoDBTemplate.java

+10-76
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.socialsignin.spring.data.dynamodb.mapping.event.BeforeSaveEvent;
4040
import org.socialsignin.spring.data.dynamodb.mapping.event.DynamoDBMappingEvent;
4141
import org.springframework.beans.BeansException;
42+
import org.springframework.beans.factory.annotation.Autowired;
4243
import org.springframework.context.ApplicationContext;
4344
import org.springframework.context.ApplicationContextAware;
4445
import org.springframework.context.ApplicationEventPublisher;
@@ -57,42 +58,6 @@ public class DynamoDBTemplate implements DynamoDBOperations, ApplicationContextA
5758
private final DynamoDBMapperConfig dynamoDBMapperConfig;
5859
private ApplicationEventPublisher eventPublisher;
5960

60-
/**
61-
* Convenient constructor to use the default
62-
* {@link DynamoDBMapper#DynamoDBMapper(AmazonDynamoDB)}
63-
*
64-
* @param amazonDynamoDB
65-
* The AWS SDK instance to talk to DynamoDB
66-
* @param dynamoDBMapperConfig
67-
* The config to use
68-
*/
69-
public DynamoDBTemplate(AmazonDynamoDB amazonDynamoDB, DynamoDBMapperConfig dynamoDBMapperConfig) {
70-
this(amazonDynamoDB, dynamoDBMapperConfig, null);
71-
}
72-
73-
/**
74-
* Convenient constructor to use the {@link DynamoDBMapperConfig#DEFAULT}
75-
*
76-
* @param amazonDynamoDB
77-
* The AWS SDK instance to talk to DynamoDB
78-
* @param dynamoDBMapper
79-
* The Mapper to use
80-
*/
81-
public DynamoDBTemplate(AmazonDynamoDB amazonDynamoDB, DynamoDBMapper dynamoDBMapper) {
82-
this(amazonDynamoDB, null, dynamoDBMapper);
83-
}
84-
85-
/**
86-
* Convenient construcotr to thse the {@link DynamoDBMapperConfig#DEFAULT} and
87-
* default {@link DynamoDBMapper#DynamoDBMapper(AmazonDynamoDB)}
88-
*
89-
* @param amazonDynamoDB
90-
* The AWS SDK instance to talk to DynamoDB
91-
*/
92-
public DynamoDBTemplate(AmazonDynamoDB amazonDynamoDB) {
93-
this(amazonDynamoDB, null, null);
94-
}
95-
9661
/**
9762
* Initializes a new {@code DynamoDBTemplate}. The following combinations are
9863
* valid:
@@ -106,49 +71,18 @@ public DynamoDBTemplate(AmazonDynamoDB amazonDynamoDB) {
10671
* can be {@code null} -
10772
* {@link DynamoDBMapper#DynamoDBMapper(AmazonDynamoDB, DynamoDBMapperConfig)}
10873
* is used if {@code null} is passed in
74+
* @param dynamoDBMapperConfig
10975
*/
110-
public DynamoDBTemplate(AmazonDynamoDB amazonDynamoDB, DynamoDBMapperConfig dynamoDBMapperConfig,
111-
DynamoDBMapper dynamoDBMapper) {
76+
@Autowired
77+
public DynamoDBTemplate(AmazonDynamoDB amazonDynamoDB, DynamoDBMapper dynamoDBMapper,
78+
DynamoDBMapperConfig dynamoDBMapperConfig) {
11279
Assert.notNull(amazonDynamoDB, "amazonDynamoDB must not be null!");
113-
this.amazonDynamoDB = amazonDynamoDB;
80+
Assert.notNull(dynamoDBMapper, "dynamoDBMapper must not be null!");
81+
Assert.notNull(dynamoDBMapperConfig, "dynamoDBMapperConfig must not be null!");
11482

115-
if (dynamoDBMapperConfig == null) {
116-
this.dynamoDBMapperConfig = DynamoDBMapperConfig.DEFAULT;
117-
} else {
118-
119-
// #146, #81 #157
120-
// Trying to fix half-initialized DynamoDBMapperConfigs here.
121-
// The old documentation advised to start with an empty builder. Therefore we
122-
// try here to set required fields to their defaults -
123-
// As the documentation at
124-
// https://github.com/derjust/spring-data-dynamodb/wiki/Alter-table-name-during-runtime
125-
// (same as https://git.io/DynamoDBMapperConfig)
126-
// now does: Start with #DEFAULT and add what's required
127-
DynamoDBMapperConfig.Builder emptyBuilder = DynamoDBMapperConfig.builder(); // empty (!) builder
128-
129-
if (dynamoDBMapperConfig.getConversionSchema() == null) {
130-
LOGGER.warn(
131-
"No ConversionSchema set in the provided dynamoDBMapperConfig! Merging with DynamoDBMapperConfig.DEFAULT - Please see https://git.io/DynamoDBMapperConfig");
132-
// DynamoDBMapperConfig#DEFAULT comes with a ConversionSchema
133-
emptyBuilder.withConversionSchema(DynamoDBMapperConfig.DEFAULT.getConversionSchema());
134-
}
135-
136-
if (dynamoDBMapperConfig.getTypeConverterFactory() == null) {
137-
LOGGER.warn(
138-
"No TypeConverterFactory set in the provided dynamoDBMapperConfig! Merging with DynamoDBMapperConfig.DEFAULT - Please see https://git.io/DynamoDBMapperConfig");
139-
// DynamoDBMapperConfig#DEFAULT comes with a TypeConverterFactory
140-
emptyBuilder.withTypeConverterFactory(DynamoDBMapperConfig.DEFAULT.getTypeConverterFactory());
141-
}
142-
143-
// Deprecated but the only way how DynamoDBMapperConfig#merge is exposed
144-
this.dynamoDBMapperConfig = new DynamoDBMapperConfig(dynamoDBMapperConfig, emptyBuilder.build());
145-
}
146-
147-
if (dynamoDBMapper == null) {
148-
this.dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB, dynamoDBMapperConfig);
149-
} else {
150-
this.dynamoDBMapper = dynamoDBMapper;
151-
}
83+
this.amazonDynamoDB = amazonDynamoDB;
84+
this.dynamoDBMapper = dynamoDBMapper;
85+
this.dynamoDBMapperConfig = dynamoDBMapperConfig;
15286
}
15387

15488
@Override

Diff for: src/main/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryBean.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.socialsignin.spring.data.dynamodb.repository.cdi;
1717

1818
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
19+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
1920
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
2021
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
2122
import org.socialsignin.spring.data.dynamodb.core.DynamoDBTemplate;
@@ -100,8 +101,13 @@ protected T create(CreationalContext<T> creationalContext, Class<T> repositoryTy
100101
? null
101102
: getDependencyInstance(dynamoDBOperationsBean, DynamoDBOperations.class);
102103

104+
if (dynamoDBMapperConfig == null) {
105+
dynamoDBMapperConfig = DynamoDBMapperConfig.DEFAULT;
106+
}
107+
DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB, dynamoDBMapperConfig);
108+
103109
if (dynamoDBOperations == null) {
104-
dynamoDBOperations = new DynamoDBTemplate(amazonDynamoDB, dynamoDBMapperConfig);
110+
dynamoDBOperations = new DynamoDBTemplate(amazonDynamoDB, dynamoDBMapper, dynamoDBMapperConfig);
105111
}
106112

107113
DynamoDBRepositoryFactory factory = new DynamoDBRepositoryFactory(dynamoDBOperations);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/**
2+
* Copyright © 2018 spring-data-dynamodb (https://github.com/derjust/spring-data-dynamodb)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.socialsignin.spring.data.dynamodb.repository.config;
17+
18+
import org.slf4j.Logger;
19+
import org.slf4j.LoggerFactory;
20+
import org.springframework.beans.BeansException;
21+
import org.springframework.beans.factory.FactoryBean;
22+
import org.springframework.beans.factory.config.BeanPostProcessor;
23+
import org.springframework.lang.Nullable;
24+
25+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
26+
27+
public class DynamoDBMapperConfigFactory implements FactoryBean<DynamoDBMapperConfig>, BeanPostProcessor {
28+
private static final Logger LOGGER = LoggerFactory.getLogger(DynamoDBMapperConfigFactory.class);
29+
@Override
30+
public DynamoDBMapperConfig getObject() throws Exception {
31+
return DynamoDBMapperConfig.DEFAULT;
32+
}
33+
34+
@Override
35+
public Class<?> getObjectType() {
36+
return DynamoDBMapperConfig.class;
37+
}
38+
39+
@Nullable
40+
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
41+
if (bean instanceof DynamoDBMapperConfig) {
42+
DynamoDBMapperConfig dynamoDBMapperConfig = (DynamoDBMapperConfig) bean;
43+
if (dynamoDBMapperConfig == DynamoDBMapperConfig.DEFAULT) {
44+
return bean;
45+
}
46+
// #146, #81 #157
47+
// Trying to fix half-initialized DynamoDBMapperConfigs here.
48+
// The old documentation advised to start with an empty builder. Therefore we
49+
// try here to set required fields to their defaults -
50+
// As the documentation at
51+
// https://github.com/derjust/spring-data-dynamodb/wiki/Alter-table-name-during-runtime
52+
// (same as https://git.io/DynamoDBMapperConfig)
53+
// now does: Start with #DEFAULT and add what's required
54+
DynamoDBMapperConfig.Builder emptyBuilder = DynamoDBMapperConfig.builder(); // empty (!) builder
55+
56+
if (dynamoDBMapperConfig.getConversionSchema() == null) {
57+
LOGGER.warn(
58+
"No ConversionSchema set in the provided dynamoDBMapperConfig! Merging with DynamoDBMapperConfig.DEFAULT - Please see https://git.io/DynamoDBMapperConfig");
59+
// DynamoDBMapperConfig#DEFAULT comes with a ConversionSchema
60+
emptyBuilder.withConversionSchema(DynamoDBMapperConfig.DEFAULT.getConversionSchema());
61+
}
62+
63+
if (dynamoDBMapperConfig.getTypeConverterFactory() == null) {
64+
LOGGER.warn(
65+
"No TypeConverterFactory set in the provided dynamoDBMapperConfig! Merging with DynamoDBMapperConfig.DEFAULT - Please see https://git.io/DynamoDBMapperConfig");
66+
// DynamoDBMapperConfig#DEFAULT comes with a TypeConverterFactory
67+
emptyBuilder.withTypeConverterFactory(DynamoDBMapperConfig.DEFAULT.getTypeConverterFactory());
68+
}
69+
70+
return createDynamoDBMapperConfig(dynamoDBMapperConfig, emptyBuilder);
71+
72+
} else {
73+
return bean;
74+
}
75+
}
76+
77+
@SuppressWarnings("deprecation")
78+
private DynamoDBMapperConfig createDynamoDBMapperConfig(DynamoDBMapperConfig dynamoDBMapperConfig,
79+
DynamoDBMapperConfig.Builder emptyBuilder) {
80+
// Deprecated but the only way how DynamoDBMapperConfig#merge is exposed
81+
return new DynamoDBMapperConfig(dynamoDBMapperConfig, emptyBuilder.build());
82+
}
83+
}

0 commit comments

Comments
 (0)