Skip to content

Commit bc1df36

Browse files
tepa46EgorkaKulikov
authored andcommitted
Introduce Spring beans analyzer project
1 parent 2ab0b0d commit bc1df36

File tree

5 files changed

+139
-0
lines changed

5 files changed

+139
-0
lines changed

settings.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,5 @@ if (goIde.split(",").contains(ideType)) {
6969
include("utbot-cli-go")
7070
include("utbot-intellij-go")
7171
}
72+
73+
include("utbot-spring-analyzer")
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
plugins {
2+
id("org.springframework.boot") version "2.7.8"
3+
id("io.spring.dependency-management") version "1.1.0"
4+
id("java")
5+
}
6+
7+
java {
8+
sourceCompatibility = JavaVersion.VERSION_11
9+
targetCompatibility = JavaVersion.VERSION_11
10+
}
11+
12+
dependencies {
13+
implementation("org.springframework.boot:spring-boot-starter")
14+
implementation("org.springframework.boot:spring-boot-starter-web")
15+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package analyzer;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.boot.builder.SpringApplicationBuilder;
6+
import org.springframework.context.ApplicationContextException;
7+
8+
import java.io.IOException;
9+
import java.net.URL;
10+
import java.net.URLClassLoader;
11+
import java.nio.file.Path;
12+
13+
14+
@SpringBootApplication
15+
public class SpringBeansAnalyzer {
16+
17+
public static void main(String[] args) throws ClassNotFoundException, IOException {
18+
ClassLoader classLoader = new URLClassLoader(new URL[]{Path.of(args[0]).toUri().toURL()});
19+
Class<?> userConfigurationClass = classLoader.loadClass(args[1]);
20+
21+
SpringApplication app = new SpringApplicationBuilder(SpringBeansAnalyzer.class)
22+
.sources(TestApplicationConfiguration.class, userConfigurationClass)
23+
.build();
24+
25+
try {
26+
app.run();
27+
} catch (ApplicationContextException e) {
28+
System.out.println("Bean analysis finished successfully");
29+
}
30+
}
31+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package analyzer;
2+
3+
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
7+
@Configuration
8+
public class TestApplicationConfiguration {
9+
10+
@Bean
11+
public static BeanFactoryPostProcessor utBotBeanFactoryPostProcessor() {
12+
return new UtBotBeanFactoryPostProcessor();
13+
}
14+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package analyzer;
2+
3+
import org.springframework.beans.BeansException;
4+
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
5+
import org.springframework.beans.factory.config.BeanDefinition;
6+
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
7+
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
8+
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
9+
import org.springframework.core.PriorityOrdered;
10+
import org.springframework.core.type.MethodMetadata;
11+
12+
import java.io.File;
13+
import java.io.FileWriter;
14+
import java.util.ArrayList;
15+
import java.util.Arrays;
16+
17+
public class UtBotBeanFactoryPostProcessor implements BeanFactoryPostProcessor, PriorityOrdered {
18+
19+
@Override
20+
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
21+
22+
System.out.println("Started post-processing bean factory in UtBot");
23+
24+
ArrayList<String> beanClassNames = new ArrayList<>();
25+
for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
26+
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanDefinitionName);
27+
28+
if (beanDefinition instanceof AnnotatedBeanDefinition) {
29+
MethodMetadata factoryMethodMetadata = ((AnnotatedBeanDefinition) beanDefinition).getFactoryMethodMetadata();
30+
if (factoryMethodMetadata != null) {
31+
beanClassNames.add(factoryMethodMetadata.getReturnTypeName());
32+
}
33+
} else {
34+
String className = beanDefinition.getBeanClassName();
35+
if (className == null) {
36+
className = beanFactory.getBean(beanDefinitionName).getClass().getName();
37+
}
38+
beanClassNames.add(className);
39+
}
40+
}
41+
for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
42+
BeanDefinitionRegistry beanRegistry = (BeanDefinitionRegistry) beanFactory;
43+
beanRegistry.removeBeanDefinition(beanDefinitionName);
44+
}
45+
46+
writeToFile(beanClassNames);
47+
}
48+
49+
private void writeToFile(ArrayList<String> beanClassNames) {
50+
try {
51+
File springBeansFile = new File("SpringBeans.txt");
52+
FileWriter fileWriter = new FileWriter(springBeansFile);
53+
54+
Object[] distinctClassNames = beanClassNames.stream()
55+
.distinct()
56+
.toArray();
57+
Arrays.sort(distinctClassNames);
58+
59+
for (Object beanClassName : distinctClassNames) {
60+
fileWriter.append(beanClassName.toString());
61+
fileWriter.append("\n");
62+
}
63+
64+
fileWriter.flush();
65+
fileWriter.close();
66+
} catch (Throwable e) {
67+
System.out.println("Storing bean information failed");
68+
} finally {
69+
System.out.println("Finished post-processing bean factory in UtBot");
70+
}
71+
}
72+
73+
@Override
74+
public int getOrder() {
75+
return PriorityOrdered.HIGHEST_PRECEDENCE;
76+
}
77+
}

0 commit comments

Comments
 (0)