/*
 * Copyright (c) 2000, 2011, 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
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * 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.
 */

package sun.util.calendar;


@SuppressWarnings({"unchecked", "deprecation", "all"})
public abstract class CalendarDate implements java.lang.Cloneable {

    protected CalendarDate() {
        throw new RuntimeException("Stub!");
    }

    protected CalendarDate(java.util.TimeZone zone) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.Era getEra() {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate setEra(sun.util.calendar.Era era) {
        throw new RuntimeException("Stub!");
    }

    @android.compat.annotation.UnsupportedAppUsage
    public int getYear() {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate setYear(int year) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate addYear(int n) {
        throw new RuntimeException("Stub!");
    }

    public boolean isLeapYear() {
        throw new RuntimeException("Stub!");
    }

    void setLeapYear(boolean leapYear) {
        throw new RuntimeException("Stub!");
    }

    @android.compat.annotation.UnsupportedAppUsage
    public int getMonth() {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate setMonth(int month) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate addMonth(int n) {
        throw new RuntimeException("Stub!");
    }

    @android.compat.annotation.UnsupportedAppUsage
    public int getDayOfMonth() {
        throw new RuntimeException("Stub!");
    }

    @android.compat.annotation.UnsupportedAppUsage
    public sun.util.calendar.CalendarDate setDayOfMonth(int date) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate addDayOfMonth(int n) {
        throw new RuntimeException("Stub!");
    }

    public int getDayOfWeek() {
        throw new RuntimeException("Stub!");
    }

    public int getHours() {
        throw new RuntimeException("Stub!");
    }

    @android.compat.annotation.UnsupportedAppUsage
    public sun.util.calendar.CalendarDate setHours(int hours) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate addHours(int n) {
        throw new RuntimeException("Stub!");
    }

    public int getMinutes() {
        throw new RuntimeException("Stub!");
    }

    @android.compat.annotation.UnsupportedAppUsage
    public sun.util.calendar.CalendarDate setMinutes(int minutes) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate addMinutes(int n) {
        throw new RuntimeException("Stub!");
    }

    public int getSeconds() {
        throw new RuntimeException("Stub!");
    }

    @android.compat.annotation.UnsupportedAppUsage
    public sun.util.calendar.CalendarDate setSeconds(int seconds) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate addSeconds(int n) {
        throw new RuntimeException("Stub!");
    }

    public int getMillis() {
        throw new RuntimeException("Stub!");
    }

    @android.compat.annotation.UnsupportedAppUsage
    public sun.util.calendar.CalendarDate setMillis(int millis) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate addMillis(int n) {
        throw new RuntimeException("Stub!");
    }

    @android.compat.annotation.UnsupportedAppUsage
    public long getTimeOfDay() {
        throw new RuntimeException("Stub!");
    }

    @android.compat.annotation.UnsupportedAppUsage
    public sun.util.calendar.CalendarDate setDate(int year, int month, int dayOfMonth) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate addDate(int year, int month, int dayOfMonth) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate setTimeOfDay(
            int hours, int minutes, int seconds, int millis) {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate addTimeOfDay(
            int hours, int minutes, int seconds, int millis) {
        throw new RuntimeException("Stub!");
    }

    protected void setTimeOfDay(long fraction) {
        throw new RuntimeException("Stub!");
    }

    public boolean isNormalized() {
        throw new RuntimeException("Stub!");
    }

    public boolean isStandardTime() {
        throw new RuntimeException("Stub!");
    }

    public void setStandardTime(boolean standardTime) {
        throw new RuntimeException("Stub!");
    }

    public boolean isDaylightTime() {
        throw new RuntimeException("Stub!");
    }

    protected void setLocale(java.util.Locale loc) {
        throw new RuntimeException("Stub!");
    }

    public java.util.TimeZone getZone() {
        throw new RuntimeException("Stub!");
    }

    public sun.util.calendar.CalendarDate setZone(java.util.TimeZone zoneinfo) {
        throw new RuntimeException("Stub!");
    }

    public boolean isSameDate(sun.util.calendar.CalendarDate date) {
        throw new RuntimeException("Stub!");
    }

    public boolean equals(java.lang.Object obj) {
        throw new RuntimeException("Stub!");
    }

    public int hashCode() {
        throw new RuntimeException("Stub!");
    }

    public java.lang.Object clone() {
        throw new RuntimeException("Stub!");
    }

    public java.lang.String toString() {
        throw new RuntimeException("Stub!");
    }

    protected void setDayOfWeek(int dayOfWeek) {
        throw new RuntimeException("Stub!");
    }

    protected void setNormalized(boolean normalized) {
        throw new RuntimeException("Stub!");
    }

    public int getZoneOffset() {
        throw new RuntimeException("Stub!");
    }

    protected void setZoneOffset(int offset) {
        throw new RuntimeException("Stub!");
    }

    public int getDaylightSaving() {
        throw new RuntimeException("Stub!");
    }

    protected void setDaylightSaving(int daylightSaving) {
        throw new RuntimeException("Stub!");
    }

    public static final int FIELD_UNDEFINED = -2147483648; // 0x80000000

    public static final long TIME_UNDEFINED = -9223372036854775808L; // 0x8000000000000000L

    private int dayOfMonth;

    private int dayOfWeek = -2147483648; // 0x80000000

    private int daylightSaving;

    private sun.util.calendar.Era era;

    private boolean forceStandardTime;

    private long fraction;

    private int hours;

    private boolean leapYear;

    private java.util.Locale locale;

    private int millis;

    private int minutes;

    private int month;

    private boolean normalized;

    private int seconds;

    private int year;

    private int zoneOffset;

    private java.util.TimeZone zoneinfo;
}
