Browse Source

Put addPersistentEntity calls into a dedicated ApplicationEvent listener bean that gets populated by the classpath scanning done in the namespace parser.

pull/1/head
Jon Brisbin 15 years ago committed by J. Brisbin
parent
commit
84aba45895
  1. 22
      spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java
  2. 19
      spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java
  3. 64
      spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/event/MappingConfigurationListener.java

22
spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java

@ -35,8 +35,8 @@ import org.springframework.data.document.mongodb.convert.MappingMongoConverter; @@ -35,8 +35,8 @@ import org.springframework.data.document.mongodb.convert.MappingMongoConverter;
import org.springframework.data.document.mongodb.mapping.Document;
import org.springframework.data.document.mongodb.mapping.MongoMappingConfigurationBuilder;
import org.springframework.data.document.mongodb.mapping.MongoMappingContext;
import org.springframework.data.document.mongodb.mapping.event.MappingConfigurationListener;
import org.springframework.data.document.mongodb.mapping.index.IndexCreationHelper;
import org.springframework.data.mapping.model.MappingException;
import org.w3c.dom.Element;
/**
@ -51,6 +51,7 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser { @@ -51,6 +51,7 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
private static final String CONFIGURATION_BUILDER = "mappingConfigurationBuilder";
private static final String MAPPING_CONTEXT = "mappingContext";
private static final String INDEX_CREATION_HELPER = "indexCreationHelper";
private static final String CONFIGURATION_LISTENER = "mappingConfigurationListener";
private static final String TEMPLATE = "mongoTemplate";
private static final String BASE_PACKAGE = "base-package";
@ -74,7 +75,7 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser { @@ -74,7 +75,7 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
if (null == ctxRef || "".equals(ctxRef)) {
BeanDefinitionBuilder mappingContextBuilder = BeanDefinitionBuilder.genericBeanDefinition(MongoMappingContext.class);
mappingContextBuilder.addPropertyReference("mappingConfigurationBuilder", builderRef);
//mappingContextBuilder.addPropertyValue("indexCreationHelper", new RuntimeBeanReference(INDEX_CREATION_HELPER));
mappingContextBuilder.addPropertyValue("indexCreationHelper", new RuntimeBeanReference(INDEX_CREATION_HELPER));
registry.registerBeanDefinition(MAPPING_CONTEXT, mappingContextBuilder.getBeanDefinition());
ctxRef = MAPPING_CONTEXT;
}
@ -94,7 +95,6 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser { @@ -94,7 +95,6 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
}
converterBuilder.addPropertyReference("mongo", mongoRef);
/*
try {
registry.getBeanDefinition(INDEX_CREATION_HELPER);
} catch (NoSuchBeanDefinitionException ignored) {
@ -106,7 +106,9 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser { @@ -106,7 +106,9 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
indexListenerBuilder.addPropertyValue("mongoTemplate", new RuntimeBeanReference(templateRef));
registry.registerBeanDefinition(INDEX_CREATION_HELPER, indexListenerBuilder.getBeanDefinition());
}
*/
BeanDefinitionBuilder listenerBuilder = BeanDefinitionBuilder.genericBeanDefinition(MappingConfigurationListener.class);
listenerBuilder.addPropertyReference("mappingContext", ctxRef);
// Scan for @Document entities
String basePackage = element.getAttribute(BASE_PACKAGE);
@ -116,18 +118,14 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser { @@ -116,18 +118,14 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
scanner.addIncludeFilter(new AnnotationTypeFilter(Persistent.class));
Set<BeanDefinition> entities = scanner.findCandidateComponents(basePackage);
if (null != entities) {
Set<Class<?>> initialEntitySet = new HashSet<Class<?>>(entities.size());
Set<String> initialEntitySet = new HashSet<String>(entities.size());
for (BeanDefinition def : entities) {
String clazzName = def.getBeanClassName();
try {
initialEntitySet.add(Class.forName(clazzName));
} catch (ClassNotFoundException e) {
throw new MappingException(e.getMessage(), e);
}
initialEntitySet.add(def.getBeanClassName());
}
converterBuilder.addPropertyValue("initialEntitySet", initialEntitySet);
listenerBuilder.addPropertyValue("initialEntitySet", initialEntitySet);
}
}
registry.registerBeanDefinition(CONFIGURATION_LISTENER, listenerBuilder.getBeanDefinition());
return converterBuilder.getBeanDefinition();
}

19
spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java

@ -24,11 +24,9 @@ import java.util.Arrays; @@ -24,11 +24,9 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
@ -86,7 +84,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext @@ -86,7 +84,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext
protected boolean useFieldAccessOnly = true;
protected Mongo mongo;
protected String defaultDatabase;
protected Set<Class<?>> initialEntitySet = new HashSet<Class<?>>();
public MappingMongoConverter() {
initializeConverters();
@ -127,11 +124,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext @@ -127,11 +124,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext
public void setMappingContext(MappingContext mappingContext) {
this.mappingContext = mappingContext;
if (initialEntitySet.size() > 0 && null == mappingContext.getPersistentEntity(initialEntitySet.iterator().next())) {
for (Class<?> entity : initialEntitySet) {
mappingContext.addPersistentEntity(entity);
}
}
}
public Mongo getMongo() {
@ -166,14 +158,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext @@ -166,14 +158,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext
this.useFieldAccessOnly = useFieldAccessOnly;
}
public Set<Class<?>> getInitialEntitySet() {
return initialEntitySet;
}
public void setInitialEntitySet(Set<Class<?>> initialEntitySet) {
this.initialEntitySet = initialEntitySet;
}
public <T> T convertObjectId(ObjectId id, Class<T> targetType) {
return conversionService.convert(id, targetType);
}
@ -618,9 +602,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext @@ -618,9 +602,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext
}
public void afterPropertiesSet() throws Exception {
for (Class<?> entity : initialEntitySet) {
mappingContext.addPersistentEntity(entity);
}
}
/**

64
spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/event/MappingConfigurationListener.java

@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
/*
* Copyright (c) 2011 by the original author(s).
*
* 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.springframework.data.document.mongodb.mapping.event;
import java.util.Set;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.data.document.mongodb.mapping.MongoMappingContext;
/**
* @author Jon Brisbin <jbrisbin@vmware.com>
*/
public class MappingConfigurationListener implements ApplicationListener<ContextRefreshedEvent> {
private MongoMappingContext mappingContext;
private Set<String> initialEntitySet;
public MappingConfigurationListener() {
}
public MongoMappingContext getMappingContext() {
return mappingContext;
}
public void setMappingContext(MongoMappingContext mappingContext) {
this.mappingContext = mappingContext;
}
public Set<String> getInitialEntitySet() {
return initialEntitySet;
}
public void setInitialEntitySet(Set<String> initialEntitySet) {
this.initialEntitySet = initialEntitySet;
}
public void onApplicationEvent(ContextRefreshedEvent event) {
for (String className : initialEntitySet) {
try {
Class<?> clazz = Class.forName(className);
if (null == mappingContext.getPersistentEntity(clazz)) {
mappingContext.addPersistentEntity(clazz);
}
} catch (ClassNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
}
Loading…
Cancel
Save