diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ec4fbce2..19f1356c 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -17,7 +17,7 @@ jobs:
fail-fast: false
matrix:
os: [ ubuntu-latest, windows-latest, macos-latest ]
- java: [ 8, 11, 17, 18 ]
+ java: [ 8, 11, 17, 20 ]
runs-on: ${{ matrix.os }}
permissions:
checks: write
diff --git a/common/common-lang/src/main/java/com/twelvemonkeys/lang/StringUtil.java b/common/common-lang/src/main/java/com/twelvemonkeys/lang/StringUtil.java
index d1f88c93..3a6b1bf0 100755
--- a/common/common-lang/src/main/java/com/twelvemonkeys/lang/StringUtil.java
+++ b/common/common-lang/src/main/java/com/twelvemonkeys/lang/StringUtil.java
@@ -904,7 +904,7 @@ public final class StringUtil {
}
catch (ParseException pe) {
// Wrap in RuntimeException
- throw new IllegalArgumentException(pe.getMessage());
+ throw new IllegalArgumentException(pe.getMessage() + " at pos " + pe.getErrorOffset());
}
}
diff --git a/common/common-lang/src/test/java/com/twelvemonkeys/lang/StringUtilTest.java b/common/common-lang/src/test/java/com/twelvemonkeys/lang/StringUtilTest.java
index 923cffd0..c6863961 100644
--- a/common/common-lang/src/test/java/com/twelvemonkeys/lang/StringUtilTest.java
+++ b/common/common-lang/src/test/java/com/twelvemonkeys/lang/StringUtilTest.java
@@ -593,8 +593,8 @@ public class StringUtilTest {
cal.clear();
cal.set(Calendar.HOUR, 1);
cal.set(Calendar.MINUTE, 2);
- date = StringUtil.toDate("1:02 am",
- DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US));
+ format = new SimpleDateFormat("HH:mm");
+ date = StringUtil.toDate("1:02", format);
assertNotNull(date);
assertEquals(cal.getTime(), date);
}
diff --git a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/KCMSSanitizerStrategyTest.java b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/KCMSSanitizerStrategyTest.java
index 3cf80a29..c8b8ae61 100644
--- a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/KCMSSanitizerStrategyTest.java
+++ b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/KCMSSanitizerStrategyTest.java
@@ -36,9 +36,11 @@ import java.awt.color.ColorSpace;
import java.awt.color.ICC_ColorSpace;
import java.awt.color.ICC_Profile;
import java.io.IOException;
+import java.lang.reflect.Method;
import java.util.Arrays;
import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assume.assumeFalse;
import static org.mockito.Mockito.*;
public class KCMSSanitizerStrategyTest {
@@ -56,6 +58,8 @@ public class KCMSSanitizerStrategyTest {
@Test
public void testFixProfileUpdateHeader() throws Exception {
+ assumeICC_ProfileNotSealed(); // Ignores test for JDK 19+
+
byte[] header = new byte[128];
header[ICC_Profile.icHdrRenderingIntent + 3] = 1;
ICC_Profile profile = mock(ICC_Profile.class);
@@ -69,6 +73,17 @@ public class KCMSSanitizerStrategyTest {
verify(profile).setData(eq(ICC_Profile.icSigHead), any(byte[].class));
}
+ static void assumeICC_ProfileNotSealed() {
+ try {
+ Method isSealed = Class.class.getMethod("isSealed");
+ Boolean result = (Boolean) isSealed.invoke(ICC_Profile.class);
+ assumeFalse("Can't mock ICC_Profile, class is sealed (as of JDK 19).", result);
+ }
+ catch (ReflectiveOperationException ignore) {
+ // We can't have sealed classes if we don't have the isSealed method...
+ }
+ }
+
@Test
public void testFixProfileCorbisRGB() throws IOException {
// TODO: Consider re-writing this using mocks, to avoid dependencies on the CMS implementation
diff --git a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/LCMSSanitizerStrategyTest.java b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/LCMSSanitizerStrategyTest.java
index d7b63ea2..cff1acbd 100644
--- a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/LCMSSanitizerStrategyTest.java
+++ b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/LCMSSanitizerStrategyTest.java
@@ -34,6 +34,7 @@ import org.junit.Test;
import java.awt.color.ICC_Profile;
+import static com.twelvemonkeys.imageio.color.KCMSSanitizerStrategyTest.assumeICC_ProfileNotSealed;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -46,6 +47,8 @@ public class LCMSSanitizerStrategyTest {
@Test
public void testFixProfile() throws Exception {
+ assumeICC_ProfileNotSealed(); // Ignores test for JDK 19+
+
ICC_Profile profile = mock(ICC_Profile.class);
new LCMSSanitizerStrategy().fixProfile(profile);
diff --git a/pom.xml b/pom.xml
index 7869e718..f7d51e1e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -224,8 +224,8 @@
3.11.0
true
- 1.7
- 1.7
+ 8
+ 8
false
source,lines