2a510a6353
Reviewed-by: rriggs, chegar
438 lines
12 KiB
Java
438 lines
12 KiB
Java
/*
|
|
* Copyright (c) 2007, 2019, 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.
|
|
*/
|
|
|
|
|
|
import java.util.Calendar;
|
|
import sun.util.calendar.CalendarUtils;
|
|
|
|
public class CalendarAdapter extends Calendar {
|
|
public static enum Type {
|
|
GREGORIAN, BUDDHIST, JAPANESE;
|
|
}
|
|
|
|
static final String[] FIELD_NAMES = {
|
|
"ERA", "YEAR", "MONTH", "WEEK_OF_YEAR", "WEEK_OF_MONTH", "DAY_OF_MONTH",
|
|
"DAY_OF_YEAR", "DAY_OF_WEEK", "DAY_OF_WEEK_IN_MONTH", "AM_PM", "HOUR",
|
|
"HOUR_OF_DAY", "MINUTE", "SECOND", "MILLISECOND", "ZONE_OFFSET",
|
|
"DST_OFFSET"
|
|
};
|
|
|
|
Calendar cal;
|
|
GregorianAdapter gcal;
|
|
private Type type;
|
|
|
|
public CalendarAdapter(Calendar cal) {
|
|
if (cal == null)
|
|
throw new NullPointerException();
|
|
|
|
this.cal = cal;
|
|
if (cal instanceof sun.util.BuddhistCalendar) {
|
|
type = Type.BUDDHIST;
|
|
} else if (cal instanceof GregorianAdapter) {
|
|
type = Type.GREGORIAN;
|
|
gcal = (GregorianAdapter) cal;
|
|
} else {
|
|
type = Type.JAPANESE;
|
|
}
|
|
}
|
|
|
|
public void setFirstDayOfWeek(int w) {
|
|
cal.setFirstDayOfWeek(w);
|
|
}
|
|
|
|
public int getFirstDayOfWeek() {
|
|
return cal.getFirstDayOfWeek();
|
|
}
|
|
|
|
public void setMinimalDaysInFirstWeek(int value) {
|
|
cal.setMinimalDaysInFirstWeek(value);
|
|
}
|
|
|
|
public int getMinimalDaysInFirstWeek() {
|
|
return getMinimalDaysInFirstWeek();
|
|
}
|
|
|
|
public long getTimeInMillis() {
|
|
return cal.getTimeInMillis();
|
|
}
|
|
|
|
public void setTimeInMillis(long millis) {
|
|
cal.setTimeInMillis(millis);
|
|
}
|
|
|
|
public int get(int field) {
|
|
return cal.get(field);
|
|
}
|
|
|
|
public void set(int field, int value) {
|
|
cal.set(field, value);
|
|
}
|
|
|
|
public void add(int field, int amount) {
|
|
cal.add(field, amount);
|
|
}
|
|
|
|
public void roll(int field, boolean dir) {
|
|
cal.roll(field, dir);
|
|
}
|
|
|
|
public void roll(int field, int amount) {
|
|
cal.roll(field, amount);
|
|
}
|
|
|
|
public void setDate(int year, int month, int date)
|
|
{
|
|
cal.set(year, month, date);
|
|
}
|
|
|
|
public void setDate(int era, int year, int month, int date) {
|
|
cal.set(ERA, era);
|
|
cal.set(year, month, date);
|
|
}
|
|
|
|
public void setDateTime(int year, int month, int date, int hourOfDay, int minute, int second)
|
|
{
|
|
cal.set(year, month, date, hourOfDay, minute, second);
|
|
}
|
|
|
|
public void clearAll() {
|
|
cal.clear();
|
|
}
|
|
|
|
public void clearField(int field)
|
|
{
|
|
cal.clear(field);
|
|
}
|
|
|
|
public boolean isSetField(int field)
|
|
{
|
|
return cal.isSet(field);
|
|
}
|
|
|
|
public int getMaximum(int field) {
|
|
return cal.getMaximum(field);
|
|
}
|
|
|
|
public int getLeastMaximum(int field) {
|
|
return cal.getLeastMaximum(field);
|
|
}
|
|
|
|
public int getActualMaximum(int field) {
|
|
return cal.getActualMaximum(field);
|
|
}
|
|
|
|
public int getMinimum(int field) {
|
|
return cal.getMinimum(field);
|
|
}
|
|
|
|
public int getGreatestMinimum(int field) {
|
|
return cal.getGreatestMinimum(field);
|
|
}
|
|
|
|
public int getActualMinimum(int field) {
|
|
return cal.getActualMinimum(field);
|
|
}
|
|
|
|
public void setLenient(boolean lenient) {
|
|
cal.setLenient(lenient);
|
|
}
|
|
|
|
public String toString() {
|
|
return cal.toString();
|
|
}
|
|
|
|
protected void computeFields() {
|
|
}
|
|
|
|
protected void computeTime() {
|
|
}
|
|
|
|
void setTimeOfDay(int hourOfDay, int minute, int second, int ms) {
|
|
cal.set(HOUR_OF_DAY, hourOfDay);
|
|
cal.set(MINUTE, minute);
|
|
cal.set(SECOND, second);
|
|
cal.set(MILLISECOND, ms);
|
|
}
|
|
|
|
// GregorianAdapter specific methods
|
|
|
|
// When gcal is null, the methods throw a NPE.
|
|
|
|
int getSetStateFields() {
|
|
return gcal.getSetStateFields();
|
|
}
|
|
|
|
int[] getFields() {
|
|
return gcal.getFields();
|
|
}
|
|
|
|
boolean checkInternalDate(int year, int month, int dayOfMonth) {
|
|
return gcal.checkInternalDate(year, month, dayOfMonth);
|
|
}
|
|
|
|
boolean checkInternalDate(int year, int month, int dayOfMonth, int dayOfWeek) {
|
|
return gcal.checkInternalDate(year, month, dayOfMonth, dayOfWeek);
|
|
}
|
|
|
|
boolean checkInternalField(int field, int expectedValue) {
|
|
return checkInternalField(field, expectedValue);
|
|
}
|
|
|
|
// check methods
|
|
|
|
boolean checkAllSet() {
|
|
initTest();
|
|
for (int i = 0; i < FIELD_COUNT; i++) {
|
|
checkFieldState(i, true);
|
|
}
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkMaximum(int field, int expectedValue) {
|
|
int val;
|
|
if ((val = getMaximum(field)) != expectedValue) {
|
|
appendMessage("getMaximum("+FIELD_NAMES[field]+"): got " + val
|
|
+ " expected " + expectedValue);
|
|
}
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkActualMaximum(int field, int expectedValue) {
|
|
int val;
|
|
if ((val = getActualMaximum(field)) != expectedValue) {
|
|
appendMessage("getActualMaximum("+FIELD_NAMES[field]+"): got " + val
|
|
+ " expected " + expectedValue);
|
|
}
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkLeastMaximum(int field, int expectedValue) {
|
|
int val;
|
|
if ((val = getLeastMaximum(field)) != expectedValue) {
|
|
appendMessage("getLeastMaximum("+FIELD_NAMES[field]+"): got " + val
|
|
+ " expected " + expectedValue);
|
|
}
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkMinimum(int field, int expectedValue) {
|
|
int val;
|
|
if ((val = getMinimum(field)) != expectedValue) {
|
|
appendMessage("getMinimum("+FIELD_NAMES[field]+"): got " + val
|
|
+ " expected " + expectedValue);
|
|
}
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkActualMinimum(int field, int expectedValue) {
|
|
int val;
|
|
if ((val = getActualMinimum(field)) != expectedValue) {
|
|
appendMessage("getActualMinimum("+FIELD_NAMES[field]+"): got " + val
|
|
+ " expected " + expectedValue);
|
|
}
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkGreatestMinimum(int field, int expectedValue) {
|
|
int val;
|
|
if ((val = getGreatestMinimum(field)) != expectedValue) {
|
|
appendMessage("getGreatestMinimum("+FIELD_NAMES[field]+"): got " + val
|
|
+ " expected " + expectedValue);
|
|
}
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkDate(int year, int month, int dayOfMonth) {
|
|
initTest();
|
|
checkField(YEAR, year);
|
|
checkField(MONTH, month);
|
|
checkField(DAY_OF_MONTH, dayOfMonth);
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkDate(int era, int year, int month, int dayOfMonth) {
|
|
initTest();
|
|
checkField(ERA, era);
|
|
checkField(YEAR, year);
|
|
checkField(MONTH, month);
|
|
checkField(DAY_OF_MONTH, dayOfMonth);
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkDateTime(int year, int month, int dayOfMonth,
|
|
int hourOfDay, int minute, int second) {
|
|
initTest();
|
|
checkField(YEAR, year);
|
|
checkField(MONTH, month);
|
|
checkField(DAY_OF_MONTH, dayOfMonth);
|
|
checkField(HOUR_OF_DAY, hourOfDay);
|
|
checkField(MINUTE, minute);
|
|
checkField(SECOND, second);
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkDateTime(int year, int month, int dayOfMonth,
|
|
int hourOfDay, int minute, int second, int ms) {
|
|
initTest();
|
|
checkField(YEAR, year);
|
|
checkField(MONTH, month);
|
|
checkField(DAY_OF_MONTH, dayOfMonth);
|
|
checkField(HOUR_OF_DAY, hourOfDay);
|
|
checkField(MINUTE, minute);
|
|
checkField(SECOND, second);
|
|
checkField(MILLISECOND, ms);
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkTimeOfDay(int hourOfDay, int minute, int second, int ms) {
|
|
initTest();
|
|
checkField(HOUR_OF_DAY, hourOfDay);
|
|
checkField(MINUTE, minute);
|
|
checkField(SECOND, second);
|
|
checkField(MILLISECOND, ms);
|
|
return getStatus();
|
|
}
|
|
|
|
boolean checkMillis(long millis) {
|
|
initTest();
|
|
long t = cal.getTimeInMillis();
|
|
if (t != millis) {
|
|
appendMessage("wrong millis: got " + t + ", expected " + millis);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
boolean checkFieldState(int field, boolean expectedState) {
|
|
if (isSet(field) != expectedState) {
|
|
appendMessage(FIELD_NAMES[field] + " state is not " + expectedState + "; ");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
boolean checkField(int field, int expectedValue) {
|
|
int val;
|
|
if ((val = get(field)) != expectedValue) {
|
|
appendMessage("get(" + FIELD_NAMES[field] + "): got " + val +
|
|
", expected " + expectedValue + "; ");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static final String fieldName(int field) {
|
|
return FIELD_NAMES[field];
|
|
}
|
|
|
|
String toDateString() {
|
|
StringBuffer sb = new StringBuffer();
|
|
String[] eraNames = null;
|
|
switch (type) {
|
|
case GREGORIAN:
|
|
eraNames = new String[] { "BCE", "" };
|
|
break;
|
|
|
|
case BUDDHIST:
|
|
eraNames = new String[] { "Before BE", "BE"};
|
|
break;
|
|
|
|
case JAPANESE:
|
|
eraNames = new String[] {
|
|
"BeforeMeiji",
|
|
"Meiji",
|
|
"Taisho",
|
|
"Showa",
|
|
"Heisei",
|
|
"Reiwa"
|
|
};
|
|
break;
|
|
}
|
|
|
|
sb.append(eraNames[cal.get(ERA)]);
|
|
if (sb.length() > 0)
|
|
sb.append(' ');
|
|
CalendarUtils.sprintf0d(sb, cal.get(YEAR), 4).append('-');
|
|
CalendarUtils.sprintf0d(sb, cal.get(MONTH)+1, 2).append('-');
|
|
CalendarUtils.sprintf0d(sb, cal.get(DAY_OF_MONTH), 2);
|
|
return sb.toString();
|
|
}
|
|
|
|
String toTimeString() {
|
|
StringBuffer sb = new StringBuffer();
|
|
CalendarUtils.sprintf0d(sb, cal.get(HOUR_OF_DAY), 2).append(':');
|
|
CalendarUtils.sprintf0d(sb, cal.get(MINUTE), 2).append(':');
|
|
CalendarUtils.sprintf0d(sb, cal.get(SECOND),2 ).append('.');
|
|
CalendarUtils.sprintf0d(sb, cal.get(MILLISECOND), 3);
|
|
int zoneOffset = cal.get(ZONE_OFFSET) + cal.get(DST_OFFSET);
|
|
if (zoneOffset == 0) {
|
|
sb.append('Z');
|
|
} else {
|
|
int offset;
|
|
char sign;
|
|
if (zoneOffset > 0) {
|
|
offset = zoneOffset;
|
|
sign = '+';
|
|
} else {
|
|
offset = -zoneOffset;
|
|
sign = '-';
|
|
}
|
|
offset /= 60000;
|
|
sb.append(sign);
|
|
CalendarUtils.sprintf0d(sb, offset / 60, 2);
|
|
CalendarUtils.sprintf0d(sb, offset % 60, 2);
|
|
}
|
|
return sb.toString();
|
|
}
|
|
|
|
String toDateTimeString() {
|
|
return toDateString() + "T" + toTimeString();
|
|
}
|
|
|
|
// Message handling
|
|
|
|
StringBuffer msg = new StringBuffer();
|
|
|
|
private void initTest() {
|
|
msg = new StringBuffer();
|
|
}
|
|
|
|
String getMessage() {
|
|
String s = msg.toString();
|
|
msg = new StringBuffer();
|
|
return " " + s;
|
|
}
|
|
|
|
private void setMessage(String msg) {
|
|
this.msg = new StringBuffer(msg);
|
|
}
|
|
|
|
private void appendMessage(String msg) {
|
|
this.msg.append(msg);
|
|
}
|
|
|
|
boolean getStatus() {
|
|
return msg.length() == 0;
|
|
}
|
|
}
|