FirstSupportingResolverAdapter.java
package fr.sii.ogham.template.thymeleaf.common.adapter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.thymeleaf.templateresolver.ITemplateResolver;
import fr.sii.ogham.core.resource.resolver.ResourceResolver;
import fr.sii.ogham.template.exception.NoResolverAdapterException;
import fr.sii.ogham.template.thymeleaf.common.TemplateResolverOptions;
/**
* Decorator that will ask each resolver adapter if it is able to handle the
* template resolver. If the resolver adapter supports it, then this
* implementation asks the resolver adapter to provide the Thymeleaf template
* resolver.
*
* Only the first resolver adapter that can handle the template resolver is
* used.
*
* @author Aurélien Baudet
*/
public class FirstSupportingResolverAdapter implements TemplateResolverAdapter {
/**
* The list of adapters used to convert the general resolvers into Thymeleaf
* specific resolvers
*/
private List<TemplateResolverAdapter> adapters;
/**
* Initialize the decorator with none, one or several resolver adapter
* implementations. The registration order may be important.
*
* @param adapters
* the adapters to register
*/
public FirstSupportingResolverAdapter(TemplateResolverAdapter... adapters) {
this(new ArrayList<>(Arrays.asList(adapters)));
}
/**
* Initialize the decorator with the provided resolver adapter
* implementations. The registration order may be important.
*
* @param adapters
* the adapters to register
*/
public FirstSupportingResolverAdapter(List<TemplateResolverAdapter> adapters) {
super();
this.adapters = adapters;
}
public FirstSupportingResolverAdapter() {
this(new ArrayList<>());
}
@Override
public boolean supports(ResourceResolver resolver) {
for (TemplateResolverAdapter adapter : adapters) {
if (adapter.supports(resolver)) {
return true;
}
}
return false;
}
@Override
public ITemplateResolver adapt(ResourceResolver resolver) throws NoResolverAdapterException {
for (TemplateResolverAdapter adapter : adapters) {
if (adapter.supports(resolver)) {
return adapter.adapt(resolver);
}
}
throw new NoResolverAdapterException("No resolver adapter found for the provided resolver: " + resolver.getClass().getSimpleName(), resolver);
}
/**
* Register a new adapter. The adapter is added at the end.
*
* @param adapter
* the adapter to register
*/
public void addAdapter(TemplateResolverAdapter adapter) {
adapters.add(adapter);
}
public List<TemplateResolverAdapter> getAdapters() {
return adapters;
}
@Override
public void setOptions(TemplateResolverOptions options) {
for (TemplateResolverAdapter adapter : adapters) {
adapter.setOptions(options);
}
}
}