Skip to content

Commit 6b7cae9

Browse files
committed
Support PropertySource annotation analysis
1 parent bc1df36 commit 6b7cae9

File tree

5 files changed

+104
-31
lines changed

5 files changed

+104
-31
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package analyzer;
2+
3+
import java.lang.reflect.Field;
4+
import java.lang.reflect.InvocationHandler;
5+
import java.util.Map;
6+
7+
public class ConfigurationManager {
8+
9+
private final ClassLoader classLoader;
10+
private final Class userConfigurationClass;
11+
12+
public ConfigurationManager(ClassLoader classLoader, Class userConfigurationClass) {
13+
this.classLoader = classLoader;
14+
this.userConfigurationClass = userConfigurationClass;
15+
}
16+
17+
public void patchPropertySourceAnnotation() throws IllegalAccessException, NoSuchFieldException, ClassNotFoundException {
18+
19+
Class<?> proxyClass = classLoader.loadClass("java.lang.reflect.Proxy");
20+
Field hField = proxyClass.getDeclaredField("h");
21+
hField.setAccessible(true);
22+
23+
InvocationHandler o = (InvocationHandler) (hField.get(userConfigurationClass.getAnnotations()[2]));
24+
25+
Class<?> annotationInvocationHandlerClass = classLoader.loadClass("sun.reflect.annotation.AnnotationInvocationHandler");
26+
Field memberValuesField = annotationInvocationHandlerClass.getDeclaredField("memberValues");
27+
memberValuesField.setAccessible(true);
28+
Map<String, Object> memberValues = (Map<String, Object>) (memberValuesField.get(o));
29+
memberValues.put("value", "classpath:fakeapplication.properties");
30+
}
31+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package analyzer;
2+
3+
import java.io.BufferedReader;
4+
import java.io.FileReader;
5+
import java.io.IOException;
6+
import java.util.ArrayList;
7+
8+
public class PropertiesAnalyzer {
9+
10+
private final String propertiesFilePath;
11+
12+
public PropertiesAnalyzer(String propertiesFilePath) {
13+
this.propertiesFilePath = propertiesFilePath;
14+
}
15+
16+
public ArrayList<String> readProperties() throws IOException {
17+
ArrayList<String> props = new ArrayList<>();
18+
19+
BufferedReader reader = new BufferedReader(new FileReader(propertiesFilePath));
20+
String line = reader.readLine();
21+
while (line != null) {
22+
props.add(line);
23+
line = reader.readLine();
24+
}
25+
26+
reader.close();
27+
28+
return props;
29+
}
30+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package analyzer;
2+
3+
import org.springframework.boot.autoconfigure.SpringBootApplication;
4+
import org.springframework.boot.builder.SpringApplicationBuilder;
5+
import org.springframework.context.ApplicationContextException;
6+
7+
import java.io.IOException;
8+
import java.net.URL;
9+
import java.net.URLClassLoader;
10+
import java.nio.file.Path;
11+
12+
@SpringBootApplication
13+
public class SpringAnalysisRunner {
14+
15+
public static void main(String[] args) throws ClassNotFoundException, IOException, NoSuchFieldException, IllegalAccessException {
16+
//String arg0 = "D:\\Projects\\spring-starter-lesson-28\\build\\classes\\java\\main";
17+
//String arg1 = "com.dmdev.spring.config.ApplicationConfiguration";
18+
//String arg2 = "D:\\Projects\\spring-starter-lesson-28\\build\\resources\\main\\application.properties";
19+
20+
ClassLoader classLoader = new URLClassLoader(new URL[]{Path.of(args[0]).toUri().toURL()});
21+
Class<?> userConfigurationClass = classLoader.loadClass(args[1]);
22+
23+
ConfigurationManager configurationManager = new ConfigurationManager(classLoader, userConfigurationClass);
24+
PropertiesAnalyzer propertiesAnalyzer = new PropertiesAnalyzer(args[2]);
25+
26+
configurationManager.patchPropertySourceAnnotation();
27+
28+
SpringApplicationBuilder app = new SpringApplicationBuilder(SpringAnalysisRunner.class)
29+
.sources(TestApplicationConfiguration.class, userConfigurationClass);
30+
31+
for (String prop : propertiesAnalyzer.readProperties()) {
32+
app.properties(prop);
33+
}
34+
35+
try {
36+
app.build();
37+
app.run();
38+
} catch (ApplicationContextException e) {
39+
System.out.println("Bean analysis finished successfully");
40+
}
41+
}
42+
43+
}

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

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

utbot-spring-analyzer/src/main/resources/fakeapplication.properties

Whitespace-only changes.

0 commit comments

Comments
 (0)