X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=utils%2FMessageBundleChecker.java;h=b1927e11d6c0c6264b6c30c942dc7cdae0a903f1;hb=99bfb1a08e5ceb3a3c990bb49dcd7433a0880558;hp=4489a9384a374ff71a51c61e1b7aaebb819cba6d;hpb=1eda02547f8519e1dff46dac06734cba6c77b97f;p=jalview.git diff --git a/utils/MessageBundleChecker.java b/utils/MessageBundleChecker.java index 4489a93..b1927e1 100644 --- a/utils/MessageBundleChecker.java +++ b/utils/MessageBundleChecker.java @@ -1,3 +1,4 @@ + /* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors @@ -23,7 +24,9 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.HashSet; +import java.util.Iterator; import java.util.Properties; +import java.util.Set; import java.util.TreeSet; import java.util.regex.Pattern; @@ -89,7 +92,9 @@ public class MessageBundleChecker implements BufferedLineReader.LineCleaner private int javaCount; - private HashSet invalidKeys; + private Set invalidKeys; + + private Set dynamicKeys; /** * Runs the scan given the path to the root of Java source directories @@ -124,8 +129,9 @@ public class MessageBundleChecker implements BufferedLineReader.LineCleaner */ private void doMain(String srcPath) throws IOException { - System.out.println("Scanning " + srcPath - + " for calls to MessageManager"); + System.out.println( + "Scanning " + srcPath + " for calls to MessageManager\n"); + sourcePath = srcPath; loadMessages(); File dir = new File(srcPath); @@ -134,7 +140,10 @@ public class MessageBundleChecker implements BufferedLineReader.LineCleaner System.out.println(srcPath + " not found"); return; } - invalidKeys = new HashSet(); + + invalidKeys = new HashSet<>(); + dynamicKeys = new HashSet<>(); + if (dir.isDirectory()) { scanDirectory(dir); @@ -151,18 +160,62 @@ public class MessageBundleChecker implements BufferedLineReader.LineCleaner */ private void reportResults() { - System.out.println("\nScanned " + javaCount + " source files"); - System.out.println("Message.properties has " + messages.size() - + " keys"); - System.out.println("Found " + invalidKeys.size() - + " possibly invalid parameter calls"); - - System.out.println(messageKeys.size() - + " keys not found, either unused or constructed dynamically"); + System.out.println( + "\nMessages.properties has " + messages.size() + " keys"); + System.out.println("Scanned " + javaCount + " source files\n"); + + if (!invalidKeys.isEmpty()) + { + System.out.println("Found " + invalidKeys.size() + + " possibly invalid unmatched key(s) in source code" + + (invalidKeys.size() > 1 ? "s" : "")); + } + + System.out.println( + "Keys not found in source code, assumed constructed dynamically:"); + int dynamicCount = 0; for (String key : messageKeys) { - System.out.println(" " + key); + if (isDynamic(key)) + { + System.out.println(" " + key); + dynamicCount++; + } } + + if (dynamicCount < messageKeys.size()) + { + System.out.println((messageKeys.size() - dynamicCount) + + " key(s) not found, possibly unused, or used indirectly (check code manually!)"); + for (String key : messageKeys) + { + if (!isDynamic(key)) + { + System.out.println(" " + key); + } + } + } + System.out + .println("\nRun i18nAnt.xml to compare other message bundles"); + } + + /** + * Answers true if the key starts with one of the recorded dynamic key stubs, + * else false + * + * @param key + * @return + */ + private boolean isDynamic(String key) + { + for (String dynamic : dynamicKeys) + { + if (key.startsWith(dynamic)) + { + return true; + } + } + return false; } /** @@ -235,11 +288,11 @@ public class MessageBundleChecker implements BufferedLineReader.LineCleaner * @param lineNo * @param line */ - private void inspectSourceLines(String path, int lineNo, String line) + private void inspectSourceLines(String path, int lineNo, + final String line) { - String lineNos = String - .format("%d-%d", lineNo, lineNo + bufferSize - - 1); + String lineNos = String.format("%d-%d", lineNo, + lineNo + bufferSize - 1); for (String method : METHODS) { int pos = line.indexOf(method); @@ -275,14 +328,21 @@ public class MessageBundleChecker implements BufferedLineReader.LineCleaner continue; } + String messageKey = getMessageKey(method, methodArgs); + if (METHOD3 == method) { - System.out.println(String.format("Dynamic key at %s line %s %s", - path.substring(sourcePath.length()), lineNos, line)); + String key = messageKey.substring(1, messageKey.length() - 1); + if (!dynamicKeys.contains(key)) + { +// System.out.println(String.format( +// "Dynamic key \"" + key + "\" at %s line %s %s", +// path.substring(sourcePath.length()), lineNos, line)); + dynamicKeys.add(key); + } continue; } - String messageKey = getMessageKey(method, methodArgs); if (messageKey == null) { System.out.println(String.format("Trouble parsing %s line %s %s", @@ -292,8 +352,8 @@ public class MessageBundleChecker implements BufferedLineReader.LineCleaner if (!(STRING_PATTERN.matcher(messageKey).matches())) { - System.out.println(String.format("Dynamic key at %s line %s %s", - path.substring(sourcePath.length()), lineNos, line)); +// System.out.println(String.format("Dynamic key at %s line %s %s", +// path.substring(sourcePath.length()), lineNos, line)); continue; } @@ -304,16 +364,33 @@ public class MessageBundleChecker implements BufferedLineReader.LineCleaner if (!this.messages.containsKey(messageKey)) { - System.out.println(String.format( - "Unmatched key '%s' at line %s of %s", messageKey, lineNos, - path.substring(sourcePath.length()))); if (!invalidKeys.contains(messageKey)) { + // report each key the first time found only + System.out.println(String.format( + "Unmatched key '%s' at line %s of %s", messageKey, + lineNos, path.substring(sourcePath.length()))); invalidKeys.add(messageKey); } } messageKeys.remove(messageKey); } + + /* + * and a brute force scan for _any_ as yet unseen message key, to catch the + * cases where it is in a variable or a condition + */ + if (line.contains("\"")) + { + Iterator it = messageKeys.iterator(); + while (it.hasNext()) + { + if (line.contains(it.next())) + { + it.remove(); // remove as 'seen' + } + } + } } /** @@ -347,8 +424,8 @@ public class MessageBundleChecker implements BufferedLineReader.LineCleaner */ int commaPos = key.indexOf(","); int bracePos = key.indexOf(")"); - int endPos = commaPos == -1 ? bracePos : (bracePos == -1 ? commaPos - : Math.min(commaPos, bracePos)); + int endPos = commaPos == -1 ? bracePos + : (bracePos == -1 ? commaPos : Math.min(commaPos, bracePos)); if (endPos == -1 && key.length() > 1 && key.endsWith("\"")) { endPos = key.length(); @@ -365,12 +442,12 @@ public class MessageBundleChecker implements BufferedLineReader.LineCleaner void loadMessages() throws IOException { messages = new Properties(); - FileReader reader = new FileReader(new File(sourcePath, - "../resources/lang/Messages.properties")); + FileReader reader = new FileReader( + new File(sourcePath, "../resources/lang/Messages.properties")); messages.load(reader); reader.close(); - messageKeys = new TreeSet(); + messageKeys = new TreeSet<>(); for (Object key : messages.keySet()) { messageKeys.add((String) key);