Skip to content

Commit

Permalink
Merge pull request #6 from NitorCreations/feature/filter-anonymous-cl…
Browse files Browse the repository at this point in the history
…asses

Filter anonymous classes
  • Loading branch information
d4gg4d committed Apr 14, 2015
2 parents 79b3e2a + 3a22646 commit d646b1f
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 16 deletions.
19 changes: 10 additions & 9 deletions drm-core/src/main/java/com/nitorcreations/DomainClassFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,28 @@

class DomainClassFinder {

private static boolean shouldBeIncluded(Class<?> clazz) {
return !clazz.getSimpleName().equals("package-info");
}

public static List<Class<?>> findClasses(final List<String> packages, final URLClassLoader classLoader) {
return packages.stream()
.map(packageName -> getClasses(classLoader, packageName))
.flatMap(Collection::stream)
.filter(DomainClassFinder::shouldBeIncluded)
.filter(DomainClassFinder::isNotPackageInfo)
.filter(DomainClassFinder::isNotAnonymousClass)
.collect(Collectors.toList());
}

private static boolean isNotPackageInfo(Class<?> clazz) {
return !clazz.getSimpleName().equals("package-info");
}

private static boolean isNotAnonymousClass(Class<?> clazz) {
return !clazz.getSimpleName().equals("");
}

private static Set<Class<?>> getClasses(URLClassLoader classLoader, String packageName) {
Reflections reflections = new Reflections(packageName, new SubTypesScanner(false), classLoader);
return reflections.getSubTypesOf(Object.class);
}

public static List<Class<?>> findClasses(final List<String> packages) {
return findClasses(packages, null);
}

private DomainClassFinder() {
// private constructor for utility class
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@
import static java.util.Optional.of;

public class FieldScanner extends AbstractScanner {
public static final String NAME_FOR_INNERCLASS = null;

private static final String NAME_FOR_INNERCLASS = null;
private static final String innerClassFieldReferenceInBytecode = "this$0";

private final Logger logger = LoggerFactory.getLogger(FieldScanner.class);

public FieldScanner(final List<Class<?>> classes) {
Expand Down Expand Up @@ -69,7 +72,7 @@ public FieldVisitor visitField(int access, String name, String desc, String sign

private Optional<Edge> createFieldEdge(Class<?> clazz, Field field) {
if (isDomainClass(field.getType())) {
if ("this$0".equals(field.getName())) {
if (innerClassFieldReferenceInBytecode.equals(field.getName())) {
return of(createEdge(clazz, (Class) field.getType(), EdgeType.INNER_CLASS, NAME_FOR_INNERCLASS));
}
return of(createEdge(clazz, (Class) field.getType(), EdgeType.ONE_TO_ONE, field.getName()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,29 @@
public class DomainClassFinderTest {

@Test
public void withsinglePackage() throws Exception {
List<Class<?>> classes = DomainClassFinder.findClasses(Arrays.asList("com.nitorcreations.testdomain.person"));

public void withSinglePackage() throws Exception {
List<Class<?>> classes = findClasses("com.nitorcreations.testdomain.person");
assertThat(classes.size(), is(4));
}

@Test
public void withMultiPackages() throws Exception {
List<Class<?>> classes = DomainClassFinder.findClasses(Arrays.asList("com.nitorcreations.testdomain.person", "com.nitorcreations.testdomain.another"));

List<Class<?>> classes = findClasses("com.nitorcreations.testdomain.person", "com.nitorcreations.testdomain.another");
assertThat(classes.size(), is(5));
}

@Test
public void filtersAnonymousClasses() throws Exception {
List<Class<?>> classes = findClasses("com.nitorcreations.testdomain.withanonymousclass");
assertThat(classes.size(), is(1));
}

@Test
public void privateConstructor() {
CoverageForPrivateConstructor.giveMeCoverage(DomainClassFinder.class);
}

private List<Class<?>> findClasses(String... packages) {
return DomainClassFinder.findClasses(Arrays.asList(packages), null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.nitorcreations.testdomain.withanonymousclass;

public class ClassWithAnonymousImplementation {

private ClassWithAnonymousImplementation self;

public ClassWithAnonymousImplementation() {
Runnable anonImplementation = new Runnable() {
@Override
public void run() {}
};
}
}

0 comments on commit d646b1f

Please sign in to comment.