in src/main/java/org/apache/sling/maven/slingstart/ModelPreprocessor.java [296:394]
private List<Model> searchSlingstartDependencies(
final Environment env,
final ProjectInfo info,
final Model rawModel,
final Model effectiveModel,
final ResolverOptions resolverOptions)
throws MavenExecutionException {
// slingstart or slingfeature
final List<Model> dependencies = new ArrayList<>();
for(final Feature feature : effectiveModel.getFeatures()) {
for(final RunMode runMode : feature.getRunModes()) {
for(final ArtifactGroup group : runMode.getArtifactGroups()) {
final List<org.apache.sling.provisioning.model.Artifact> removeList = new ArrayList<>();
for(final org.apache.sling.provisioning.model.Artifact a : group) {
if ( a.getType().equals(BuildConstants.PACKAGING_SLINGSTART)
|| a.getType().equals(BuildConstants.PACKAGING_PARTIAL_SYSTEM)) {
final Dependency dep = new Dependency();
dep.setGroupId(a.getGroupId());
dep.setArtifactId(a.getArtifactId());
dep.setVersion(a.getVersion());
dep.setType(BuildConstants.PACKAGING_PARTIAL_SYSTEM);
if ( a.getType().equals(BuildConstants.PACKAGING_SLINGSTART) ) {
dep.setClassifier(BuildConstants.PACKAGING_PARTIAL_SYSTEM);
} else {
dep.setClassifier(a.getClassifier());
}
dep.setScope(Artifact.SCOPE_PROVIDED);
env.logger.debug("- adding dependency " + ModelUtils.toString(dep));
info.project.getDependencies().add(dep);
// if it's a project from the current reactor build, we can't resolve it right now
final String key = a.getGroupId() + ":" + a.getArtifactId();
final ProjectInfo depInfo = env.modelProjects.get(key);
if ( depInfo != null ) {
env.logger.debug("Found reactor " + a.getType() + " dependency : " + a);
final Model model = addDependencies(env, depInfo);
if ( model == null ) {
throw new MavenExecutionException("Recursive model dependency list including project " + info.project, (File)null);
}
dependencies.add(model);
info.includedModels.put(a, depInfo.localModel);
} else {
env.logger.debug("Found external " + a.getType() + " dependency: " + a);
// "external" dependency, we can already resolve it
final File modelFile = resolveSlingstartArtifact(env, info.project, dep);
FileReader r = null;
try {
r = new FileReader(modelFile);
final Model model = ModelReader.read(r, modelFile.getAbsolutePath());
info.includedModels.put(a, model);
final Map<Traceable, String> errors = ModelUtility.validate(model);
if ( errors != null ) {
throw new MavenExecutionException("Unable to read model file from " + modelFile + " : " + errors, modelFile);
}
final Model fullModel = processSlingstartDependencies(env, info, dep, model, resolverOptions);
dependencies.add(fullModel);
} catch ( final IOException ioe) {
throw new MavenExecutionException("Unable to read model file from " + modelFile, ioe);
} finally {
try {
if ( r != null ) {
r.close();
}
} catch ( final IOException io) {
// ignore
}
}
}
removeList.add(a);
}
}
for(final org.apache.sling.provisioning.model.Artifact r : removeList) {
group.remove(r);
final Feature localModelFeature = rawModel.getFeature(feature.getName());
if ( localModelFeature != null ) {
final RunMode localRunMode = localModelFeature.getRunMode(runMode.getNames());
if ( localRunMode != null ) {
final ArtifactGroup localAG = localRunMode.getArtifactGroup(group.getStartLevel());
if ( localAG != null ) {
removeArtifact(localModelFeature, localAG, r, resolverOptions);
}
}
}
}
}
}
}
return dependencies;
}