1
16 package org.springframework.data.repository.config;
17
18 import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
19 import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
20 import org.springframework.beans.factory.config.BeanDefinition;
21 import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder;
22 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
23 import org.springframework.beans.factory.support.BeanNameGenerator;
24 import org.springframework.context.annotation.AnnotationBeanNameGenerator;
25 import org.springframework.util.Assert;
26 import org.springframework.util.ClassUtils;
27
28
37 class RepositoryBeanNameGenerator {
38
39 private final ClassLoader beanClassLoader;
40 private final BeanNameGenerator generator;
41 private final BeanDefinitionRegistry registry;
42
43
51 public RepositoryBeanNameGenerator(ClassLoader beanClassLoader, BeanNameGenerator generator,
52 BeanDefinitionRegistry registry) {
53
54 Assert.notNull(beanClassLoader, "Bean ClassLoader must not be null!");
55 Assert.notNull(generator, "BeanNameGenerator must not be null!");
56 Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
57
58 this.beanClassLoader = beanClassLoader;
59 this.generator = generator;
60 this.registry = registry;
61 }
62
63
70 public String generateBeanName(BeanDefinition definition) {
71
72 AnnotatedBeanDefinition beanDefinition = definition instanceof AnnotatedBeanDefinition
73 ? (AnnotatedBeanDefinition) definition
74 : new AnnotatedGenericBeanDefinition(getRepositoryInterfaceFrom(definition));
75
76 return generator.generateBeanName(beanDefinition, registry);
77 }
78
79
87 private Class<?> getRepositoryInterfaceFrom(BeanDefinition beanDefinition) {
88
89 ValueHolder argumentValue = beanDefinition.getConstructorArgumentValues().getArgumentValue(0, Class.class);
90
91 if (argumentValue == null) {
92 throw new IllegalStateException(
93 String.format("Failed to obtain first constructor parameter value of BeanDefinition %s!", beanDefinition));
94 }
95
96 Object value = argumentValue.getValue();
97
98 if (value == null) {
99
100 throw new IllegalStateException(
101 String.format("Value of first constructor parameter value of BeanDefinition %s is null!", beanDefinition));
102
103 } else if (value instanceof Class<?>) {
104
105 return (Class<?>) value;
106
107 } else {
108
109 try {
110 return ClassUtils.forName(value.toString(), beanClassLoader);
111 } catch (Exception o_O) {
112 throw new RuntimeException(o_O);
113 }
114 }
115 }
116 }
117