Skip to content

Commit 91255f8

Browse files
committed
Update code after the removal of jai_imageio dependencies
1 parent e7ea7b4 commit 91255f8

File tree

9 files changed

+91
-357
lines changed

9 files changed

+91
-357
lines changed

geowebcache/web/src/main/webapp/WEB-INF/geowebcache-wmsservice-context.xml

Lines changed: 3 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -31,31 +31,18 @@
3131

3232
<bean id="wmsUtilities" class="org.geowebcache.service.wms.WMSUtilities"/>
3333

34-
<bean id="ioInitializer" class="org.geowebcache.io.codec.ImageIOInitializer" factory-method="getInstance">
35-
<constructor-arg index="0">
36-
<list></list>
37-
</constructor-arg>
38-
</bean>
39-
4034
<!--Encoders -->
4135

4236
<bean id="PNGEncoder" class="org.geowebcache.io.codec.PNGImageEncoder">
4337
<constructor-arg index="0" value="false" />
4438
<constructor-arg index="1" value="0.25" />
4539
<constructor-arg index="2">
46-
<list>
47-
<value>com.sun.media.imageioimpl.plugins.png.CLibPNGImageWriterSpi</value>
48-
<value>com.sun.imageio.plugins.png.PNGImageWriterSpi</value>
49-
</list>
50-
</constructor-arg>
51-
<constructor-arg>
5240
<map>
5341
<entry key="COMPRESSION" value="FILTERED" />
5442
<entry key="COMPRESSION_RATE" value="0.75" />
5543
</map>
5644
</constructor-arg>
57-
<constructor-arg index="4" value="false" />
58-
<constructor-arg ref="ioInitializer" />
45+
<constructor-arg index="3" value="false" />
5946
</bean>
6047

6148
<bean id="GIFEncoder" class="org.geowebcache.io.codec.ImageEncoderImpl">
@@ -65,19 +52,12 @@
6552
<value>image/gif</value>
6653
</list>
6754
</constructor-arg>
68-
<constructor-arg>
69-
<list>
70-
<value>com.sun.media.imageioimpl.plugins.gif.GIFImageWriterSpi</value>
71-
<value>com.sun.media.imageio.plugins.gif.GIFImageWriterSpi</value>
72-
</list>
73-
</constructor-arg>
7455
<constructor-arg>
7556
<map>
7657
<entry key="COMPRESSION" value="NULL" />
7758
<entry key="COMPRESSION_RATE" value="NULL" />
7859
</map>
7960
</constructor-arg>
80-
<constructor-arg ref="ioInitializer" />
8161
</bean>
8262

8363
<bean id="JPEGEncoder" class="org.geowebcache.io.codec.ImageEncoderImpl">
@@ -87,19 +67,12 @@
8767
<value>image/jpeg</value>
8868
</list>
8969
</constructor-arg>
90-
<constructor-arg>
91-
<list>
92-
<value>com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterSpi</value>
93-
<value>com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi</value>
94-
</list>
95-
</constructor-arg>
9670
<constructor-arg>
9771
<map>
9872
<entry key="COMPRESSION" value="JPEG" />
9973
<entry key="COMPRESSION_RATE" value="0.75" />
10074
</map>
10175
</constructor-arg>
102-
<constructor-arg ref="ioInitializer" />
10376
</bean>
10477

10578
<bean id="TIFFEncoder" class="org.geowebcache.io.codec.ImageEncoderImpl">
@@ -109,19 +82,13 @@
10982
<value>image/tiff</value>
11083
</list>
11184
</constructor-arg>
112-
<constructor-arg>
113-
<list>
114-
<value>it.geosolutions.imageioimpl.plugins.tiff.TIFFImageWriterSpi</value>
115-
<value>com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriterSpi</value>
116-
</list>
117-
</constructor-arg>
11885
<constructor-arg>
11986
<map>
12087
<entry key="COMPRESSION" value="Deflate" />
12188
<entry key="COMPRESSION_RATE" value="0.75" />
12289
</map>
12390
</constructor-arg>
124-
<constructor-arg ref="ioInitializer" />
91+
<constructor-arg value="it.geosolutions.imageioimpl.plugins.tiff.TIFFImageWriterSpi"/>
12592
</bean>
12693

