in src/main/java/org/apache/sling/feature/io/json/FeatureJSONReader.java [502:581]
private Prototype readPrototype(final JsonObject json) throws IOException {
if ( json.containsKey(JSONConstants.FEATURE_PROTOTYPE)) {
final JsonValue prototypeObj = json.get(JSONConstants.FEATURE_PROTOTYPE);
checkTypeObjectOrString(JSONConstants.FEATURE_PROTOTYPE, prototypeObj);
final Prototype prototype;
if ( prototypeObj.getValueType() == ValueType.STRING ) {
prototype = new Prototype(checkTypeArtifactId(JSONConstants.FEATURE_PROTOTYPE, prototypeObj));
} else {
final JsonObject obj = (JsonObject) prototypeObj;
if ( !obj.containsKey(JSONConstants.ARTIFACT_ID) ) {
throw new IOException(exceptionPrefix.concat(" prototype is missing required artifact id"));
}
prototype = new Prototype(checkTypeArtifactId("Prototype ".concat(JSONConstants.ARTIFACT_ID), obj.get(JSONConstants.ARTIFACT_ID)));
if ( obj.containsKey(JSONConstants.PROTOTYPE_REMOVALS) ) {
final JsonObject removalObj = checkTypeObject("Prototype removals", obj.get(JSONConstants.PROTOTYPE_REMOVALS));
if ( removalObj.containsKey(JSONConstants.FEATURE_BUNDLES) ) {
for(final JsonValue val : checkTypeArray("Prototype removal bundles", removalObj.get(JSONConstants.FEATURE_BUNDLES))) {
if ( checkTypeString("Prototype removal bundles", val).startsWith("#")) {
continue;
}
prototype.getBundleRemovals().add(checkTypeArtifactId("Prototype removal bundles", val));
}
}
if ( removalObj.containsKey(JSONConstants.FEATURE_CONFIGURATIONS) ) {
for(final JsonValue val : checkTypeArray("Prototype removal configuration", removalObj.get(JSONConstants.FEATURE_CONFIGURATIONS))) {
final String propVal = checkTypeString("Prototype removal configuration", val);
if ( propVal.startsWith("#") ) {
continue;
}
prototype.getConfigurationRemovals().add(propVal);
}
}
if ( removalObj.containsKey(JSONConstants.FEATURE_FRAMEWORK_PROPERTIES) ) {
for(final JsonValue val : checkTypeArray("Prototype removal framework properties", removalObj.get(JSONConstants.FEATURE_FRAMEWORK_PROPERTIES))) {
final String propVal = checkTypeString("Prototype removal framework properties", val);
if ( propVal.startsWith("#") ) {
continue;
}
prototype.getFrameworkPropertiesRemovals().add(propVal);
}
}
if ( removalObj.containsKey(JSONConstants.PROTOTYPE_EXTENSION_REMOVALS) ) {
for(final JsonValue val : checkTypeArray("Prototype removal extensions", removalObj.get(JSONConstants.PROTOTYPE_EXTENSION_REMOVALS))) {
checkTypeObjectOrString("Prototype removal extension", val);
if ( val.getValueType() == ValueType.STRING ) {
final String propVal = org.apache.felix.cm.json.io.Configurations.convertToObject(val).toString();
if ( propVal.startsWith("#")) {
continue;
}
prototype.getExtensionRemovals().add(propVal);
} else {
final JsonObject removalMap = (JsonObject)val;
final JsonValue nameObj = removalMap.get("name");
final String name = checkTypeString("Prototype removal extension", nameObj);
if ( removalMap.containsKey("artifacts") ) {
final List<ArtifactId> ids = new ArrayList<>();
for(final JsonValue aid : checkTypeArray("Prototype removal extension artifacts", removalMap.get("artifacts"))) {
if ( checkTypeString("Prototype removal extension artifact", aid).startsWith("#")) {
continue;
}
ids.add(checkTypeArtifactId("Prototype removal extension artifact", aid));
}
prototype.getArtifactExtensionRemovals().put(name, ids);
} else {
prototype.getExtensionRemovals().add(name);
}
}
}
}
readRequirements(removalObj, prototype.getRequirementRemovals());
readCapabilities(removalObj, prototype.getCapabilityRemovals());
}
}
return prototype;
}
return null;
}