public static Feature convert()

in src/main/java/org/apache/sling/feature/osgi/Converters.java [75:210]


    public static Feature convert(final org.apache.sling.feature.Feature feature) throws IOException {
        if ( feature == null ) {
            return null;
        }
        final ID id = service.getIDfromMavenCoordinates(feature.getId().toMvnId());
        final FeatureBuilder builder = service.getBuilderFactory().newFeatureBuilder(id);

        // metadata
        builder.setComplete(feature.isComplete());
        builder.setDescription(feature.getDescription());
        builder.setLicense(feature.getLicense());
        builder.setName(feature.getTitle());
        builder.setVendor(feature.getVendor());
        builder.setDocURL(feature.getDocURL());
        builder.setSCM(feature.getSCMInfo());
        for(final String v : feature.getCategories()) {
            builder.addCategories(v);
        }

        // variables
        feature.getVariables().entrySet().stream().forEach(entry -> builder.addVariable(entry.getKey(), entry.getValue()));

        // bundles
        for(final Artifact bundle : feature.getBundles()) {
            final FeatureBundleBuilder b = service.getBuilderFactory().newBundleBuilder(service.getIDfromMavenCoordinates(bundle.getId().toMvnId()));
            bundle.getMetadata().entrySet().stream().forEach(entry -> b.addMetadata(entry.getKey(), entry.getValue()));
            builder.addBundles(b.build());
        }

        // configurations
        for(final Configuration cfg : feature.getConfigurations()) {
            final FeatureConfigurationBuilder b;
            if ( cfg.isFactoryConfiguration() ) {
                b = service.getBuilderFactory().newConfigurationBuilder(cfg.getFactoryPid(), cfg.getName());
            } else {
                b = service.getBuilderFactory().newConfigurationBuilder(cfg.getPid());
            }
            for(final String name : Collections.list(cfg.getProperties().keys()) ) {
                b.addValue(name, cfg.getProperties().get(name));
            }
            builder.addConfigurations(b.build());
        }

        // extensions
        for(final Extension ext : feature.getExtensions()) {
            FeatureExtension.Type type;
            if ( ext.getType() == ExtensionType.ARTIFACTS ) {
                type = Type.ARTIFACTS;
            } else if ( ext.getType() == ExtensionType.TEXT ) {
                type = Type.TEXT;
            } else {
                type = Type.JSON;
            }
            FeatureExtension.Kind kind;
            if ( ext.getState() == ExtensionState.OPTIONAL ) {
                kind = Kind.OPTIONAL;
            } else if ( ext.getState() == ExtensionState.REQUIRED ) {
                kind = Kind.MANDATORY;
            } else {
                kind = Kind.TRANSIENT;
            }
            final FeatureExtensionBuilder b = service.getBuilderFactory().newExtensionBuilder(ext.getName(), type, kind);
            if ( ext.getType() == ExtensionType.ARTIFACTS ) {
                for(final Artifact artifact : ext.getArtifacts()) {
                    final FeatureArtifactBuilder ab = service.getBuilderFactory().newArtifactBuilder(service.getIDfromMavenCoordinates(artifact.getId().toMvnId()));
                    artifact.getMetadata().entrySet().stream().forEach(entry -> ab.addMetadata(entry.getKey(), entry.getValue()));
                    b.addArtifact(ab.build());
                }
            } else if ( ext.getType() == ExtensionType.TEXT ) {
                if ( ext.getText() != null ) {
                    for(final String t : ext.getText().split("\n")) {
                        b.addText(t);
                    }
                }
            } else {
                if ( ext.getJSON() != null ) {
                    b.setJSON(ext.getJSON());
                } else {
                    b.setJSON("{}");
                }
            }
            builder.addExtensions(b.build());            
        }

        // framework properties
        if ( ! feature.getFrameworkProperties().isEmpty() ) {
            final FeatureExtensionBuilder b = service.getBuilderFactory().newExtensionBuilder(FRAMEWORK_PROPERTIES_EXTENSION, Type.JSON, Kind.MANDATORY);
            final Dictionary<String, Object> properties = new Hashtable<>();
            feature.getFrameworkProperties().entrySet().stream().forEach(entry -> properties.put(entry.getKey(), entry.getValue()));
            try ( final Writer writer = new StringWriter()) {
                Configurations.buildWriter().build(writer).writeConfiguration(properties);
                writer.flush();
                b.setJSON(writer.toString());
            }
            builder.addExtensions(b.build());
        }
        
        // Write metadata for variables and framework properties in the internal extension
        final Hashtable<String, Object> output = Configurations.newConfiguration();
        if ( !feature.getFrameworkProperties().isEmpty() ) {
            final Map<String, Object> fwkMetadata = Configurations.newConfiguration();
            for(final String fwkPropName : feature.getFrameworkProperties().keySet()) {
                final Map<String, Object> metadata = feature.getFrameworkPropertyMetadata(fwkPropName);
                if ( !metadata.isEmpty() ) {
                    fwkMetadata.put(fwkPropName, metadata);
                }
            }
            if ( !fwkMetadata.isEmpty() ) {
                output.put(FRAMEWORK_PROPERTIES_METADATA, fwkMetadata);
            }
        }
        if ( !feature.getVariables().isEmpty() ) {
            final Map<String, Object> varMetadata = Configurations.newConfiguration();
            for(final String varName : feature.getVariables().keySet()) {
                final Map<String, Object> metadata = feature.getVariableMetadata(varName);
                if ( !metadata.isEmpty() ) {
                    varMetadata.put(varName, metadata);
                }
            }
            if ( !varMetadata.isEmpty() ) {
                output.put(VARIABLES_METADATA, varMetadata);
            }
        }
        if ( !output.isEmpty() ) {
            final FeatureExtensionBuilder b = service.getBuilderFactory().newExtensionBuilder(Extension.EXTENSION_NAME_INTERNAL_DATA, 
                    Type.JSON, Kind.OPTIONAL);
            try ( final Writer writer = new StringWriter()) {
                Configurations.buildWriter().build(writer).writeConfiguration(output);
                writer.flush();
                b.setJSON(writer.toString());
            }
            builder.addExtensions(b.build());
        }

        return builder.build();
    }