in src/main/java/org/apache/sling/feature/io/json/FeatureJSONReader.java [303:398]
private void readExtensions(final JsonObject json,
final List<String> keywords,
final Extensions container,
final Configurations configContainer) throws IOException {
final Set<String> keySet = new HashSet<>(json.keySet());
keySet.removeAll(keywords);
// the remaining keys are considered extensions!
for(final String key : keySet) {
if ( key.startsWith("#") ) {
// skip comments
continue;
}
final int pos = key.indexOf(':');
final String postfix = pos == -1 ? null : key.substring(pos + 1);
final int sep = (postfix == null ? key.indexOf('|') : postfix.indexOf('|'));
final String name;
final String type;
final String state;
if ( pos == -1 ) {
type = ExtensionType.ARTIFACTS.name();
if ( sep == -1 ) {
name = key;
state = ExtensionState.OPTIONAL.name();
} else {
name = key.substring(0, sep);
state = key.substring(sep + 1);
}
} else {
name = key.substring(0, pos);
if ( sep == -1 ) {
type = postfix;
state = ExtensionState.OPTIONAL.name();
} else {
type = postfix.substring(0, sep);
state = postfix.substring(sep + 1);
}
}
if ( JSONConstants.FEATURE_KNOWN_PROPERTIES.contains(name) ) {
throw new IOException(this.exceptionPrefix.concat("Extension is using reserved name : ").concat(name));
}
if ( container.getByName(name) != null ) {
throw new IOException(exceptionPrefix.concat("Duplicate extension with name ").concat(name));
}
final ExtensionType extType = ExtensionType.valueOf(type);
final ExtensionState extState;
if (ExtensionState.OPTIONAL.name().equalsIgnoreCase(state)) {
extState = ExtensionState.OPTIONAL;
} else if (ExtensionState.REQUIRED.name().equalsIgnoreCase(state)) {
extState = ExtensionState.REQUIRED;
} else if (ExtensionState.TRANSIENT.name().equalsIgnoreCase(state)) {
extState = ExtensionState.TRANSIENT;
} else {
final boolean opt = Boolean.valueOf(state).booleanValue();
extState = opt ? ExtensionState.REQUIRED : ExtensionState.OPTIONAL;
}
final Extension ext = new Extension(extType, name, extState);
final JsonValue value = json.get(key);
switch ( extType ) {
case ARTIFACTS : final List<Artifact> list = new ArrayList<>();
readArtifacts("Extension ".concat(name), "artifact", list, value, configContainer);
for(final Artifact a : list) {
if ( ext.getArtifacts().contains(a) ) {
throw new IOException(exceptionPrefix.concat("Duplicate artifact in extension ").concat(name).concat(" : ").concat(a.getId().toMvnId()));
}
ext.getArtifacts().add(a);
}
break;
case JSON : if ( value.getValueType() != ValueType.ARRAY && value.getValueType() != ValueType.OBJECT ) {
throw new IOException(this.exceptionPrefix.concat("JSON Extension ").concat(name).concat(" is neither an object nor an array : ").concat(value.getValueType().name()));
}
ext.setJSONStructure((JsonStructure)value);
break;
case TEXT : if ( value.getValueType() != ValueType.ARRAY && value.getValueType() != ValueType.STRING ) {
throw new IOException(this.exceptionPrefix.concat("Text Extension ").concat(name).concat(" is neither a string nor an array : ").concat(value.getValueType().name()));
}
if ( value.getValueType() == ValueType.STRING ) {
// string
ext.setText(((JsonString)value).getString());
} else {
// list (array of strings)
final StringBuilder sb = new StringBuilder();
for(final JsonValue o : value.asJsonArray()) {
final String textValue = checkTypeString("Text Extension ".concat(name).concat(", value ").concat(o.toString()), o);
sb.append(textValue);
sb.append('\n');
}
ext.setText(sb.toString());
}
break;
}
container.add(ext);
}
}