/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. This program 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 for more details. * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * * For the text or an alternative of this public license, you may reach us * * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * * or via info@compiere.org or http://www.compiere.org/license.html * *****************************************************************************/ package org.compiere.model; import static org.compiere.model.SystemIDs.COUNTRY_US; import java.io.Serializable; import java.sql.ResultSet; import java.text.Collator; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.logging.Level; import org.compiere.util.CLogger; import org.compiere.util.Env; import org.compiere.util.Language; import org.compiere.util.Util; import org.idempiere.cache.ImmutableIntPOCache; import org.idempiere.cache.ImmutablePOSupport; /** * Location Country Model * * @author Jorg Janke * @version $Id: MCountry.java,v 1.3 2006/07/30 00:58:18 jjanke Exp $ * * * @author Michael Judd (Akuna Ltd) *
  • BF [ 2695078 ] Country is not translated on invoice */ public class MCountry extends X_C_Country implements Comparator, Serializable, ImmutablePOSupport { /** * generated serial id */ private static final long serialVersionUID = 6102749517340832365L; /** * Get Country (cached) (immutable) * @param C_Country_ID ID * @return Country */ public static MCountry get (int C_Country_ID) { return get(Env.getCtx(), C_Country_ID); } /** * Get Country (Immutable, cached) * @param ctx context * @param C_Country_ID ID * @return Country */ public static MCountry get (Properties ctx, int C_Country_ID) { if(C_Country_ID <= 0) return null; loadAllCountriesIfNeeded(); MCountry c = s_countries.get(ctx, C_Country_ID, e -> new MCountry(ctx, e)); if (c != null) return c; c = new MCountry (ctx, C_Country_ID, (String)null); if (c.getC_Country_ID() == C_Country_ID) { s_countries.put(C_Country_ID, c, e -> new MCountry(Env.getCtx(), e)); return c; } return null; } // get /** * Get Default Country * @param ctx ignore * @return Country * @deprecated */ @Deprecated public static MCountry getDefault (Properties ctx) { return getDefault(); } /** * Get Default Country (immutable) * @return Country */ public static MCountry getDefault () { int clientID = Env.getAD_Client_ID(Env.getCtx()); MCountry c = s_default.get(clientID); if (c != null) return c; loadDefaultCountry(); c = s_default.get(clientID); return c; } // get /** * Return Countries as Array * @param ctx ignore * @return MCountry Array * @deprecated */ @Deprecated public static MCountry[] getCountries(Properties ctx) { return getCountries(); } /** * Return Countries as Array * @return MCountry Array */ public static MCountry[] getCountries() { loadAllCountriesIfNeeded(); MCountry[] retValue = s_countries.values().toArray(new MCountry[0]); Arrays.sort(retValue, new MCountry(Env.getCtx(), 0, null)); return retValue; } // getCountries private static synchronized void loadAllCountriesIfNeeded() { if (s_countries == null || s_countries.isEmpty()) { loadAllCountries(); } } /** * Load Countries. * Set Default Country via country code of Client Language (AD_Language.CountryCode). */ private static synchronized void loadAllCountries () { MClient client = MClient.get (Env.getCtx()); MLanguage lang = MLanguage.get(Env.getCtx(), client.getAD_Language()); // if (s_countries == null) s_countries = new ImmutableIntPOCache(Table_Name, 250); List countries = new Query(Env.getCtx(), Table_Name, "", null) .setOnlyActiveRecords(true) .list(); for (MCountry c : countries) { s_countries.put(c.getC_Country_ID(), c); // Country code of Client Language if (lang != null && lang.getCountryCode().equals(c.getCountryCode())) s_default.put(client.getAD_Client_ID(), c); } if (s_log.isLoggable(Level.FINE)) s_log.fine("#" + s_countries.size() + " - Default=" + s_default); } // loadAllCountries /** * Load Default Country for login client */ private static void loadDefaultCountry() { loadAllCountriesIfNeeded(); MClient client = MClient.get (Env.getCtx()); MCountry found = s_default.get(client.getAD_Client_ID()); if (found != null) return; MLanguage lang = MLanguage.get(Env.getCtx(), client.getAD_Language()); MCountry usa = null; //create local instance to avoid concurrent modification exception Map countries = new HashMap(s_countries); for (Entry cachedEntry : countries.entrySet()) { MCountry c = cachedEntry.getValue(); // Country code of Client Language if (lang != null && lang.getCountryCode().equals(c.getCountryCode())) { found = c; break; } if (c.getC_Country_ID() == COUNTRY_US) // USA usa = c; } if (found != null) s_default.put(client.getAD_Client_ID(), found); else s_default.put(client.getAD_Client_ID(), usa); if (s_log.isLoggable(Level.FINE)) s_log.fine("#" + countries.size() + " - Default=" + s_default); } /** * Set the Language for Display (toString) * @param AD_Language language or null * @deprecated - not used at all, you can delete references to this method */ @Deprecated(forRemoval = true, since = "11") public static void setDisplayLanguage (String AD_Language) { s_AD_Language = AD_Language; if (Language.isBaseLanguage(AD_Language)) s_AD_Language = null; } // setDisplayLanguage /** Display Language */ @SuppressWarnings("unused") private static String s_AD_Language = null; /** Country Cache */ private static ImmutableIntPOCache s_countries = new ImmutableIntPOCache(Table_Name, 250, 0, false) { private static final long serialVersionUID = 1106078701451046946L; @Override public int reset(int recordId) { if (recordId <= 0) return super.reset(recordId); else return 0; } }; /** Default Country */ private static ImmutableIntPOCache s_default = new ImmutableIntPOCache(Table_Name, Table_Name+"|Default", 3); /** Static Logger */ private static CLogger s_log = CLogger.getCLogger (MCountry.class); // Default DisplaySequence */ private static String DISPLAYSEQUENCE = "@C@, @P@"; /** * UUID based Constructor * @param ctx Context * @param C_Country_UU UUID key * @param trxName Transaction */ public MCountry(Properties ctx, String C_Country_UU, String trxName) { super(ctx, C_Country_UU, trxName); if (Util.isEmpty(C_Country_UU)) setInitialDefaults(); } /** * @param ctx context * @param C_Country_ID ID * @param trxName transaction */ public MCountry (Properties ctx, int C_Country_ID, String trxName) { super (ctx, C_Country_ID, trxName); if (C_Country_ID == 0) setInitialDefaults(); } // MCountry /** * Set the initial defaults for a new record */ private void setInitialDefaults() { setDisplaySequence(DISPLAYSEQUENCE); setHasRegion(false); setHasPostal_Add(false); setIsAddressLinesLocalReverse (false); setIsAddressLinesReverse (false); } /** * Load Country from current row in ResultSet * @param ctx context * @param rs ResultSet * @param trxName transaction */ public MCountry (Properties ctx, ResultSet rs, String trxName) { super(ctx, rs, trxName); } // MCountry /** * Copy constructor * @param copy */ public MCountry(MCountry copy) { this(Env.getCtx(), copy); } /** * Copy constructor * @param ctx * @param copy */ public MCountry(Properties ctx, MCountry copy) { this(ctx, copy, (String) null); } /** * Copy constructor * @param ctx * @param copy * @param trxName */ public MCountry(Properties ctx, MCountry copy, String trxName) { this(ctx, 0, trxName); copyPO(copy); } /** * Return Name - translated if DisplayLanguage is set. * @return Name */ @Override public String toString() { return getTrlName(); } // toString /** * Get Translated Name * @return name */ public String getTrlName() { return getTrlName(Env.getAD_Language(Env.getCtx())); } // getTrlName /** * Get Translated Name * @param language * @return name */ public String getTrlName(String language) { return get_Translation(COLUMNNAME_Name, language); } // getTrlName /** * Get Display Sequence for city (C), region (R), postal code (P) and additional postal code (A). * @return display sequence */ @Override public String getDisplaySequence () { String ds = super.getDisplaySequence (); if (ds == null || ds.length() == 0) ds = DISPLAYSEQUENCE; return ds; } // getDisplaySequence /** * Get Local Display Sequence for city (C), region (R), postal code (P) and additional postal code (A). * If not defined get Display Sequence. * @return display sequence */ @Override public String getDisplaySequenceLocal () { String ds = super.getDisplaySequenceLocal(); if (ds == null || ds.length() == 0) ds = getDisplaySequence(); return ds; } // getDisplaySequenceLocal /** * Compare based on Name * @param o1 object 1 * @param o2 object 2 * @return -1,0, 1 */ @Override public int compare(Object o1, Object o2) { String s1 = o1.toString(); if (s1 == null) s1 = ""; String s2 = o2.toString(); if (s2 == null) s2 = ""; Collator collator = Collator.getInstance(); return collator.compare(s1, s2); } // compare /** * Is the region valid in this country * @param C_Region_ID region * @return true if valid */ public boolean isValidRegion(int C_Region_ID) { if (C_Region_ID == 0 || getC_Country_ID() == 0 || !isHasRegion()) return false; MRegion[] regions = MRegion.getRegions(getC_Country_ID()); for (int i = 0; i < regions.length; i++) { if (C_Region_ID == regions[i].getC_Region_ID()) return true; } return false; } // isValidRegion @Override public MCountry markImmutable() { if (is_Immutable()) return this; makeImmutable(); return this; } } // MCountry