package org.apache.sling.webresource.postprocessors.impl;
import javax.jcr.Node;
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.PostCompileProcess;
import org.apache.sling.webresource.postprocessors.PostCompileProcessProvider;
@Component(label = "Web Resource Post Compiler Process Provider Service", immediate = true)
@Service
@Reference(name = "WebResourcePostCompilerProcessProvider", referenceInterface = PostCompileProcess.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC)
public class PostCompileProcessProviderImpl implements
PostCompileProcessProvider {
private List<PostCompileProcess> webResourcePostCompileProcessList = new ArrayList<PostCompileProcess>();
private PostCompileProcess[] webResourcePostCompileProcesses;
@Override
public InputStream applyPostCompileProcesses(Node sourceNode,
InputStream compiledSource) {
InputStream result = compiledSource;
PostCompileProcess[] postCompileProcesses = getWebResourcePostCompilerProcessProviders();
if (postCompileProcesses != null) {
for (PostCompileProcess currentProcess : postCompileProcesses) {
if (currentProcess.shouldProcess(sourceNode)) {
result = currentProcess.processCompiledStream(result);
}
}
}
return result;
}
/**
*
*
* @param webResourcePostCompileProcessService
*/
protected void bindWebResourcePostCompilerProcessProvider(
PostCompileProcess webResourcePostCompileProcessService) {
synchronized (this.webResourcePostCompileProcessList) {
this.webResourcePostCompileProcessList
.add(webResourcePostCompileProcessService);
this.webResourcePostCompileProcesses = null;
}
}
/**
*
* @param webResourcePostCompileProcessService
*/
protected void unbindWebResourcePostCompilerProcessProvider(
PostCompileProcess webResourcePostCompileProcessService) {
synchronized (this.webResourcePostCompileProcessList) {
this.webResourcePostCompileProcessList
.remove(webResourcePostCompileProcessService);
this.webResourcePostCompileProcesses = null;
}
}
/**
*
* Return list of available compilers
*
* @return
*/
private PostCompileProcess[] getWebResourcePostCompilerProcessProviders() {
PostCompileProcess[] list = this.webResourcePostCompileProcesses;
if (list == null) {
synchronized (this.webResourcePostCompileProcessList) {
this.webResourcePostCompileProcesses = this.webResourcePostCompileProcessList
.toArray(new PostCompileProcess[this.webResourcePostCompileProcessList
.size()]);
list = this.webResourcePostCompileProcesses;
}
}
return list;
}
}