private void transformResources()

in src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java [950:1000]


    private void transformResources() {
        boolean changed = false;
        final List<ServiceReference<ResourceTransformer>> serviceRefs = this.transformerTracker
                .getSortedServiceReferences();

        if ( serviceRefs.size() > 0 ) {
            synchronized ( this.resourcesLock ) {
                // Walk the list of unknown resources and invoke all transformers
                int index = 0;
                final List<RegisteredResource> unknownList = this.persistentList.getUntransformedResources();

                while ( index < unknownList.size() ) {
                    final RegisteredResource resource = unknownList.get(index);
                    for (final ServiceReference<ResourceTransformer> reference : serviceRefs) {
                        final Long id = (Long)reference.getProperty(Constants.SERVICE_ID);
                        // check if this transformer has already been invoked for the resource
                        final String transformers = (String)((RegisteredResourceImpl)resource).getAttribute(ResourceTransformer.class.getName());
                        if ( id == null ||
                                (transformers != null && transformers.contains(":" + id + ':'))) {
                            continue;
                        }
                        final ResourceTransformer transformer = this.transformerTracker.getService(reference);
                        if ( transformer != null ) {
                            try {
                                final TransformationResult[] result = transformer.transform(resource);
                                final String newTransformers = (transformers == null ? ":" + id + ':' : transformers + id + ':');
                                ((RegisteredResourceImpl)resource).setAttribute(ResourceTransformer.class.getName(), newTransformers);
                                if ( logger.isDebugEnabled() ) {
                                    logger.debug("Invoked transformer {} on {} : {}",
                                            new Object[] {transformer, resource, Arrays.toString(result)});
                                }
                                if ( result != null && result.length > 0 ) {
                                    this.persistentList.transform(resource, result);
                                    changed = true;
                                    index--;
                                    break;
                                }
                            } catch (final Throwable t) {
                                logger.error("Uncaught exception during resource transformation!", t);
                            }
                        }
                    }
                    index++;
                }
            }
            if ( changed ) {
                this.persistentList.save();
                printResources("Transformed");
            }
        }
    }