1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.templating.imaging;
35
36 import info.magnolia.imaging.ImagingException;
37 import info.magnolia.imaging.OutputFormat;
38 import info.magnolia.imaging.ParameterProvider;
39 import info.magnolia.imaging.operations.ImageOperation;
40 import info.magnolia.imaging.operations.ImageOperationChain;
41 import info.magnolia.templating.imaging.parameters.ThemeAwareParameter;
42 import info.magnolia.templating.imaging.variation.ImageOperationProvidingVariation;
43
44 import java.awt.image.BufferedImage;
45 import java.io.IOException;
46
47 import javax.imageio.ImageIO;
48 import javax.jcr.Node;
49 import javax.jcr.RepositoryException;
50
51 import org.apache.commons.lang3.StringUtils;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55
56
57
58 public class ThemeAwareImageGenerator extends ImageOperationChain<ParameterProvider<ThemeAwareParameter>> {
59
60 private static final Logger log = LoggerFactory.getLogger(ThemeAwareImageGenerator.class);
61
62 public static final String GENERATOR_NAME = "mte";
63
64 @Override
65 public BufferedImage generate(ParameterProvider<ThemeAwareParameter> parameters) throws ImagingException {
66 final ThemeAwareParameter parameter = parameters.getParameter();
67 return resolveImageVariation(parameter);
68 }
69
70 @Override
71 public OutputFormat getOutputFormat(ParameterProvider<ThemeAwareParameter> parameters) {
72 final ThemeAwareParameter parameter = parameters.getParameter();
73
74 OutputFormat format;
75 try {
76 format = getOutputFormat().clone();
77 } catch (CloneNotSupportedException e) {
78 throw new RuntimeException("Can't clone the output format to produce a dynamic format.", e);
79 }
80
81 String extension = parameter.getExtension();
82 format.setFormatName(extension);
83
84 if ("gif".equals(StringUtils.lowerCase(extension))) {
85 format.setCompressionType("lzw");
86 } else {
87 format.setCompressionType(null);
88 }
89
90 return format;
91 }
92
93 private BufferedImage resolveImageVariation(final ThemeAwareParameter parameter) throws ImagingException {
94 final ImageOperationProvidingVariation variation = parameter.getImageVariation();
95 if (variation == null) {
96 try {
97 log.info("No image variation found, will return original image.");
98 return ImageIO.read(parameter.getBinary().getStream());
99 } catch (IOException e) {
100 log.error("Error reading image from stream. Parameter was [{}].", parameter, e);
101 } catch (RepositoryException e) {
102 log.error("Error reading image from stream. Parameter was [{}].", parameter, e);
103 }
104 return null;
105 }
106
107 final ImageOperation<ParameterProvider<Node>> imageOperation = variation.getImageOperation();
108
109 return imageOperation.apply(null, new ParameterProvider<Node>() {
110 @Override
111 public Node getParameter() {
112 return parameter.getNode();
113 }
114 });
115 }
116 }