This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-slingfeature-maven-plugin.git
The following commit(s) were added to refs/heads/master by this push:
new 3bd5909 Prevent NPE during feature resolving and improve algorithm to
find non assembled features
3bd5909 is described below
commit 3bd5909770e1d402bec671d839ade67640bdba2d
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Tue Oct 16 14:46:17 2018 +0200
Prevent NPE during feature resolving and improve algorithm to find non
assembled features
---
.../apache/sling/feature/maven/Preprocessor.java | 150 ++++++++++++++-------
1 file changed, 99 insertions(+), 51 deletions(-)
diff --git a/src/main/java/org/apache/sling/feature/maven/Preprocessor.java
b/src/main/java/org/apache/sling/feature/maven/Preprocessor.java
index 0ad4514..fe908a9 100644
--- a/src/main/java/org/apache/sling/feature/maven/Preprocessor.java
+++ b/src/main/java/org/apache/sling/feature/maven/Preprocessor.java
@@ -200,9 +200,7 @@ public class Preprocessor {
continue;
}
- env.logger.debug("- adding dependency " + a.toMvnId());
- final Dependency dep = ProjectHelper.toDependency(a, scope);
- info.project.getDependencies().add(dep);
+ this.addDependency(env.logger, info.project, a, scope);
}
for(final Extension ext : assembledFeature.getExtensions()) {
if ( ext.getType() != ExtensionType.ARTIFACTS ) {
@@ -217,9 +215,7 @@ public class Preprocessor {
env.logger.debug("- skipping dependency " + a.toMvnId());
continue;
}
- env.logger.debug("- adding dependency " + a.toMvnId());
- final Dependency dep = ProjectHelper.toDependency(a, scope);
- info.project.getDependencies().add(dep);
+ this.addDependency(env.logger, info.project, a, scope);
}
}
}
@@ -333,56 +329,108 @@ public class Preprocessor {
final List<Feature> projectFeatures) {
return new FeatureProvider() {
+ private final Set<ArtifactId> processing = new HashSet<>();
+
@Override
public Feature provide(final ArtifactId id) {
-
- final Dependency dep = ProjectHelper.toDependency(id,
dependencyScope);
- if ( !skipAddDependencies ) {
-
- env.logger.debug("- adding feature dependency " +
id.toMvnId());
- info.project.getDependencies().add(dep);
+ if ( processing.contains(id) ) {
+ env.logger.error("Unable to get feature " + id.toMvnId() +
" : Recursive dependency list including project " + info.project);
+ return null;
}
-
- // if it's a project from the current reactor build, we can't
resolve it right now
- final String key = id.getGroupId() + ":" + id.getArtifactId();
- final FeatureProjectInfo depProjectInfo =
env.modelProjects.get(key);
- if ( depProjectInfo != null ) {
- env.logger.debug("Found reactor " + id.getType() + "
dependency to project: " + id);
- // check if it is a feature project
- final FeatureProjectInfo depInfo = depProjectInfo;
- if ( isTest ) {
- process(env, depInfo,
FeatureProjectConfig.getTestConfig(depInfo));
- } else {
- process(env, depInfo,
FeatureProjectConfig.getMainConfig(depInfo));
- }
- Feature found = null;
- for(final Feature f : (isTest ?
depInfo.assembledTestFeatures : depInfo.assembledFeatures).values()) {
- if ( f.getId().equals(id) ) {
- found = f;
- break;
- }
- }
-
- 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.resolver, 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);
- }
+ processing.add(id);
+ try {
+ if ( !skipAddDependencies ) {
+
+ addDependency(env.logger, info.project, id,
dependencyScope);
+ }
+
+ // if it's a project from the current reactor build, we
can't resolve it right now
+ final String key = id.getGroupId() + ":" +
id.getArtifactId();
+ final FeatureProjectInfo depProjectInfo =
env.modelProjects.get(key);
+ if ( depProjectInfo != null ) {
+ env.logger.debug("Found reactor " + id.getType() +
" dependency to project: " + id);
+ // check if it is a feature project
+ final FeatureProjectInfo depInfo = depProjectInfo;
+ if ( isTest ) {
+ process(env, depInfo,
FeatureProjectConfig.getTestConfig(depInfo));
+ } else {
+ process(env, depInfo,
FeatureProjectConfig.getMainConfig(depInfo));
+ }
+ Feature found = findFeature(isTest ?
depInfo.assembledTestFeatures : depInfo.assembledFeatures, id);
+ if ( found == null ) {
+ if ( isTest ) {
+ found = findFeature(depInfo.features,
id);
+ }
+ if ( found == null ) {
+ found = findFeature(isTest ?
depInfo.testFeatures : depInfo.features, id);
+ if ( found == null && isTest ) {
+ found =
findFeature(depInfo.features, id);
+ }
+ if ( found != null ) {
+ found = FeatureBuilder.assemble(found,
new BuilderContext(this));
+ }
+ }
+ }
+
+ 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.resolver, 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);
}
-
- return null;
}
};
}
+
+ private void addDependency(final Logger logger, final MavenProject
project, final ArtifactId id, final String scope) {
+ boolean found = false;
+ for(final Dependency d : project.getDependencies()) {
+ if ( d.getGroupId().equals(id.getGroupId()) &&
d.getArtifactId().equals(id.getArtifactId())) {
+ if ( d.getVersion().equals(id.getVersion()) &&
d.getType().equals(id.getType())) {
+ if ( d.getClassifier() == null &&
id.getClassifier() == null ) {
+ found = true;
+ break;
+ }
+ if ( d.getClassifier() != null &&
d.getClassifier().equals(id.getClassifier())) {
+ found = true;
+ break;
+ }
+ }
+ }
+ }
+ if ( !found ) {
+ logger.debug("- adding dependency " + id.toMvnId());
+ final Dependency dep = ProjectHelper.toDependency(id, scope);
+ project.getDependencies().add(dep);
+ }
+ }
+
+ private Feature findFeature(final Map<String, Feature> featureMap, final
ArtifactId id) {
+ Feature found = null;
+ if ( featureMap != null ) {
+ for(final Feature f : featureMap.values()) {
+ if ( f.getId().equals(id) ) {
+ found = f;
+ break;
+ }
+ }
+ }
+ return found;
+ }
}