in src/main/java/org/apache/sling/feature/maven/Preprocessor.java [131:256]
private void process(final Environment env, final FeatureProjectInfo info, final FeatureProjectConfig config) {
if ((config.isTestConfig() && info.testFeatureDone == true)
|| (!config.isTestConfig() && info.featureDone == true)) {
env.logger.debug("Return assembled " + config.getName() + " for " + info.project.getId());
return;
}
// prevent recursion and multiple processing
if (config.isTestConfig()) {
info.testFeatureDone = true;
} else {
info.featureDone = true;
}
env.logger.debug("Processing " + config.getName() + " in project " + info.project.getId());
// read project features
readProjectFeatures(env.logger, info, config);
if ((config.isTestConfig() ? info.testFeatures : info.features).isEmpty()) {
env.logger.debug("No " + config.getName() + " found in project " + info.project.getId());
return;
}
// process attachments (only for jar or bundle)
if ("jar".equals(info.project.getPackaging()) || "bundle".equals(info.project.getPackaging())) {
if (config.isSkipAddJarToFeature()) {
env.logger.debug("Skip adding jar to " + config.getName());
} else {
if (info.features.size() > 1) {
throw new RuntimeException("Jar can only be added if just one feature is defined in the project");
}
final Artifact jar = new Artifact(new ArtifactId(
info.project.getGroupId(),
info.project.getArtifactId(),
info.project.getVersion(),
null,
"jar"));
if (config.getJarStartOrder() != null) {
jar.setStartOrder(Integer.valueOf(config.getJarStartOrder()));
}
// add to first feature
(config.isTestConfig() ? info.testFeatures : info.features)
.values()
.iterator()
.next()
.getBundles()
.add(jar);
}
}
// assemble features
final Map<String, Feature> features = (config.isTestConfig() ? info.testFeatures : info.features);
final Map<String, Feature> processFeatures = new HashMap<>(features);
final Map<String, Feature> aggregatedFeatures =
(config.isTestConfig() ? info.assembledTestFeatures : info.assembledFeatures);
while (aggregatedFeatures.size() < features.size()) {
final int start = aggregatedFeatures.size();
final Iterator<Map.Entry<String, Feature>> iter =
processFeatures.entrySet().iterator();
while (iter.hasNext()) {
final Map.Entry<String, Feature> entry = iter.next();
boolean process = false;
if (entry.getValue().getPrototype() == null) {
// no include we can process
process = true;
} else {
final ArtifactId prototype = entry.getValue().getPrototype().getId();
if (!prototype.getGroupId().equals(info.project.getGroupId())
|| !prototype.getArtifactId().equals(info.project.getArtifactId())
|| !prototype.getVersion().equals(info.project.getVersion())) {
process = true;
} else {
// same project
for (final Feature f : aggregatedFeatures.values()) {
if (f.getId().equals(prototype)) {
process = true;
break;
}
}
}
}
if (process) {
iter.remove();
final Feature assembledFeature = FeatureBuilder.assemble(
entry.getValue(),
new BuilderContext(this.createFeatureProvider(
env,
info,
config.isTestConfig(),
config.isSkipAddDependencies(),
config.getScope(),
null))
.setArtifactProvider(aid -> {
try {
return ProjectHelper.getOrResolveArtifact(
info.project,
env.session,
env.artifactHandlerManager,
env.repoSystem,
aid)
.getFile()
.toURI()
.toURL();
} catch (Exception e) {
env.logger.error(e.getMessage(), e);
return null;
}
}));
aggregatedFeatures.put(entry.getKey(), assembledFeature);
break;
}
}
if (aggregatedFeatures.size() == start) {
throw new RuntimeException("Circular dependency in features in project " + info.project.getId());
}
}
if (config.isSkipAddDependencies()) {
env.logger.debug("Not adding artifacts from features as dependencies");
} else {
for (final Feature f :
(config.isTestConfig() ? info.assembledTestFeatures : info.assembledFeatures).values()) {
addDependenciesFromFeature(env, info, f, config.getScope());
}
}
}