Skip to content

Commit b96b415

Browse files
committed
Apply some fixes and improve package structure
1 parent b3db25f commit b96b415

File tree

9 files changed

+171
-168
lines changed

9 files changed

+171
-168
lines changed

utbot-spring-analyzer/src/main/java/analyzer/XmlBeanAnalyzer.java

Lines changed: 0 additions & 66 deletions
This file was deleted.

utbot-spring-analyzer/src/main/java/analyzer/PropertiesAnalyzer.java renamed to utbot-spring-analyzer/src/main/java/analyzers/PropertiesAnalyzer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package analyzer;
1+
package analyzers;
22

33
import java.io.BufferedReader;
44
import java.io.FileReader;
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package analyzers;
2+
3+
import utils.ResourceNames;
4+
import org.w3c.dom.Document;
5+
import org.w3c.dom.Element;
6+
import org.w3c.dom.NodeList;
7+
8+
import javax.xml.parsers.DocumentBuilder;
9+
import javax.xml.parsers.DocumentBuilderFactory;
10+
import javax.xml.transform.Result;
11+
import javax.xml.transform.Source;
12+
import javax.xml.transform.Transformer;
13+
import javax.xml.transform.TransformerException;
14+
import javax.xml.transform.TransformerFactory;
15+
import javax.xml.transform.dom.DOMSource;
16+
import javax.xml.transform.stream.StreamResult;
17+
18+
public class XmlConfigurationAnalyzer {
19+
20+
private final String userXmlFilePath;
21+
22+
public XmlConfigurationAnalyzer(String userXmlFilePath) {
23+
this.userXmlFilePath = userXmlFilePath;
24+
}
25+
26+
private final String fakeXmlFilePath =
27+
this.getClass().getClassLoader().getResource(ResourceNames.fakeApplicationXmlFileName).getPath();
28+
29+
public void fillFakeApplicationXml() throws Exception {
30+
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
31+
Document doc = builder.parse(userXmlFilePath);
32+
33+
// Property placeholders may contain file names relative to user project,
34+
// they will not be found in ours. We import all properties using another approach.
35+
deletePropertyPlaceholders(doc);
36+
37+
writeXmlFile(doc);
38+
}
39+
40+
private void deletePropertyPlaceholders(Document doc) {
41+
NodeList elements = doc.getElementsByTagName("context:property-placeholder");
42+
int elementsCount = elements.getLength();
43+
44+
// Xml file may contain several property placeholders:
45+
// see https://stackoverflow.com/questions/26618400/how-to-use-multiple-property-placeholder-in-a-spring-xml-file
46+
for (int i = 0; i < elementsCount; i++) {
47+
Element element = (Element) elements.item(i);
48+
element.getParentNode().removeChild(element);
49+
}
50+
51+
doc.normalize();
52+
}
53+
54+
private void writeXmlFile(Document doc) throws TransformerException {
55+
Transformer tFormer = TransformerFactory.newInstance().newTransformer();
56+
Source source = new DOMSource(doc);
57+
Result dest = new StreamResult(fakeXmlFilePath);
58+
59+
tFormer.transform(source, dest);
60+
}
61+
}

utbot-spring-analyzer/src/main/java/analyzer/SpringAnalysisRunner.java renamed to utbot-spring-analyzer/src/main/java/application/SpringAnalysisRunner.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
package analyzer;
1+
package application;
22

3+
import analyzers.PropertiesAnalyzer;
4+
import analyzers.XmlConfigurationAnalyzer;
35
import org.springframework.boot.autoconfigure.SpringBootApplication;
46
import org.springframework.boot.builder.SpringApplicationBuilder;
57
import org.springframework.context.ApplicationContextException;
8+
import utils.ConfigurationManager;
69

