Skip to content

Commit e24999e

Browse files
committed
Fix auditing.
Closes #1967.
1 parent 10f71c9 commit e24999e

File tree

4 files changed

+146
-13
lines changed

4 files changed

+146
-13
lines changed

src/main/java/org/springframework/data/couchbase/core/mapping/event/AuditingEventListener.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
* @author Mark Paluch
3636
* @author Michael Reiche
3737
*/
38-
public class AuditingEventListener implements ApplicationListener<CouchbaseMappingEvent<Object>> {
38+
public class AuditingEventListener implements ApplicationListener<CouchbaseMappingEvent<?>> {
3939

4040
private final ObjectFactory<Object> auditingHandlerFactory;
4141

@@ -54,14 +54,20 @@ public AuditingEventListener() {
5454
public AuditingEventListener(ObjectFactory<Object> auditingHandlerFactory) {
5555
Assert.notNull(auditingHandlerFactory, "auditingHandlerFactory must not be null!");
5656
this.auditingHandlerFactory = auditingHandlerFactory;
57+
Object o = auditingHandlerFactory.getObject();
58+
if(!(o instanceof IsNewAwareAuditingHandler)){
59+
LOG.warn("auditingHandler IS NOT an IsNewAwareAuditingHandler: {}",o);
60+
} else {
61+
LOG.info("auditingHandler IS an IsNewAwareAuditingHandler: {}",o);
62+
}
5763
}
5864

59-
/*
65+
/**
6066
* (non-Javadoc)
61-
* @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)
67+
* @see {@link org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)}
6268
*/
6369
@Override
64-
public void onApplicationEvent(CouchbaseMappingEvent<Object> event) {
70+
public void onApplicationEvent(CouchbaseMappingEvent<?> event) {
6571
if (event instanceof BeforeConvertEvent) {
6672
IsNewAwareAuditingHandler h = auditingHandlerFactory != null
6773
&& auditingHandlerFactory.getObject() instanceof IsNewAwareAuditingHandler
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*
2+
* Copyright 2012-2024 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+
* https://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+
17+
package org.springframework.data.couchbase.core.mapping.event;
18+
19+
import java.util.Optional;
20+
21+
import org.slf4j.Logger;
22+
import org.slf4j.LoggerFactory;
23+
import org.springframework.beans.factory.ObjectFactory;
24+
import org.springframework.context.ApplicationListener;
25+
import org.springframework.data.auditing.AuditingHandler;
26+
import org.springframework.data.auditing.IsNewAwareAuditingHandler;
27+
import org.springframework.data.auditing.ReactiveIsNewAwareAuditingHandler;
28+
import org.springframework.data.mapping.context.MappingContext;
29+
import org.springframework.util.Assert;
30+
31+
/**
32+
* Event listener to populate auditing related fields on an entity about to be saved.
33+
*
34+
* @author Oliver Gierke
35+
* @author Simon Baslé
36+
* @author Mark Paluch
37+
* @author Michael Reiche
38+
*/
39+
public class ReactiveAuditingEventListener implements ApplicationListener<CouchbaseMappingEvent<?>> {
40+
41+
private final ObjectFactory<Object> auditingHandlerFactory;
42+
43+
public ReactiveAuditingEventListener() {
44+
this.auditingHandlerFactory = null;
45+
}
46+
47+
private static final Logger LOG = LoggerFactory.getLogger(ReactiveAuditingEventListener.class);
48+
49+
/**
50+
* Creates a new {@link ReactiveAuditingEventListener} using the given {@link MappingContext} and {@link AuditingHandler}
51+
* provided by the given {@link ObjectFactory}. Registered in CouchbaseAuditingRegistrar
52+
*
53+
* @param auditingHandlerFactory must not be {@literal null}.
54+
*/
55+
public ReactiveAuditingEventListener(ObjectFactory<Object> auditingHandlerFactory) {
56+
Assert.notNull(auditingHandlerFactory, "auditingHandlerFactory must not be null!");
57+
this.auditingHandlerFactory = auditingHandlerFactory;
58+
Object o = auditingHandlerFactory.getObject();
59+
if(!(o instanceof ReactiveIsNewAwareAuditingHandler)){
60+
LOG.warn("auditingHandler IS NOT a ReactiveIsNewAwareAuditingHandler: {}",o);
61+
} else {
62+
LOG.info("auditingHandler IS a ReactiveIsNewAwareAuditingHandler: {}",o);
63+
}
64+
}
65+
66+
/**
67+
* (non-Javadoc)
68+
* @see {@link ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)}
69+
*/
70+
@Override
71+
public void onApplicationEvent(CouchbaseMappingEvent<?> event) {
72+
if (event instanceof BeforeConvertEvent) {
73+
ReactiveIsNewAwareAuditingHandler h = auditingHandlerFactory != null
74+
&& auditingHandlerFactory.getObject() instanceof ReactiveIsNewAwareAuditingHandler
75+
? (ReactiveIsNewAwareAuditingHandler) (auditingHandlerFactory.getObject())
76+
: null;
77+
if (auditingHandlerFactory != null && h == null) {
78+
if (LOG.isWarnEnabled()) {
79+
LOG.warn("event:{} source:{} auditingHandler is not a ReactiveIsNewAwareAuditingHandler: {}",
80+
event.getClass().getSimpleName(), event.getSource(), auditingHandlerFactory.getObject());
81+
}
82+
}
83+
if (h != null) {
84+
Optional.ofNullable(event.getSource()).ifPresent(it -> h.markAudited(it));
85+
}
86+
}
87+
if (event instanceof BeforeSaveEvent) {}
88+
if (event instanceof AfterSaveEvent) {}
89+
if (event instanceof BeforeDeleteEvent) {}
90+
if (event instanceof AfterDeleteEvent) {}
91+
92+
if (LOG.isTraceEnabled()) {
93+
LOG.trace("{} {}", event.getClass().getSimpleName(), event.getSource());
94+
}
95+
}
96+
97+
}

src/main/java/org/springframework/data/couchbase/repository/auditing/CouchbaseAuditingRegistrar.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
1716
package org.springframework.data.couchbase.repository.auditing;
1817

1918
import java.lang.annotation.Annotation;
@@ -24,7 +23,6 @@
2423
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2524
import org.springframework.beans.factory.support.RootBeanDefinition;
2625
import org.springframework.core.type.AnnotationMetadata;
27-
import org.springframework.data.auditing.AuditingHandler;
2826
import org.springframework.data.auditing.IsNewAwareAuditingHandler;
2927
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
3028
import org.springframework.data.auditing.config.AuditingConfiguration;
@@ -36,7 +34,7 @@
3634
import org.springframework.util.Assert;
3735

3836
/**
39-
* A support registrar that allows to set up auditing for Couchbase (including {@link AuditingHandler} and {
37+
* A support registrar that allows to set up auditing for Couchbase (including {@link IsNewAwareAuditingHandler} and {
4038
* IsNewStrategyFactory} set up). See {@link EnableCouchbaseAuditing} for the associated annotation.
4139
*
4240
* @author Thomas Darimont
@@ -91,7 +89,7 @@ protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandle
9189
.rootBeanDefinition(AuditingEntityCallback.class);
9290
listenerBeanDefinitionBuilder
9391
.addConstructorArgValue(ParsingUtils.getObjectFactoryBeanDefinition(getAuditingHandlerBeanName(), registry));
94-
92+
listenerBeanDefinitionBuilder.getRawBeanDefinition().setSource(auditingHandlerDefinition.getSource());
9593
registerInfrastructureBeanWithId(listenerBeanDefinitionBuilder.getBeanDefinition(),
9694
AuditingEntityCallback.class.getName(), registry);
9795

@@ -101,7 +99,7 @@ protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandle
10199
.rootBeanDefinition(AuditingEventListener.class);
102100
listenerBeanDefinitionBuilder2
103101
.addConstructorArgValue(ParsingUtils.getObjectFactoryBeanDefinition(getAuditingHandlerBeanName(), registry));
104-
102+
listenerBeanDefinitionBuilder2.getRawBeanDefinition().setSource(auditingHandlerDefinition.getSource());
105103
registerInfrastructureBeanWithId(listenerBeanDefinitionBuilder2.getBeanDefinition(),
106104
AuditingEventListener.class.getName(), registry);
107105

src/main/java/org/springframework/data/couchbase/repository/auditing/ReactiveCouchbaseAuditingRegistrar.java

+36-4
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,23 @@
1515
*/
1616
package org.springframework.data.couchbase.repository.auditing;
1717

18-
import static org.springframework.data.couchbase.config.BeanNames.REACTIVE_COUCHBASE_AUDITING_HANDLER;
19-
2018
import java.lang.annotation.Annotation;
2119

2220
import org.springframework.beans.factory.config.BeanDefinition;
2321
import org.springframework.beans.factory.support.AbstractBeanDefinition;
2422
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
2523
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
24+
import org.springframework.beans.factory.support.RootBeanDefinition;
25+
import org.springframework.core.type.AnnotationMetadata;
2626
import org.springframework.data.auditing.ReactiveIsNewAwareAuditingHandler;
2727
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
2828
import org.springframework.data.auditing.config.AuditingConfiguration;
2929
import org.springframework.data.config.ParsingUtils;
30+
import org.springframework.data.couchbase.config.BeanNames;
31+
import org.springframework.data.couchbase.core.mapping.CouchbaseMappingContext;
32+
import org.springframework.data.couchbase.core.mapping.event.AuditingEventListener;
3033
import org.springframework.data.couchbase.core.mapping.event.ReactiveAuditingEntityCallback;
34+
import org.springframework.data.couchbase.core.mapping.event.ReactiveAuditingEventListener;
3135
import org.springframework.util.Assert;
3236

3337
/**
@@ -56,7 +60,16 @@ protected Class<? extends Annotation> getAnnotation() {
5660
*/
5761
@Override
5862
protected String getAuditingHandlerBeanName() {
59-
return REACTIVE_COUCHBASE_AUDITING_HANDLER;
63+
return BeanNames.REACTIVE_COUCHBASE_AUDITING_HANDLER;
64+
}
65+
66+
@Override
67+
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
68+
Assert.notNull(annotationMetadata, "AnnotationMetadata must not be null!");
69+
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
70+
71+
ensureMappingContext(registry, annotationMetadata);
72+
super.registerBeanDefinitions(annotationMetadata, registry);
6073
}
6174

6275
/*
@@ -86,7 +99,7 @@ protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandle
8699
Assert.notNull(auditingHandlerDefinition, "BeanDefinition must not be null!");
87100
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
88101

89-
// Register the AuditingEntityCallback
102+
// Register the ReactiveAuditingEntityCallback
90103

91104
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(ReactiveAuditingEntityCallback.class);
92105

@@ -96,6 +109,25 @@ protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandle
96109
registerInfrastructureBeanWithId(builder.getBeanDefinition(), ReactiveAuditingEntityCallback.class.getName(),
97110
registry);
98111

112+
// Register the ReactiveAuditingEventListener
113+
114+
BeanDefinitionBuilder builder2 = BeanDefinitionBuilder.rootBeanDefinition(ReactiveAuditingEventListener.class);
115+
116+
builder2.addConstructorArgValue(
117+
ParsingUtils.getObjectFactoryBeanDefinition(getAuditingHandlerBeanName(), registry));
118+
builder2.getRawBeanDefinition().setSource(auditingHandlerDefinition.getSource());
119+
120+
registerInfrastructureBeanWithId(builder2.getBeanDefinition(), ReactiveAuditingEventListener.class.getName(), registry);
121+
99122
}
100123

124+
private void ensureMappingContext(BeanDefinitionRegistry registry, Object source) {
125+
if (!registry.containsBeanDefinition(BeanNames.COUCHBASE_MAPPING_CONTEXT)) {
126+
RootBeanDefinition definition = new RootBeanDefinition(CouchbaseMappingContext.class);
127+
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
128+
definition.setSource(source);
129+
130+
registry.registerBeanDefinition(BeanNames.COUCHBASE_MAPPING_CONTEXT, definition);
131+
}
132+
}
101133
}

0 commit comments

Comments
 (0)