1+ /*
2+ * Copyright 2016 the original author or authors.
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 .config ;
17+
18+ import org .slf4j .Logger ;
19+ import org .slf4j .LoggerFactory ;
20+ import org .springframework .beans .factory .config .BeanDefinition ;
21+ import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
22+ import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
23+ import org .springframework .beans .factory .support .RootBeanDefinition ;
24+ import org .springframework .core .type .AnnotationMetadata ;
25+ import org .springframework .data .auditing .IsNewAwareAuditingHandler ;
26+ import org .springframework .data .auditing .config .AuditingBeanDefinitionRegistrarSupport ;
27+ import org .springframework .data .auditing .config .AuditingConfiguration ;
28+ import org .springframework .data .config .ParsingUtils ;
29+ import org .socialsignin .spring .data .dynamodb .mapping .DynamoDBMappingContext ;
30+ import org .socialsignin .spring .data .dynamodb .mapping .event .AuditingEventListener ;
31+ import org .springframework .util .Assert ;
32+
33+ import java .lang .annotation .Annotation ;
34+
35+ import static org .springframework .beans .factory .config .BeanDefinition .ROLE_INFRASTRUCTURE ;
36+ import static org .socialsignin .spring .data .dynamodb .config .BeanNames .MAPPING_CONTEXT_BEAN_NAME ;
37+
38+ /**
39+ * {@link org.springframework.context.annotation.ImportBeanDefinitionRegistrar} to enable {@link EnableDynamoDBAuditing} annotation.
40+ *
41+ * @author Vito Limandibhrata
42+ */
43+ class DynamoDBAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
44+
45+ private static Logger LOGGER = LoggerFactory .getLogger (DynamoDBAuditingRegistrar .class );
46+
47+ /*
48+ * (non-Javadoc)
49+ * @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAnnotation()
50+ */
51+ @ Override
52+ protected Class <? extends Annotation > getAnnotation () {
53+ return EnableDynamoDBAuditing .class ;
54+ }
55+
56+ /*
57+ * (non-Javadoc)
58+ * @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAuditingHandlerBeanName()
59+ */
60+ @ Override
61+ protected String getAuditingHandlerBeanName () {
62+ return "dynamoDBAuditingHandler" ;
63+ }
64+
65+ /*
66+ * (non-Javadoc)
67+ * @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#registerBeanDefinitions(org.springframework.core.type.AnnotationMetadata, org.springframework.beans.factory.support.BeanDefinitionRegistry)
68+ */
69+ @ Override
70+ public void registerBeanDefinitions (AnnotationMetadata annotationMetadata , BeanDefinitionRegistry registry ) {
71+ LOGGER .trace ("registerBeanDefinitions" );
72+ Assert .notNull (annotationMetadata , "AnnotationMetadata must not be null!" );
73+ Assert .notNull (registry , "BeanDefinitionRegistry must not be null!" );
74+
75+ defaultDependenciesIfNecessary (registry , annotationMetadata );
76+ super .registerBeanDefinitions (annotationMetadata , registry );
77+ }
78+
79+ /*
80+ * (non-Javadoc)
81+ * @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAuditHandlerBeanDefinitionBuilder(org.springframework.data.auditing.config.AuditingConfiguration)
82+ */
83+ @ Override
84+ protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder (AuditingConfiguration configuration ) {
85+ LOGGER .trace ("getAuditHandlerBeanDefinitionBuilder" );
86+ Assert .notNull (configuration , "AuditingConfiguration must not be null!" );
87+
88+ BeanDefinitionBuilder builder = BeanDefinitionBuilder .rootBeanDefinition (IsNewAwareAuditingHandler .class );
89+ builder .addConstructorArgReference (MAPPING_CONTEXT_BEAN_NAME );
90+ return configureDefaultAuditHandlerAttributes (configuration , builder );
91+ }
92+
93+ /*
94+ * (non-Javadoc)
95+ * @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#registerAuditListener(org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.support.BeanDefinitionRegistry)
96+ */
97+ @ Override
98+ protected void registerAuditListenerBeanDefinition (BeanDefinition auditingHandlerDefinition ,
99+ BeanDefinitionRegistry registry ) {
100+ LOGGER .trace ("registerAuditListenerBeanDefinition" );
101+ Assert .notNull (auditingHandlerDefinition , "BeanDefinition must not be null!" );
102+ Assert .notNull (registry , "BeanDefinitionRegistry must not be null!" );
103+
104+ BeanDefinitionBuilder listenerBeanDefinitionBuilder = BeanDefinitionBuilder
105+ .rootBeanDefinition (AuditingEventListener .class );
106+ listenerBeanDefinitionBuilder .addConstructorArgValue (ParsingUtils .getObjectFactoryBeanDefinition (
107+ getAuditingHandlerBeanName (), registry ));
108+
109+ registerInfrastructureBeanWithId (listenerBeanDefinitionBuilder .getBeanDefinition (),
110+ AuditingEventListener .class .getName (), registry );
111+ }
112+
113+ /**
114+ * Register default bean definitions for a {@link DynamoDBMappingContext} and an {@link org.springframework.data.support.IsNewStrategyFactory} in case we
115+ * don't find beans with the assumed names in the registry.
116+ *
117+ * @param registry the {@link BeanDefinitionRegistry} to use to register the components into.
118+ * @param source the source which the registered components shall be registered with
119+ */
120+ private void defaultDependenciesIfNecessary (BeanDefinitionRegistry registry , Object source ) {
121+ LOGGER .trace ("defaultDependenciesIfNecessary. source:{}" , source );
122+ LOGGER .trace ("is registry.containsBeanDefinition {} {}" , MAPPING_CONTEXT_BEAN_NAME , registry .containsBeanDefinition (MAPPING_CONTEXT_BEAN_NAME ));
123+ if (!registry .containsBeanDefinition (MAPPING_CONTEXT_BEAN_NAME )) {
124+
125+ RootBeanDefinition definition = new RootBeanDefinition (DynamoDBMappingContext .class );
126+ definition .setRole (ROLE_INFRASTRUCTURE );
127+ definition .setSource (source );
128+
129+ registry .registerBeanDefinition (MAPPING_CONTEXT_BEAN_NAME , definition );
130+ }
131+ }
132+ }
0 commit comments