protected FeatureProvider createFeatureProvider()

in src/main/java/org/apache/sling/feature/maven/Preprocessor.java [373:449]


    protected FeatureProvider createFeatureProvider(
            final Environment env,
            final FeatureProjectInfo info,
            final boolean isTest,
            final boolean skipAddDependencies,
            final String dependencyScope,
            final List<Feature> projectFeatures) {
        final String projectKey = info.project.getGroupId() + ":" + info.project.getArtifactId();
        return new FeatureProvider() {

            private final Set<ArtifactId> processing = new HashSet<>();

            @Override
            public Feature provide(final ArtifactId id) {
                if (processing.contains(id)) {
                    env.logger.error("Unable to get feature " + id.toMvnId()
                            + " : Recursive dependency list including project " + info.project);
                    return null;
                }
                processing.add(id);
                try {
                    // add feature to dependencies
                    if (!skipAddDependencies) {
                        addDependency(env.logger, info.project, id, dependencyScope);
                    }

                    final String key = id.getGroupId() + ":" + id.getArtifactId();
                    if (projectKey.equals(key)) {
                        // this is a feature from the current project
                        final Feature found = findFeature(info, isTest, id);
                        if (found == null) {
                            env.logger.error(
                                    "Unable to find included feature " + id.toMvnId() + " in project " + info.project);
                            return null;
                        }
                        return found;
                    }
                    // if it's a project from the current reactor build, we can't resolve it right now
                    final FeatureProjectInfo depProjectInfo = env.modelProjects.get(key);
                    if (depProjectInfo != null) {
                        env.logger.debug("Found reactor " + id.getType() + " dependency to project: " + id);
                        if (isTest) {
                            process(env, depProjectInfo, FeatureProjectConfig.getTestConfig(depProjectInfo));
                        } else {
                            process(env, depProjectInfo, FeatureProjectConfig.getMainConfig(depProjectInfo));
                        }
                        final Feature found = findFeature(depProjectInfo, isTest, id);

                        if (isTest && found == null) {
                            env.logger.error("Unable to get feature " + id.toMvnId()
                                    + " : Recursive test feature dependency list including project " + info.project);
                        } else if (!isTest && found == null) {
                            env.logger.error("Unable to get feature " + id.toMvnId()
                                    + " : Recursive feature dependency list including project " + info.project);
                        }
                        return found;
                    } else {
                        env.logger.debug("Found external " + id.getType() + " dependency: " + id);

                        // "external" dependency, we can already resolve it
                        final File featureFile = ProjectHelper.getOrResolveArtifact(
                                        info.project, env.session, env.artifactHandlerManager, env.repoSystem, id)
                                .getFile();
                        try (final FileReader r = new FileReader(featureFile)) {
                            return FeatureJSONReader.read(r, featureFile.getAbsolutePath());
                        } catch (final IOException ioe) {
                            env.logger.error("Unable to read feature file from " + featureFile, ioe);
                        }
                    }

                    return null;
                } finally {
                    processing.remove(id);
                }
            }
        };
    }