1
16 package org.springframework.data.jpa.repository.config;
17
18 import java.util.Collection;
19 import java.util.Set;
20
21 import javax.persistence.EntityManagerFactory;
22 import javax.persistence.metamodel.Metamodel;
23
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26 import org.springframework.beans.BeansException;
27 import org.springframework.beans.factory.BeanFactoryUtils;
28 import org.springframework.beans.factory.FactoryBean;
29 import org.springframework.beans.factory.ListableBeanFactory;
30 import org.springframework.beans.factory.config.AbstractFactoryBean;
31 import org.springframework.context.ApplicationContext;
32 import org.springframework.context.ApplicationContextAware;
33 import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext;
34 import org.springframework.data.util.StreamUtils;
35 import org.springframework.lang.Nullable;
36
37
44 class JpaMetamodelMappingContextFactoryBean extends AbstractFactoryBean<JpaMetamodelMappingContext>
45 implements ApplicationContextAware {
46
47 private static final Logger LOG = LoggerFactory.getLogger(JpaMetamodelMappingContextFactoryBean.class);
48
49 private @Nullable ListableBeanFactory beanFactory;
50
51
55 @Override
56 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
57 this.beanFactory = applicationContext;
58 }
59
60
64 @Override
65 public Class<?> getObjectType() {
66 return JpaMetamodelMappingContext.class;
67 }
68
69
73 @Override
74 protected JpaMetamodelMappingContext createInstance() throws Exception {
75
76 if (LOG.isDebugEnabled()) {
77 LOG.debug("Initializing JpaMetamodelMappingContext…");
78 }
79
80 JpaMetamodelMappingContext context = new JpaMetamodelMappingContext(getMetamodels());
81 context.initialize();
82
83 if (LOG.isDebugEnabled()) {
84 LOG.debug("Finished initializing JpaMetamodelMappingContext!");
85 }
86
87 return context;
88 }
89
90
95 private Set<Metamodel> getMetamodels() {
96
97 if (beanFactory == null) {
98 throw new IllegalStateException("BeanFactory must not be null!");
99 }
100
101 Collection<EntityManagerFactory> factories = BeanFactoryUtils
102 .beansOfTypeIncludingAncestors(beanFactory, EntityManagerFactory.class).values();
103
104 return factories.stream()
105 .map(EntityManagerFactory::getMetamodel)
106 .collect(StreamUtils.toUnmodifiableSet());
107 }
108 }
109