12794
<bean id="BMPEncoder" class="org.geowebcache.io.codec.ImageEncoderImpl">
@@ -131,19 +98,12 @@
13198
<value>image/bmp</value>
13299
</list>
133100
</constructor-arg>
134-
<constructor-arg>
135-
<list>
136-
<value>com.sun.media.imageioimpl.plugins.bmp.BMPImageWriterSpi</value>
137-
<value>com.sun.imageio.plugins.bmp.BMPImageWriterSpi</value>
138-
</list>
139-
</constructor-arg>
140101
<constructor-arg>
141102
<map>
142103
<entry key="COMPRESSION" value="NULL" />
143104
<entry key="COMPRESSION_RATE" value="NULL" />
144105
</map>
145106
</constructor-arg>
146-
<constructor-arg ref="ioInitializer" />
147107
</bean>
148108

149109
<!--Decoders -->
@@ -156,13 +116,6 @@
156116
<value>image/png; mode=24bit</value>
157117
</list>
158118
</constructor-arg>
159-
<constructor-arg>
160-
<list>
161-
<value>com.sun.media.imageioimpl.plugins.png.CLibPNGImageReaderSpi</value>
162-
<value>com.sun.imageio.plugins.png.PNGImageReaderSpi</value>
163-
</list>
164-
</constructor-arg>
165-
<constructor-arg ref="ioInitializer" />
166119
</bean>
167120

168121
<bean id="GIFDecoder" class="org.geowebcache.io.codec.ImageDecoderImpl">
@@ -172,12 +125,6 @@
172125
<value>image/gif</value>
173126
</list>
174127
</constructor-arg>
175-
<constructor-arg>
176-
<list>
177-
<value>com.sun.imageio.plugins.gif.GIFImageReaderSpi</value>
178-
</list>
179-
</constructor-arg>
180-
<constructor-arg ref="ioInitializer" />
181128
</bean>
182129

183130
<bean id="JPEGDecoder" class="org.geowebcache.io.codec.ImageDecoderImpl">
@@ -187,13 +134,6 @@
187134
<value>image/jpeg</value>
188135
</list>
189136
</constructor-arg>
190-
<constructor-arg>
191-
<list>
192-
<value>com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReaderSpi</value>
193-
<value>com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi</value>
194-
</list>
195-
</constructor-arg>
196-
<constructor-arg ref="ioInitializer" />
197137
</bean>
198138

199139
<bean id="TIFFDecoder" class="org.geowebcache.io.codec.ImageDecoderImpl">
@@ -203,13 +143,7 @@
203143
<value>image/tiff</value>
204144
</list>
205145
</constructor-arg>
206-
<constructor-arg>
207-
<list>
208-
<value>it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReaderSpi</value>
209-
<value>com.sun.media.imageioimpl.plugins.tiff.TIFFImageReaderSpi</value>
210-
</list>
211-
</constructor-arg>
212-
<constructor-arg ref="ioInitializer" />
146+
<constructor-arg value="it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReaderSpi"/>
213147
</bean>
214148

215149
<bean id="BMPDecoder" class="org.geowebcache.io.codec.ImageDecoderImpl">
@@ -219,13 +153,6 @@
219153
<value>image/bmp</value>
220154
</list>
221155
</constructor-arg>
222-
<constructor-arg>
223-
<list>
224-
<value>com.sun.media.imageioimpl.plugins.bmp.BMPImageReaderSpi</value>
225-
<value>com.sun.imageio.plugins.bmp.BMPImageReaderSpi</value>
226-
</list>
227-
</constructor-arg>
228-
<constructor-arg ref="ioInitializer" />
229156
</bean>
230157

231158
<bean id="decoderContainer" class="org.geowebcache.io.codec.ImageDecoderContainer" />

