[metrics-web/master] Provide graphs for all countries in the GeoIP database.

commit f5116c6087b8cfd18b53268b56d9097218c43123 Author: Karsten Loesing <karsten.loesing@gmx.net> Date: Thu Apr 21 21:47:12 2011 +0200 Provide graphs for all countries in the GeoIP database. --- rserve/graphs.R | 312 ++++++++++++++++--- src/org/torproject/ernie/web/Countries.java | 282 ++++++++++++++++++ .../ernie/web/GraphParameterChecker.java | 8 +- .../ernie/web/GraphsSubpagesServlet.java | 8 + web/WEB-INF/network.jsp | 45 +--- web/WEB-INF/users.jsp | 90 +------ 6 files changed, 566 insertions(+), 179 deletions(-) diff --git a/rserve/graphs.R b/rserve/graphs.R index 3e56cc8..15daf02 100644 --- a/rserve/graphs.R +++ b/rserve/graphs.R @@ -1,3 +1,259 @@ +countrylist <- list( + "ad" = "Andorra", + "ae" = "the United Arab Emirates", + "af" = "Afghanistan", + "ag" = "Antigua and Barbuda", + "ai" = "Anguilla", + "al" = "Albania", + "am" = "Armenia", + "an" = "the Netherlands Antilles", + "ao" = "Angola", + "aq" = "Antarctica", + "ar" = "Argentina", + "as" = "American Samoa", + "at" = "Austria", + "au" = "Australia", + "aw" = "Aruba", + "ax" = "the Aland Islands", + "az" = "Azerbaijan", + "ba" = "Bosnia and Herzegovina", + "bb" = "Barbados", + "bd" = "Bangladesh", + "be" = "Belgium", + "bf" = "Burkina Faso", + "bg" = "Bulgaria", + "bh" = "Bahrain", + "bi" = "Burundi", + "bj" = "Benin", + "bl" = "Saint Bartelemey", + "bm" = "Bermuda", + "bn" = "Brunei Darussalam", + "bo" = "Bolivia", + "br" = "Brazil", + "bs" = "the Bahamas", + "bt" = "Bhutan", + "bv" = "the Bouvet Island", + "bw" = "Botswana", + "by" = "Belarus", + "bz" = "Belize", + "ca" = "Canada", + "cc" = "the Cocos (Keeling) Islands", + "cd" = "the Democratic Republic of the Congo", + "cf" = "Central African Republic", + "cg" = "Congo", + "ch" = "Switzerland", + "ci" = "Cote d'Ivoire", + "ck" = "the Cook Islands", + "cl" = "Chile", + "cm" = "Cameroon", + "cn" = "China", + "co" = "Colombia", + "cr" = "Costa Rica", + "cu" = "Cuba", + "cv" = "Cape Verde", + "cx" = "the Christmas Island", + "cy" = "Cyprus", + "cz" = "the Czech Republic", + "de" = "Germany", + "dj" = "Djibouti", + "dk" = "Denmark", + "dm" = "Dominica", + "do" = "the Dominican Republic", + "dz" = "Algeria", + "ec" = "Ecuador", + "ee" = "Estonia", + "eg" = "Egypt", + "eh" = "the Western Sahara", + "er" = "Eritrea", + "es" = "Spain", + "et" = "Ethiopia", + "fi" = "Finland", + "fj" = "Fiji", + "fk" = "the Falkland Islands (Malvinas)", + "fm" = "the Federated States of Micronesia", + "fo" = "the Faroe Islands", + "fr" = "France", + "fx" = "Metropolitan France", + "ga" = "Gabon", + "gb" = "the United Kingdom", + "gd" = "Grenada", + "ge" = "Georgia", + "gf" = "French Guiana", + "gg" = "Guernsey", + "gh" = "Ghana", + "gi" = "Gibraltar", + "gl" = "Greenland", + "gm" = "Gambia", + "gn" = "Guinea", + "gp" = "Guadeloupe", + "gq" = "Equatorial Guinea", + "gr" = "Greece", + "gs" = "South Georgia and the South Sandwich Islands", + "gt" = "Guatemala", + "gu" = "Guam", + "gw" = "Guinea-Bissau", + "gy" = "Guyana", + "hk" = "Hong Kong", + "hm" = "Heard Island and McDonald Islands", + "hn" = "Honduras", + "hr" = "Croatia", + "ht" = "Haiti", + "hu" = "Hungary", + "id" = "Indonesia", + "ie" = "Ireland", + "il" = "Israel", + "im" = "the Isle of Man", + "in" = "India", + "io" = "the British Indian Ocean Territory", + "iq" = "Iraq", + "ir" = "the Islamic Republic of Iran", + "is" = "Iceland", + "it" = "Italy", + "je" = "Jersey", + "jm" = "Jamaica", + "jo" = "Jordan", + "jp" = "Japan", + "ke" = "Kenya", + "kg" = "Kyrgyzstan", + "kh" = "Cambodia", + "ki" = "Kiribati", + "km" = "Comoros", + "kn" = "Saint Kitts and Nevis", + "kp" = "the Democratic People's Republic of Korea", + "kr" = "the Republic of Korea", + "kw" = "Kuwait", + "ky" = "the Cayman Islands", + "kz" = "Kazakhstan", + "la" = "Lao People's Democratic Republic", + "lb" = "Lebanon", + "lc" = "Saint Lucia", + "li" = "Liechtenstein", + "lk" = "Sri Lanka", + "lr" = "Liberia", + "ls" = "Lesotho", + "lt" = "Lithuania", + "lu" = "Luxembourg", + "lv" = "Latvia", + "ly" = "Libyan Arab Jamahiriya", + "ma" = "Morocco", + "mc" = "Monaco", + "md" = "the Republic of Moldova", + "me" = "Montenegro", + "mf" = "Saint Martin", + "mg" = "Madagascar", + "mh" = "the Marshall Islands", + "mk" = "Macedonia", + "ml" = "Mali", + "mm" = "Myanmar", + "mn" = "Mongolia", + "mo" = "Macao", + "mp" = "the Northern Mariana Islands", + "mq" = "Martinique", + "mr" = "Mauritania", + "ms" = "Montserrat", + "mt" = "Malta", + "mu" = "Mauritius", + "mv" = "the Maldives", + "mw" = "Malawi", + "mx" = "Mexico", + "my" = "Malaysia", + "mz" = "Mozambique", + "na" = "Namibia", + "nc" = "New Caledonia", + "ne" = "Niger", + "nf" = "Norfolk Island", + "ng" = "Nigeria", + "ni" = "Nicaragua", + "nl" = "the Netherlands", + "no" = "Norway", + "np" = "Nepal", + "nr" = "Nauru", + "nu" = "Niue", + "nz" = "New Zealand", + "om" = "Oman", + "pa" = "Panama", + "pe" = "Peru", + "pf" = "French Polynesia", + "pg" = "Papua New Guinea", + "ph" = "the Philippines", + "pk" = "Pakistan", + "pl" = "Poland", + "pm" = "Saint Pierre and Miquelon", + "pn" = "Pitcairn", + "pr" = "Puerto Rico", + "ps" = "the Palestinian Territory", + "pt" = "Portugal", + "pw" = "Palau", + "py" = "Paraguay", + "qa" = "Qatar", + "re" = "Reunion", + "ro" = "Romania", + "rs" = "Serbia", + "ru" = "the Russian Federation", + "rw" = "Rwanda", + "sa" = "Saudi Arabia", + "sb" = "the Solomon Islands", + "sc" = "the Seychelles", + "sd" = "Sudan", + "se" = "Sweden", + "sg" = "Singapore", + "sh" = "Saint Helena", + "si" = "Slovenia", + "sj" = "Svalbard and Jan Mayen", + "sk" = "Slovakia", + "sl" = "Sierra Leone", + "sm" = "San Marino", + "sn" = "Senegal", + "so" = "Somalia", + "sr" = "Suriname", + "st" = "Sao Tome and Principe", + "sv" = "El Salvador", + "sy" = "the Syrian Arab Republic", + "sz" = "Swaziland", + "tc" = "Turks and Caicos Islands", + "td" = "Chad", + "tf" = "the French Southern Territories", + "tg" = "Togo", + "th" = "Thailand", + "tj" = "Tajikistan", + "tk" = "Tokelau", + "tl" = "Timor-Leste", + "tm" = "Turkmenistan", + "tn" = "Tunisia", + "to" = "Tonga", + "tr" = "Turkey", + "tt" = "Trinidad and Tobago", + "tv" = "Tuvalu", + "tw" = "Taiwan", + "tz" = "the United Republic of Tanzania", + "ua" = "Ukraine", + "ug" = "Uganda", + "um" = "the United States Minor Outlying Islands", + "us" = "the United States", + "uy" = "Uruguay", + "uz" = "Uzbekistan", + "va" = "Vatican City State", + "vc" = "Saint Vincent and the Grenadines", + "ve" = "Venezuela", + "vg" = "the British Virgin Islands", + "vi" = "the United States Virgin Islands", + "vn" = "Vietnam", + "vu" = "Vanuatu", + "wf" = "Wallis and Futuna", + "ws" = "Samoa", + "ye" = "Yemen", + "yt" = "Mayotte", + "za" = "South Africa", + "zm" = "Zambia", + "zw" = "Zimbabwe") + +countryname <- function(country) { + res <- countrylist[[country]] + if (is.null(res)) + res <- "no-man's-land" + res +} + plot_networksize <- function(start, end, path, dpi) { drv <- dbDriver("PostgreSQL") con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db) @@ -69,24 +325,9 @@ plot_relaycountries <- function(start, end, country, path, dpi) { u <- rbind(u, data.frame(date = as.Date(missing, origin = "1970-01-01"), relays = NA)) - peoples <- data.frame(country = c("ae", "au", "bh", "br", "ca", "cn", - "cu", "de", "dj", "dz", "eg", "et", "fr", "gb", "il", "ir", "it", - "iq", "jo", "jp", "kp", "kr", "kw", "lb", "ly", "ma", "mm", "om", - "pl", "ps", "qa", "ru", "sa", "sd", "se", "sy", "tn", "tm", "us", - "uz", "vn", "ye"), - people = c("U.A.E.", "Australian", "Bahraini", "Brazilian", - "Canadian", "Chinese", "Cuban", "German", "Djiboutian", "Algerian", - "Egyptian", "Ethiopian", "French", "U.K.", "Israeli", "Iranian", - "Italian", "Iraqi", "Jordanian", "Japanese", "North Korean", - "South Korean", "Kuwaiti", "Lebanese", "Libyan", "Moroccan", - "Burmese", "Omani", "Polish", "Palestinian", "Qatari", "Russian", - "Saudi", "Sudanese", "Swedish", "Syrian", "Tunisian", "Turkmen", - "U.S.", "Uzbek", "Vietnamese", "Yemeni"), - stringsAsFactors = FALSE) title <- ifelse(country == "all", "Number of relays in all countries\n", - paste("Number of", peoples[peoples$country == country, "people"], - "relays\n")) + paste("Number of relays in ", countryname(country), "\n", sep = "")) formatter <- function(x, ...) { format(x, scientific = FALSE, ...) } ggplot(u, aes(x = as.Date(date, "%Y-%m-%d"), y = relays)) + geom_line(size = 1) + @@ -318,24 +559,10 @@ plot_direct_users <- function(start, end, country, path, dpi) { u <- rbind(u, data.frame(date = as.Date(missing, origin = "1970-01-01"), users = NA)) - peoples <- data.frame(country = c("ae", "au", "bh", "br", "ca", "cn", - "cu", "de", "dj", "dz", "eg", "et", "fr", "gb", "il", "ir", "it", - "iq", "jo", "jp", "kp", "kr", "kw", "lb", "ly", "ma", "mm", "om", - "pl", "ps", "qa", "ru", "sa", "sd", "se", "sy", "tn", "tm", "us", - "uz", "vn", "ye"), - people = c("U.A.E.", "Australian", "Bahraini", "Brazilian", - "Canadian", "Chinese", "Cuban", "German", "Djiboutian", "Algerian", - "Egyptian", "Ethiopian", "French", "U.K.", "Israeli", "Iranian", - "Italian", "Iraqi", "Jordanian", "Japanese", "North Korean", - "South Korean", "Kuwaiti", "Lebanese", "Libyan", "Moroccan", - "Burmese", "Omani", "Polish", "Palestinian", "Qatari", "Russian", - "Saudi", "Sudanese", "Swedish", "Syrian", "Tunisian", "Turkmen", - "U.S.", "Uzbek", "Vietnamese", "Yemeni"), - stringsAsFactors = FALSE) title <- ifelse(country == "all", - "Total directly connecting Tor users (all data)\n", - paste("Directly connecting", - peoples[peoples$country == country, "people"], "Tor users\n")) + "Directly connecting users from all countries\n", + paste("Directly connecting users from ", countryname(country), "\n", + sep = "")) formatter <- function(x, ...) { format(x, scientific = FALSE, ...) } ggplot(u, aes(x = as.Date(date, "%Y-%m-%d"), y = users)) + geom_line(size = 1) + @@ -370,24 +597,9 @@ plot_bridge_users <- function(start, end, country, path, dpi) { bridgeusers <- rbind(bridgeusers, data.frame(date = as.Date(missing, origin = "1970-01-01"), users = NA)) - peoples <- data.frame(country = c("ae", "au", "bh", "br", "ca", "cn", - "cu", "de", "dj", "dz", "eg", "et", "fr", "gb", "il", "ir", "it", - "iq", "jo", "jp", "kp", "kr", "kw", "lb", "ly", "ma", "mm", "om", - "pl", "ps", "qa", "ru", "sa", "sd", "se", "sy", "tn", "tm", "us", - "uz", "vn", "ye"), - people = c("U.A.E.", "Australian", "Bahraini", "Brazilian", - "Canadian", "Chinese", "Cuban", "German", "Djiboutian", "Algerian", - "Egyptian", "Ethiopian", "French", "U.K.", "Israeli", "Iranian", - "Italian", "Iraqi", "Jordanian", "Japanese", "North Korean", - "South Korean", "Kuwaiti", "Lebanese", "Libyan", "Moroccan", - "Burmese", "Omani", "Polish", "Palestinian", "Qatari", "Russian", - "Saudi", "Sudanese", "Swedish", "Syrian", "Tunisian", "Turkmen", - "U.S.", "Uzbek", "Vietnamese", "Yemeni"), - stringsAsFactors = FALSE) title <- ifelse(country == "all", - "Total users via bridges (all data)\n", - paste(peoples[peoples$country == country, "people"], - "users via bridges\n")) + "Bridge users from all countries\n", + paste("Bridge users from ", countryname(country), "\n", sep = "")) formatter <- function(x, ...) { format(x, scientific = FALSE, ...) } ggplot(bridgeusers, aes(x = as.Date(date, "%Y-%m-%d"), y = users)) + geom_line(size = 1) + diff --git a/src/org/torproject/ernie/web/Countries.java b/src/org/torproject/ernie/web/Countries.java new file mode 100644 index 0000000..6829488 --- /dev/null +++ b/src/org/torproject/ernie/web/Countries.java @@ -0,0 +1,282 @@ +package org.torproject.ernie.web; + +import java.util.*; + +public class Countries { + + private static Countries instance = new Countries(); + + public static Countries getInstance() { + return Countries.instance; + } + + /* List of arrays of length 2, containing country codes at [0] and + * country names at [1], alphabetically ordered by country names. */ + private List<String[]> knownCountries; + + private Countries() { + this.knownCountries = new ArrayList<String[]>(); + this.knownCountries.add("af;Afghanistan".split(";")); + this.knownCountries.add("ax;Aland Islands".split(";")); + this.knownCountries.add("al;Albania".split(";")); + this.knownCountries.add("dz;Algeria".split(";")); + this.knownCountries.add("as;American Samoa".split(";")); + this.knownCountries.add("ad;Andorra".split(";")); + this.knownCountries.add("ao;Angola".split(";")); + this.knownCountries.add("ai;Anguilla".split(";")); + this.knownCountries.add("aq;Antarctica".split(";")); + this.knownCountries.add("ag;Antigua and Barbuda".split(";")); + this.knownCountries.add("ar;Argentina".split(";")); + this.knownCountries.add("am;Armenia".split(";")); + this.knownCountries.add("aw;Aruba".split(";")); + this.knownCountries.add("au;Australia".split(";")); + this.knownCountries.add("at;Austria".split(";")); + this.knownCountries.add("az;Azerbaijan".split(";")); + this.knownCountries.add("bs;Bahamas".split(";")); + this.knownCountries.add("bh;Bahrain".split(";")); + this.knownCountries.add("bd;Bangladesh".split(";")); + this.knownCountries.add("bb;Barbados".split(";")); + this.knownCountries.add("by;Belarus".split(";")); + this.knownCountries.add("be;Belgium".split(";")); + this.knownCountries.add("bz;Belize".split(";")); + this.knownCountries.add("bj;Benin".split(";")); + this.knownCountries.add("bm;Bermuda".split(";")); + this.knownCountries.add("bt;Bhutan".split(";")); + this.knownCountries.add("bo;Bolivia".split(";")); + this.knownCountries.add("ba;Bosnia and Herzegovina".split(";")); + this.knownCountries.add("bw;Botswana".split(";")); + this.knownCountries.add("bv;Bouvet Island".split(";")); + this.knownCountries.add("br;Brazil".split(";")); + this.knownCountries.add("io;British Indian Ocean Territory". + split(";")); + this.knownCountries.add("bn;Brunei Darussalam".split(";")); + this.knownCountries.add("bg;Bulgaria".split(";")); + this.knownCountries.add("bf;Burkina Faso".split(";")); + this.knownCountries.add("bi;Burundi".split(";")); + this.knownCountries.add("kh;Cambodia".split(";")); + this.knownCountries.add("cm;Cameroon".split(";")); + this.knownCountries.add("ca;Canada".split(";")); + this.knownCountries.add("cv;Cape Verde".split(";")); + this.knownCountries.add("ky;Cayman Islands".split(";")); + this.knownCountries.add("cf;Central African Republic".split(";")); + this.knownCountries.add("td;Chad".split(";")); + this.knownCountries.add("cl;Chile".split(";")); + this.knownCountries.add("cn;China".split(";")); + this.knownCountries.add("cx;Christmas Island".split(";")); + this.knownCountries.add("cc;Cocos (Keeling) Islands".split(";")); + this.knownCountries.add("co;Colombia".split(";")); + this.knownCountries.add("km;Comoros".split(";")); + this.knownCountries.add("cd;Congo, The Democratic Republic of the". + split(";")); + this.knownCountries.add("cg;Congo".split(";")); + this.knownCountries.add("ck;Cook Islands".split(";")); + this.knownCountries.add("cr;Costa Rica".split(";")); + this.knownCountries.add("ci;Cote d'Ivoire".split(";")); + this.knownCountries.add("hr;Croatia".split(";")); + this.knownCountries.add("cu;Cuba".split(";")); + this.knownCountries.add("cy;Cyprus".split(";")); + this.knownCountries.add("cz;Czech Republic".split(";")); + this.knownCountries.add("dk;Denmark".split(";")); + this.knownCountries.add("dj;Djibouti".split(";")); + this.knownCountries.add("dm;Dominica".split(";")); + this.knownCountries.add("do;Dominican Republic".split(";")); + this.knownCountries.add("ec;Ecuador".split(";")); + this.knownCountries.add("eg;Egypt".split(";")); + this.knownCountries.add("sv;El Salvador".split(";")); + this.knownCountries.add("gq;Equatorial Guinea".split(";")); + this.knownCountries.add("er;Eritrea".split(";")); + this.knownCountries.add("ee;Estonia".split(";")); + this.knownCountries.add("et;Ethiopia".split(";")); + this.knownCountries.add("fk;Falkland Islands (Malvinas)".split(";")); + this.knownCountries.add("fo;Faroe Islands".split(";")); + this.knownCountries.add("fj;Fiji".split(";")); + this.knownCountries.add("fi;Finland".split(";")); + this.knownCountries.add("fx;France, Metropolitan".split(";")); + this.knownCountries.add("fr;France".split(";")); + this.knownCountries.add("gf;French Guiana".split(";")); + this.knownCountries.add("pf;French Polynesia".split(";")); + this.knownCountries.add("tf;French Southern Territories".split(";")); + this.knownCountries.add("ga;Gabon".split(";")); + this.knownCountries.add("gm;Gambia".split(";")); + this.knownCountries.add("ge;Georgia".split(";")); + this.knownCountries.add("de;Germany".split(";")); + this.knownCountries.add("gh;Ghana".split(";")); + this.knownCountries.add("gi;Gibraltar".split(";")); + this.knownCountries.add("gr;Greece".split(";")); + this.knownCountries.add("gl;Greenland".split(";")); + this.knownCountries.add("gd;Grenada".split(";")); + this.knownCountries.add("gp;Guadeloupe".split(";")); + this.knownCountries.add("gu;Guam".split(";")); + this.knownCountries.add("gt;Guatemala".split(";")); + this.knownCountries.add("gg;Guernsey".split(";")); + this.knownCountries.add("gn;Guinea".split(";")); + this.knownCountries.add("gw;Guinea-Bissau".split(";")); + this.knownCountries.add("gy;Guyana".split(";")); + this.knownCountries.add("ht;Haiti".split(";")); + this.knownCountries.add("hm;Heard Island and McDonald Islands". + split(";")); + this.knownCountries.add("va;Holy See (Vatican City State)". + split(";")); + this.knownCountries.add("hn;Honduras".split(";")); + this.knownCountries.add("hk;Hong Kong".split(";")); + this.knownCountries.add("hu;Hungary".split(";")); + this.knownCountries.add("is;Iceland".split(";")); + this.knownCountries.add("in;India".split(";")); + this.knownCountries.add("id;Indonesia".split(";")); + this.knownCountries.add("ir;Iran, Islamic Republic of".split(";")); + this.knownCountries.add("iq;Iraq".split(";")); + this.knownCountries.add("ie;Ireland".split(";")); + this.knownCountries.add("im;Isle of Man".split(";")); + this.knownCountries.add("il;Israel".split(";")); + this.knownCountries.add("it;Italy".split(";")); + this.knownCountries.add("jm;Jamaica".split(";")); + this.knownCountries.add("jp;Japan".split(";")); + this.knownCountries.add("je;Jersey".split(";")); + this.knownCountries.add("jo;Jordan".split(";")); + this.knownCountries.add("kz;Kazakhstan".split(";")); + this.knownCountries.add("ke;Kenya".split(";")); + this.knownCountries.add("ki;Kiribati".split(";")); + this.knownCountries.add("kp;Korea, Democratic People's Republic of". + split(";")); + this.knownCountries.add("kr;Korea, Republic of".split(";")); + this.knownCountries.add("kw;Kuwait".split(";")); + this.knownCountries.add("kg;Kyrgyzstan".split(";")); + this.knownCountries.add("la;Lao People's Democratic Republic". + split(";")); + this.knownCountries.add("lv;Latvia".split(";")); + this.knownCountries.add("lb;Lebanon".split(";")); + this.knownCountries.add("ls;Lesotho".split(";")); + this.knownCountries.add("lr;Liberia".split(";")); + this.knownCountries.add("ly;Libyan Arab Jamahiriya".split(";")); + this.knownCountries.add("li;Liechtenstein".split(";")); + this.knownCountries.add("lt;Lithuania".split(";")); + this.knownCountries.add("lu;Luxembourg".split(";")); + this.knownCountries.add("mo;Macao".split(";")); + this.knownCountries.add("mk;Macedonia".split(";")); + this.knownCountries.add("mg;Madagascar".split(";")); + this.knownCountries.add("mw;Malawi".split(";")); + this.knownCountries.add("my;Malaysia".split(";")); + this.knownCountries.add("mv;Maldives".split(";")); + this.knownCountries.add("ml;Mali".split(";")); + this.knownCountries.add("mt;Malta".split(";")); + this.knownCountries.add("mh;Marshall Islands".split(";")); + this.knownCountries.add("mq;Martinique".split(";")); + this.knownCountries.add("mr;Mauritania".split(";")); + this.knownCountries.add("mu;Mauritius".split(";")); + this.knownCountries.add("yt;Mayotte".split(";")); + this.knownCountries.add("mx;Mexico".split(";")); + this.knownCountries.add("fm;Micronesia, Federated States of". + split(";")); + this.knownCountries.add("md;Moldova, Republic of".split(";")); + this.knownCountries.add("mc;Monaco".split(";")); + this.knownCountries.add("mn;Mongolia".split(";")); + this.knownCountries.add("me;Montenegro".split(";")); + this.knownCountries.add("ms;Montserrat".split(";")); + this.knownCountries.add("ma;Morocco".split(";")); + this.knownCountries.add("mz;Mozambique".split(";")); + this.knownCountries.add("mm;Myanmar".split(";")); + this.knownCountries.add("na;Namibia".split(";")); + this.knownCountries.add("nr;Nauru".split(";")); + this.knownCountries.add("np;Nepal".split(";")); + this.knownCountries.add("an;Netherlands Antilles".split(";")); + this.knownCountries.add("nl;Netherlands".split(";")); + this.knownCountries.add("nc;New Caledonia".split(";")); + this.knownCountries.add("nz;New Zealand".split(";")); + this.knownCountries.add("ni;Nicaragua".split(";")); + this.knownCountries.add("ne;Niger".split(";")); + this.knownCountries.add("ng;Nigeria".split(";")); + this.knownCountries.add("nu;Niue".split(";")); + this.knownCountries.add("nf;Norfolk Island".split(";")); + this.knownCountries.add("mp;Northern Mariana Islands".split(";")); + this.knownCountries.add("no;Norway".split(";")); + this.knownCountries.add("om;Oman".split(";")); + this.knownCountries.add("pk;Pakistan".split(";")); + this.knownCountries.add("pw;Palau".split(";")); + this.knownCountries.add("ps;Palestinian Territory".split(";")); + this.knownCountries.add("pa;Panama".split(";")); + this.knownCountries.add("pg;Papua New Guinea".split(";")); + this.knownCountries.add("py;Paraguay".split(";")); + this.knownCountries.add("pe;Peru".split(";")); + this.knownCountries.add("ph;Philippines".split(";")); + this.knownCountries.add("pn;Pitcairn".split(";")); + this.knownCountries.add("pl;Poland".split(";")); + this.knownCountries.add("pt;Portugal".split(";")); + this.knownCountries.add("pr;Puerto Rico".split(";")); + this.knownCountries.add("qa;Qatar".split(";")); + this.knownCountries.add("re;Reunion".split(";")); + this.knownCountries.add("ro;Romania".split(";")); + this.knownCountries.add("ru;Russian Federation".split(";")); + this.knownCountries.add("rw;Rwanda".split(";")); + this.knownCountries.add("bl;Saint Bartelemey".split(";")); + this.knownCountries.add("sh;Saint Helena".split(";")); + this.knownCountries.add("kn;Saint Kitts and Nevis".split(";")); + this.knownCountries.add("lc;Saint Lucia".split(";")); + this.knownCountries.add("mf;Saint Martin".split(";")); + this.knownCountries.add("pm;Saint Pierre and Miquelon".split(";")); + this.knownCountries.add("vc;Saint Vincent and the Grenadines". + split(";")); + this.knownCountries.add("ws;Samoa".split(";")); + this.knownCountries.add("sm;San Marino".split(";")); + this.knownCountries.add("st;Sao Tome and Principe".split(";")); + this.knownCountries.add("sa;Saudi Arabia".split(";")); + this.knownCountries.add("sn;Senegal".split(";")); + this.knownCountries.add("rs;Serbia".split(";")); + this.knownCountries.add("sc;Seychelles".split(";")); + this.knownCountries.add("sl;Sierra Leone".split(";")); + this.knownCountries.add("sg;Singapore".split(";")); + this.knownCountries.add("sk;Slovakia".split(";")); + this.knownCountries.add("si;Slovenia".split(";")); + this.knownCountries.add("sb;Solomon Islands".split(";")); + this.knownCountries.add("so;Somalia".split(";")); + this.knownCountries.add("za;South Africa".split(";")); + this.knownCountries.add(("gs;South Georgia and the South Sandwich " + + "Islands").split(";")); + this.knownCountries.add("es;Spain".split(";")); + this.knownCountries.add("lk;Sri Lanka".split(";")); + this.knownCountries.add("sd;Sudan".split(";")); + this.knownCountries.add("sr;Suriname".split(";")); + this.knownCountries.add("sj;Svalbard and Jan Mayen".split(";")); + this.knownCountries.add("sz;Swaziland".split(";")); + this.knownCountries.add("se;Sweden".split(";")); + this.knownCountries.add("ch;Switzerland".split(";")); + this.knownCountries.add("sy;Syrian Arab Republic".split(";")); + this.knownCountries.add("tw;Taiwan".split(";")); + this.knownCountries.add("tj;Tajikistan".split(";")); + this.knownCountries.add("tz;Tanzania, United Republic of".split(";")); + this.knownCountries.add("th;Thailand".split(";")); + this.knownCountries.add("tl;Timor-Leste".split(";")); + this.knownCountries.add("tg;Togo".split(";")); + this.knownCountries.add("tk;Tokelau".split(";")); + this.knownCountries.add("to;Tonga".split(";")); + this.knownCountries.add("tt;Trinidad and Tobago".split(";")); + this.knownCountries.add("tn;Tunisia".split(";")); + this.knownCountries.add("tr;Turkey".split(";")); + this.knownCountries.add("tm;Turkmenistan".split(";")); + this.knownCountries.add("tc;Turks and Caicos Islands".split(";")); + this.knownCountries.add("tv;Tuvalu".split(";")); + this.knownCountries.add("ug;Uganda".split(";")); + this.knownCountries.add("ua;Ukraine".split(";")); + this.knownCountries.add("ae;United Arab Emirates".split(";")); + this.knownCountries.add("gb;United Kingdom".split(";")); + this.knownCountries.add("um;United States Minor Outlying Islands". + split(";")); + this.knownCountries.add("us;United States".split(";")); + this.knownCountries.add("uy;Uruguay".split(";")); + this.knownCountries.add("uz;Uzbekistan".split(";")); + this.knownCountries.add("vu;Vanuatu".split(";")); + this.knownCountries.add("ve;Venezuela".split(";")); + this.knownCountries.add("vn;Vietnam".split(";")); + this.knownCountries.add("vg;Virgin Islands, British".split(";")); + this.knownCountries.add("vi;Virgin Islands, U.S.".split(";")); + this.knownCountries.add("wf;Wallis and Futuna".split(";")); + this.knownCountries.add("eh;Western Sahara".split(";")); + this.knownCountries.add("ye;Yemen".split(";")); + this.knownCountries.add("zm;Zambia".split(";")); + this.knownCountries.add("zw;Zimbabwe".split(";")); + } + + public List<String[]> getCountryList() { + return this.knownCountries; + } +} + diff --git a/src/org/torproject/ernie/web/GraphParameterChecker.java b/src/org/torproject/ernie/web/GraphParameterChecker.java index 2822cc4..308afe5 100644 --- a/src/org/torproject/ernie/web/GraphParameterChecker.java +++ b/src/org/torproject/ernie/web/GraphParameterChecker.java @@ -64,9 +64,11 @@ public class GraphParameterChecker { this.knownParameterValues.put("flag", "Running,Exit,Guard,Fast,Stable"); this.knownParameterValues.put("granularity", "day,hour"); - this.knownParameterValues.put("country", "all,ae,au,bh,br,ca,cn,cu," - + "de,dj,dz,eg,et,fr,gb,il,ir,it,iq,jo,jp,kp,kr,kw,lb,ly,ma,mm," - + "om,pl,ps,qa,ru,sa,sd,se,sy,tn,tm,us,uz,vn,ye"); + StringBuilder sb = new StringBuilder("all"); + for (String[] country : Countries.getInstance().getCountryList()) { + sb.append("," + country[0]); + } + this.knownParameterValues.put("country", sb.toString()); this.knownParameterValues.put("bundle", "all,en,zh_CN,fa"); this.knownParameterValues.put("source", "all,siv,moria,torperf"); this.knownParameterValues.put("filesize", "50kb,1mb,5mb"); diff --git a/src/org/torproject/ernie/web/GraphsSubpagesServlet.java b/src/org/torproject/ernie/web/GraphsSubpagesServlet.java index 1ae39d1..2de2eac 100644 --- a/src/org/torproject/ernie/web/GraphsSubpagesServlet.java +++ b/src/org/torproject/ernie/web/GraphsSubpagesServlet.java @@ -11,6 +11,9 @@ public class GraphsSubpagesServlet extends HttpServlet { * are forwarded. */ private Map<String, String> availableGraphsSubpages; + /* Country codes and names for per-country graphs. */ + private List<String[]> knownCountries; + public GraphsSubpagesServlet() { this.availableGraphsSubpages = new HashMap<String, String>(); this.availableGraphsSubpages.put("network.html", @@ -20,6 +23,8 @@ public class GraphsSubpagesServlet extends HttpServlet { "WEB-INF/packages.jsp"); this.availableGraphsSubpages.put("performance.html", "WEB-INF/performance.jsp"); + + this.knownCountries = Countries.getInstance().getCountryList(); } public void doGet(HttpServletRequest request, @@ -69,6 +74,9 @@ public class GraphsSubpagesServlet extends HttpServlet { } } + /* Pass list of known countries in case we want to display them. */ + request.setAttribute("countries", this.knownCountries); + /* Forward the request to the JSP that does all the hard work. */ request.getRequestDispatcher(jsp).forward(request, response); } diff --git a/web/WEB-INF/network.jsp b/web/WEB-INF/network.jsp index 84d5f1d..bba1d4b 100644 --- a/web/WEB-INF/network.jsp +++ b/web/WEB-INF/network.jsp @@ -64,48 +64,9 @@ country.</p> </p><p> Source: <select name="country"> <option value="all"<c:if test="${relaycountries_country[0] eq 'all'}"> selected</c:if>>All relays</option> - <option value="dz"<c:if test="${relaycountries_country[0] eq 'dz'}"> selected</c:if>>Algeria</option> - <option value="au"<c:if test="${relaycountries_country[0] eq 'au'}"> selected</c:if>>Australia</option> - <option value="bh"<c:if test="${relaycountries_country[0] eq 'bh'}"> selected</c:if>>Bahrain</option> - <option value="br"<c:if test="${relaycountries_country[0] eq 'br'}"> selected</c:if>>Brazil</option> - <option value="mm"<c:if test="${relaycountries_country[0] eq 'mm'}"> selected</c:if>>Burma</option> - <option value="ca"<c:if test="${relaycountries_country[0] eq 'ca'}"> selected</c:if>>Canada</option> - <option value="cn"<c:if test="${relaycountries_country[0] eq 'cn'}"> selected</c:if>>China</option> - <option value="cu"<c:if test="${relaycountries_country[0] eq 'cu'}"> selected</c:if>>Cuba</option> - <option value="dj"<c:if test="${relaycountries_country[0] eq 'dj'}"> selected</c:if>>Djibouti</option> - <option value="eg"<c:if test="${relaycountries_country[0] eq 'eg'}"> selected</c:if>>Egypt</option> - <option value="et"<c:if test="${relaycountries_country[0] eq 'et'}"> selected</c:if>>Ethiopia</option> - <option value="fr"<c:if test="${relaycountries_country[0] eq 'fr'}"> selected</c:if>>France</option> - <option value="de"<c:if test="${relaycountries_country[0] eq 'de'}"> selected</c:if>>Germany</option> - <option value="ir"<c:if test="${relaycountries_country[0] eq 'ir'}"> selected</c:if>>Iran</option> - <option value="iq"<c:if test="${relaycountries_country[0] eq 'iq'}"> selected</c:if>>Iraq</option> - <option value="il"<c:if test="${relaycountries_country[0] eq 'il'}"> selected</c:if>>Israel</option> - <option value="it"<c:if test="${relaycountries_country[0] eq 'it'}"> selected</c:if>>Italy</option> - <option value="jp"<c:if test="${relaycountries_country[0] eq 'jp'}"> selected</c:if>>Japan</option> - <option value="jo"<c:if test="${relaycountries_country[0] eq 'jo'}"> selected</c:if>>Jordan</option> - <option value="kw"<c:if test="${relaycountries_country[0] eq 'kw'}"> selected</c:if>>Kuwait</option> - <option value="lb"<c:if test="${relaycountries_country[0] eq 'lb'}"> selected</c:if>>Lebanon</option> - <option value="ly"<c:if test="${relaycountries_country[0] eq 'ly'}"> selected</c:if>>Libya</option> - <option value="ma"<c:if test="${relaycountries_country[0] eq 'ma'}"> selected</c:if>>Morocco</option> - <option value="kp"<c:if test="${relaycountries_country[0] eq 'kp'}"> selected</c:if>>North Korea</option> - <option value="om"<c:if test="${relaycountries_country[0] eq 'om'}"> selected</c:if>>Oman</option> - <option value="ps"<c:if test="${relaycountries_country[0] eq 'ps'}"> selected</c:if>>Palestinian territories</option> - <option value="pl"<c:if test="${relaycountries_country[0] eq 'pl'}"> selected</c:if>>Poland</option> - <option value="qa"<c:if test="${relaycountries_country[0] eq 'qa'}"> selected</c:if>>Qatar</option> - <option value="ru"<c:if test="${relaycountries_country[0] eq 'ru'}"> selected</c:if>>Russia</option> - <option value="sa"<c:if test="${relaycountries_country[0] eq 'sa'}"> selected</c:if>>Saudi Arabia</option> - <option value="kr"<c:if test="${relaycountries_country[0] eq 'kr'}"> selected</c:if>>South Korea</option> - <option value="sd"<c:if test="${relaycountries_country[0] eq 'sd'}"> selected</c:if>>Sudan</option> - <option value="se"<c:if test="${relaycountries_country[0] eq 'se'}"> selected</c:if>>Sweden</option> - <option value="sy"<c:if test="${relaycountries_country[0] eq 'sy'}"> selected</c:if>>Syria</option> - <option value="tn"<c:if test="${relaycountries_country[0] eq 'tn'}"> selected</c:if>>Tunisia</option> - <option value="tm"<c:if test="${relaycountries_country[0] eq 'tm'}"> selected</c:if>>Turkmenistan</option> - <option value="ae"<c:if test="${relaycountries_country[0] eq 'ae'}"> selected</c:if>>U.A.E.</option> - <option value="gb"<c:if test="${relaycountries_country[0] eq 'gb'}"> selected</c:if>>U.K.</option> - <option value="us"<c:if test="${relaycountries_country[0] eq 'us'}"> selected</c:if>>U.S.A.</option> - <option value="uz"<c:if test="${relaycountries_country[0] eq 'uz'}"> selected</c:if>>Uzbekistan</option> - <option value="vn"<c:if test="${relaycountries_country[0] eq 'vn'}"> selected</c:if>>Vietnam</option> - <option value="ye"<c:if test="${relaycountries_country[0] eq 'ye'}"> selected</c:if>>Yemen</option> + <c:forEach var="country" items="${countries}" > + <option value="${country[0]}"<c:if test="${relaycountries_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option> + </c:forEach> </select> </p><p> Resolution: <select name="dpi"> diff --git a/web/WEB-INF/users.jsp b/web/WEB-INF/users.jsp index 9d88e96..7ea45a5 100644 --- a/web/WEB-INF/users.jsp +++ b/web/WEB-INF/users.jsp @@ -37,48 +37,9 @@ based on the requests seen by a few dozen directory mirrors.</p> </p><p> Source: <select name="country"> <option value="all"<c:if test="${direct_users_country[0] eq 'all'}"> selected</c:if>>All users</option> - <option value="dz"<c:if test="${direct_users_country[0] eq 'dz'}"> selected</c:if>>Algeria</option> - <option value="au"<c:if test="${direct_users_country[0] eq 'au'}"> selected</c:if>>Australia</option> - <option value="bh"<c:if test="${direct_users_country[0] eq 'bh'}"> selected</c:if>>Bahrain</option> - <option value="br"<c:if test="${direct_users_country[0] eq 'br'}"> selected</c:if>>Brazil</option> - <option value="mm"<c:if test="${direct_users_country[0] eq 'mm'}"> selected</c:if>>Burma</option> - <option value="ca"<c:if test="${direct_users_country[0] eq 'ca'}"> selected</c:if>>Canada</option> - <option value="cn"<c:if test="${direct_users_country[0] eq 'cn'}"> selected</c:if>>China</option> - <option value="cu"<c:if test="${direct_users_country[0] eq 'cu'}"> selected</c:if>>Cuba</option> - <option value="dj"<c:if test="${direct_users_country[0] eq 'dj'}"> selected</c:if>>Djibouti</option> - <option value="eg"<c:if test="${direct_users_country[0] eq 'eg'}"> selected</c:if>>Egypt</option> - <option value="et"<c:if test="${direct_users_country[0] eq 'et'}"> selected</c:if>>Ethiopia</option> - <option value="fr"<c:if test="${direct_users_country[0] eq 'fr'}"> selected</c:if>>France</option> - <option value="de"<c:if test="${direct_users_country[0] eq 'de'}"> selected</c:if>>Germany</option> - <option value="ir"<c:if test="${direct_users_country[0] eq 'ir'}"> selected</c:if>>Iran</option> - <option value="iq"<c:if test="${direct_users_country[0] eq 'iq'}"> selected</c:if>>Iraq</option> - <option value="il"<c:if test="${direct_users_country[0] eq 'il'}"> selected</c:if>>Israel</option> - <option value="it"<c:if test="${direct_users_country[0] eq 'it'}"> selected</c:if>>Italy</option> - <option value="jp"<c:if test="${direct_users_country[0] eq 'jp'}"> selected</c:if>>Japan</option> - <option value="jo"<c:if test="${direct_users_country[0] eq 'jo'}"> selected</c:if>>Jordan</option> - <option value="kw"<c:if test="${direct_users_country[0] eq 'kw'}"> selected</c:if>>Kuwait</option> - <option value="lb"<c:if test="${direct_users_country[0] eq 'lb'}"> selected</c:if>>Lebanon</option> - <option value="ly"<c:if test="${direct_users_country[0] eq 'ly'}"> selected</c:if>>Libya</option> - <option value="ma"<c:if test="${direct_users_country[0] eq 'ma'}"> selected</c:if>>Morocco</option> - <option value="kp"<c:if test="${direct_users_country[0] eq 'kp'}"> selected</c:if>>North Korea</option> - <option value="om"<c:if test="${direct_users_country[0] eq 'om'}"> selected</c:if>>Oman</option> - <option value="ps"<c:if test="${direct_users_country[0] eq 'ps'}"> selected</c:if>>Palestinian territories</option> - <option value="pl"<c:if test="${direct_users_country[0] eq 'pl'}"> selected</c:if>>Poland</option> - <option value="qa"<c:if test="${direct_users_country[0] eq 'qa'}"> selected</c:if>>Qatar</option> - <option value="ru"<c:if test="${direct_users_country[0] eq 'ru'}"> selected</c:if>>Russia</option> - <option value="sa"<c:if test="${direct_users_country[0] eq 'sa'}"> selected</c:if>>Saudi Arabia</option> - <option value="kr"<c:if test="${direct_users_country[0] eq 'kr'}"> selected</c:if>>South Korea</option> - <option value="sd"<c:if test="${direct_users_country[0] eq 'sd'}"> selected</c:if>>Sudan</option> - <option value="se"<c:if test="${direct_users_country[0] eq 'se'}"> selected</c:if>>Sweden</option> - <option value="sy"<c:if test="${direct_users_country[0] eq 'sy'}"> selected</c:if>>Syria</option> - <option value="tn"<c:if test="${direct_users_country[0] eq 'tn'}"> selected</c:if>>Tunisia</option> - <option value="tm"<c:if test="${direct_users_country[0] eq 'tm'}"> selected</c:if>>Turkmenistan</option> - <option value="ae"<c:if test="${direct_users_country[0] eq 'ae'}"> selected</c:if>>U.A.E.</option> - <option value="gb"<c:if test="${direct_users_country[0] eq 'gb'}"> selected</c:if>>U.K.</option> - <option value="us"<c:if test="${direct_users_country[0] eq 'us'}"> selected</c:if>>U.S.A.</option> - <option value="uz"<c:if test="${direct_users_country[0] eq 'uz'}"> selected</c:if>>Uzbekistan</option> - <option value="vn"<c:if test="${direct_users_country[0] eq 'vn'}"> selected</c:if>>Vietnam</option> - <option value="ye"<c:if test="${direct_users_country[0] eq 'ye'}"> selected</c:if>>Yemen</option> + <c:forEach var="country" items="${countries}" > + <option value="${country[0]}"<c:if test="${direct_users_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option> + </c:forEach> </select> </p><p> Resolution: <select name="dpi"> @@ -120,48 +81,9 @@ by a few hundred bridges.</p> </p><p> Source: <select name="country"> <option value="all"<c:if test="${bridge_users_country[0] eq 'all'}"> selected</c:if>>All users</option> - <option value="dz"<c:if test="${bridge_users_country[0] eq 'dz'}"> selected</c:if>>Algeria</option> - <option value="au"<c:if test="${bridge_users_country[0] eq 'au'}"> selected</c:if>>Australia</option> - <option value="bh"<c:if test="${bridge_users_country[0] eq 'bh'}"> selected</c:if>>Bahrain</option> - <option value="br"<c:if test="${bridge_users_country[0] eq 'br'}"> selected</c:if>>Brazil</option> - <option value="mm"<c:if test="${bridge_users_country[0] eq 'mm'}"> selected</c:if>>Burma</option> - <option value="ca"<c:if test="${bridge_users_country[0] eq 'ca'}"> selected</c:if>>Canada</option> - <option value="cn"<c:if test="${bridge_users_country[0] eq 'cn'}"> selected</c:if>>China</option> - <option value="cu"<c:if test="${bridge_users_country[0] eq 'cu'}"> selected</c:if>>Cuba</option> - <option value="dj"<c:if test="${bridge_users_country[0] eq 'dj'}"> selected</c:if>>Djibouti</option> - <option value="eg"<c:if test="${bridge_users_country[0] eq 'eg'}"> selected</c:if>>Egypt</option> - <option value="et"<c:if test="${bridge_users_country[0] eq 'et'}"> selected</c:if>>Ethiopia</option> - <option value="fr"<c:if test="${bridge_users_country[0] eq 'fr'}"> selected</c:if>>France</option> - <option value="de"<c:if test="${bridge_users_country[0] eq 'de'}"> selected</c:if>>Germany</option> - <option value="ir"<c:if test="${bridge_users_country[0] eq 'ir'}"> selected</c:if>>Iran</option> - <option value="iq"<c:if test="${bridge_users_country[0] eq 'iq'}"> selected</c:if>>Iraq</option> - <option value="il"<c:if test="${bridge_users_country[0] eq 'il'}"> selected</c:if>>Israel</option> - <option value="it"<c:if test="${bridge_users_country[0] eq 'it'}"> selected</c:if>>Italy</option> - <option value="jp"<c:if test="${bridge_users_country[0] eq 'jp'}"> selected</c:if>>Japan</option> - <option value="jo"<c:if test="${bridge_users_country[0] eq 'jo'}"> selected</c:if>>Jordan</option> - <option value="kw"<c:if test="${bridge_users_country[0] eq 'kw'}"> selected</c:if>>Kuwait</option> - <option value="lb"<c:if test="${bridge_users_country[0] eq 'lb'}"> selected</c:if>>Lebanon</option> - <option value="ly"<c:if test="${bridge_users_country[0] eq 'ly'}"> selected</c:if>>Libya</option> - <option value="ma"<c:if test="${bridge_users_country[0] eq 'ma'}"> selected</c:if>>Morocco</option> - <option value="kp"<c:if test="${bridge_users_country[0] eq 'kp'}"> selected</c:if>>North Korea</option> - <option value="om"<c:if test="${bridge_users_country[0] eq 'om'}"> selected</c:if>>Oman</option> - <option value="ps"<c:if test="${bridge_users_country[0] eq 'ps'}"> selected</c:if>>Palestinian territories</option> - <option value="pl"<c:if test="${bridge_users_country[0] eq 'pl'}"> selected</c:if>>Poland</option> - <option value="qa"<c:if test="${bridge_users_country[0] eq 'qa'}"> selected</c:if>>Qatar</option> - <option value="ru"<c:if test="${bridge_users_country[0] eq 'ru'}"> selected</c:if>>Russia</option> - <option value="sa"<c:if test="${bridge_users_country[0] eq 'sa'}"> selected</c:if>>Saudi Arabia</option> - <option value="kr"<c:if test="${bridge_users_country[0] eq 'kr'}"> selected</c:if>>South Korea</option> - <option value="sd"<c:if test="${bridge_users_country[0] eq 'sd'}"> selected</c:if>>Sudan</option> - <option value="se"<c:if test="${bridge_users_country[0] eq 'se'}"> selected</c:if>>Sweden</option> - <option value="sy"<c:if test="${bridge_users_country[0] eq 'sy'}"> selected</c:if>>Syria</option> - <option value="tn"<c:if test="${bridge_users_country[0] eq 'tn'}"> selected</c:if>>Tunisia</option> - <option value="tm"<c:if test="${bridge_users_country[0] eq 'tm'}"> selected</c:if>>Turkmenistan</option> - <option value="ae"<c:if test="${bridge_users_country[0] eq 'ae'}"> selected</c:if>>U.A.E.</option> - <option value="gb"<c:if test="${bridge_users_country[0] eq 'gb'}"> selected</c:if>>U.K.</option> - <option value="us"<c:if test="${bridge_users_country[0] eq 'us'}"> selected</c:if>>U.S.A.</option> - <option value="uz"<c:if test="${bridge_users_country[0] eq 'uz'}"> selected</c:if>>Uzbekistan</option> - <option value="vn"<c:if test="${bridge_users_country[0] eq 'vn'}"> selected</c:if>>Vietnam</option> - <option value="ye"<c:if test="${bridge_users_country[0] eq 'ye'}"> selected</c:if>>Yemen</option> + <c:forEach var="country" items="${countries}" > + <option value="${country[0]}"<c:if test="${bridge_users_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option> + </c:forEach> </select> </p><p> Resolution: <select name="dpi">
participants (1)
-
karsten@torproject.org