in src/main/java/org/apache/sling/installer/factory/model/impl/InstallModelTask.java [176:279]
private Result transform(final String name,
final String modelText,
final int featureIndex,
final TaskResource rsrc,
final File baseDir) {
Model model = null;
try ( final Reader reader = new StringReader(modelText)) {
model = ModelUtility.getEffectiveModel(ModelReader.read(reader, name));
} catch ( final IOException ioe) {
logger.warn("Unable to read model file for feature " + name, ioe);
}
if ( model == null ) {
return null;
}
int index = 0;
final Iterator<Feature> iter = model.getFeatures().iterator();
while ( iter.hasNext() ) {
iter.next();
if ( index != featureIndex ) {
iter.remove();
}
index++;
}
if ( baseDir != null ) {
final List<Artifact> artifacts = new ArrayList<>();
final Feature feature = model.getFeatures().get(0);
for(final RunMode rm : feature.getRunModes()) {
for(final ArtifactGroup group : rm.getArtifactGroups()) {
for(final Artifact a : group) {
artifacts.add(a);
}
}
}
// extract artifacts
final byte[] buffer = new byte[1024*1024*256];
try ( final InputStream is = rsrc.getInputStream() ) {
ModelArchiveReader.read(is, new ModelArchiveReader.ArtifactConsumer() {
@Override
public void consume(final Artifact artifact, final InputStream is) throws IOException {
if ( artifacts.contains(artifact) ) {
final File artifactFile = new File(baseDir, artifact.getRepositoryPath().replace('/', File.separatorChar));
if ( !artifactFile.exists() ) {
artifactFile.getParentFile().mkdirs();
try (final OutputStream os = new FileOutputStream(artifactFile)) {
int l = 0;
while ( (l = is.read(buffer)) > 0 ) {
os.write(buffer, 0, l);
}
}
}
}
}
});
} catch ( final IOException ioe) {
logger.warn("Unable to extract artifacts from model " + name, ioe);
return null;
}
}
final List<ArtifactDescription> files = new ArrayList<>();
Map<Traceable, String> errors = collectArtifacts(model, files, baseDir);
if ( errors == null ) {
final Result result = new Result();
for(final ArtifactDescription desc : files) {
if ( desc.artifactFile != null ) {
try {
final InputStream is = new FileInputStream(desc.artifactFile);
final String digest = String.valueOf(desc.artifactFile.lastModified());
// handle start level
final Dictionary<String, Object> dict = new Hashtable<String, Object>();
if ( desc.startLevel > 0 ) {
dict.put(InstallableResource.BUNDLE_START_LEVEL, desc.startLevel);
}
dict.put(InstallableResource.RESOURCE_URI_HINT, desc.artifactFile.toURI().toString());
result.resources.add(new InstallableResource("/" + desc.artifactFile.getName(), is, dict, digest,
InstallableResource.TYPE_FILE, null));
} catch ( final IOException ioe ) {
logger.warn("Unable to read artifact " + desc.artifactFile, ioe);
return null;
}
} else if ( desc.cfg != null ) {
final String id = (desc.cfg.getFactoryPid() != null ? desc.cfg.getFactoryPid() + "-" + desc.cfg.getPid() : desc.cfg.getPid());
result.resources.add(new InstallableResource("/" + id + ".config",
null,
desc.cfg.getProperties(),
null,
InstallableResource.TYPE_CONFIG, null));
} else if ( desc.section != null ) {
result.repoinit = desc.section.getContents();
}
}
return result;
}
logger.warn("Errors during parsing model file {} : {}", name, errors.values());
return null;
}