geowebcache/wms/src/main/java/org/geowebcache/io/codec/ImageDecoderImpl.java

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@
1919
import java.io.IOException;
2020
import java.io.InputStream;
2121
import java.util.ArrayList;
22+
import java.util.Iterator;
2223
import java.util.List;
2324
import java.util.Map;
2425
import java.util.logging.Level;
2526
import java.util.logging.Logger;
27+
import javax.imageio.ImageIO;
2628
import javax.imageio.ImageReader;
27-
import javax.imageio.spi.IIORegistry;
2829
import javax.imageio.spi.ImageReaderSpi;
2930
import javax.imageio.stream.ImageInputStream;
3031
import javax.imageio.stream.MemoryCacheImageInputStream;
@@ -50,31 +51,52 @@ public class ImageDecoderImpl implements ImageDecoder {
5051
/** ImageReaderSpi object used */
5152
private ImageReaderSpi spi;
5253

54+
/**
55+
* Creates a new Instance of ImageEncoder supporting or not OutputStream optimization, with the defined MimeTypes.
56+
*/
57+
public ImageDecoderImpl(boolean aggressiveInputStreamOptimization, List<String> supportedMimeTypes) {
58+
this(aggressiveInputStreamOptimization, supportedMimeTypes, null);
59+
}
60+
5361
/**
5462
* Creates a new Instance of ImageEncoder supporting or not OutputStream optimization, with the defined MimeTypes
5563
* and Spi classes.
5664
*/
5765
public ImageDecoderImpl(
58-
boolean aggressiveInputStreamOptimization,
59-
List<String> supportedMimeTypes,
60-
List<String> readerSpi,
61-
ImageIOInitializer initializer) {
62-
66+
boolean aggressiveInputStreamOptimization, List<String> supportedMimeTypes, String preferredSpi) {
6367
this.isAggressiveInputStreamSupported = aggressiveInputStreamOptimization;
6468
this.supportedMimeTypes = new ArrayList<>(supportedMimeTypes);
6569
// Get the IIORegistry if needed
66-
IIORegistry theRegistry = initializer.getRegistry();
67-
// Checks for each Spi class if it is present and then it is added to the list.
68-
for (String spi : readerSpi) {
69-
try {
70-
Class<?> clazz = Class.forName(spi);
71-
ImageReaderSpi reader = (ImageReaderSpi) theRegistry.getServiceProviderByClass(clazz);
72-
if (reader != null) {
73-
this.spi = reader;
74-
break;
70+
// Looks up an SPI for each supported MimeType, without breaking the JDK package sealing
71+
ImageReaderSpi backupSPI = null;
72+
for (String mimeType : supportedMimeTypes) {
73+
Iterator<ImageReader> reader = ImageIO.getImageReadersByMIMEType(mimeType);
74+
if (reader.hasNext()) {
75+
ImageReaderSpi readerSpi = reader.next().getOriginatingProvider();
76+
if (readerSpi != null) {
77+
if (preferredSpi == null) {
78+
this.spi = readerSpi;
79+
break;
80+
} else if (readerSpi.getClass().getName().equals(preferredSpi)) {
81+
this.spi = readerSpi;
82+
break;
83+
} else if (backupSPI == null) {
84+
// Keep the first available SPI as a backup
85+
backupSPI = readerSpi;
86+
}
7587
}
76-
} catch (ClassNotFoundException e) {
77-
LOGGER.log(Level.SEVERE, e.getMessage(), e);
88+
}
89+
}
90+
if (this.spi == null) {
91+
if (backupSPI == null) {
92+
throw new IllegalArgumentException(
93+
"No ImageReaderSpi found for the selected mimetypes: " + supportedMimeTypes);
94+
} else {
95+
LOGGER.log(
96+
Level.WARNING,
97+
"Preferred SPI not found, using the first available one: "
98+
+ backupSPI.getClass().getName());
99+
this.spi = backupSPI;
78100
}
79101
}
80102
}

geowebcache/wms/src/main/java/org/geowebcache/io/codec/ImageEncoderImpl.java

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,22 @@
1313
*/
1414
package org.geowebcache.io.codec;
1515

16-
import com.sun.media.imageioimpl.plugins.clib.CLibImageWriter;
1716
import it.geosolutions.imageio.stream.output.ImageOutputStreamAdapter;
1817
import java.awt.image.IndexColorModel;
1918
import java.awt.image.RenderedImage;
2019
import java.io.IOException;
2120
import java.io.OutputStream;
2221
import java.util.ArrayList;
22+
import java.util.Iterator;
2323
import java.util.List;
2424
import java.util.Map;
2525
import java.util.logging.Level;
2626
import java.util.logging.Logger;
2727
import javax.imageio.IIOImage;
28+
import javax.imageio.ImageIO;
2829
import javax.imageio.ImageWriteParam;
2930
import javax.imageio.ImageWriter;
3031
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
31-
import javax.imageio.spi.IIORegistry;
3232
import javax.imageio.spi.ImageWriterSpi;
3333
import javax.imageio.stream.ImageOutputStream;
3434
import javax.imageio.stream.MemoryCacheImageOutputStream;
@@ -80,20 +80,7 @@ public ImageWriteParam prepareParameters(
8080
ImageWriter writer, String compression, boolean compressUsed, float compressionRate) {
8181
ImageWriteParam params = null;
8282

83-
if (writer instanceof CLibImageWriter) {
84-
params = writer.getDefaultWriteParam();
85-
// Define compression mode
86-
params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
87-
if (compressUsed) {
88-
// best compression
89-
params.setCompressionType(compression);
90-
}
91-
if (compressionRate > -1) {
92-
// we can control quality here
93-
params.setCompressionQuality(compressionRate);
94-
}
95-
// Use class name without import for JDK 11 compatibility
96-
} else if ("com.sun.imageio.plugins.png.PNGImageWriter"
83+
if ("com.sun.imageio.plugins.png.PNGImageWriter"
9784
.equals(writer.getClass().getName())) {
9885
params = new PNGImageWriteParam();
9986
// Define compression mode
@@ -337,26 +324,51 @@ public boolean isAggressiveOutputStreamSupported() {
337324
public ImageEncoderImpl(
338325
boolean aggressiveOutputStreamOptimization,
339326
List<String> supportedMimeTypes,
340-
List<String> writerSpi,
327+
Map<String, String> inputParams) {
328+
this(aggressiveOutputStreamOptimization, supportedMimeTypes, inputParams, null); // No preferred SPI
329+
}
330+
331+
/**
332+
* Creates a new Instance of ImageEncoder supporting or not OutputStream optimization, with the defined MimeTypes
333+
* and Spi classes.
334+
*/
335+
public ImageEncoderImpl(
336+
boolean aggressiveOutputStreamOptimization,
337+
List<String> supportedMimeTypes,
341338
Map<String, String> inputParams,
342-
ImageIOInitializer initializer) {
339+
String preferredSpi) {
343340
this.isAggressiveOutputStreamSupported = aggressiveOutputStreamOptimization;
344341
this.supportedMimeTypes = new ArrayList<>(supportedMimeTypes);
345342
this.inputParams = inputParams;
346-
// Get the IIORegistry if needed
347-
IIORegistry theRegistry = initializer.getRegistry();
348-
// Checks for each Spi class if it is present and then it is added to the list.
349-
for (String spi : writerSpi) {
350-
try {
351-
352-
Class<?> clazz = Class.forName(spi);
353-
ImageWriterSpi writer = (ImageWriterSpi) theRegistry.getServiceProviderByClass(clazz);
354-
if (writer != null) {
355-
this.spi = writer;
356-
break;
343+
ImageWriterSpi backupSPI = null;
344+
for (String mimeType : supportedMimeTypes) {
345+
Iterator<ImageWriter> writer = ImageIO.getImageWritersByMIMEType(mimeType);
346+
if (writer.hasNext()) {
347+
ImageWriterSpi writerSpi = writer.next().getOriginatingProvider();
348+
if (writerSpi != null) {
349+
if (preferredSpi == null) {
350+
this.spi = writerSpi;
351+
break;
352+
} else if (writerSpi.getClass().getName().equals(preferredSpi)) {
353+
this.spi = writerSpi;
354+
break;
355+
} else if (backupSPI == null) {
356+
// Keep the first available SPI as a backup
357+
backupSPI = writerSpi;
358+
}
357359
}
358-
} catch (ClassNotFoundException e) {
359-
LOGGER.log(Level.SEVERE, e.getMessage(), e);
360+
}
361+
}
362+
if (this.spi == null) {
363+
if (backupSPI == null) {
364+
throw new IllegalArgumentException(
365+
"No ImageWriterSpi found for the selected mimetypes: " + supportedMimeTypes);
366+
} else {
367+
LOGGER.log(
368+
Level.WARNING,
369+
"Preferred SPI not found, using the first available one: "
370+
+ backupSPI.getClass().getName());
371+
this.spi = backupSPI;
360372
}
361373
}
362374

0 commit comments

Comments
 (0)