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);
+ }
+ }
+ }
}