SLING-9718 : Allow configuring the default name for the provisioning model
diff --git a/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java b/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
index 2bc41b4..a8875ca 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
@@ -92,6 +92,8 @@
                     final ProjectInfo info = new ProjectInfo();
                     info.plugin = plugin;
                     info.project = project;
+                    info.defaultProvisioningModelName = ModelPreprocessor.nodeValue(plugin,
+                            "defaultProvisioningModelName", null);
                     env.modelProjects.put(project.getGroupId() + ":" + project.getArtifactId(), info);
                     File processed = new File(project.getBuild().getDirectory(), "features/processed");
                     try {
diff --git a/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java b/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java
index 5296c66..a00aa95 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java
@@ -47,6 +47,7 @@
 import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.builder.FeatureProvider;
 import org.apache.sling.feature.io.json.FeatureJSONReader;
+import org.apache.sling.feature.io.json.FeatureJSONWriter;
 import org.apache.sling.feature.modelconverter.FeatureToProvisioning;
 import org.apache.sling.maven.slingstart.ModelPreprocessor.Environment;
 import org.apache.sling.maven.slingstart.ModelPreprocessor.ProjectInfo;
@@ -69,7 +70,7 @@
 
     public static void convert(Environment env) throws MavenExecutionException {
         for (ProjectInfo pi : env.modelProjects.values()) {
-            convert(env, pi);
+            convert(env, pi, pi.defaultProvisioningModelName);
         }
     }
 
@@ -93,7 +94,8 @@
         return files;
     }
 
-    public static void convert(Environment env, ProjectInfo info) throws MavenExecutionException {
+    public static void convert(Environment env, ProjectInfo info, String defaultProvName)
+            throws MavenExecutionException {
         final String config = ModelPreprocessor.nodeValue(info.plugin, "featuresDirectory", "src/main/features");
         final List<File> files = getFeatureFiles(info.project.getBasedir(), config);
         if (files == null) {
@@ -101,7 +103,7 @@
         }
 
         try {
-            convert(files, info.project,
+            convert(files, info.project, defaultProvName,
                     id -> getFeature(id, env.session, info.project, env.artifactHandlerManager, env.resolver));
         } catch (RuntimeException ex) {
             throw new MavenExecutionException(ex.getMessage(), ex);
@@ -109,7 +111,10 @@
 
     }
 
-    static void convert(List<File> files, MavenProject project, FeatureProvider fp) throws MavenExecutionException {
+    static final String PROVISIONING_MODEL_NAME_VARIABLE = "provisioning.model.name";
+
+    static void convert(List<File> files, MavenProject project, String defaultProvName, FeatureProvider fp)
+            throws MavenExecutionException {
         File processedFeaturesDir = new File(project.getBuild().getDirectory(), "features/processed");
         processedFeaturesDir.mkdirs();
 
@@ -125,8 +130,22 @@
                     } else {
                         suggestedClassifier = null;
                     }
-                    final String json = readFeatureFile(project, f, suggestedClassifier);
+                    String json = readFeatureFile(project, f, suggestedClassifier);
 
+                    // check for prov model name
+                    if (defaultProvName != null) {
+                        try (final Reader reader = new StringReader(json)) {
+                            final Feature feature = FeatureJSONReader.read(reader, f.getAbsolutePath());
+                            if (feature.getVariables().get(PROVISIONING_MODEL_NAME_VARIABLE) == null) {
+                                feature.getVariables().put(PROVISIONING_MODEL_NAME_VARIABLE, defaultProvName);
+                                try (final Writer writer = new StringWriter()) {
+                                    FeatureJSONWriter.write(writer, feature);
+                                    writer.flush();
+                                    json = writer.toString();
+                                }
+                            }
+                        }
+                    }
                     try (final Writer fileWriter = new FileWriter(outFile)) {
                         fileWriter.write(json);
                     }
diff --git a/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java b/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java
index 366743b..27924bd 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java
@@ -41,6 +41,9 @@
     @Parameter(defaultValue = "src/main/features")
     private String featuresDirectory;
 
+    @Parameter
+    private String defaultProvisioningModelName;
+
     /**
      * To look up Archiver/UnArchiver implementations
      */
@@ -68,7 +71,8 @@
             return;
 
         try {
-            FeatureModelConverter.convert(featureFiles, project, id -> FeatureModelConverter.getFeature(id,
+            FeatureModelConverter.convert(featureFiles, project, defaultProvisioningModelName,
+                    id -> FeatureModelConverter.getFeature(id,
                     mavenSession,
                     project, artifactHandlerManager, resolver));
         } catch (MavenExecutionException e) {
diff --git a/src/main/java/org/apache/sling/maven/slingstart/ModelPreprocessor.java b/src/main/java/org/apache/sling/maven/slingstart/ModelPreprocessor.java
index b36a1b5..09f0cb6 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/ModelPreprocessor.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/ModelPreprocessor.java
@@ -69,6 +69,7 @@
         public Model        model;
         public boolean      extendMavenClassPath = true;
         public final Map<org.apache.sling.provisioning.model.Artifact, Model> includedModels = new HashMap<>();
+        public String defaultProvisioningModelName;
 
     }