Changeset 19050 in josm for trunk/src/org/openstreetmap/josm/tools/Utils.java
- Timestamp:
- 2024-04-22T20:59:26+02:00 (10 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/tools/Utils.java
r19048 r19050 9 9 import java.awt.font.FontRenderContext; 10 10 import java.awt.font.GlyphVector; 11 import java.io.ByteArrayOutputStream;12 11 import java.io.Closeable; 13 12 import java.io.File; … … 30 29 import java.nio.file.StandardCopyOption; 31 30 import java.nio.file.attribute.BasicFileAttributes; 31 import java.nio.file.attribute.FileTime; 32 32 import java.security.MessageDigest; 33 33 import java.security.NoSuchAlgorithmException; … … 152 152 */ 153 153 public static <T> int indexOf(Iterable<? extends T> collection, Predicate<? super T> predicate) { 154 vari = 0;155 for ( varitem : collection) {154 int i = 0; 155 for (T item : collection) { 156 156 if (predicate.test(item)) 157 157 return i; … … 168 168 * @throws AssertionError if the condition is not met 169 169 */ 170 public static void ensure(boolean condition, String message, Object...data) { 170 public static void ensure(boolean condition, String message, Object... data) { 171 171 if (!condition) 172 172 throw new AssertionError( … … 185 185 if (n <= 0) 186 186 throw new IllegalArgumentException("n must be <= 0 but is " + n); 187 varres = a % n;187 int res = a % n; 188 188 if (res < 0) { 189 189 res += n; … … 303 303 Logging.warn("Unable to create directory "+out.getPath()); 304 304 } 305 varfiles = in.listFiles();305 File[] files = in.listFiles(); 306 306 if (files != null) { 307 for ( varf : files) {308 vartarget = new File(out, f.getName());307 for (File f : files) { 308 File target = new File(out, f.getName()); 309 309 if (f.isDirectory()) { 310 310 copyDirectory(f, target); … … 324 324 public static boolean deleteDirectory(File path) { 325 325 if (path.exists()) { 326 varfiles = path.listFiles();326 File[] files = path.listFiles(); 327 327 if (files != null) { 328 for ( varfile : files) {328 for (File file : files) { 329 329 if (file.isDirectory()) { 330 330 deleteDirectory(file); … … 371 371 */ 372 372 public static boolean deleteFile(File file, String warnMsg) { 373 varresult = file.delete();373 boolean result = file.delete(); 374 374 if (!result) { 375 375 Logging.warn(tr(warnMsg, file.getPath())); … … 397 397 */ 398 398 public static boolean mkDirs(File dir, String warnMsg) { 399 varresult = dir.mkdirs();399 boolean result = dir.mkdirs(); 400 400 if (!result) { 401 401 Logging.warn(tr(warnMsg, dir.getPath())); … … 497 497 throw new JosmRuntimeException(e); 498 498 } 499 varbyteData = data.getBytes(StandardCharsets.UTF_8);500 varbyteDigest = md.digest(byteData);499 byte[] byteData = data.getBytes(StandardCharsets.UTF_8); 500 byte[] byteDigest = md.digest(byteData); 501 501 return toHexString(byteDigest); 502 502 } … … 517 517 } 518 518 519 final varlen = bytes.length;519 final int len = bytes.length; 520 520 if (len == 0) { 521 521 return ""; 522 522 } 523 523 524 varhexChars = new char[len * 2];525 varj = 0;524 char[] hexChars = new char[len * 2]; 525 int j = 0; 526 526 for (final int v : bytes) { 527 527 hexChars[j++] = HEX_ARRAY[(v & 0xf0) >> 4]; … … 541 541 */ 542 542 public static <T> List<T> topologicalSort(final MultiMap<T, T> dependencies) { 543 vardeps = new MultiMap<T, T>();544 for ( varkey : dependencies.keySet()) {543 MultiMap<T, T> deps = new MultiMap<>(); 544 for (T key : dependencies.keySet()) { 545 545 deps.putVoid(key); 546 for ( varval : dependencies.get(key)) {546 for (T val : dependencies.get(key)) { 547 547 deps.putVoid(val); 548 548 deps.put(key, val); … … 550 550 } 551 551 552 varsize = deps.size();552 int size = deps.size(); 553 553 List<T> sorted = new ArrayList<>(); 554 for ( vari = 0; i < size; ++i) {555 varparentless = deps.keySet().stream()554 for (int i = 0; i < size; ++i) { 555 T parentless = deps.keySet().stream() 556 556 .filter(key -> deps.get(key).isEmpty()) 557 557 .findFirst().orElse(null); … … 559 559 sorted.add(parentless); 560 560 deps.remove(parentless); 561 for ( varkey : deps.keySet()) {561 for (T key : deps.keySet()) { 562 562 deps.remove(key, parentless); 563 563 } … … 679 679 return Collections.emptyMap(); 680 680 } else if (map.size() == 1) { 681 final varentry = map.entrySet().iterator().next();681 final Map.Entry<K, V> entry = map.entrySet().iterator().next(); 682 682 return Collections.singletonMap(entry.getKey(), entry.getValue()); 683 683 } else if (mapOfEntries != null) { … … 795 795 } 796 796 797 varstart = 0;798 varend = str.length();799 varleadingSkipChar = true;797 int start = 0; 798 int end = str.length(); 799 boolean leadingSkipChar = true; 800 800 while (leadingSkipChar && start < end) { 801 801 leadingSkipChar = isStrippedChar(str.charAt(start), skipChars); … … 804 804 } 805 805 } 806 vartrailingSkipChar = true;806 boolean trailingSkipChar = true; 807 807 while (trailingSkipChar && end > start) { 808 808 trailingSkipChar = isStrippedChar(str.charAt(end - 1), skipChars); … … 866 866 Logging.debug(String.join(" ", command)); 867 867 } 868 varout = Files.createTempFile("josm_exec_" + command.get(0) + "_", ".txt");868 Path out = Files.createTempFile("josm_exec_" + command.get(0) + "_", ".txt"); 869 869 try { 870 varp = new ProcessBuilder(command).redirectErrorStream(true).redirectOutput(out.toFile()).start();870 Process p = new ProcessBuilder(command).redirectErrorStream(true).redirectOutput(out.toFile()).start(); 871 871 if (!p.waitFor(timeout, unit) || p.exitValue() != 0) { 872 872 throw new ExecutionException(command.toString(), null); … … 888 888 */ 889 889 public static File getJosmTempDir() { 890 vartmpDir = getSystemProperty("java.io.tmpdir");890 String tmpDir = getSystemProperty("java.io.tmpdir"); 891 891 if (tmpDir == null) { 892 892 return null; 893 893 } 894 final varjosmTmpDir = new File(tmpDir, "JOSM");894 final File josmTmpDir = new File(tmpDir, "JOSM"); 895 895 if (!josmTmpDir.exists() && !josmTmpDir.mkdirs()) { 896 896 Logging.warn("Unable to create temp directory " + josmTmpDir); … … 920 920 // Is it less than 1 hour ? 921 921 if (elapsedTime < MILLIS_OF_HOUR) { 922 final varmin = elapsedTime / MILLIS_OF_MINUTE;922 final long min = elapsedTime / MILLIS_OF_MINUTE; 923 923 return String.format("%d %s %d %s", min, tr("min"), (elapsedTime - min * MILLIS_OF_MINUTE) / MILLIS_OF_SECOND, tr("s")); 924 924 } 925 925 // Is it less than 1 day ? 926 926 if (elapsedTime < MILLIS_OF_DAY) { 927 final varhour = elapsedTime / MILLIS_OF_HOUR;927 final long hour = elapsedTime / MILLIS_OF_HOUR; 928 928 return String.format("%d %s %d %s", hour, tr("h"), (elapsedTime - hour * MILLIS_OF_HOUR) / MILLIS_OF_MINUTE, tr("min")); 929 929 } 930 vardays = elapsedTime / MILLIS_OF_DAY;930 long days = elapsedTime / MILLIS_OF_DAY; 931 931 return String.format("%d %s %d %s", days, trn("day", "days", days), (elapsedTime - days * MILLIS_OF_DAY) / MILLIS_OF_HOUR, tr("h")); 932 932 } … … 943 943 throw new IllegalArgumentException("bytes must be >= 0"); 944 944 } 945 varunitIndex = 0;945 int unitIndex = 0; 946 946 double value = bytes; 947 947 while (value >= 1024 && unitIndex < SIZE_UNITS.length) { … … 967 967 public static String getPositionListString(List<Integer> positionList) { 968 968 Collections.sort(positionList); 969 final var sb = new StringBuilder(32);969 final StringBuilder sb = new StringBuilder(32); 970 970 sb.append(positionList.get(0)); 971 varcnt = 0;971 int cnt = 0; 972 972 int last = positionList.get(0); 973 for ( vari = 1; i < positionList.size(); ++i) {973 for (int i = 1; i < positionList.size(); ++i) { 974 974 int cur = positionList.get(i); 975 975 if (cur == last + 1) { … … 1030 1030 */ 1031 1031 public static Throwable getRootCause(Throwable t) { 1032 varresult = t;1032 Throwable result = t; 1033 1033 if (result != null) { 1034 varcause = result.getCause();1034 Throwable cause = result.getCause(); 1035 1035 while (cause != null && !cause.equals(result)) { 1036 1036 result = cause; … … 1050 1050 */ 1051 1051 public static <T> T[] addInArrayCopy(T[] array, T item) { 1052 varbiggerCopy = Arrays.copyOf(array, array.length + 1);1052 T[] biggerCopy = Arrays.copyOf(array, array.length + 1); 1053 1053 biggerCopy[array.length] = item; 1054 1054 return biggerCopy; … … 1063 1063 */ 1064 1064 public static String shortenString(String s, int maxLength) { 1065 final varellipses = "...";1065 final String ellipses = "..."; 1066 1066 CheckParameterUtil.ensureThat(maxLength >= ellipses.length(), "maxLength is shorter than " + ellipses.length()); 1067 1067 if (s != null && s.length() > maxLength) { … … 1101 1101 if (elements.size() > maxElements) { 1102 1102 final Collection<T> r = new ArrayList<>(maxElements); 1103 final varit = elements.iterator();1103 final Iterator<T> it = elements.iterator(); 1104 1104 while (r.size() < maxElements - 1) { 1105 1105 r.add(it.next()); … … 1126 1126 return url; 1127 1127 1128 final varquery = url.substring(url.indexOf('?') + 1);1129 1130 final var sb = new StringBuilder(url.substring(0, url.indexOf('?') + 1));1131 1132 for ( vari = 0; i < query.length(); i++) {1133 final varc = query.substring(i, i + 1);1128 final String query = url.substring(url.indexOf('?') + 1); 1129 1130 final StringBuilder sb = new StringBuilder(url.substring(0, url.indexOf('?') + 1)); 1131 1132 for (int i = 0; i < query.length(); i++) { 1133 final String c = query.substring(i, i + 1); 1134 1134 if (URL_CHARS.contains(c)) { 1135 1135 sb.append(c); … … 1152 1152 */ 1153 1153 public static String encodeUrl(String s) { 1154 final varenc = StandardCharsets.UTF_8.name();1154 final String enc = StandardCharsets.UTF_8.name(); 1155 1155 try { 1156 1156 return URLEncoder.encode(s, enc); … … 1172 1172 */ 1173 1173 public static String decodeUrl(String s) { 1174 final varenc = StandardCharsets.UTF_8.name();1174 final String enc = StandardCharsets.UTF_8.name(); 1175 1175 try { 1176 1176 return URLDecoder.decode(s, enc); … … 1220 1220 @Override 1221 1221 public Thread newThread(final Runnable runnable) { 1222 final varthread = new Thread(runnable, String.format(Locale.ENGLISH, nameFormat, count.getAndIncrement()));1222 final Thread thread = new Thread(runnable, String.format(Locale.ENGLISH, nameFormat, count.getAndIncrement())); 1223 1223 thread.setPriority(threadPriority); 1224 1224 return thread; … … 1298 1298 public static boolean isSimilar(String string1, String string2) { 1299 1299 // check plain strings 1300 vardistance = getLevenshteinDistance(string1, string2);1300 int distance = getLevenshteinDistance(string1, string2); 1301 1301 1302 1302 // check if only the case differs, so we don't consider large distance as different strings … … 1339 1339 } 1340 1340 1341 for ( varlength : values) {1341 for (double length : values) { 1342 1342 standardDeviation += Math.pow(length - mean, 2); 1343 1343 } … … 1360 1360 } 1361 1361 List<int[]> groups = new ArrayList<>(); 1362 varcurrent =new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};1362 int[] current = {Integer.MIN_VALUE, Integer.MIN_VALUE}; 1363 1363 groups.add(current); 1364 for ( varrow : integers) {1364 for (int row : integers) { 1365 1365 if (current[0] == Integer.MIN_VALUE) { 1366 1366 current[0] = row; … … 1397 1397 @SuppressWarnings("ThreadPriorityCheck") 1398 1398 public static ForkJoinPool newForkJoinPool(String pref, final String nameFormat, final int threadPriority) { 1399 final varnoThreads = Config.getPref().getInt(pref, Runtime.getRuntime().availableProcessors());1399 final int noThreads = Config.getPref().getInt(pref, Runtime.getRuntime().availableProcessors()); 1400 1400 return new ForkJoinPool(noThreads, new ForkJoinPool.ForkJoinWorkerThreadFactory() { 1401 1401 final AtomicLong count = new AtomicLong(0); … … 1467 1467 if (value != null) { 1468 1468 try { 1469 varold = System.setProperty(key, value);1469 String old = System.setProperty(key, value); 1470 1470 if (Logging.isDebugEnabled() && !value.equals(old)) { 1471 1471 if (!key.toLowerCase(Locale.ENGLISH).contains("password")) { … … 1493 1493 */ 1494 1494 public static boolean hasExtension(String filename, String... extensions) { 1495 varname = filename.toLowerCase(Locale.ENGLISH).replace("?format=raw", "");1495 String name = filename.toLowerCase(Locale.ENGLISH).replace("?format=raw", ""); 1496 1496 return Arrays.stream(extensions) 1497 1497 .anyMatch(ext -> name.endsWith('.' + ext.toLowerCase(Locale.ENGLISH))); … … 1516 1516 * @return byte array of data in input stream (empty if stream is null) 1517 1517 * @throws IOException if any I/O error occurs 1518 */ 1518 * @deprecated since xxx -- use {@link InputStream#readAllBytes()} instead 1519 */ 1520 @Deprecated 1519 1521 public static byte[] readBytesFromStream(InputStream stream) throws IOException { 1520 // TODO: remove this method when switching to Java 11 and use InputStream.readAllBytes1521 1522 if (stream == null) { 1522 1523 return new byte[0]; 1523 1524 } 1524 try (stream; var bout = new ByteArrayOutputStream(stream.available())) { 1525 final var buffer = new byte[8192]; 1526 var finished = false; 1527 do { 1528 var read = stream.read(buffer); 1529 if (read >= 0) { 1530 bout.write(buffer, 0, read); 1531 } else { 1532 finished = true; 1533 } 1534 } while (!finished); 1535 if (bout.size() == 0) 1536 return new byte[0]; 1537 return bout.toByteArray(); 1538 } 1525 return stream.readAllBytes(); 1539 1526 } 1540 1527 … … 1600 1587 */ 1601 1588 public static List<GlyphVector> getGlyphVectorsBidi(String string, Font font, FontRenderContext frc) { 1602 final vargvs = new ArrayList<GlyphVector>();1603 final varbidi = new Bidi(string, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);1604 final varlevels = new byte[bidi.getRunCount()];1605 final vardirStrings = new DirectionString[levels.length];1606 for ( vari = 0; i < levels.length; ++i) {1589 final List<GlyphVector> gvs = new ArrayList<>(); 1590 final Bidi bidi = new Bidi(string, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); 1591 final byte[] levels = new byte[bidi.getRunCount()]; 1592 final DirectionString[] dirStrings = new DirectionString[levels.length]; 1593 for (int i = 0; i < levels.length; ++i) { 1607 1594 levels[i] = (byte) bidi.getRunLevel(i); 1608 final varsubstr = string.substring(bidi.getRunStart(i), bidi.getRunLimit(i));1609 final vardir = levels[i] % 2 == 0 ? Bidi.DIRECTION_LEFT_TO_RIGHT : Bidi.DIRECTION_RIGHT_TO_LEFT;1595 final String substr = string.substring(bidi.getRunStart(i), bidi.getRunLimit(i)); 1596 final int dir = levels[i] % 2 == 0 ? Bidi.DIRECTION_LEFT_TO_RIGHT : Bidi.DIRECTION_RIGHT_TO_LEFT; 1610 1597 dirStrings[i] = new DirectionString(dir, substr); 1611 1598 } 1612 1599 Bidi.reorderVisually(levels, 0, dirStrings, 0, levels.length); 1613 for ( vardirString : dirStrings) {1614 varchars = dirString.str.toCharArray();1600 for (DirectionString dirString : dirStrings) { 1601 final char[] chars = dirString.str.toCharArray(); 1615 1602 gvs.add(font.layoutGlyphVector(frc, chars, 0, chars.length, dirString.direction)); 1616 1603 } … … 1709 1696 public static int getJavaVersion() { 1710 1697 // Switch to Runtime.version() once we move past Java 8 1711 varversion = Objects.requireNonNull(getSystemProperty("java.version"));1698 String version = Objects.requireNonNull(getSystemProperty("java.version")); 1712 1699 if (version.startsWith("1.")) { 1713 1700 version = version.substring(2); … … 1718 1705 // 9 1719 1706 // 9.0.1 1720 vardotPos = version.indexOf('.');1721 vardashPos = version.indexOf('-');1707 int dotPos = version.indexOf('.'); 1708 int dashPos = version.indexOf('-'); 1722 1709 return Integer.parseInt(version.substring(0, 1723 1710 dotPos > -1 ? dotPos : dashPos > -1 ? dashPos : version.length())); … … 1731 1718 public static int getJavaUpdate() { 1732 1719 // Switch to Runtime.version() once we move past Java 8 1733 varversion = Objects.requireNonNull(getSystemProperty("java.version"));1720 String version = Objects.requireNonNull(getSystemProperty("java.version")); 1734 1721 if (version.startsWith("1.")) { 1735 1722 version = version.substring(2); … … 1742 1729 // 17.0.4.1+1-LTS 1743 1730 // $MAJOR.$MINOR.$SECURITY.$PATCH 1744 varundePos = version.indexOf('_');1745 vardashPos = version.indexOf('-');1731 int undePos = version.indexOf('_'); 1732 int dashPos = version.indexOf('-'); 1746 1733 if (undePos > -1) { 1747 1734 return Integer.parseInt(version.substring(undePos + 1, 1748 1735 dashPos > -1 ? dashPos : version.length())); 1749 1736 } 1750 varfirstDotPos = version.indexOf('.');1751 varsecondDotPos = version.indexOf('.', firstDotPos + 1);1737 int firstDotPos = version.indexOf('.'); 1738 int secondDotPos = version.indexOf('.', firstDotPos + 1); 1752 1739 if (firstDotPos == secondDotPos) { 1753 1740 return 0; … … 1764 1751 public static int getJavaBuild() { 1765 1752 // Switch to Runtime.version() once we move past Java 8 1766 varversion = Objects.requireNonNull(getSystemProperty("java.runtime.version"));1767 varbPos = version.indexOf('b');1768 varpPos = version.indexOf('+');1753 String version = Objects.requireNonNull(getSystemProperty("java.runtime.version")); 1754 int bPos = version.indexOf('b'); 1755 int pPos = version.indexOf('+'); 1769 1756 try { 1770 1757 return Integer.parseInt(version.substring(bPos > -1 ? bPos + 1 : pPos + 1)); … … 1783 1770 try { 1784 1771 Object value; 1785 varc = Class.forName("com.sun.deploy.config.BuiltInProperties");1772 Class<?> c = Class.forName("com.sun.deploy.config.BuiltInProperties"); 1786 1773 try { 1787 1774 value = c.getDeclaredField("JRE_EXPIRATION_DATE").get(null); … … 1807 1794 public static String getJavaLatestVersion() { 1808 1795 try { 1809 varversions = HttpClient.create(1796 String[] versions = HttpClient.create( 1810 1797 new URL(Config.getPref().get( 1811 1798 "java.baseline.version.url", … … 1813 1800 .connect().fetchContent().split("\n", -1); 1814 1801 if (getJavaVersion() <= 11 && isRunningWebStart()) { // OpenWebStart currently only has Java 11 1815 for ( varversion : versions) {1802 for (String version : versions) { 1816 1803 if (version.startsWith("11")) { 1817 1804 return version; … … 1819 1806 } 1820 1807 } else if (getJavaVersion() <= 17) { 1821 for ( varversion : versions) {1808 for (String version : versions) { 1822 1809 if (version.startsWith("17")) { // Use current Java LTS 1823 1810 return version; … … 1942 1929 return url.openStream(); 1943 1930 } catch (FileNotFoundException | InvalidPathException e) { 1944 final varbetterUrl = betterJarUrl(url);1931 final URL betterUrl = betterJarUrl(url); 1945 1932 if (betterUrl != null) { 1946 1933 try { … … 1979 1966 public static URL betterJarUrl(URL jarUrl, URL defaultUrl) throws IOException { 1980 1967 // Workaround to https://bugs.openjdk.java.net/browse/JDK-4523159 1981 varurlPath = jarUrl.getPath().replace("%20", " ");1968 String urlPath = jarUrl.getPath().replace("%20", " "); 1982 1969 if (urlPath.startsWith("file:/") && urlPath.split("!", -1).length > 2) { 1983 1970 // Locate jar file 1984 varindex = urlPath.lastIndexOf("!/");1985 final varjarFile = Paths.get(urlPath.substring("file:/".length(), index));1986 varfilename = jarFile.getFileName();1987 varjarTime = Files.readAttributes(jarFile, BasicFileAttributes.class).lastModifiedTime();1971 int index = urlPath.lastIndexOf("!/"); 1972 final Path jarFile = Paths.get(urlPath.substring("file:/".length(), index)); 1973 Path filename = jarFile.getFileName(); 1974 FileTime jarTime = Files.readAttributes(jarFile, BasicFileAttributes.class).lastModifiedTime(); 1988 1975 // Copy it to temp directory (hopefully free of exclamation mark) if needed (missing or older jar) 1989 final varjarCopy = Paths.get(getSystemProperty("java.io.tmpdir")).resolve(filename);1976 final Path jarCopy = Paths.get(getSystemProperty("java.io.tmpdir")).resolve(filename); 1990 1977 if (!jarCopy.toFile().exists() || 1991 1978 Files.readAttributes(jarCopy, BasicFileAttributes.class).lastModifiedTime().compareTo(jarTime) < 0) { … … 2026 2013 Logging.trace(e); 2027 2014 try { 2028 final varbetterUrl = betterJarUrl(cl.getResource(path));2015 final URL betterUrl = betterJarUrl(cl.getResource(path)); 2029 2016 if (betterUrl != null) { 2030 2017 return betterUrl.openStream();
Note:
See TracChangeset
for help on using the changeset viewer.