in src/main/java/org/apache/sling/feature/maven/mojos/AbstractFeatureMojo.java [250:334]
private void handleGeneratedFeatures() throws MojoExecutionException {
final File dir;
if (this.generatedFeatures == null) {
Path targetPath = null;
File basedir = this.project.getBasedir();
if (basedir == null) {
// no basedir? use the build directory instead.
targetPath = Paths.get(this.project.getBuild().getDirectory());
} else {
// resolve build directory relative to the basedir path
targetPath = basedir.toPath().resolve(this.project.getBuild().getDirectory());
}
final File targetDir = targetPath == null ? null : targetPath.toFile();
final File genDir = new File(targetDir, "generated-features");
if (genDir.exists()) {
dir = genDir;
} else {
if (genDir.mkdirs()) {
dir = genDir;
} else {
dir = null;
}
}
} else {
dir = this.generatedFeatures;
}
if (dir != null) {
if (!dir.exists()) {
if (!dir.mkdirs()) {
throw new MojoExecutionException("Directory does not exists: " + dir);
}
}
if (!dir.isDirectory()) {
throw new MojoExecutionException("Generated features configuration is not a directory: " + dir);
}
final List<File> files = new ArrayList<>();
ProjectHelper.scan(files, dir, this.generatedFeaturesIncludes, this.generatedFeaturesExcludes);
for (final File file : files) {
getLog().debug("Reading feature file " + file);
try {
final String json = ProjectHelper.readFeatureFile(
project,
file,
null,
this.enableLegacyVariableReplacement,
this.enableProjectVariableReplacement,
this.replacePropertyVariables != null ? this.replacePropertyVariables.split(",") : null);
try (final Reader reader = new StringReader(json)) {
final Feature feature = FeatureJSONReader.read(reader, file.getAbsolutePath());
ProjectHelper.checkFeatureId(project, feature);
// Extension handling
JSONFeatures.handleExtensions(feature, file);
// Default metadata
JSONFeatures.handleDefaultMetadata(feature, ProjectHelper.getDefaultMetadata(project));
ProjectHelper.setFeatureInfo(project, feature);
// Add feature to map of features
final String key = file.toPath().normalize().toFile().getAbsolutePath();
ProjectHelper.getFeatures(this.project).put(key, feature);
// assemble feature and add
final Feature assembledFeature = FeatureBuilder.assemble(feature, getBuilderContext());
ProjectHelper.getAssembledFeatures(project).put(key, assembledFeature);
// finally validate classifier
ProjectHelper.validateFeatureClassifiers(project);
} catch (final IOException io) {
throw new MojoExecutionException("Unable to read feature " + file.getAbsolutePath(), io);
}
} catch (final RuntimeException re) {
// this is a bit unusual, but as ProjectHelper can only throw RuntimeException
// it's
// more user friendly to catch it and rethrow a mojo friendly exception
throw new MojoExecutionException(re.getMessage(), re.getCause() != null ? re.getCause() : re);
}
}
}
}