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