/*
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
*
*/
/*
* This class is used by ExpirationTest.sh. See the timing information in
* the shell script.
*/
import java.util.*;
public class ExpirationTest {
static final Locale AUSTRIA = new Locale("de", "AT");
static String format;
static String fileType;
public static void main(String[] args) {
// If -latency is specified, try sleeping for 3 seconds 3
// times to see its latency. If the latency is too large, then
// the program exits with 2. (See sleep())
if ("-latency".equals(args[0])) {
System.out.print("Checking latency... ");
for (int i = 0; i < 3; i++) {
sleep(3);
}
System.out.println("done");
System.exit(0);
}
format = args[0];
fileType = args[1];
Locale loc = Locale.getDefault();
try {
Locale.setDefault(Locale.JAPAN);
ResourceBundle.Control control = new TestControl();
ResourceBundle rb = ResourceBundle.getBundle("ExpirationData", Locale.GERMAN,
control);
check(rb.getString("data"), "German");
rb = ResourceBundle.getBundle("ExpirationData", AUSTRIA, control);
check(rb.getString("january"), "Januar");
// Wait until the instance gets expired in the cache in 7 seconds.
sleep(7);
// At this point, it should be determined that reloading is not needed.
rb = ResourceBundle.getBundle("ExpirationData", Locale.GERMAN, control);
check(rb.getString("data"), "German");
rb = ResourceBundle.getBundle("ExpirationData", AUSTRIA, control);
check(rb.getString("january"), "Januar");
// Wait until the instance in the cache gets expired again and
// ExpirationData_de gets updated.
// 33 = 40 - 7 (See the timing chart in ExpirationTest.sh)
sleep(33);
// At this point, getBundle must reload the updated
// ExpirationData_de and ExpirationData_de_AT must be
// avaible.
rb = ResourceBundle.getBundle("ExpirationData", Locale.GERMAN, control);
try {
check(rb.getString("data"), "Deutsch");
} catch (RuntimeException e) {
if (format.equals("class")) {
// Class loader doesn't load updated classes.
System.out.println("Known class limitation: " + e.getMessage());
}
}
rb = ResourceBundle.getBundle("ExpirationData", AUSTRIA, control);
try {
check(rb.getString("january"), "J\u00e4nner");
} catch (RuntimeException e) {
if (fileType.equals("jar")) {
// Jar doesn't load new entries.
System.out.println("Known jar limitation: " + e.getMessage());
} else {
throw e;
}
}
} finally {
Locale.setDefault(loc);
}
}
private static void check(String s, String expected) {
String time = getTime();
if (!s.equals(expected)) {
throw new RuntimeException("got '" + s + "', expected '" + expected + "' at "
+ time);
}
System.out.println("ExpirationTest: got '" + s + "' at " + time);
}
private static void sleep(int seconds) {
long millis = seconds * 1000;
long start = System.currentTimeMillis();
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
long end = System.currentTimeMillis();
long latency = end - start - millis;
// If the latecy is more than 1% of the requested sleep time,
// then give up the testing.
if (latency > millis/100) {
System.err.printf("Latency is too large: slept for %d [ms], "
+ "expected %d [ms] latency rate: %+.2f%% (expected not more than 1%%)%n"
+ "exiting...%n",
end - start, millis, (double)latency*100.0/millis);
System.exit(2);
}
}
private static final String getTime() {
return new Date().toString().substring(11, 19);
}
private static class TestControl extends ResourceBundle.Control {
@Override
public long getTimeToLive(String name, Locale loc) {
return 5000; // 5 seconds
}
@Override
public ResourceBundle newBundle(String name, Locale loc,
String fmt, ClassLoader cl, boolean reload)
throws IllegalAccessException, InstantiationException, java.io.IOException {
ResourceBundle bundle = super.newBundle(name, loc, fmt, cl, reload);
if (bundle != null) {
System.out.println("newBundle: " + (reload ? "**re" : "")
+ "loaded '" + toName(name, loc , fmt) + "' at " + getTime());
}
return bundle;
}
@Override
public boolean needsReload(String name, Locale loc,
String fmt, ClassLoader cl,
ResourceBundle rb, long time) {
boolean b = super.needsReload(name, loc, fmt, cl, rb, time);
System.out.println("needsReload: '" + b + "' for " + toName(name, loc, fmt)
+ " at " + getTime());
return b;
}
private String toName(String name, Locale loc, String fmt) {
return toResourceName(toBundleName(name, loc), fmt.substring(5));
}
}
}