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);
}
}
};
}