// set up our flags and our input and output streams based on the // command-line arguments (exceptions generated here will propagate out // to the environment)
BufferedReader in = null;
PrintWriter out = null; boolean writeNewFile = false; boolean doThrow = true;
for (int i = 0; i < args.length; i++) { if (args[i].equals("-w")) {
writeNewFile = true;
doThrow = false;
}
elseif (args[i].equals("-s") && in == null)
in = new BufferedReader(new EscapeReader(new InputStreamReader(System.in, "ISO8859_1"))); elseif (!args[i].startsWith("-") && in == null)
in = new BufferedReader(new EscapeReader(new InputStreamReader(new
FileInputStream(args[i]), "ISO8859_1")));
} if (in == null) {
File localeData = new File(System.getProperty("test.src", "."), DEFAULT_DATAFILE + cldrSuffix);
in = new BufferedReader(new EscapeReader(new InputStreamReader(new
FileInputStream(localeData), "ISO8859_1")));
}
out = new PrintWriter(new EscapeWriter(new OutputStreamWriter(System.out, "ISO8859_1")), true);
// perform the actual test int errorCount = doTest(in, out, writeNewFile);
// write out the error count, and throw an exception out into the environment // if there were any errors if (errorCount != 0) { if (!writeNewFile)
out.println("Test failed. " + errorCount + " errors."); if (doThrow) thrownew Exception("Test failed. " + errorCount + " errors.");
} elseif (!writeNewFile)
out.println("Test passed.");
in.close();
out.close();
}
staticint doTest(BufferedReader in, PrintWriter out, boolean writeNewFile) throws Exception { int errorCount = 0;
String key = null;
String expectedValue = null;
String line = in.readLine(); while (line != null) { if (line.startsWith("#") || line.length() == 0) { if (writeNewFile)
out.println(line);
}
else { int index = line.indexOf("="); if (index == -1) {
key = line;
expectedValue = "";
} else {
key = line.substring(0, index); if (index + 1 == line.length())
expectedValue = ""; else
expectedValue = line.substring(index + 1);
} if (!processLine(key, expectedValue, out, writeNewFile))
++errorCount;
}
line = in.readLine();
} return errorCount;
}
staticboolean processLine(String key, String expectedValue, PrintWriter out, boolean writeNewFile) throws Exception {
String rbName, localeName, resTag, qualifier;
String language = "", country = "", variant = ""; int index, oldIndex;
index = key.indexOf("/"); if (index == -1 || index + 1 == key.length()) thrownew Exception("Malformed input file: no slashes in \"" + key + "\"");
rbName = key.substring(0, index);
oldIndex = index + 1;
index = key.indexOf("/", oldIndex); if (index == -1 || index + 1 == key.length()) thrownew Exception("Malformed input file: \"" + key + "\" is missing locale name");
localeName = key.substring(oldIndex, index); boolean use_tag = localeName.indexOf("-") != -1; if (use_tag == false && localeName.length() > 0) {
String[] locDetails = localeName.split("_"); switch (locDetails.length) { case1:
language = locDetails[0]; break; case2:
language = locDetails[0];
country = locDetails[1]; break; case3:
language = locDetails[0];
country = locDetails[1];
variant = locDetails[2]; break; default: thrownew Exception("locale not specified properly " + locDetails);
}
}
oldIndex = index + 1;
index = key.indexOf("/", oldIndex); if (index == -1)
index = key.length();
resTag = key.substring(oldIndex, index);
// TimeZone name may have "/" in it, for example "Asia/Taipei", so use "Asia\/Taipei in LocaleData. if(resTag.endsWith("\\")) {
resTag = resTag.substring(0, resTag.length() - 1);
oldIndex = index;
index = key.indexOf("/", oldIndex + 1); if (index == -1) index = key.length();
resTag += key.substring(oldIndex, index);
}
class EscapeReader extends FilterReader { public EscapeReader(Reader in) { super(in);
}
publicint read() throws IOException { if (buffer != null) {
String b = buffer.toString(); int result = b.charAt(0); if (b.length() > 1)
buffer = new StringBuffer(b.substring(1)); else
buffer = null; return result;
} else { int result = super.read(); if (result != '\\') return result; else {
buffer = new StringBuffer();
result = super.read();
buffer.append((char)result); if (result == 'u') { for (int i = 0; i < 4; i++) {
result = super.read(); if (result == -1) break;
buffer.append((char)result);
}
String number = buffer.toString().substring(1);
result = Integer.parseInt(number, 16);
buffer = null; return result;
} return'\\';
}
}
}
publicint read(char[] cbuf, int start, int len) throws IOException { int p = start; int end = start + len; int c = 0; while (c != -1 && p < end) {
c = read(); if (c != -1)
cbuf[p++] = (char)c;
} if (c == -1 && p == start) return -1; else return p - start;
}
private StringBuffer buffer = null;
}
class EscapeWriter extends FilterWriter { public EscapeWriter(Writer out) { super(out);
}
publicvoid write(int c) throws IOException { if ((c >= ' ' && c <= '\u007e') || c == '\r' || c == '\n') super.write(c); else { super.write('\\'); super.write('u');
String number = Integer.toHexString(c); if (number.length() < 4)
number = zeros.substring(0, 4 - number.length()) + number; super.write(number.charAt(0)); super.write(number.charAt(1)); super.write(number.charAt(2)); super.write(number.charAt(3));
}
}
publicvoid write(char[] cbuf, int off, int len) throws IOException { int end = off + len; while (off < end)
write(cbuf[off++]);
}
publicvoid write(String str, int off, int len) throws IOException { int end = off + len; while (off < end)
write(str.charAt(off++));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.