src/share/classes/sun/util/calendar/LocalGregorianCalendar.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2005, 2013, 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. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2005, 2014, 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. Oracle designates this
*** 23,46 ****
* questions.
*/
package sun.util.calendar;
! import java.io.IOException;
! import java.util.ArrayList;
! import java.util.List;
! import java.util.Properties;
import java.util.StringTokenizer;
import java.util.TimeZone;
/**
*
* @author Masayoshi Okutsu
* @since 1.6
*/
public class LocalGregorianCalendar extends BaseCalendar {
private String name;
private Era[] eras;
public static class Date extends BaseCalendar.Date {
--- 23,65 ----
* questions.
*/
package sun.util.calendar;
! import java.security.AccessController;
import java.util.StringTokenizer;
import java.util.TimeZone;
/**
*
* @author Masayoshi Okutsu
* @since 1.6
*/
public class LocalGregorianCalendar extends BaseCalendar {
+ private static final Era[] JAPANESE_ERAS = {
+ new Era("Meiji", "M", -3218832000000L, true),
+ new Era("Taisho", "T", -1812153600000L, true),
+ new Era("Showa", "S", -1357603200000L, true),
+ new Era("Heisei", "H", 600220800000L, true),
+ };
+
+ private static boolean isValidEra(Era newEra, Era[] eras) {
+ Era last = eras[eras.length - 1];
+ if (last.getSinceDate().getYear() >= newEra.getSinceDate().getYear()) {
+ return false;
+ }
+ // The new era name should be unique. Its abbr may not.
+ String newName = newEra.getName();
+ for (Era era : eras) {
+ if (era.getName().equals(newName)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
private String name;
private Era[] eras;
public static class Date extends BaseCalendar.Date {
*** 116,177 ****
return sb.toString();
}
}
static LocalGregorianCalendar getLocalGregorianCalendar(String name) {
! Properties calendarProps;
! try {
! calendarProps = CalendarSystem.getCalendarProperties();
! } catch (IOException | IllegalArgumentException e) {
! throw new InternalError(e);
! }
! // Parse calendar.*.eras
! String props = calendarProps.getProperty("calendar." + name + ".eras");
! if (props == null) {
return null;
}
! List<Era> eras = new ArrayList<>();
! StringTokenizer eraTokens = new StringTokenizer(props, ";");
! while (eraTokens.hasMoreTokens()) {
! String items = eraTokens.nextToken().trim();
! StringTokenizer itemTokens = new StringTokenizer(items, ",");
String eraName = null;
boolean localTime = true;
long since = 0;
String abbr = null;
while (itemTokens.hasMoreTokens()) {
String item = itemTokens.nextToken();
int index = item.indexOf('=');
// it must be in the key=value form.
if (index == -1) {
! return null;
}
! String key = item.substring(0, index);
! String value = item.substring(index + 1);
! if ("name".equals(key)) {
eraName = value;
! } else if ("since".equals(key)) {
if (value.endsWith("u")) {
localTime = false;
! since = Long.parseLong(value.substring(0, value.length() - 1));
! } else {
since = Long.parseLong(value);
}
! } else if ("abbr".equals(key)) {
abbr = value;
! } else {
! throw new RuntimeException("Unknown key word: " + key);
}
}
! Era era = new Era(eraName, abbr, since, localTime);
! eras.add(era);
}
! Era[] eraArray = new Era[eras.size()];
! eras.toArray(eraArray);
!
! return new LocalGregorianCalendar(name, eraArray);
}
private LocalGregorianCalendar(String name, Era[] eras) {
this.name = name;
this.eras = eras;
--- 135,210 ----
return sb.toString();
}
}
static LocalGregorianCalendar getLocalGregorianCalendar(String name) {
! // Only the Japanese calendar is supported.
! if (!"japanese".equals(name)) {
return null;
}
!
! // Append an era to the predefined eras if it's given by the property.
! String prop = AccessController.doPrivileged(
! new sun.security.action.GetPropertyAction("jdk.calendar.japanese.supplemental.era"));
! if (prop != null) {
! Era era = parseEraEntry(prop);
! if (era != null) {
! if (isValidEra(era, JAPANESE_ERAS)) {
! int length = JAPANESE_ERAS.length;
! Era[] eras = new Era[length + 1];
! System.arraycopy(JAPANESE_ERAS, 0, eras, 0, length);
! eras[length] = era;
! return new LocalGregorianCalendar(name, eras);
! }
! }
! }
! return new LocalGregorianCalendar(name, JAPANESE_ERAS);
! }
!
! private static Era parseEraEntry(String entry) {
! StringTokenizer itemTokens = new StringTokenizer(entry, ",");
String eraName = null;
boolean localTime = true;
long since = 0;
String abbr = null;
while (itemTokens.hasMoreTokens()) {
String item = itemTokens.nextToken();
int index = item.indexOf('=');
// it must be in the key=value form.
if (index == -1) {
! throw new RuntimeException("Syntax error: " + item);
}
! String key = item.substring(0, index).trim();
! String value = item.substring(index + 1).trim();
! switch (key) {
! case "name":
eraName = value;
! break;
! case "since":
if (value.endsWith("u")) {
localTime = false;
! value = value.substring(0, value.length() - 1);
! }
! try {
since = Long.parseLong(value);
+ } catch (NumberFormatException e) {
+ return null;
}
! break;
! case "abbr":
abbr = value;
! break;
! default:
! return null;
}
}
! if (eraName == null || eraName.isEmpty()
! || abbr == null || abbr.isEmpty()) {
! return null;
}
! return new Era(eraName, abbr, since, localTime);
}
private LocalGregorianCalendar(String name, Era[] eras) {
this.name = name;
this.eras = eras;
*** 260,272 ****
}
return super.validate(ldate);
}
private boolean validateEra(Era era) {
! // Validate the era
! for (int i = 0; i < eras.length; i++) {
! if (era == eras[i]) {
return true;
}
}
return false;
}
--- 293,304 ----
}
return super.validate(ldate);
}
private boolean validateEra(Era era) {
! for (Era era1 : eras) {
! if (era == era1) {
return true;
}
}
return false;
}
*** 331,340 ****
--- 363,373 ----
}
}
}
if (i >= 0) {
ldate.setLocalEra(era);
+ @SuppressWarnings("null")
int y = ldate.getNormalizedYear() - era.getSinceDate().getYear() + 1;
ldate.setLocalYear(y);
} else {
// Set Gregorian year with no era
ldate.setEra(null);