// // Copyright (C) 2007 United States Government as represented by the // Administrator of the National Aeronautics and Space Administration // (NASA). All Rights Reserved. // // This software is distributed under the NASA Open Source Agreement // (NOSA), version 1.3. The NOSA has been approved by the Open Source // Initiative. See the file NOSA-1.3-JPF at the top of the distribution // directory tree for the complete NOSA document. // // THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY // KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT // LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO // SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR // A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT // THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT // DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. // package gov.nasa.jpf.vm; import java.util.Locale; import cmu.conditional.One; import de.fosd.typechef.featureexpr.FeatureExpr; import gov.nasa.jpf.annotation.MJI; @SuppressWarnings("deprecation") public class JPF_java_util_Locale extends NativePeer { static Locale getLocale (MJIEnv env, int locref, FeatureExpr ctx) { //--- check first if it's one of the standard locales (ci is obviously loaded at this point ClassInfo ci = env.getClassInfo(locref); // Locale is final, so we can do this ElementInfo sei = ci.getStaticElementInfo(); if (locref == sei.getReferenceField("US").getValue()) return Locale.US; if (locref == sei.getReferenceField("GERMAN").getValue()) return Locale.GERMAN; if (locref == sei.getReferenceField("ENGLISH").getValue()) return Locale.ENGLISH; if (locref == sei.getReferenceField("FRENCH").getValue()) return Locale.FRENCH; if (locref == sei.getReferenceField("JAPANESE").getValue()) return Locale.JAPANESE; if (locref == sei.getReferenceField("CHINESE").getValue()) return Locale.CHINESE; //... we should have a bunch more //--- if it wasn't any of these, get the fields and just construct it String country, language, variant; FieldInfo fiBase = ci.getInstanceField("baseLocale"); if (fiBase != null){ // Java >= 1.7 int baseLocref = env.getReferenceField(ctx, locref, fiBase); country = env.getStringObject(ctx, env.getReferenceField(ctx,baseLocref, "region").getValue()); language = env.getStringObject(ctx, env.getReferenceField(ctx, baseLocref, "language").getValue()); variant = env.getStringObject(ctx, env.getReferenceField(ctx, baseLocref, "variant").getValue()); } else { // Java < 1.7 country = env.getStringObject(ctx, env.getReferenceField(ctx,locref, "country").getValue()); language = env.getStringObject(ctx, env.getReferenceField(ctx, locref, "language").getValue()); variant = env.getStringObject(ctx, env.getReferenceField(ctx, locref, "variant").getValue()); } Locale locale = new Locale(language,country,variant); return locale; } @MJI public int getDisplayName__Ljava_util_Locale_2__Ljava_lang_String_2 (MJIEnv env, int objref, int locref, FeatureExpr ctx) { Locale locale = getLocale(env, locref, ctx); String name = locale.getDisplayName(); return env.newString(ctx, name); } @MJI public int getDisplayVariant__Ljava_util_Locale_2__Ljava_lang_String_2 (MJIEnv env, int objref, int locref, FeatureExpr ctx) { Locale locale = getLocale(env, locref, ctx); String variant = locale.getDisplayVariant(); return env.newString(ctx, variant); } @MJI public int getDisplayCountry__Ljava_util_Locale_2__Ljava_lang_String_2 (MJIEnv env, int objref, int locref, FeatureExpr ctx) { Locale locale = getLocale(env, locref, ctx); String country = locale.getDisplayCountry(); return env.newString(ctx, country); } @MJI public int getDisplayLanguage__Ljava_util_Locale_2__Ljava_lang_String_2 (MJIEnv env, int objref, int locref, FeatureExpr ctx) { Locale locale = getLocale(env, locref, ctx); String language = locale.getDisplayLanguage(); return env.newString(ctx, language); } @MJI public int getISO3Country____Ljava_lang_String_2 (MJIEnv env, int objref, FeatureExpr ctx) { Locale locale = getLocale(env, objref, ctx); String s = locale.getISO3Country(); return env.newString(ctx, s); } @MJI public int getISO3Language____Ljava_lang_String_2 (MJIEnv env, int objref, FeatureExpr ctx) { Locale locale = getLocale(env, objref, ctx); String s = locale.getISO3Language(); return env.newString(ctx, s); } //--- the static ones @MJI public int getISOCountries_____3Ljava_lang_String_2 (MJIEnv env, int clsref, FeatureExpr ctx) { String[] s = Locale.getISOCountries(); int aref = env.newObjectArray("java.lang.String", s.length); for (int i=0; i<s.length; i++) { env.setReferenceArrayElement(ctx, aref, i, new One<>(env.newString(ctx, s[i]))); } return aref; } @MJI public int getISOLanguages_____3Ljava_lang_String_2 (MJIEnv env, int clsref, FeatureExpr ctx) { String[] s = Locale.getISOLanguages(); int aref = env.newObjectArray("java.lang.String", s.length); for (int i=0; i<s.length; i++) { env.setReferenceArrayElement(ctx, aref, i, new One<>(env.newString(ctx, s[i]))); } return aref; } }