2 * Copyright (C) 2014, United States Government, as represented by the
3 * Administrator of the National Aeronautics and Space Administration.
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
10 * http://www.apache.org/licenses/LICENSE-2.0.
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.
19 package gov.nasa.jpf.vm;
21 import gov.nasa.jpf.annotation.MJI;
22 import gov.nasa.jpf.vm.MJIEnv;
23 import gov.nasa.jpf.vm.NativePeer;
25 import java.util.Date;
26 import java.util.Locale;
27 import java.util.TimeZone;
30 * native peer for java.util.TimeZone
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
36 public class JPF_java_util_TimeZone extends NativePeer {
40 static TimeZone tz; // only used within (atomic) peer methods so that we don't have to instantiate all the time
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;
47 getHostDefaultValues();
50 private static TimeZone getTimeZone (MJIEnv env, int objRef){
51 int rawOffset = env.getIntField(objRef, "rawOffset");
52 tz.setRawOffset(rawOffset);
58 //--- the factory methods
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);
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);
70 int tzRef = env.newObject("java.util.TimeZone");
71 env.setReferenceField(tzRef, "ID", idRef);
72 env.setIntField(tzRef, "rawOffset", rawOffset);
77 static void getHostDefaultValues(){
78 tz = TimeZone.getDefault();
79 defaultID = tz.getID();
80 defaultRawOffset = tz.getRawOffset();
84 public int createDefaultZone____Ljava_util_TimeZone_2 (MJIEnv env, int clsObjRef){
85 int idRef = env.newString(defaultID);
87 int tzRef = env.newObject("java.util.TimeZone");
88 env.setReferenceField(tzRef, "ID", idRef);
89 env.setIntField(tzRef, "rawOffset", defaultRawOffset);
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");
102 public int getAvailableIDs_____3Ljava_lang_String_2 (MJIEnv env, int clsObjRef){
103 String[] ids = TimeZone.getAvailableIDs();
104 return env.newStringArray(ids);
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);
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);
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);
124 env.setReferenceField(objRef, "ID", idRef);
125 env.setIntField(objRef, "rawOffset", rawOffset);
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);
136 public int getOffset__J__I (MJIEnv env, int objRef, long date){
137 TimeZone tz = getTimeZone( env, objRef);
138 return tz.getOffset(date);
141 // unfortunately, this is not public in Java 1.7, so we can't delegate w/o reflection
143 public int getOffsets__J_3I__I (MJIEnv env, int objRef, long date, int offsetsRef){
144 TimeZone tz = getTimeZone( env, objRef);
146 int rawOffset = tz.getRawOffset();
148 if (tz.inDaylightTime(new Date(date))) {
149 dstOffset = tz.getDSTSavings();
152 if (offsetsRef != MJIEnv.NULL) {
153 env.setIntArrayElement( offsetsRef, 0, rawOffset);
154 env.setIntArrayElement( offsetsRef, 1, dstOffset);
157 return (rawOffset + dstOffset);
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);
168 public boolean useDaylightTime____Z (MJIEnv env, int objRef){
169 TimeZone tz = getTimeZone( env, objRef);
170 return tz.useDaylightTime();
174 public int getDSTSavings____I (MJIEnv env, int objRef){
175 TimeZone tz = getTimeZone( env, objRef);
176 return tz.getDSTSavings();
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);
186 int sref = env.newString(s);