private Prototype readPrototype()

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