Skip to content

Commit aefacac

Browse files
Merge pull request #84 from vojtechhabarta/exclude-patterns
Class exclude patterns
2 parents 84da48f + a38a6f4 commit aefacac

File tree

12 files changed

+102
-46
lines changed

12 files changed

+102
-46
lines changed

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/ExcludingTypeProcessor.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
11

22
package cz.habarta.typescript.generator;
33

4+
import cz.habarta.typescript.generator.util.Predicate;
45
import cz.habarta.typescript.generator.util.Utils;
56
import java.lang.reflect.Type;
6-
import java.util.*;
77

88

99
public class ExcludingTypeProcessor implements TypeProcessor {
1010

11-
private final Set<String> excludedClassNames = new LinkedHashSet<>();
11+
private final Predicate<String> excludeFilter;
1212

13-
public ExcludingTypeProcessor(List<String> excludedClassNames) {
14-
if (excludedClassNames != null) {
15-
this.excludedClassNames.addAll(excludedClassNames);
16-
}
13+
public ExcludingTypeProcessor(Predicate<String> excludeFilter) {
14+
this.excludeFilter = excludeFilter;
1715
}
1816

1917
@Override
2018
public Result processType(Type javaType, Context context) {
2119
final Class<?> rawClass = Utils.getRawClassOrNull(javaType);
22-
if (rawClass != null && excludedClassNames.contains(rawClass.getName())) {
20+
if (rawClass != null && excludeFilter.test(rawClass.getName())) {
2321
return new Result(TsType.Any);
2422
}
2523
return null;

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/Input.java

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package cz.habarta.typescript.generator;
33

44
import cz.habarta.typescript.generator.parser.*;
5+
import cz.habarta.typescript.generator.util.Predicate;
56
import io.github.lukehutch.fastclasspathscanner.FastClasspathScanner;
67
import java.lang.reflect.*;
78
import java.util.*;
@@ -58,12 +59,12 @@ private static Input fromClassNamePatterns(List<String> classNamePatterns) {
5859
return fromClassNames(classNames);
5960
}
6061

61-
private static Input fromJaxrsApplication(String jaxrsApplicationClassName, List<String> excludedClassNames) {
62-
final List<SourceType<Type>> sourceTypes = new JaxrsApplicationScanner().scanJaxrsApplication(jaxrsApplicationClassName, excludedClassNames);
62+
private static Input fromJaxrsApplication(String jaxrsApplicationClassName, Predicate<String> isClassNameExcluded) {
63+
final List<SourceType<Type>> sourceTypes = new JaxrsApplicationScanner().scanJaxrsApplication(jaxrsApplicationClassName, isClassNameExcluded);
6364
return new Input(sourceTypes);
6465
}
6566

66-
public static Input fromClassNamesAndJaxrsApplication(List<String> classNames, List<String> classNamePatterns, String jaxrsApplicationClassName, boolean automaticJaxrsApplication, List<String> excludedClassNames, ClassLoader classLoader) {
67+
public static Input fromClassNamesAndJaxrsApplication(List<String> classNames, List<String> classNamePatterns, String jaxrsApplicationClassName, boolean automaticJaxrsApplication, Predicate<String> isClassNameExcluded, ClassLoader classLoader) {
6768
final ClassLoader originalContextClassLoader = Thread.currentThread().getContextClassLoader();
6869
try {
6970
Thread.currentThread().setContextClassLoader(classLoader);
@@ -75,10 +76,10 @@ public static Input fromClassNamesAndJaxrsApplication(List<String> classNames, L
7576
types.addAll(fromClassNamePatterns(classNamePatterns).getSourceTypes());
7677
}
7778
if (jaxrsApplicationClassName != null) {
78-
types.addAll(fromJaxrsApplication(jaxrsApplicationClassName, excludedClassNames).getSourceTypes());
79+
types.addAll(fromJaxrsApplication(jaxrsApplicationClassName, isClassNameExcluded).getSourceTypes());
7980
}
8081
if (automaticJaxrsApplication) {
81-
types.addAll(fromJaxrsApplication(null, excludedClassNames).getSourceTypes());
82+
types.addAll(fromJaxrsApplication(null, isClassNameExcluded).getSourceTypes());
8283
}
8384
if (types.isEmpty()) {
8485
final String errorMessage = "No input classes found.";
@@ -92,22 +93,33 @@ public static Input fromClassNamesAndJaxrsApplication(List<String> classNames, L
9293
}
9394

9495
static List<String> filterClassNames(List<String> classNames, List<String> globs) {
95-
final List<Pattern> regexps = new ArrayList<>();
96-
for (String glob : globs) {
97-
regexps.add(globToRegexp(glob));
98-
}
96+
final List<Pattern> regexps = globsToRegexps(globs);
9997
final List<String> result = new ArrayList<>();
10098
for (String className : classNames) {
101-
for (Pattern regexp : regexps) {
102-
if (regexp.matcher(className).matches()) {
103-
result.add(className);
104-
break;
105-
}
99+
if (classNameMatches(className, regexps)) {
100+
result.add(className);
106101
}
107102
}
108103
return result;
109104
}
110105

106+
static boolean classNameMatches(String className, List<Pattern> regexps) {
107+
for (Pattern regexp : regexps) {
108+
if (regexp.matcher(className).matches()) {
109+
return true;
110+
}
111+
}
112+
return false;
113+
}
114+
115+
static List<Pattern> globsToRegexps(List<String> globs) {
116+
final List<Pattern> regexps = new ArrayList<>();
117+
for (String glob : globs) {
118+
regexps.add(globToRegexp(glob));
119+
}
120+
return regexps;
121+
}
122+
111123
/**
112124
* Creates regexp for glob pattern.
113125
* Replaces "*" with "[^.\$]*" and "**" with ".*".

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/JaxrsApplicationScanner.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package cz.habarta.typescript.generator;
33

44
import cz.habarta.typescript.generator.parser.*;
5+
import cz.habarta.typescript.generator.util.Predicate;
56
import cz.habarta.typescript.generator.util.Utils;
67
import io.github.lukehutch.fastclasspathscanner.FastClasspathScanner;
78
import java.lang.annotation.*;
@@ -13,16 +14,17 @@
1314

1415
public class JaxrsApplicationScanner {
1516

16-
private Set<String> excludes;
17+
private Predicate<String> isClassNameExcluded;
18+
private Set<String> defaultExcludes;
1719
private Queue<Class<?>> resourceQueue;
1820
private List<SourceType<Type>> discoveredTypes;
1921

20-
public List<SourceType<Type>> scanJaxrsApplication(String jaxrsApplicationClassName, List<String> excludedClassNames) {
22+
public List<SourceType<Type>> scanJaxrsApplication(String jaxrsApplicationClassName, Predicate<String> isClassNameExcluded) {
2123
try {
2224
final List<Class<?>> resourceClasses = jaxrsApplicationClassName != null
2325
? scanJaxrsApplicationForJaxrsResources(jaxrsApplicationClassName)
2426
: scanClasspathForJaxrsResources();
25-
return scanJaxrsApplication(resourceClasses, excludedClassNames);
27+
return scanJaxrsApplication(resourceClasses, isClassNameExcluded);
2628
} catch (ReflectiveOperationException e) {
2729
final String url = "https://github.com/vojtechhabarta/typescript-generator/wiki/JAX-RS-Application";
2830
final String message = "Cannot load JAX-RS application. For more information see " + url + ".";
@@ -51,14 +53,11 @@ private static List<Class<?>> scanClasspathForJaxrsResources() throws Reflective
5153
return classes;
5254
}
5355

54-
List<SourceType<Type>> scanJaxrsApplication(List<Class<?>> resourceClasses, List<String> excludedClassNames) {
56+
List<SourceType<Type>> scanJaxrsApplication(List<Class<?>> resourceClasses, Predicate<String> isClassNameExcluded) {
5557
resourceQueue = new LinkedList<>();
5658
discoveredTypes = new ArrayList<>();
57-
excludes = new LinkedHashSet<>();
58-
excludes.addAll(getDefaultExcludedClassNames());
59-
if (excludedClassNames != null) {
60-
excludes.addAll(excludedClassNames);
61-
}
59+
this.isClassNameExcluded = isClassNameExcluded;
60+
this.defaultExcludes = new LinkedHashSet<>(getDefaultExcludedClassNames());
6261
final LinkedHashSet<Class<?>> scannedResources = new LinkedHashSet<>();
6362
Collections.sort(resourceClasses, new Comparator<Class<?>>() {
6463
@Override
@@ -128,7 +127,10 @@ private void foundType(Type type, Class<?> usedInClass, String usedInMember) {
128127

129128
private boolean isExcluded(Type type) {
130129
final Class<?> cls = Utils.getRawClassOrNull(type);
131-
if (cls != null && excludes.contains(cls.getName())) {
130+
if (cls != null && isClassNameExcluded != null && isClassNameExcluded.test(cls.getName())) {
131+
return true;
132+
}
133+
if (cls != null && defaultExcludes.contains(cls.getName())) {
132134
return true;
133135
}
134136
for (Class<?> standardEntityClass : getStandardEntityClasses()) {

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/Settings.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
package cz.habarta.typescript.generator;
33

44
import cz.habarta.typescript.generator.emitter.EmitterExtension;
5+
import cz.habarta.typescript.generator.util.Predicate;
56
import java.io.File;
67
import java.lang.annotation.Annotation;
78
import java.util.*;
9+
import java.util.regex.Pattern;
810

911

1012
/**
@@ -21,7 +23,7 @@ public class Settings {
2123
public String module = null;
2224
public String namespace = null;
2325
public JsonLibrary jsonLibrary = null;
24-
public List<String> excludedClassNames = null;
26+
private Predicate<String> excludeFilter = null;
2527
public boolean declarePropertiesAsOptional = false;
2628
public String removeTypeNamePrefix = null;
2729
public String removeTypeNameSuffix = null;
@@ -118,6 +120,28 @@ public void validateFileName(File outputFile) {
118120
}
119121
}
120122

123+
public Predicate<String> getExcludeFilter() {
124+
if (excludeFilter == null) {
125+
setExcludeFilter(null, null);
126+
}
127+
return excludeFilter;
128+
}
129+
130+
public void setExcludeFilter(List<String> excludedClasses, List<String> excludedClassPatterns) {
131+
this.excludeFilter = createExcludeFilter(excludedClasses, excludedClassPatterns);
132+
}
133+
134+
public static Predicate<String> createExcludeFilter(List<String> excludedClasses, List<String> excludedClassPatterns) {
135+
final Set<String> names = new LinkedHashSet<>(excludedClasses != null ? excludedClasses : Collections.<String>emptyList());
136+
final List<Pattern> patterns = Input.globsToRegexps(excludedClassPatterns != null ? excludedClassPatterns : Collections.<String>emptyList());
137+
return new Predicate<String>() {
138+
@Override
139+
public boolean test(String className) {
140+
return names.contains(className) || Input.classNameMatches(className, patterns);
141+
}
142+
};
143+
}
144+
121145
public boolean areDefaultStringEnumsOverriddenByExtension() {
122146
for (EmitterExtension extension : extensions) {
123147
if (extension.getFeatures().overridesStringEnums) {

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/TypeScriptGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ private void generateTypeScript(Input input, Output output, boolean forceExportK
5454
public TypeProcessor getTypeProcessor() {
5555
if (typeProcessor == null) {
5656
final List<TypeProcessor> processors = new ArrayList<>();
57-
processors.add(new ExcludingTypeProcessor(settings.excludedClassNames));
57+
processors.add(new ExcludingTypeProcessor(settings.getExcludeFilter()));
5858
if (settings.customTypeProcessor != null) {
5959
processors.add(settings.customTypeProcessor);
6060
}

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/Jackson2Parser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ private boolean isParentProperty(String property, Class<?> cls) {
126126
}
127127
parents.addAll(Arrays.asList(cls.getInterfaces()));
128128
for (Class<?> parent : parents) {
129-
if (settings.excludedClassNames == null || !settings.excludedClassNames.contains(parent.getName())) {
129+
if (!settings.getExcludeFilter().test(parent.getName())) {
130130
final BeanHelper beanHelper = getBeanHelper(parent);
131131
if (beanHelper != null) {
132132
for (BeanPropertyWriter beanPropertyWriter : beanHelper.getProperties()) {

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/GenericsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public void testImplements() {
9494
final Settings settings = TestUtils.settings();
9595
settings.customTypeProcessor = new GenericsTypeProcessor();
9696
settings.sortDeclarations = true;
97-
settings.excludedClassNames = Arrays.asList(Comparable.class.getName());
97+
settings.setExcludeFilter(Arrays.asList(Comparable.class.getName()), null);
9898

9999
final StringWriter stringWriter = new StringWriter();
100100
new TypeScriptGenerator(settings).generateEmbeddableTypeScript(Input.from(IA.class), Output.to(stringWriter), true, 0);

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/JaxrsApplicationScannerTest.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import com.fasterxml.jackson.core.type.*;
55
import cz.habarta.typescript.generator.parser.*;
6+
import cz.habarta.typescript.generator.util.Predicate;
67
import java.io.*;
78
import java.lang.reflect.*;
89
import java.util.*;
@@ -71,16 +72,20 @@ private void testWithParsing(String applicationClass) {
7172

7273
@Test
7374
public void testExcludedResource() {
74-
final List<SourceType<Type>> sourceTypes = new JaxrsApplicationScanner().scanJaxrsApplication(TestApplication.class.getName(), Arrays.asList(TestResource1.class.getName()));
75+
final Predicate<String> excludeFilter = Settings.createExcludeFilter(Arrays.asList(
76+
TestResource1.class.getName()
77+
), null);
78+
final List<SourceType<Type>> sourceTypes = new JaxrsApplicationScanner().scanJaxrsApplication(TestApplication.class.getName(), excludeFilter);
7579
Assert.assertEquals(0, sourceTypes.size());
7680
}
7781

7882
@Test
7983
public void testExcludedType() {
80-
final List<SourceType<Type>> sourceTypes = new JaxrsApplicationScanner().scanJaxrsApplication(TestApplication.class.getName(), Arrays.asList(
84+
final Predicate<String> excludeFilter = Settings.createExcludeFilter(Arrays.asList(
8185
A.class.getName(),
8286
J.class.getName()
83-
));
87+
), null);
88+
final List<SourceType<Type>> sourceTypes = new JaxrsApplicationScanner().scanJaxrsApplication(TestApplication.class.getName(), excludeFilter);
8489
Assert.assertTrue(!getTypes(sourceTypes).contains(A.class));
8590
Assert.assertTrue(getTypes(sourceTypes).contains(J[].class));
8691
}

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/ModelCompilerTest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,18 @@ public void testExclusion() throws Exception {
2929
Assert.assertEquals("{ [index: string]: any }[]", TestUtils.compileType(settings, javaType).toString());
3030
}
3131

32+
@Test
33+
public void testExclusionPattern() throws Exception {
34+
final Settings settings = TestUtils.settings();
35+
settings.setExcludeFilter(null, Arrays.asList("**Direction"));
36+
final Type javaType = A.class.getField("directions").getGenericType();
37+
Assert.assertEquals("{ [index: string]: any }[]", TestUtils.compileType(settings, javaType).toString());
38+
}
39+
3240
private static Settings getTestSettings(String... excludedClassNames) {
3341
final Settings settings = TestUtils.settings();
3442
settings.mapDate = DateMapping.asString;
35-
settings.excludedClassNames = Arrays.asList(excludedClassNames);
43+
settings.setExcludeFilter(Arrays.asList(excludedClassNames), null);
3644
return settings;
3745
}
3846

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/ModelParserTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ public void testExcludedInputInList() {
6161

6262
private Model parseModel(Type type, String... excludedClassNames) {
6363
final Settings settings = new Settings();
64-
settings.excludedClassNames = Arrays.asList(excludedClassNames);
64+
settings.setExcludeFilter(Arrays.asList(excludedClassNames), null);
6565
final ModelParser parser = new Jackson2Parser(settings, new TypeProcessor.Chain(
66-
new ExcludingTypeProcessor(settings.excludedClassNames),
66+
new ExcludingTypeProcessor(settings.getExcludeFilter()),
6767
new DefaultTypeProcessor()
6868
));
6969
final Model model = parser.parseModel(type);

0 commit comments

Comments
 (0)