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.imaging;
35
36 import info.magnolia.module.ModuleLifecycle;
37 import info.magnolia.module.ModuleLifecycleContext;
38
39 import java.util.ArrayList;
40 import java.util.Arrays;
41 import java.util.Collection;
42 import java.util.Iterator;
43 import java.util.LinkedHashMap;
44 import java.util.List;
45 import java.util.Map;
46 import java.util.TreeSet;
47
48 import javax.imageio.ImageIO;
49 import javax.imageio.spi.IIORegistry;
50 import javax.imageio.spi.ServiceRegistry;
51
52 import org.apache.commons.collections4.CollectionUtils;
53 import org.apache.commons.collections4.Transformer;
54 import org.apache.commons.lang3.StringUtils;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57
58
59
60
61 public class ImagingModule implements ModuleLifecycle {
62
63 private static final Logger log = LoggerFactory.getLogger(ImagingModule.class);
64
65 public static final String IMAGING = "imaging";
66
67 private Map<String, ImageGenerator> generators = new LinkedHashMap<String, ImageGenerator>();
68 private boolean storeGeneratedImages = true;
69
70 public void setGenerators(Map<String, ImageGenerator> generators) {
71 this.generators = generators;
72 }
73
74 public Map<String, ImageGenerator> getGenerators() {
75 return generators;
76 }
77
78 public boolean isStoreGeneratedImages() {
79 return storeGeneratedImages;
80 }
81
82 public void setStoreGeneratedImages(boolean storeGeneratedImages) {
83 this.storeGeneratedImages = storeGeneratedImages;
84 }
85
86
87
88
89
90
91 @Override
92 public void start(ModuleLifecycleContext moduleLifecycleContext) {
93 ImageIO.scanForPlugins();
94
95
96 if (log.isDebugEnabled()) {
97 log.debug("This lists the formats currently available to the javax.imageio package, as installed on this system.");
98 log.debug("Supported input formats: {}", StringUtils.join(filter(ImageIO.getReaderFormatNames()), ", "));
99 log.debug("Supported input mime types: {}", StringUtils.join(filter(ImageIO.getReaderMIMETypes()), ", "));
100 log.debug("Supported output formats: {}", StringUtils.join(filter(ImageIO.getWriterFormatNames()), ", "));
101 log.debug("Supported output mime types: {}", StringUtils.join(filter(ImageIO.getWriterMIMETypes()), ", "));
102 }
103 }
104
105
106
107
108
109
110
111
112 @Override
113 public void stop(ModuleLifecycleContext moduleLifecycleContext) {
114
115
116 final IIORegistry registry = IIORegistry.getDefaultInstance();
117 final LocalFilter localFilter = new LocalFilter(Thread.currentThread().getContextClassLoader());
118
119 Iterator<Class<?>> categories = registry.getCategories();
120
121 while (categories.hasNext()) {
122 Class<?> category = categories.next();
123 Iterator<?> providers = registry.getServiceProviders(category, localFilter, false);
124
125
126 List<Object> providersCopy = new ArrayList<>();
127 while (providers.hasNext()) {
128 providersCopy.add(providers.next());
129 }
130
131 for (Object provider : providersCopy) {
132 registry.deregisterServiceProvider(provider);
133 log.debug("Unregistered locally installed provider class: {}", provider.getClass());
134 }
135 }
136 }
137
138
139
140
141 static class LocalFilter implements ServiceRegistry.Filter {
142 private final ClassLoader loader;
143
144 public LocalFilter(ClassLoader loader) {
145 this.loader = loader;
146 }
147
148 @Override
149 public boolean filter(Object provider) {
150 return provider.getClass().getClassLoader() == loader;
151 }
152 }
153
154
155
156
157 private Collection<String> filter(String... formats) {
158 final TreeSet<String> set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
159 set.addAll(Arrays.asList(formats));
160 CollectionUtils.transform(set, new Transformer() {
161 @Override
162 public Object transform(Object input) {
163 return ((String) input).toLowerCase();
164 }
165 });
166 return set;
167 }
168 }