private Result transform()

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