From 0036655df47450ddec5e3bf645ac4936cdebe458 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Mon, 21 Apr 2025 12:07:21 +0000 Subject: [PATCH] ForbiddenApis: Adjust for deprecations in JDK 21+ Fix failures reported when raising the language level to 23 new URL() is deprecated new Locale() is deprecated still allow ThreadDeath and Thread.getId() for now to keep support for JDK 8 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1925199 13f79535-47bb-0310-9956-ffa450edef68 --- .../dsig/services/TimeStampSimpleHttpClient.java | 13 ++++++++++--- .../poi/poifs/crypt/dsig/TestSignatureInfo.java | 6 ++++-- .../poi/util/tests/TestTempFileThreaded.java | 2 ++ .../apache/poi/hslf/usermodel/TestPictures.java | 6 ++++-- .../org/apache/poi/hssf/usermodel/TestBugs.java | 6 ++++-- .../ExcelFileFormatDocFunctionExtractor.java | 14 ++++++++------ .../ss/formula/functions/TestNumericFunction.java | 10 +++++----- .../apache/poi/ss/usermodel/TestDataFormatter.java | 2 +- .../ss/usermodel/TestExcelStyleDateFormatter.java | 12 ++++++------ .../poi/ss/util/TestDateFormatConverter.java | 2 +- .../org/apache/poi/util/ExceptionUtilTest.java | 2 +- 11 files changed, 46 insertions(+), 29 deletions(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/services/TimeStampSimpleHttpClient.java b/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/services/TimeStampSimpleHttpClient.java index 1f40862a7d..74a0138aa9 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/services/TimeStampSimpleHttpClient.java +++ b/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/services/TimeStampSimpleHttpClient.java @@ -24,6 +24,8 @@ import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Proxy; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; @@ -127,11 +129,11 @@ public class TimeStampSimpleHttpClient implements TimeStampHttpClient { proxy = Proxy.NO_PROXY; } else { try { - URL pUrl = new URL(proxyUrl); + URL pUrl = new URI(proxyUrl).toURL(); String host = pUrl.getHost(); int port = pUrl.getPort(); proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getByName(host), (port == -1 ? 80 : port))); - } catch (IOException ignored) { + } catch (IOException | URISyntaxException ignored) { } } } @@ -205,7 +207,12 @@ public class TimeStampSimpleHttpClient implements TimeStampHttpClient { } protected TimeStampHttpClientResponse handleRedirect(String url, MethodHandler handler, boolean followRedirect) throws IOException { - HttpURLConnection huc = (HttpURLConnection)new URL(url).openConnection(proxy); + final HttpURLConnection huc; + try { + huc = (HttpURLConnection)new URI(url).toURL().openConnection(proxy); + } catch (URISyntaxException e) { + throw new IOException(e); + } if (ignoreHttpsCertificates) { recklessConnection(huc); } diff --git a/poi-ooxml/src/test/java/org/apache/poi/poifs/crypt/dsig/TestSignatureInfo.java b/poi-ooxml/src/test/java/org/apache/poi/poifs/crypt/dsig/TestSignatureInfo.java index 241243a93e..d834fd1e87 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/poifs/crypt/dsig/TestSignatureInfo.java +++ b/poi-ooxml/src/test/java/org/apache/poi/poifs/crypt/dsig/TestSignatureInfo.java @@ -41,6 +41,8 @@ import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.SocketTimeoutException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.security.GeneralSecurityException; import java.security.KeyStoreException; @@ -597,8 +599,8 @@ class TestSignatureInfo { public static String getAccessError(String destinationUrl, boolean fireRequest, int timeout) { URL url; try { - url = new URL(destinationUrl); - } catch (MalformedURLException e) { + url = new URI(destinationUrl).toURL(); + } catch (MalformedURLException | URISyntaxException e) { throw new IllegalArgumentException("Invalid destination URL", e); } diff --git a/poi-ooxml/src/test/java/org/apache/poi/util/tests/TestTempFileThreaded.java b/poi-ooxml/src/test/java/org/apache/poi/util/tests/TestTempFileThreaded.java index 625fa448e4..4110ef456b 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/util/tests/TestTempFileThreaded.java +++ b/poi-ooxml/src/test/java/org/apache/poi/util/tests/TestTempFileThreaded.java @@ -33,6 +33,7 @@ import java.util.Map; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.util.SuppressForbidden; import org.apache.poi.util.TempFile; import org.apache.poi.util.TempFileCreationStrategy; import org.apache.poi.xssf.streaming.SXSSFSheet; @@ -51,6 +52,7 @@ class TestTempFileThreaded { // the actual thread-safe temp-file strategy private static TempFileCreationStrategy createTempFileCreationStrategy(File poiTempFileDirectory) { return new TempFileCreationStrategy() { + @SuppressForbidden("Thread.getId() is deprecated and replaced with threadId() in JDK 19+") @Override public File createTempFile(String prefix, String suffix) throws IOException { long threadId = Thread.currentThread().getId(); diff --git a/poi-scratchpad/src/test/java/org/apache/poi/hslf/usermodel/TestPictures.java b/poi-scratchpad/src/test/java/org/apache/poi/hslf/usermodel/TestPictures.java index 2b90916775..5474c7f8d0 100644 --- a/poi-scratchpad/src/test/java/org/apache/poi/hslf/usermodel/TestPictures.java +++ b/poi-scratchpad/src/test/java/org/apache/poi/hslf/usermodel/TestPictures.java @@ -29,6 +29,8 @@ import java.awt.geom.Dimension2D; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.Arrays; import java.util.Collections; @@ -271,9 +273,9 @@ public final class TestPictures { @Test @Disabled("requires an internet connection to a 3rd party site") // As of 2017-06-20, the file still exists at the specified URL and the test passes. - void testZeroPictureLength() throws IOException { + void testZeroPictureLength() throws IOException, URISyntaxException { // take the data from www instead of test directory - URL url = new URL("http://www.cs.sfu.ca/~anoop/courses/CMPT-882-Fall-2002/chris.ppt"); + URL url = new URI("http://www.cs.sfu.ca/~anoop/courses/CMPT-882-Fall-2002/chris.ppt").toURL(); HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(url.openStream()); /* Assume that the file could retrieved... InputStream is; diff --git a/poi/src/test/java/org/apache/poi/hssf/usermodel/TestBugs.java b/poi/src/test/java/org/apache/poi/hssf/usermodel/TestBugs.java index 3b026b2ce1..df7da70e19 100644 --- a/poi/src/test/java/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/poi/src/test/java/org/apache/poi/hssf/usermodel/TestBugs.java @@ -26,6 +26,8 @@ import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; @@ -2316,12 +2318,12 @@ final class TestBugs extends BaseTestBugzillaIssues { } @Test - void test46515() throws IOException { + void test46515() throws IOException, URISyntaxException { try (Workbook wb = openSampleWorkbook("46515.xls")) { // Get structure from webservice String urlString = "https://poi.apache.org/components/spreadsheet/images/calendar.jpg"; - URL structURL = new URL(urlString); + URL structURL = new URI(urlString).toURL(); BufferedImage bimage; try { bimage = ImageIO.read(structURL); diff --git a/poi/src/test/java/org/apache/poi/ss/formula/function/ExcelFileFormatDocFunctionExtractor.java b/poi/src/test/java/org/apache/poi/ss/formula/function/ExcelFileFormatDocFunctionExtractor.java index b131071abf..a900169822 100644 --- a/poi/src/test/java/org/apache/poi/ss/formula/function/ExcelFileFormatDocFunctionExtractor.java +++ b/poi/src/test/java/org/apache/poi/ss/formula/function/ExcelFileFormatDocFunctionExtractor.java @@ -26,6 +26,8 @@ import java.io.UncheckedIOException; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.nio.charset.StandardCharsets; @@ -171,7 +173,7 @@ public final class ExcelFileFormatDocFunctionExtractor { String returnClass, String paramClasses, String volatileFlagStr) { boolean isVolatile = volatileFlagStr.length() > 0; - Integer funcIxKey = Integer.valueOf(funcIx); + Integer funcIxKey = funcIx; if(!_groupFunctionIndexes.add(funcIxKey)) { throw new RuntimeException("Duplicate function index (" + funcIx + ")"); } @@ -209,7 +211,7 @@ public final class ExcelFileFormatDocFunctionExtractor { throw new RuntimeException("changing function '" + funcName + "' definition without foot-note"); } - _allFunctionsByIndex.remove(Integer.valueOf(fdPrev.getIndex())); + _allFunctionsByIndex.remove(fdPrev.getIndex()); } } @@ -326,7 +328,7 @@ public final class ExcelFileFormatDocFunctionExtractor { processTableRow(cellData, noteFlags); } else if(matchesRelPath(TABLE_CELL_RELPATH_NAMES)) { _rowData.add(_textNodeBuffer.toString().trim()); - _rowNoteFlags.add(Boolean.valueOf(_cellHasNote)); + _rowNoteFlags.add(_cellHasNote); _textNodeBuffer.setLength(0); } } @@ -350,7 +352,7 @@ public final class ExcelFileFormatDocFunctionExtractor { } int funcIx = parseInt(funcIxStr); - boolean hasFootnote = noteFlags[i + 1].booleanValue(); + boolean hasFootnote = noteFlags[i + 1]; String funcName = cellData[i + 1]; int minParams = parseInt(cellData[i + 2]); int maxParams = parseInt(cellData[i + 3]); @@ -577,8 +579,8 @@ public final class ExcelFileFormatDocFunctionExtractor { private static File downloadSourceFile() { URL url; try { - url = new URL("http://sc.openoffice.org/" + SOURCE_DOC_FILE_NAME); - } catch (MalformedURLException e) { + url = new URI("http://sc.openoffice.org/" + SOURCE_DOC_FILE_NAME).toURL(); + } catch (MalformedURLException | URISyntaxException e) { throw new RuntimeException(e); } diff --git a/poi/src/test/java/org/apache/poi/ss/formula/functions/TestNumericFunction.java b/poi/src/test/java/org/apache/poi/ss/formula/functions/TestNumericFunction.java index 632c53ad39..6343cb1a06 100644 --- a/poi/src/test/java/org/apache/poi/ss/formula/functions/TestNumericFunction.java +++ b/poi/src/test/java/org/apache/poi/ss/formula/functions/TestNumericFunction.java @@ -69,7 +69,7 @@ final class TestNumericFunction { void testDOLLAR() { Locale defaultLocale = LocaleUtil.getUserLocale(); try { - LocaleUtil.setUserLocale(new Locale("en", "US")); + LocaleUtil.setUserLocale(new Locale.Builder().setLanguage("en").setRegion("US").build()); HSSFWorkbook wb = new HSSFWorkbook(); HSSFCell cell = wb.createSheet().createRow(0).createCell(0); HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); @@ -89,7 +89,7 @@ final class TestNumericFunction { void testDOLLARIreland() { Locale defaultLocale = LocaleUtil.getUserLocale(); try { - LocaleUtil.setUserLocale(new Locale("en", "IE")); + LocaleUtil.setUserLocale(new Locale.Builder().setLanguage("en").setRegion("IE").build()); HSSFWorkbook wb = new HSSFWorkbook(); HSSFCell cell = wb.createSheet().createRow(0).createCell(0); HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); @@ -104,7 +104,7 @@ final class TestNumericFunction { void testDOLLARSpain() { Locale defaultLocale = LocaleUtil.getUserLocale(); try { - LocaleUtil.setUserLocale(new Locale("es", "ES")); + LocaleUtil.setUserLocale(new Locale.Builder().setLanguage("es").setRegion("ES").build()); HSSFWorkbook wb = new HSSFWorkbook(); HSSFCell cell = wb.createSheet().createRow(0).createCell(0); HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); @@ -119,7 +119,7 @@ final class TestNumericFunction { void testDOLLARJapan() { Locale defaultLocale = LocaleUtil.getUserLocale(); try { - LocaleUtil.setUserLocale(new Locale("ja", "JP")); + LocaleUtil.setUserLocale(new Locale.Builder().setLanguage("ja").setRegion("JP").build()); HSSFWorkbook wb = new HSSFWorkbook(); HSSFCell cell = wb.createSheet().createRow(0).createCell(0); HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); @@ -135,7 +135,7 @@ final class TestNumericFunction { void testDOLLARDenmark() { Locale defaultLocale = LocaleUtil.getUserLocale(); try { - LocaleUtil.setUserLocale(new Locale("da", "DK")); + LocaleUtil.setUserLocale(new Locale.Builder().setLanguage("da").setRegion("DK").build()); HSSFWorkbook wb = new HSSFWorkbook(); HSSFCell cell = wb.createSheet().createRow(0).createCell(0); HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); diff --git a/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java b/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java index 0d49bee3ab..b1fced30a5 100644 --- a/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java +++ b/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java @@ -937,7 +937,7 @@ class TestDataFormatter { // 2017-12-01 09:54:33 which is 42747.412892397523 as double DataFormatter dfDE = new DataFormatter(Locale.GERMANY); DataFormatter dfZH = new DataFormatter(Locale.PRC); - DataFormatter dfIE = new DataFormatter(new Locale("GA", "IE")); + DataFormatter dfIE = new DataFormatter(new Locale.Builder().setLanguage("GA").setRegion("IE").build()); double date = 42747.412892397523; String format = "dd MMMM yyyy HH:mm:ss"; assertEquals("12 Januar 2017 09:54:33", dfDE.formatRawCellContents(date, -1, format)); diff --git a/poi/src/test/java/org/apache/poi/ss/usermodel/TestExcelStyleDateFormatter.java b/poi/src/test/java/org/apache/poi/ss/usermodel/TestExcelStyleDateFormatter.java index 8d63c9adbb..f905470f88 100644 --- a/poi/src/test/java/org/apache/poi/ss/usermodel/TestExcelStyleDateFormatter.java +++ b/poi/src/test/java/org/apache/poi/ss/usermodel/TestExcelStyleDateFormatter.java @@ -103,15 +103,15 @@ class TestExcelStyleDateFormatter { public static Stream initializeLocales() throws ParseException { Object[][] locExps = { { Locale.GERMAN, "JFMAMJJASOND" }, - { new Locale("de", "AT"), "JFMAMJJASOND" }, + { new Locale.Builder().setLanguage("de").setRegion("AT").build(), "JFMAMJJASOND" }, { Locale.UK, "JFMAMJJASOND" }, - { new Locale("en", "IN"), "JFMAMJJASOND" }, - { new Locale("in", "ID"), "JFMAMJJASOND" }, + { new Locale.Builder().setLanguage("en").setRegion("IN").build(), "JFMAMJJASOND" }, + { new Locale.Builder().setLanguage("in").setRegion("ID").build(), "JFMAMJJASOND" }, { Locale.FRENCH, "jfmamjjasond" }, - { new Locale("ru", "RU"), "\u044f\u0444\u043c\u0430\u043c\u0438\u0438\u0430\u0441\u043e\u043d\u0434" }, + { new Locale.Builder().setLanguage("ru").setRegion("RU").build(), "\u044f\u0444\u043c\u0430\u043c\u0438\u0438\u0430\u0441\u043e\u043d\u0434" }, { Locale.CHINESE, localeIndex(Locale.CHINESE) == 0 ? "\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u5341\u5341" : "123456789111" }, - { new Locale("tr", "TR"), "\u004f\u015e\u004d\u004e\u004d\u0048\u0054\u0041\u0045\u0045\u004b\u0041" }, - { new Locale("hu", "HU"), "\u006a\u0066\u006d\u00e1\u006d\u006a\u006a\u0061\u0073\u006f\u006e\u0064" } + { new Locale.Builder().setLanguage("tr").setRegion("TR").build(), "\u004f\u015e\u004d\u004e\u004d\u0048\u0054\u0041\u0045\u0045\u004b\u0041" }, + { new Locale.Builder().setLanguage("hu").setRegion("HU").build(), "\u006a\u0066\u006d\u00e1\u006d\u006a\u006a\u0061\u0073\u006f\u006e\u0064" } }; String[] dates = { diff --git a/poi/src/test/java/org/apache/poi/ss/util/TestDateFormatConverter.java b/poi/src/test/java/org/apache/poi/ss/util/TestDateFormatConverter.java index 059426289e..59c8acf695 100644 --- a/poi/src/test/java/org/apache/poi/ss/util/TestDateFormatConverter.java +++ b/poi/src/test/java/org/apache/poi/ss/util/TestDateFormatConverter.java @@ -130,7 +130,7 @@ final class TestDateFormatConverter { void testJDK8EmptyLocale() { // JDK 8 seems to add an empty locale-string to the list returned via DateFormat.getAvailableLocales() // therefore we now cater for this special locale as well - String prefix = getPrefixForLocale(new Locale("")); + String prefix = getPrefixForLocale(new Locale.Builder().build()); assertEquals("", prefix); } diff --git a/poi/src/test/java/org/apache/poi/util/ExceptionUtilTest.java b/poi/src/test/java/org/apache/poi/util/ExceptionUtilTest.java index d5d4fdd77a..d78e679789 100644 --- a/poi/src/test/java/org/apache/poi/util/ExceptionUtilTest.java +++ b/poi/src/test/java/org/apache/poi/util/ExceptionUtilTest.java @@ -42,7 +42,7 @@ class ExceptionUtilTest { assertTrue(ExceptionUtil.isFatal(new VirtualMachineError(){})); } - + @SuppressForbidden("Test with ThreadDeath on purpose here") @Test void testThreadDeath() { assertTrue(ExceptionUtil.isFatal(new ThreadDeath()));