Skip to content

Commit 4d460b9

Browse files
Added new Jandex methods
1 parent 128403a commit 4d460b9

File tree

6 files changed

+100
-13
lines changed

6 files changed

+100
-13
lines changed

.checkstyle

-11
This file was deleted.

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ A small Java library that contains several helpful utility classes.
99
[![Java Development Kit 17](https://img.shields.io/badge/JDK-17-green.svg)](https://openjdk.java.net/projects/jdk/17/)
1010

1111
## Versions
12-
- 0.14.0 = See [release-notes](release-notes.md)
12+
- [0.15.0](release-notes.md#0150)
13+
- [0.14.0](release-notes.md#0140)
1314
- 0.13.x (or later) = **Java 17**
1415
- 0.12.0 = **Java 11** with new **jakarta** namespace
1516
- 0.11.x = **Java 11** before namespace change from 'javax' to 'jakarta'

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<artifactId>utils4j</artifactId>
1414
<packaging>bundle</packaging>
15-
<version>0.14.0</version>
15+
<version>0.15.0-SNAPSHOT</version>
1616
<description>A small Java library that contains several helpful utility classes.</description>
1717
<url>http://www.fuin.org/utils4j/</url>
1818

release-notes.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Release Notes
22

3+
## 0.15.0
4+
- Added new [JandexUtils](src/main/java/org/fuin/utils4j/jandex/JandexUtils.java) methods
5+
36
## 0.14.0
47

58
### General

src/main/java/org/fuin/utils4j/jandex/JandexUtils.java

+60
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,21 @@
1818
package org.fuin.utils4j.jandex;
1919

2020
import org.fuin.utils4j.Utils4J;
21+
import org.jboss.jandex.ClassInfo;
22+
import org.jboss.jandex.CompositeIndex;
2123
import org.jboss.jandex.DotName;
2224
import org.jboss.jandex.Index;
25+
import org.jboss.jandex.IndexView;
2326
import org.jboss.jandex.Indexer;
2427

2528
import java.io.File;
2629
import java.io.IOException;
2730
import java.io.InputStream;
31+
import java.lang.reflect.Constructor;
32+
import java.lang.reflect.InvocationTargetException;
33+
import java.lang.reflect.Modifier;
2834
import java.util.ArrayList;
35+
import java.util.Collection;
2936
import java.util.Enumeration;
3037
import java.util.List;
3138
import java.util.jar.JarEntry;
@@ -84,6 +91,21 @@ public static Index indexDir(final File dir) {
8491
return indexer.complete();
8592
}
8693

94+
/**
95+
* Indexes all classes in multiple directories and their subdirectories.
96+
*
97+
* @param dirs Classes directories to analyze.
98+
* @return Index of all classes in the directories.
99+
*/
100+
public static Index indexDirs(final File... dirs) {
101+
final Indexer indexer = new Indexer();
102+
final List<File> knownClassFiles = new ArrayList<>();
103+
for (final File dir : dirs) {
104+
indexDir(indexer, knownClassFiles, dir);
105+
}
106+
return indexer.complete();
107+
}
108+
87109
/**
88110
* Indexes all classes in a directory or it's subdirectories.
89111
*
@@ -194,5 +216,43 @@ public static Class<?> loadClass(DotName name) {
194216
return Utils4J.loadClass(name.toString());
195217
}
196218

219+
/**
220+
* Locates (non-abstract, non-interface) classes that implement a given interface in directories.
221+
*
222+
* @param intf Interface to find implementors for.
223+
* @param classesDirs Directories with class files to scan.
224+
* @return List of classes.
225+
*
226+
* @param <T> Expected interface type.
227+
*/
228+
@SuppressWarnings("unchecked")
229+
public static <T> List<Class<? extends T>> findImplementors(final Class<T> intf, final File... classesDirs) {
230+
final List<IndexView> indexes = new ArrayList<>();
231+
indexes.add(new JandexIndexFileReader.Builder().addDefaultResource().build().loadR());
232+
indexes.add(indexDirs(classesDirs));
233+
return findImplementors(intf, CompositeIndex.create(indexes));
234+
}
235+
236+
/**
237+
* Locates (non-abstract, non-interface) classes that implement a given interface in an index.
238+
*
239+
* @param intf Interface to find implementors for.
240+
* @param index Index with known classes.
241+
* @return List of classes.
242+
*
243+
* @param <T> Expected interface type.
244+
*/
245+
@SuppressWarnings("unchecked")
246+
public static <T> List<Class<? extends T>> findImplementors(final Class<T> intf, final IndexView index) {
247+
List<Class<? extends T>> implementors = new ArrayList<>();
248+
final Collection<ClassInfo> implementingClasses = index.getAllKnownImplementors(DotName.createSimple(intf));
249+
for (final ClassInfo classInfo : implementingClasses) {
250+
if (!Modifier.isAbstract(classInfo.flags()) && !Modifier.isInterface(classInfo.flags())) {
251+
final Class<? extends T> implementor = (Class<? extends T>) JandexUtils.loadClass(classInfo.name());
252+
implementors.add(implementor);
253+
}
254+
}
255+
return implementors;
256+
}
197257

198258
}

src/test/java/org/fuin/utils4j/jandex/JandexUtilsTest.java

+34
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818
package org.fuin.utils4j.jandex;
1919

2020
import org.fuin.utils4j.Utils4J;
21+
import org.fuin.utils4j.filter.AndFilter;
22+
import org.fuin.utils4j.filter.Filter;
2123
import org.fuin.utils4j.jandex.JandexUtils;
24+
import org.fuin.utils4j.jaxb.CDataXmlAdapter;
2225
import org.jboss.jandex.DotName;
2326
import org.jboss.jandex.Index;
2427
import org.jboss.jandex.Indexer;
@@ -73,6 +76,22 @@ public final void testIndexDirSimple() {
7376

7477
}
7578

79+
@Test
80+
public final void testIndexDirs() {
81+
82+
// PREPEARE
83+
final File filterDir = new File(TARGET_DIR, "classes/org/fuin/utils4j/filter");
84+
final File jaxbDir = new File(TARGET_DIR, "classes/org/fuin/utils4j/jaxb");
85+
86+
// TEST
87+
final Index index = JandexUtils.indexDirs(filterDir, jaxbDir);
88+
89+
// VERIFY
90+
assertThat(index.getClassByName(DotName.createSimple(AndFilter.class.getName()))).isNotNull();
91+
assertThat(index.getClassByName(DotName.createSimple(CDataXmlAdapter.class.getName()))).isNotNull();
92+
93+
}
94+
7695
@Test
7796
public final void testIndexDir() {
7897

@@ -145,5 +164,20 @@ public final void loadClassFailure() {
145164
.hasMessageContaining("Failed to load class");
146165
}
147166

167+
@Test
168+
public final void findImplementors() {
169+
170+
// PREPEARE
171+
final File filterDir = new File(TARGET_DIR, "classes/org/fuin/utils4j/filter");
172+
173+
// TEST
174+
final List<Class<? extends Filter>> classes = JandexUtils.findImplementors(Filter.class, filterDir);
175+
176+
// VERIFY
177+
assertThat(classes).isNotEmpty();
178+
assertThat(classes).contains(AndFilter.class);
179+
180+
}
181+
148182
}
149183
// CHECKSTYLE:ON

0 commit comments

Comments
 (0)