/*
**********************************************************************
* Copyright (c) 2003-2004, International Business Machines
* Corporation and others.  All Rights Reserved.
**********************************************************************
* Author: Alan Liu
* Created: October 2 2003
* Since: ICU 2.8
**********************************************************************
*/
package com.ibm.icu.impl;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.util.SimpleTimeZone;
import java.util.Date;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import java.io.IOException;

/**
 * A wrapper around a java.util.TimeZone object.  This is a concrete
 * instance of TimeZone.  All TimeZones that wrap a java.util.TimeZone
 * should inherit from this class.  TimeZones that do not wrap a
 * java.util.TimeZone inherit directly from TimeZone.
 *
 * The complement of this is TimeZoneAdapter, which makes a
 * com.ibm.icu.util.TimeZone look like a java.util.TimeZone.
 *
 * @see com.ibm.icu.impl.JDKTimeZone
 * @author Alan Liu
 * @since ICU 2.8
 */
public class JDKTimeZone extends TimeZone {

    /**
     * The java.util.TimeZone wrapped by this object.  Must not be null.
     */
    transient java.util.TimeZone zone;

    /**
     * Given a java.util.TimeZone, wrap it in the appropriate adapter
     * subclass of com.ibm.icu.util.TimeZone and return the adapter.
     */
    public static TimeZone wrap(java.util.TimeZone tz) {
        if (tz instanceof TimeZoneAdapter) {
            return ((TimeZoneAdapter) tz).unwrap();
        }
        if (tz instanceof java.util.SimpleTimeZone) {
            return new SimpleTimeZone((java.util.SimpleTimeZone) tz);
        }
        return new JDKTimeZone(tz);
    }

    /**
     * Return the java.util.TimeZone wrapped by this object.
     */
    public java.util.TimeZone unwrap() {
        return zone;
    }

    /**
     * Constructs a JDKTimeZone given a java.util.TimeZone reference
     * which must not be null.
     * @param tz the time zone to wrap
     */
    protected JDKTimeZone(java.util.TimeZone tz) {
        zone = tz;
        super.setID(zone.getID());
    }

    /**
     * Sets the time zone ID. This does not change any other data in
     * the time zone object.
     * @param ID the new time zone ID.
     */
    public void setID(String ID) {
        super.setID(ID);
        zone.setID(ID);
    }

    /**
     * TimeZone API; calls through to wrapped time zone.
     */
    public int getOffset(int era, int year, int month, int day,
                         int dayOfWeek, int milliseconds) {
        return unwrap().getOffset(era, year, month, day,
                                  dayOfWeek, milliseconds);
    }

    /**
     * Override TimeZone to handle wrapped ZoneInfo.
     */
    public void getOffset(long date, boolean local, int[] offsets) {
        // The following code works on 1.4 or later.  Since we need to
        // be compatible with 1.3, we have to use reflection.
        //| if (zone instanceof ZoneInfo) {
        //|     ((ZoneInfo) zone).getOffsets(date, offsets);
        //|     if (local) {
        //|         date -= offsets[0] + offsets[1];
        //|         ((ZoneInfo) zone).getOffsets(date, offsets);
        //|     }
        //| } else {
        //|     super.getOffset(date, local, offsets);
        //| }

        try {
            Class zoneInfo = Class.forName("sun.util.calendar.ZoneInfo");
            if (zoneInfo.isInstance(zone)) {
                Method getOffsets = zoneInfo.getMethod("getOffsets",
                       new Class[] { Long.TYPE, Class.forName("[I") });
                Object[] args = new Object[] { new Long(date), offsets };
                getOffsets.invoke(zone, args);
                if (local) {
                    date -= offsets[0] + offsets[1];
                    args[0] = new Long(date);
                    getOffsets.invoke(zone, args);
                }
                return;
            }
        } catch (ClassNotFoundException e1) {
            // ok; fall through
        } catch (SecurityException ex) {
            // ok; fall through, we're running in a protected context
        } catch (NoSuchMethodException e2) {
            throw new RuntimeException(); // should not occur
        } catch (IllegalAccessException e3) {
            throw new RuntimeException(); // should not occur
        } catch (InvocationTargetException e4) {
            throw new RuntimeException(); // should not occur
        }
        super.getOffset(date, local, offsets);
    }
 
