SLING-9725 : Better support for text extensions
diff --git a/.gitignore b/.gitignore
index 5b783ed..9e14b0a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,5 +13,7 @@
 *.bak
 .vlt
 .DS_Store
+.factorypath
+.vscode
 jcr.log
 atlassian-ide-plugin.xml
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 76a9174..c627b15 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java
@@ -146,6 +146,17 @@
                     }
                     String json = readFeatureFile(project, f, suggestedClassifier);
 
+                    // handle extensions
+                    try (final Reader reader = new StringReader(json)) {
+                        final Feature feature = FeatureJSONReader.read(reader, f.getAbsolutePath());
+                        JSONFeatures.handleExtensions(feature, f);
+                        try (final Writer writer = new StringWriter()) {
+                            FeatureJSONWriter.write(writer, feature);
+                            writer.flush();
+                            json = writer.toString();
+                        }
+                    }
+
                     // check for prov model name
                     if (defaultProvName != null || featureFile.runModes != null || featureFile.model != null) {
                         try (final Reader reader = new StringReader(json)) {
diff --git a/src/main/java/org/apache/sling/maven/slingstart/JSONFeatures.java b/src/main/java/org/apache/sling/maven/slingstart/JSONFeatures.java
index c3624b1..0dcc204 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/JSONFeatures.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/JSONFeatures.java
@@ -16,9 +16,11 @@
  */
 package org.apache.sling.maven.slingstart;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.Reader;
 import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
 
 import javax.json.Json;
@@ -29,8 +31,12 @@
 import javax.json.JsonValue;
 import javax.json.JsonWriter;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.felix.cm.json.Configurations;
 import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.ExtensionType;
+import org.apache.sling.feature.Feature;
 
 public class JSONFeatures {
 
@@ -66,4 +72,33 @@
             return writer.toString();
         }
     }
+
+    private static final String FILE_PREFIX = "@file";
+    
+   /**
+     * Check for extensions of type text and if they reference a file
+     */
+	public static void handleExtensions(final Feature feature, final File file) throws IOException {
+        for(final Extension ext : feature.getExtensions()) {
+            if ( ext.getType() == ExtensionType.TEXT && ext.getText().startsWith(FILE_PREFIX)) {
+                final int pos = file.getName().lastIndexOf(".");
+                final String baseName = pos == -1 ? file.getName() : file.getName().substring(0, pos);
+                final String fileName;
+                if ( FILE_PREFIX.equals(ext.getText()) ) {
+                    fileName = baseName.concat("-").concat(ext.getName()).concat(".txt");
+                } else {
+                    if ( !ext.getText().substring(FILE_PREFIX.length()).startsWith(":") ) {
+                        throw new IOException("Invalid file reference: " + ext.getText());
+                    }
+                    fileName = baseName.concat("-").concat(ext.getText().substring(FILE_PREFIX.length() + 1));
+                }
+                final File txtFile = new File(file.getParentFile(), fileName);
+                if ( !txtFile.exists() || !txtFile.isFile()) {
+                    throw new IOException("Extension text file " + txtFile.getAbsolutePath() + " not found.");
+                }
+                final String contents = FileUtils.readFileToString(txtFile, StandardCharsets.UTF_8);
+                ext.setText(contents);
+            }
+        }
+    }
 }