]> WPIA git - gigi.git/blobdiff - src/org/cacert/gigi/dbObjects/CountryCode.java
upd: make CountryCode a Multiton
[gigi.git] / src / org / cacert / gigi / dbObjects / CountryCode.java
index 47abc2776e818bcb5e375986ab626fddf8beb760..5468bcf6634db3e5502eb5605c281296fc776c89 100644 (file)
@@ -1,5 +1,11 @@
 package org.cacert.gigi.dbObjects;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
 import org.cacert.gigi.GigiApiException;
 import org.cacert.gigi.database.GigiPreparedStatement;
 import org.cacert.gigi.database.GigiResultSet;
@@ -9,44 +15,26 @@ public class CountryCode {
 
     public enum CountryCodeType {
         CODE_2_CHARS(2, //
-                "SELECT `id`, `english` as country, `code2` as countrycode FROM `countryIsoCode` ORDER BY code2",//
-                "SELECT `id`, `english` as country, `code2` as countrycode FROM `countryIsoCode` WHERE `code2`=?",//
-                "SELECT 1 FROM `countryIsoCode` WHERE `code2`=?"),//
+                "SELECT `id`, `english` as country, `code2` as countrycode FROM `countryIsoCode` ORDER BY code2"), //
         CODE_3_CHARS(3,//
-                "SELECT `id`, `english` as country, `code3` as countrycode FROM `countryIsoCode` ORDER BY code3", //
-                "SELECT `id`, `english` as country, `code3` as countrycode FROM `countryIsoCode` WHERE `code3`=?",//
-                "SELECT 1 FROM `countryIsoCode` WHERE `code3`=?");
+                "SELECT `id`, `english` as country, `code3` as countrycode FROM `countryIsoCode` ORDER BY code3"); //
 
         private final String listQuery;
 
-        private final String getQuery;
-
-        private final String validationQuery;
-
         private final int len;
 
-        private CountryCodeType(int len, String listQuery, String getQuery, String validationQuery) {
+        private CountryCodeType(int len, String listQuery) {
             this.len = len;
             this.listQuery = listQuery;
-            this.getQuery = getQuery;
-            this.validationQuery = validationQuery;
         }
 
         public int getLen() {
             return len;
         }
 
-        public String getGetQuery() {
-            return getQuery;
-        }
-
-        public String getListQuery() {
+        protected String getListQuery() {
             return listQuery;
         }
-
-        public String getValidationQuery() {
-            return validationQuery;
-        }
     }
 
     private final int id;
@@ -55,10 +43,35 @@ public class CountryCode {
 
     private final String countryCode;
 
-    public CountryCode(int id, String country, String countryCode) {
+    private final CountryCodeType ctype;
+
+    private static final CountryCode[] c2s;
+
+    private static final CountryCode[] c3s;
+
+    private static final Map<String, CountryCode> byString;
+    static {
+        try {
+            c2s = getCountryCodesFromDB(CountryCodeType.CODE_2_CHARS);
+            c3s = getCountryCodesFromDB(CountryCodeType.CODE_3_CHARS);
+            HashMap<String, CountryCode> ccd = new HashMap<>();
+            for (CountryCode c2 : c2s) {
+                ccd.put(c2.getCountryCode(), c2);
+            }
+            for (CountryCode c3 : c3s) {
+                ccd.put(c3.getCountryCode(), c3);
+            }
+            byString = Collections.unmodifiableMap(ccd);
+        } catch (GigiApiException e) {
+            throw new Error(e);
+        }
+    }
+
+    private CountryCode(int id, String country, String countryCode, CountryCodeType ctype) {
         this.id = id;
         this.country = country;
         this.countryCode = countryCode;
+        this.ctype = ctype;
     }
 
     public int getId() {
@@ -73,7 +86,21 @@ public class CountryCode {
         return countryCode;
     }
 
-    public static CountryCode[] getCountryCodes(CountryCodeType clength) throws GigiApiException {
+    public CountryCodeType getCountryCodeType() {
+        return ctype;
+    }
+
+    public static CountryCode[] getCountryCodes(CountryCodeType clength) {
+        switch (clength) {
+        case CODE_2_CHARS:
+            return Arrays.copyOf(c2s, c2s.length);
+        case CODE_3_CHARS:
+            return Arrays.copyOf(c3s, c3s.length);
+        }
+        throw new Error("Enum switch was not exhaustive.");
+    }
+
+    private static CountryCode[] getCountryCodesFromDB(CountryCodeType clength) throws GigiApiException {
         try (GigiPreparedStatement ps = new GigiPreparedStatement(clength.getListQuery(), true)) {
             GigiResultSet rs = ps.executeQuery();
 
@@ -84,7 +111,7 @@ public class CountryCode {
 
             CountryCode[] finalResult = new CountryCode[totalCount];
             while (rs.next()) {
-                finalResult[i] = new CountryCode(rs.getInt("id"), rs.getString("country"), rs.getString("countrycode"));
+                finalResult[i] = new CountryCode(rs.getInt("id"), rs.getString("country"), rs.getString("countrycode"), clength);
                 i += 1;
             }
 
@@ -93,33 +120,37 @@ public class CountryCode {
     }
 
     public static void checkCountryCode(String countrycode, CountryCodeType cType) throws GigiApiException {
-        if (countrycode.length() != cType.getLen()) {
-            throw new GigiApiException(SprintfCommand.createSimple("Country code length does not have the required length of {0} characters", Integer.toString(cType.getLen())));
-        }
-        try (GigiPreparedStatement ps = new GigiPreparedStatement(cType.getValidationQuery())) {
-            ps.setString(1, countrycode.toUpperCase());
-            GigiResultSet rs = ps.executeQuery();
+        getCountryCode(countrycode, cType);
+    }
 
-            if ( !rs.next()) {
-                throw new GigiApiException(SprintfCommand.createSimple("Country code {0} is not available in database", countrycode.toUpperCase()));
+    public CountryCode convertToCountryCodeType(CountryCodeType ctype) {
+        if (this.ctype.equals(ctype)) {
+            return this;
+        }
+        CountryCode[] cclist = getCountryCodes(ctype);
+        for (CountryCode cc : cclist) {
+            if (cc.getId() == this.getId()) {
+                return cc;
             }
         }
-
+        throw new RuntimeException("Internal Error: CountryCode for country not found" + this.getCountry());
     }
 
     public static CountryCode getCountryCode(String countrycode, CountryCodeType cType) throws GigiApiException {
         if (countrycode.length() != cType.getLen()) {
             throw new GigiApiException(SprintfCommand.createSimple("Country code length does not have the required length of {0} characters", Integer.toString(cType.getLen())));
         }
-        try (GigiPreparedStatement ps = new GigiPreparedStatement(cType.getGetQuery())) {
-            ps.setString(1, countrycode.toUpperCase());
-            GigiResultSet rs = ps.executeQuery();
-
-            if ( !rs.next()) {
-                throw new GigiApiException(SprintfCommand.createSimple("Country code {0} is not available in database", countrycode.toUpperCase()));
-            }
-            return new CountryCode(rs.getInt("id"), rs.getString("country"), rs.getString("countrycode"));
+        CountryCode i = byString.get(countrycode);
+        if (i == null || i.getCountryCodeType() != cType) {
+            throw new GigiApiException("Country Code was wrong.");
         }
+        return i;
+    }
 
+    public static CountryCode getRandomCountry(CountryCodeType cType) {
+        CountryCode[] cc = CountryCode.getCountryCodes(cType);
+        int rnd = new Random().nextInt(cc.length);
+        return cc[rnd];
     }
+
 }