    /**
     * TimeZone API; calls through to wrapped time zone.
     */
    public void setRawOffset(int offsetMillis) {
        unwrap().setRawOffset(offsetMillis);
    }

    /**
     * TimeZone API; calls through to wrapped time zone.
     */
    public int getRawOffset() {
        return unwrap().getRawOffset();
    }

    /**
     * TimeZone API; calls through to wrapped time zone.
     */
    public boolean useDaylightTime() {
        return unwrap().useDaylightTime();
    }

    /**
     * TimeZone API; calls through to wrapped time zone.
     */
    public boolean inDaylightTime(Date date) {
        return unwrap().inDaylightTime(date);
    }

    /**
     * TimeZone API.
     */
    public boolean hasSameRules(TimeZone other) {
        if (other == null) {
            return false;
        }
        if (other instanceof JDKTimeZone) {
            return zone.hasSameRules(((JDKTimeZone) other).zone);
        }
        return super.hasSameRules(other);
    }

    /**
     * Boilerplate API; calls through to wrapped object.
     */
    public Object clone() {
        return wrap((java.util.TimeZone)zone.clone());
    }

    /**
     * Boilerplate API; calls through to wrapped object.
     */
    public synchronized int hashCode() {
        return unwrap().hashCode();
    }

    /**
     * Returns the amount of time in ms that the clock is advanced during DST.
     * @return the number of milliseconds the time is
     * advanced with respect to standard time when the daylight savings rules
     * are in effect. A positive number, typically one hour (3600000).
     * @stable ICU 2.0
     */
    public int getDSTSavings() {
	if (useDaylightTime()) {
	    try {   
		// This is only to make a 1.3 compiler happy.  JDKTimeZone
		// is only used in JDK 1.4, where TimeZone has the getDSTSavings
		// API on it, so a straight call to getDSTSavings would actually
		// work if we could compile it.  Since on 1.4 the time zone is
		// not a SimpleTimeZone, we can't downcast in order to make
		// the direct call that a 1.3 compiler would like, because at
		// runtime the downcast would fail.
		// todo: remove when we no longer support compiling under 1.3

		// The following works if getDSTSavings is declared in   
		// TimeZone (JDK 1.4) or SimpleTimeZone (JDK 1.3).   
		final Object[] args = new Object[0];
		final Class[] argtypes = new Class[0];
		Method m = zone.getClass().getMethod("getDSTSavings", argtypes); 
		return ((Integer) m.invoke(zone, args)).intValue();   
	    } catch (Exception e) {
	    	// if zone is in the sun.foo class hierarchy and we
	    	// are in a protection domain, we'll get a security
	    	// exception.  And if we claim to support DST, but 
	    	// return a value of 0, later java.util.SimpleTimeZone will
	    	// throw an illegalargument exception.  so... fake
	    	// the dstoffset;
	    	return 3600000;
	    }   
  	}
	return 0;
    }

    /**
     * Boilerplate API; calls through to wrapped object.
     */
    public boolean equals(Object obj) {
        try {
            return obj != null &&
                unwrap().equals(((JDKTimeZone) obj).unwrap());
        } catch (ClassCastException e) {
            return false;
        }
    }

    /**
     * Returns a string representation of this object.
     * @return  a string representation of this object.
     */
    public String toString() {
        return "JDKTimeZone: " + unwrap().toString();
    }

    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
	out.writeObject(zone.getID());
    }

    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
	String id = (String)in.readObject();
	zone = java.util.TimeZone.getTimeZone(id);
    }
}

//eof
