diff --git a/java/demo/src/com/google/phonenumbers/PhoneNumberParserServlet.java b/java/demo/src/com/google/phonenumbers/PhoneNumberParserServlet.java index 2c41f713e..f94645292 100644 --- a/java/demo/src/com/google/phonenumbers/PhoneNumberParserServlet.java +++ b/java/demo/src/com/google/phonenumbers/PhoneNumberParserServlet.java @@ -19,6 +19,7 @@ package com.google.phonenumbers; import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Locale.ENGLISH; import com.google.i18n.phonenumbers.AsYouTypeFormatter; import com.google.i18n.phonenumbers.NumberParseException; @@ -103,16 +104,40 @@ public class PhoneNumberParserServlet extends HttpServlet { resp.setContentType("text/html"); resp.setCharacterEncoding(UTF_8.name()); if (fileContents.length() == 0) { - resp.getWriter().println( - getOutputForSingleNumber(phoneNumber, defaultCountry, languageCode, regionCode)); + // Redirect to a URL with the given input encoded in the query parameters. + Locale geocodingLocale = new Locale(languageCode, regionCode); + resp.sendRedirect(getPermaLinkURL(phoneNumber, defaultCountry, geocodingLocale)); } else { resp.getWriter().println(getOutputForFile(defaultCountry, fileContents)); } } + /** + * Handle the get request to get information about a number based on query parameters. + */ + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + String phoneNumber = req.getParameter("number"); + if (phoneNumber == null) { + phoneNumber = ""; + } + String defaultCountry = req.getParameter("country"); + if (defaultCountry == null) { + defaultCountry = ""; + } + String geocodingParam = req.getParameter("geocodingLocale"); + Locale geocodingLocale; + if (geocodingParam == null) { + geocodingLocale = ENGLISH; // Default languageCode to English if nothing is entered. + } else { + geocodingLocale = Locale.forLanguageTag(geocodingParam); + } + resp.getWriter().println( + getOutputForSingleNumber(phoneNumber, defaultCountry, geocodingLocale)); + } + private StringBuilder getOutputForFile(String defaultCountry, String fileContents) { - StringBuilder output = new StringBuilder(); - output.append("Results generated from phone numbers in the file provided:" + StringBuilder output = new StringBuilder( + "<HTML><HEAD><TITLE>Results generated from phone numbers in the file provided:" + ""); output.append(""); output.append(""); @@ -160,19 +185,43 @@ public class PhoneNumberParserServlet extends HttpServlet { output.append(""); } + /** + * Returns a stable URL pointing to the result page for the given input. + */ + private String getPermaLinkURL( + String phoneNumber, String defaultCountry, Locale geocodingLocale) { + StringBuilder permaLink = new StringBuilder( + "http://libphonenumber.appspot.com/phonenumberparser"); + try { + permaLink.append("?number=" + URLEncoder.encode(phoneNumber, UTF_8.name())); + if (!defaultCountry.isEmpty()) { + permaLink.append("&country=" + URLEncoder.encode(defaultCountry, UTF_8.name())); + } + if (!geocodingLocale.getLanguage().equals(ENGLISH.getLanguage()) || + !geocodingLocale.getCountry().isEmpty()) { + permaLink.append("&geocodingLocale=" + + URLEncoder.encode(geocodingLocale.toLanguageTag(), UTF_8.name())); + } + } catch(UnsupportedEncodingException e) { + // UTF-8 is guaranteed in Java, so this should be impossible. + throw new AssertionError(e); + } + return permaLink.toString(); + } + /** * Returns a link to create a new github issue with the relevant information. */ - private String getNewIssueLink(String phoneNumber, String defaultCountry) - throws UnsupportedEncodingException { + private String getNewIssueLink( + String phoneNumber, String defaultCountry, Locale geocodingLocale) { boolean hasDefaultCountry = !defaultCountry.isEmpty() && defaultCountry != "ZZ"; String issueTitle = "Validation issue with " + phoneNumber + (hasDefaultCountry ? " (" + defaultCountry + ")" : ""); // Issue template. This must be kept in sync with the template in // https://github.com/googlei18n/libphonenumber/blob/master/CONTRIBUTING.md. - StringBuilder issueTemplate = new StringBuilder(); - issueTemplate.append("Please read the \"guidelines for contributing\" (linked above) and fill " + StringBuilder issueTemplate = new StringBuilder( + "Please read the \"guidelines for contributing\" (linked above) and fill " + "in the template below.\n\n"); issueTemplate.append("Country/region affected (e.g., \"US\"): ") .append(defaultCountry).append("\n\n"); @@ -188,20 +237,27 @@ public class PhoneNumberParserServlet extends HttpServlet { "Supporting evidence (for example, national numbering plan, announcement from mobile " + "carrier, news article): **IMPORTANT - anything posted here is made public. " + "Read the guidelines first!** \n\n"); - return "https://github.com/googlei18n/libphonenumber/issues/new?title=" - + URLEncoder.encode(issueTitle, UTF_8.name()) + "&body=" + issueTemplate.append("[link to demo](" + + getPermaLinkURL(phoneNumber, defaultCountry, geocodingLocale) + + ")\n\n"); + String newIssueLink = "https://github.com/googlei18n/libphonenumber/issues/new?title="; + try { + newIssueLink += URLEncoder.encode(issueTitle, UTF_8.name()) + "&body=" + URLEncoder.encode(issueTemplate.toString(), UTF_8.name()); + } catch(UnsupportedEncodingException e) { + // UTF-8 is guaranteed in Java, so this should be impossible. + throw new AssertionError(e); + } + return newIssueLink; } /** - * The defaultCountry here is used for parsing phoneNumber. The languageCode and regionCode are - * used to specify the language used for displaying the area descriptions generated from phone - * number geocoding. + * The defaultCountry here is used for parsing phoneNumber. The geocodingLocale is used to specify + * the language used for displaying the area descriptions generated from phone number geocoding. */ private StringBuilder getOutputForSingleNumber( - String phoneNumber, String defaultCountry, String languageCode, String regionCode) { - StringBuilder output = new StringBuilder(); - output.append(""); + String phoneNumber, String defaultCountry, Locale geocodingLocale) { + StringBuilder output = new StringBuilder(""); output.append( ""); output.append(""); @@ -209,9 +265,8 @@ public class PhoneNumberParserServlet extends HttpServlet { output.append("Phone Number entered: " + StringEscapeUtils.escapeHtml(phoneNumber) + "
"); output.append("defaultCountry entered: " + StringEscapeUtils.escapeHtml(defaultCountry) + "
"); - output.append("Language entered: " + StringEscapeUtils.escapeHtml(languageCode) + - (regionCode.isEmpty() ? "" : " (" + StringEscapeUtils.escapeHtml(regionCode) + ")") - + "
"); + output.append("Language entered: " + + StringEscapeUtils.escapeHtml(geocodingLocale.toLanguageTag()) + "
"); try { PhoneNumber number = phoneUtil.parseAndKeepRawInput(phoneNumber, defaultCountry); output.append("
"); @@ -330,7 +385,7 @@ public class PhoneNumberParserServlet extends HttpServlet { appendLine( "Location", PhoneNumberOfflineGeocoder.getInstance().getDescriptionForNumber( - number, new Locale(languageCode, regionCode)), + number, geocodingLocale), output); output.append("
ID
"); output.append(""); @@ -353,23 +408,20 @@ public class PhoneNumberParserServlet extends HttpServlet { output.append("PhoneNumberToCarrierMapper Results"); appendLine( "Carrier", - PhoneNumberToCarrierMapper.getInstance().getNameForNumber( - number, new Locale(languageCode, regionCode)), + PhoneNumberToCarrierMapper.getInstance().getNameForNumber(number, geocodingLocale), output); output.append(""); output.append(""); } } - String newIssueLink = getNewIssueLink(phoneNumber, defaultCountry); + String newIssueLink = getNewIssueLink(phoneNumber, defaultCountry, geocodingLocale); String guidelinesLink = "https://github.com/googlei18n/libphonenumber/blob/master/CONTRIBUTING.md"; output.append("File an issue: by clicking on " + "this link, I confirm that I " + "have read the contributor's guidelines."); - } catch(UnsupportedEncodingException e) { - output.append(StringEscapeUtils.escapeHtml(e.toString())); } catch (NumberParseException e) { output.append(StringEscapeUtils.escapeHtml(e.toString())); }