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