blob: 90d63e287d746e6c7a7ad65f8857b6f308cec003 [file] [log] [blame]
/*
* 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;
}
}