package org.apache.sling.webresource.postprocessors.impl;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.webresource.postprocessors.PostConsolidationProcess;
import org.apache.sling.webresource.postprocessors.PostConsolidationProcessProvider;
@Component(label = "Web Resource Post Consolidation Provider Service", immediate = true)
@Service
@Reference(name = "WebResourcePostConsolidationProcessProvider", referenceInterface = PostConsolidationProcess.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC)
public class PostConsolidationProcessProviderImpl implements
PostConsolidationProcessProvider {
private List<PostConsolidationProcess> webResourcePostConsolidationProcessList = new ArrayList<PostConsolidationProcess>();
private PostConsolidationProcess[] webResourcePostConsolidationProcesses;
@Override
public InputStream applyPostConsolidationProcesses(String path,
InputStream compiledSource) {
InputStream result = compiledSource;
PostConsolidationProcess[] postConsolidationProcesses = getWebResourcePostConsolidationProcessProviders();
if (postConsolidationProcesses != null) {
for (PostConsolidationProcess currentProcess : postConsolidationProcesses) {
if (currentProcess.shouldProcess(path)) {
result = currentProcess.processCompiledStream(result);
}
}
}
return result;
}
protected void bindWebResourcePostConsolidationProcessProvider(
PostConsolidationProcess webResourcePostConsolidationProcessService) {
synchronized (this.webResourcePostConsolidationProcessList) {
this.webResourcePostConsolidationProcessList
.add(webResourcePostConsolidationProcessService);
this.webResourcePostConsolidationProcesses = null;
}
}
protected void unbindWebResourcePostConsolidationProcessProvider(
PostConsolidationProcess webResourcePostConsolidationProcessService) {
synchronized (this.webResourcePostConsolidationProcessList) {
this.webResourcePostConsolidationProcessList
.remove(webResourcePostConsolidationProcessService);
this.webResourcePostConsolidationProcesses = null;
}
}
private PostConsolidationProcess[] getWebResourcePostConsolidationProcessProviders() {
PostConsolidationProcess[] list = this.webResourcePostConsolidationProcesses;
if (list == null) {
synchronized (this.webResourcePostConsolidationProcessList) {
this.webResourcePostConsolidationProcesses = this.webResourcePostConsolidationProcessList
.toArray(new PostConsolidationProcess[this.webResourcePostConsolidationProcessList
.size()]);
list = this.webResourcePostConsolidationProcesses;
}
}
return list;
}
}