/* * 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; } }