in src/main/java/org/apache/sling/feature/maven/Preprocessor.java [359:428]
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);
}
}
};
}