private void browseDirectory()

in knights/winegrower-knight/src/main/java/org/apache/geronimo/arthur/knight/winegrower/WinegrowerExtension.java [210:269]


    private void browseDirectory(final Context context, final Path directory,
                                 final Collection<Class<?>> classes, final MetadataBuilder metadata,
                                 final String metadataDefaultJarName) {
        // winegrower metadata
        if (metadata == null) {
            final Path winegrowerInf = directory.resolve("WINEGROWER-INF");
            if (java.nio.file.Files.isDirectory(winegrowerInf)) {
                Stream.of("index", "manifests")
                        .map(it -> it + ".properties")
                        .filter(it -> java.nio.file.Files.exists(winegrowerInf.resolve(it)))
                        .forEach(it -> context.register(resource("WINEGROWER-INF/" + it)));
            }
        }

        // activator if needed
        final Path manifest = directory.resolve("META-INF/MANIFEST.MF");
        if (java.nio.file.Files.exists(manifest)) {
            try (final InputStream inputStream = java.nio.file.Files.newInputStream(manifest)) {
                handleManifest(classes, inputStream, context);
            } catch (final IOException e) {
                throw new IllegalStateException(e);
            }
        }

        // SCR and friends
        final Path osgiInf = directory.resolve("OSGI-INF");
        if (java.nio.file.Files.isDirectory(osgiInf)) {
            try {
                java.nio.file.Files.list(osgiInf)
                        .filter(path -> isOSGiInfDescriptor(path.getFileName().toString()))
                        .peek(it -> {
                            if (it.getFileName().toString().endsWith(".xml")) {
                                try (final InputStream stream = java.nio.file.Files.newInputStream(it)) {
                                    registerScrComponentsIfNeeded(it.toString(), stream, classes, context);
                                } catch (final IOException e) {
                                    throw new IllegalStateException(e);
                                }
                            }
                        })
                        .forEach(it -> context.register(resource("OSGI-INF/" + it.getFileName())));
            } catch (final IOException e) {
                throw new IllegalStateException(e);
            }
        }

        // finally init the metadata if needed
        if (metadata != null) {
            metadata.visitFolder(ofNullable(metadataDefaultJarName).orElseGet(() -> { // bad heuristic to not get a NPE
                final AtomicReference<Path> current = new AtomicReference<>(directory);
                while (Stream.of("classes", "target").anyMatch(it -> it.equals(current.get().getFileName().toString())) &&
                        current.get().getParent() != null &&
                        (java.nio.file.Files.exists(current.get().getParent().resolve("pom.xml")) ||
                                current.get().getParent().getParent() != null &&
                                java.nio.file.Files.exists(current.get().getParent().getParent().resolve("pom.xml")))) {
                    current.set(current.get().getParent());
                }
                return current.get().getFileName().toString();
            }), directory, new SimpleFileVisitor<Path>() {});
        }
    }