710
import java.net.URL;
811
import java.net.URLClassLoader;
@@ -12,27 +15,25 @@
1215
public class SpringAnalysisRunner {
1316

1417
public static void main(String[] args) throws Exception {
15-
//String arg0 = "/Users/kirillshishin/IdeaProjects/spring-starter-lesson-28/build/classes/java/main";
16-
//String arg1 = "com.dmdev.spring.config.ApplicationConfiguration";
17-
//String arg2 = "/Users/kirillshishin/IdeaProjects/spring-starter-lesson-28/src/main/resources/application.properties";
18-
//String arg3 = "/Users/kirillshishin/IdeaProjects/spring-starter-lesson-28/src/main/resources/application.xml";
18+
String arg0 = "D:/Projects/spring-starter-lesson-28/build/classes/java/main";
19+
String arg1 = "com.dmdev.spring.config.ApplicationConfiguration";
20+
String arg2 = "D:/Projects/spring-starter-lesson-28/src/main/resources/application.properties";
21+
String arg3 = "D:/Projects/spring-starter-lesson-28/src/main/resources/application.xml";
1922

20-
ClassLoader classLoader = new URLClassLoader(new URL[]{Path.of(args[0]).toUri().toURL()});
21-
Class<?> userConfigurationClass = classLoader.loadClass(args[1]);
23+
ClassLoader classLoader = new URLClassLoader(new URL[]{Path.of(arg0).toUri().toURL()});
24+
Class<?> userConfigurationClass = classLoader.loadClass(arg1);
2225

2326
ConfigurationManager configurationManager = new ConfigurationManager(classLoader, userConfigurationClass);
24-
PropertiesAnalyzer propertiesAnalyzer = new PropertiesAnalyzer(args[2]);
25-
XmlBeanAnalyzer xmlBeanAnalyzer = new XmlBeanAnalyzer(args[3]);
27+
PropertiesAnalyzer propertiesAnalyzer = new PropertiesAnalyzer(arg2);
28+
XmlConfigurationAnalyzer xmlConfigurationAnalyzer = new XmlConfigurationAnalyzer(arg3);
2629

27-
xmlBeanAnalyzer.rewriteXmlFile();
28-
// call action to update project tree
30+
xmlConfigurationAnalyzer.fillFakeApplicationXml();
2931

3032
configurationManager.patchPropertySourceAnnotation();
3133
configurationManager.patchImportResourceAnnotation();
3234

33-
SpringApplicationBuilder app = new SpringApplicationBuilder(SpringAnalysisRunner.class)
34-
.sources(TestApplicationConfiguration.class, userConfigurationClass);
35-
35+
SpringApplicationBuilder app = new SpringApplicationBuilder(SpringAnalysisRunner.class);
36+
app.sources(TestApplicationConfiguration.class, userConfigurationClass);
3637
for (String prop : propertiesAnalyzer.readProperties()) {
3738
app.properties(prop);
3839
}

utbot-spring-analyzer/src/main/java/analyzer/TestApplicationConfiguration.java renamed to utbot-spring-analyzer/src/main/java/application/TestApplicationConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
package analyzer;
1+
package application;
22

33
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
44
import org.springframework.context.annotation.Bean;
55
import org.springframework.context.annotation.Configuration;
6+
import post_processors.UtBotBeanFactoryPostProcessor;
67

78
@Configuration
89
public class TestApplicationConfiguration {
Original file line numberDiff line numberDiff line change
@@ -1,77 +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-
}
1+
package post_processors;
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+
}
7777
}

utbot-spring-analyzer/src/main/java/analyzer/ConfigurationManager.java renamed to utbot-spring-analyzer/src/main/java/utils/ConfigurationManager.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package analyzer;
1+
package utils;
22

33
import org.springframework.context.annotation.ImportResource;
44
import org.springframework.context.annotation.PropertySource;
@@ -20,12 +20,19 @@ public ConfigurationManager(ClassLoader classLoader, Class userConfigurationClas
2020
this.userConfigurationClass = userConfigurationClass;
2121
}
2222

23+
public void patchPropertySourceAnnotation() throws Exception {
24+
patchAnnotation(PropertySource.class, String.format("classpath:%s", ResourceNames.fakePropertiesFileName));
25+
}
26+
27+
public void patchImportResourceAnnotation() throws Exception {
28+
patchAnnotation(ImportResource.class, String.format("classpath:%s", ResourceNames.fakeApplicationXmlFileName));
29+
}
30+
2331
private void patchAnnotation(Class<?> type, String path) throws Exception {
2432
Class<?> proxyClass = classLoader.loadClass("java.lang.reflect.Proxy");
2533
Field hField = proxyClass.getDeclaredField("h");
2634
hField.setAccessible(true);
2735

28-
//Annotation annotationProxy = userConfigurationClass.getAnnotations()[2];
2936
Optional<Annotation> propertySourceAnnotation =
3037
Arrays.stream(userConfigurationClass.getAnnotations())
3138
.filter(el -> el.annotationType() == type)
@@ -42,12 +49,4 @@ private void patchAnnotation(Class<?> type, String path) throws Exception {
4249
memberValues.put("value", path);
4350
}
4451
}
45-
46-
public void patchPropertySourceAnnotation() throws Exception {
47-
patchAnnotation(PropertySource.class, "classpath:fakeapplication.properties");
48-
}
49-
50-
public void patchImportResourceAnnotation() throws Exception {
51-
patchAnnotation(ImportResource.class, "classpath:fakeapplication.xml");
52-
}
5352
}

0 commit comments

Comments
 (0)