Fixing a few bugs in the statistics printout.
[jpf-core.git] / src / peers / gov / nasa / jpf / vm / JPF_java_util_TimeZone.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18
19 package gov.nasa.jpf.vm;
20
21 import gov.nasa.jpf.annotation.MJI;
22 import gov.nasa.jpf.vm.MJIEnv;
23 import gov.nasa.jpf.vm.NativePeer;
24
25 import java.util.Date;
26 import java.util.Locale;
27 import java.util.TimeZone;
28
29 /**
30  * native peer for java.util.TimeZone
31  * 
32  * this is a (mostly) delegating implementation that became necessary because TimeZone has been
33  * considerably changed in Java 1.7 (OpenJDK) and we need a version that is compatible with
34  * pre and post 1.7 releases
35  */
36 public class JPF_java_util_TimeZone extends NativePeer {
37
38
39   //--- internals
40   static TimeZone tz; // only used within (atomic) peer methods so that we don't have to instantiate all the time
41   
42   // we have to keep optional defaults here so that we don't change the host environment
43   static String defaultID;
44   static int defaultRawOffset;
45   
46   static {
47     getHostDefaultValues();
48   }
49   
50   private static TimeZone getTimeZone (MJIEnv env, int objRef){
51     int rawOffset = env.getIntField(objRef, "rawOffset");
52     tz.setRawOffset(rawOffset);
53     return tz;
54   }
55
56   //--- native methods
57   
58   //--- the factory methods
59   @MJI
60   public int getTimeZone__Ljava_lang_String_2__Ljava_util_TimeZone_2 (MJIEnv env, int clsObjRef, int idRef){
61     String id = env.getStringObject(idRef);
62     TimeZone tz = TimeZone.getTimeZone(id);
63     
64     int rawOffset = tz.getRawOffset();
65     String realId = tz.getID(); // could have been changed if id was unknown
66     if (!realId.equals(id)){
67       idRef = env.newString(realId);
68     }
69
70     int tzRef = env.newObject("java.util.TimeZone");
71     env.setReferenceField(tzRef, "ID", idRef);
72     env.setIntField(tzRef, "rawOffset", rawOffset);
73     
74     return tzRef;
75   }
76   
77   static void getHostDefaultValues(){
78     tz = TimeZone.getDefault();
79     defaultID = tz.getID();
80     defaultRawOffset = tz.getRawOffset();
81   }
82   
83   @MJI
84   public int createDefaultZone____Ljava_util_TimeZone_2 (MJIEnv env, int clsObjRef){
85     int idRef = env.newString(defaultID);
86
87     int tzRef = env.newObject("java.util.TimeZone");
88     env.setReferenceField(tzRef, "ID", idRef);
89     env.setIntField(tzRef, "rawOffset", defaultRawOffset);
90     
91     return tzRef;
92   }
93
94   @MJI
95   public void setDefaultValues__Ljava_util_TimeZone_2 (MJIEnv env, int clsObjRef, int tzRef){
96     defaultID = env.getStringField(tzRef, "ID");
97     defaultRawOffset = env.getIntField( tzRef, "rawOffset");
98   }
99   
100   //--- the ID queries
101   @MJI
102   public int getAvailableIDs_____3Ljava_lang_String_2 (MJIEnv env, int clsObjRef){
103     String[] ids = TimeZone.getAvailableIDs();
104     return env.newStringArray(ids);
105   }
106   
107   @MJI
108   public int getAvailableIDs__I___3Ljava_lang_String_2 (MJIEnv env, int clsObjRef, int rawOffset){
109     String[] ids = TimeZone.getAvailableIDs(rawOffset);
110     return env.newStringArray(ids);    
111   }
112
113   @MJI
114   public void setID__Ljava_lang_String_2__V (MJIEnv env, int objRef, int idRef){
115     String id = env.getStringObject(idRef);
116     TimeZone tz = TimeZone.getTimeZone(id);
117     
118     int rawOffset = tz.getRawOffset();
119     String realId = tz.getID(); // could have been changed if id was unknown
120     if (!realId.equals(id)){
121       idRef = env.newString(realId);
122     }
123     
124     env.setReferenceField(objRef, "ID", idRef);
125     env.setIntField(objRef, "rawOffset", rawOffset);
126   }
127   
128   @MJI
129   public int getOffset__IIIIII__I (MJIEnv env, int objRef,
130       int era, int year, int month, int day, int dayOfWeek, int milliseconds){
131     TimeZone tz = getTimeZone( env, objRef);
132     return tz.getOffset(era, year, month, day, dayOfWeek, milliseconds);
133   }
134
135   @MJI
136   public int getOffset__J__I (MJIEnv env, int objRef, long date){
137     TimeZone tz = getTimeZone( env, objRef);
138     return tz.getOffset(date);
139   }
140   
141   // unfortunately, this is not public in Java 1.7, so we can't delegate w/o reflection
142   @MJI
143   public int getOffsets__J_3I__I (MJIEnv env, int objRef, long date, int offsetsRef){
144     TimeZone tz = getTimeZone( env, objRef);
145     
146     int rawOffset = tz.getRawOffset();
147     int dstOffset = 0;
148     if (tz.inDaylightTime(new Date(date))) {
149       dstOffset = tz.getDSTSavings();
150     }
151     
152     if (offsetsRef != MJIEnv.NULL) {
153       env.setIntArrayElement( offsetsRef, 0, rawOffset);
154       env.setIntArrayElement( offsetsRef, 1, dstOffset);
155     }
156     
157     return (rawOffset + dstOffset);
158   }
159
160   @MJI
161   public boolean inDaylightTime__J__Z (MJIEnv env, int objRef, long time){
162     Date date = new Date(time);
163     TimeZone tz = getTimeZone( env, objRef);
164     return tz.inDaylightTime(date);
165   }
166   
167   @MJI
168   public boolean useDaylightTime____Z (MJIEnv env, int objRef){
169     TimeZone tz = getTimeZone( env, objRef);
170     return tz.useDaylightTime();
171   }
172
173   @MJI
174   public int getDSTSavings____I (MJIEnv env, int objRef){
175     TimeZone tz = getTimeZone( env, objRef);
176     return tz.getDSTSavings();    
177   }
178
179   @MJI
180   public int getDisplayName__ZILjava_util_Locale_2__Ljava_lang_String_2 (MJIEnv env, int objRef,
181                                        boolean daylight, int style, int localeRef) {
182     TimeZone tz = getTimeZone(env, objRef);
183     Locale displayLocale = JPF_java_util_Locale.getLocale(env, localeRef);
184     String s = tz.getDisplayName(daylight, style, displayLocale);
185     
186     int sref = env.newString(s);
187     return sref;
188   }
189   
190 }
191