FirstSupportingResourceResolver.java
package fr.sii.ogham.core.resource.resolver;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.sii.ogham.core.exception.resource.NoResolverException;
import fr.sii.ogham.core.exception.resource.ResourceResolutionException;
import fr.sii.ogham.core.resource.Resource;
import fr.sii.ogham.core.resource.path.ResolvedPath;
import fr.sii.ogham.core.resource.path.ResourcePath;
/**
* Decorator that will ask each resource resolver if it is able to handle the
* lookup. If the resource resolver can, then this implementation asks the
* resolver to really provide the resource.
*
* Only the first resource resolver that can handle the lookup is used.
*
* @author Aurélien Baudet
* @see ResourceResolver
*/
public class FirstSupportingResourceResolver implements ResourceResolver, ResourceResolverRegistry {
private static final Logger LOG = LoggerFactory.getLogger(FirstSupportingResourceResolver.class);
/**
* The list of resolvers used to resolve the resource according to the
* lookup.
*/
private List<ResourceResolver> resolvers;
/**
* Initialize the decorator with the provided resource resolver
* implementations. The registration order may be important.
*
* @param resolvers
* the resolvers to register
*/
public FirstSupportingResourceResolver(ResourceResolver... resolvers) {
this(new ArrayList<>(asList(resolvers)));
}
/**
* Initialize the decorator with the provided resource resolver
* implementations. The registration order may be important.
*
* @param resolvers
* the resolvers to register
*/
public FirstSupportingResourceResolver(List<ResourceResolver> resolvers) {
super();
this.resolvers = resolvers;
}
@Override
public Resource getResource(ResourcePath path) throws ResourceResolutionException {
LOG.debug("Finding a resolver able to handle the lookup {}...", path);
ResourceResolver supportingResolver = getSupportingResolver(path);
if (supportingResolver != null) {
return supportingResolver.getResource(path);
}
throw new NoResolverException("No resource resolver available to find resource " + path.getOriginalPath(), path);
}
/**
* Register a new resolver. The resolver is added at the end.
*
* @param resolver
* the resolver to register
* @return this instance for fluent chaining
*/
@Override
public FirstSupportingResourceResolver register(ResourceResolver resolver) {
resolvers.add(resolver);
return this;
}
@Override
public boolean supports(ResourcePath path) {
return getSupportingResolver(path) != null;
}
/**
* Find the first supporting resolver.
*
* @param path
* the name of the path of the resource
* @return the first resolver supporting the path
*/
@Override
public ResourceResolver getSupportingResolver(ResourcePath path) {
LOG.debug("Finding resolver for resource {}...", path);
for (ResourceResolver resolver : resolvers) {
if (resolver.supports(path)) {
LOG.debug("{} can handle resource {}", resolver, path);
return resolver;
}
}
LOG.debug("No resolver can handle path '{}'", path);
return null;
}
@Override
public List<ResourceResolver> getResolvers() {
return resolvers;
}
@Override
public ResolvedPath resolve(ResourcePath path) {
ResourceResolver supportingResolver = getSupportingResolver(path);
if (supportingResolver != null) {
return supportingResolver.resolve(path);
} else {
return null;
}
}
}