1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.imaging.internal;
18
19 import java.io.IOException;
20 import java.util.function.Predicate;
21 import java.util.function.Supplier;
22
23 import org.apache.commons.imaging.AbstractImageParser;
24 import org.apache.commons.imaging.ImageFormat;
25 import org.apache.commons.imaging.ImageFormats;
26 import org.apache.commons.imaging.Imaging;
27 import org.apache.commons.imaging.ImagingParameters;
28 import org.apache.commons.imaging.bytesource.ByteSource;
29
30
31
32
33
34
35 public final class ImageParserFactory {
36
37 public static <T extends ImagingParameters<T>> AbstractImageParser<T> getImageParser(final ByteSource byteSource) throws IOException {
38
39 final ImageFormat format = Imaging.guessFormat(byteSource);
40 if (!format.equals(ImageFormats.UNKNOWN)) {
41 return ImageParserFactory.getImageParser(format);
42 }
43
44 final String fileName = byteSource.getFileName();
45 if (fileName != null) {
46 return ImageParserFactory.getImageParser(fileName);
47 }
48
49 throw new IllegalArgumentException("Can't parse this format.");
50 }
51
52 public static <T extends ImagingParameters<T>> AbstractImageParser<T> getImageParser(final ImageFormat format) {
53 return getImageParser(parser -> parser.canAcceptType(format), () -> new IllegalArgumentException("Unknown ImageFormat: " + format));
54 }
55
56
57
58 @SuppressWarnings("unchecked")
59 private static <T extends ImagingParameters<T>> AbstractImageParser<T> getImageParser(final Predicate<AbstractImageParser<?>> pred,
60 final Supplier<? extends RuntimeException> supplier) {
61 return (AbstractImageParser<T>) AbstractImageParser.getAllImageParsers().stream().filter(pred).findFirst().orElseThrow(supplier);
62 }
63
64 public static <T extends ImagingParameters<T>> AbstractImageParser<T> getImageParser(final String fileExtension) {
65 return getImageParser(parser -> parser.canAcceptExtension(fileExtension), () -> new IllegalArgumentException("Unknown extension: " + fileExtension));
66 }
67
68 private ImageParserFactory() {
69 }
70 }