package cz.habarta.typescript.generator; import cz.habarta.typescript.generator.parser.*; import cz.habarta.typescript.generator.util.Predicate; import io.github.lukehutch.fastclasspathscanner.scanner.ScanResult; import java.lang.reflect.*; import java.util.*; import javax.ws.rs.*; import javax.ws.rs.core.*; public class JaxrsApplicationScanner { public static List<SourceType<Type>> scanJaxrsApplication(Class<?> jaxrsApplicationClass, Predicate<String> isClassNameExcluded) { try { System.out.println("Scanning JAX-RS application: " + jaxrsApplicationClass.getName()); final Constructor<?> constructor = jaxrsApplicationClass.getDeclaredConstructor(); constructor.setAccessible(true); final Application application = (Application) constructor.newInstance(); final List<Class<?>> resourceClasses = new ArrayList<>(); for (Class<?> cls : application.getClasses()) { if (cls.isAnnotationPresent(Path.class)) { resourceClasses.add(cls); } } return new JaxrsApplicationScanner().scanJaxrsApplication(jaxrsApplicationClass, resourceClasses, isClassNameExcluded); } catch (ReflectiveOperationException e) { throw reportError(e); } } public static List<SourceType<Type>> scanAutomaticJaxrsApplication(ScanResult scanResult, Predicate<String> isClassNameExcluded) { try { final List<String> namesOfResourceClasses = scanResult.getNamesOfClassesWithAnnotation(Path.class); final List<Class<?>> resourceClasses = new ArrayList<>(); for (String className : namesOfResourceClasses) { resourceClasses.add(Thread.currentThread().getContextClassLoader().loadClass(className)); } System.out.println(String.format("Found %d root resources.", resourceClasses.size())); return new JaxrsApplicationScanner().scanJaxrsApplication(null, resourceClasses, isClassNameExcluded); } catch (ReflectiveOperationException e) { throw reportError(e); } } private static RuntimeException reportError(ReflectiveOperationException e) { final String url = "https://github.com/vojtechhabarta/typescript-generator/wiki/JAX-RS-Application"; final String message = "Cannot load JAX-RS application. For more information see " + url + "."; System.out.println(message); return new RuntimeException(message, e); } List<SourceType<Type>> scanJaxrsApplication(Class<?> applicationClass, List<Class<?>> resourceClasses, Predicate<String> isClassNameExcluded) { Collections.sort(resourceClasses, new Comparator<Class<?>>() { @Override public int compare(Class<?> o1, Class<?> o2) { return o1.getName().compareToIgnoreCase(o2.getName()); } }); final List<SourceType<Type>> sourceTypes = new ArrayList<>(); if (applicationClass != null) { sourceTypes.add(new SourceType<Type>(applicationClass)); } for (Class<?> resourceClass : resourceClasses) { if (isClassNameExcluded == null || !isClassNameExcluded.test(resourceClass.getName())) { sourceTypes.add(new SourceType<Type>(resourceClass)); } } return sourceTypes; } }