Skip to content

Commit c08700c

Browse files
committed
feat: SpringIntegrationAwsNamespaceHandler parsers auto registration
1 parent 5f287e6 commit c08700c

File tree

6 files changed

+1153
-0
lines changed

6 files changed

+1153
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.springframework.integration.aws.config.xml;
2+
3+
import org.springframework.beans.factory.xml.BeanDefinitionParser;
4+
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
5+
6+
import java.io.BufferedReader;
7+
import java.io.IOException;
8+
import java.io.InputStreamReader;
9+
import java.io.UncheckedIOException;
10+
11+
public class SpringIntegrationAwsNamespaceHandler extends NamespaceHandlerSupport {
12+
13+
@Override
14+
public void init() {
15+
var classLoader = getClass().getClassLoader();
16+
var packageName = getClass().getPackageName();
17+
try (var in = classLoader.getResourceAsStream(packageName.replace('.', '/'))) {
18+
new BufferedReader(new InputStreamReader(in)).lines()
19+
.filter(name -> name.endsWith(".class"))
20+
.map(className -> loadClass(classLoader, packageName + '.' + className.replace(".class", "")))
21+
.filter(BeanDefinitionParser.class::isAssignableFrom)
22+
.forEach(type -> registerBeanDefinitionParser(mapName(type), createParser(type)));
23+
} catch (IOException e) {
24+
throw new UncheckedIOException("Error reading classes for package " + packageName, e);
25+
}
26+
}
27+
28+
private String mapName(Class<?> type) {
29+
var typeName = type.getSimpleName().replaceAll("Parser$", "");
30+
StringBuilder sb = new StringBuilder();
31+
sb.append(Character.toLowerCase(typeName.charAt(0)));
32+
for (int i = 1; i < typeName.length(); ++i) {
33+
var c = typeName.charAt(i);
34+
if (Character.isUpperCase(c)) {
35+
sb.append('-').append(Character.toLowerCase(c));
36+
} else {
37+
sb.append(c);
38+
}
39+
}
40+
return sb.toString();
41+
}
42+
43+
44+
private Class<?> loadClass(ClassLoader classLoader, String name) {
45+
try {
46+
return classLoader.loadClass(name);
47+
} catch (ClassNotFoundException e) {
48+
throw new RuntimeException("Error load class " + name, e);
49+
}
50+
}
51+
52+
private BeanDefinitionParser createParser(Class<?> type) {
53+
try {
54+
return (BeanDefinitionParser) type.getConstructor().newInstance();
55+
} catch (Exception e) {
56+
throw new RuntimeException("Error instantiate parser of type " + type);
57+
}
58+
}
59+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.springframework.integration.aws.config.xml;
2+
3+
import org.springframework.beans.factory.config.BeanDefinition;
4+
import org.springframework.beans.factory.xml.BeanDefinitionParser;
5+
import org.springframework.beans.factory.xml.ParserContext;
6+
import org.w3c.dom.Element;
7+
8+
public class SqsOutboundChannelAdapterParser implements BeanDefinitionParser {
9+
10+
@Override
11+
public BeanDefinition parse(Element element, ParserContext parserContext) {
12+
return null;
13+
}
14+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
http\://www.springframework.org/schema/integration/aws=org.springframework.integration.aws.config.xml.SpringIntegrationAwsNamespaceHandler
2+
https\://www.springframework.org/schema/integration/aws=org.springframework.integration.aws.config.xml.SpringIntegrationAwsNamespaceHandler
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
http\://www.springframework.org/schema/integration/aws/spring-integration-aws.xsd=org/springframework/schema/integration/aws/spring-integration-aws.xsd
2+
https\://www.springframework.org/schema/integration/aws/spring-integration-aws.xsd=org/springframework/schema/integration/aws/spring-integration-aws.xsd

0 commit comments

Comments
 (0)