Add api to overwrite content type resolver (#2051)

Introduce content type resolver extension to provide
custom content types for specific file extensions.
This commit is contained in:
Eduard Heimbuch
2022-06-07 11:02:56 +02:00
committed by GitHub
parent 4f83670824
commit 084fe9e2ae
7 changed files with 86 additions and 6 deletions

View File

@@ -24,15 +24,20 @@
package sonia.scm.io;
import com.cloudogu.spotter.ContentType;
import com.cloudogu.spotter.ContentTypeDetector;
import com.cloudogu.spotter.Language;
import javax.inject.Inject;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
public final class DefaultContentTypeResolver implements ContentTypeResolver {
private final Set<ContentTypeResolverExtension> resolverExtensions;
private static final Language[] BOOST = new Language[]{
// GCC Machine Description uses .md as extension, but markdown is much more likely
Language.MARKDOWN,
@@ -52,14 +57,25 @@ public final class DefaultContentTypeResolver implements ContentTypeResolver {
.boost(BOOST)
.bestEffortMatch();
@Inject
public DefaultContentTypeResolver(Set<ContentTypeResolverExtension> resolverExtensions) {
this.resolverExtensions = resolverExtensions;
}
@Override
public DefaultContentType resolve(String path) {
return new DefaultContentType(PATH_BASED.detect(path));
Optional<String> extensionContentType = resolveContentTypeFromExtensions(path, new byte[]{});
return extensionContentType
.map(rawContentType -> new DefaultContentType(new ContentType(rawContentType)))
.orElseGet(() -> new DefaultContentType(PATH_BASED.detect(path)));
}
@Override
public DefaultContentType resolve(String path, byte[] contentPrefix) {
return new DefaultContentType(PATH_AND_CONTENT_BASED.detect(path, contentPrefix));
Optional<String> extensionContentType = resolveContentTypeFromExtensions(path, contentPrefix);
return extensionContentType
.map(rawContentType -> new DefaultContentType(new ContentType(rawContentType)))
.orElseGet(() -> new DefaultContentType(PATH_AND_CONTENT_BASED.detect(path, contentPrefix)));
}
@Override
@@ -70,4 +86,12 @@ public final class DefaultContentTypeResolver implements ContentTypeResolver {
}
return Collections.emptyMap();
}
private Optional<String> resolveContentTypeFromExtensions(String path, byte[] contentPrefix) {
return resolverExtensions.stream()
.map(r -> r.resolve(path, contentPrefix))
.filter(Optional::isPresent)
.map(Optional::get)
.findFirst();
}
}