diff --git a/java/demo/README.md b/java/demo/README.md index abe000d7b..d10b30b9b 100644 --- a/java/demo/README.md +++ b/java/demo/README.md @@ -1,15 +1,21 @@ ## Prerequisite: ### Linux + #### Install the Appengine SDK. + `$ sudo apt-get install google-cloud-sdk-app-engine-java` ### Mac + #### Install the Google Cloud SDK. + `$ brew install google-cloud-sdk` #### Use GCloud CLI to install the Java Appengine + `$ gcloud components install app-engine-java` ## How to regenerate the WAR, deploy and run in appengine? -`$ mvn appengine:run` \ No newline at end of file + +`$ mvn appengine:run` diff --git a/java/demo/pom.xml b/java/demo/pom.xml index e07ab8a4a..6267d6559 100644 --- a/java/demo/pom.xml +++ b/java/demo/pom.xml @@ -4,7 +4,7 @@ com.googlecode.libphonenumber demo 8.12.57-SNAPSHOT - war + war https://github.com/google/libphonenumber/ com.googlecode.libphonenumber @@ -20,6 +20,8 @@ 1.8 true true + src/main/resources/com/google/phonenumbers/demo + com.google.phonenumbers.demo.template @@ -29,9 +31,14 @@ - com.google.appengine + soy + com.google.template + 2022-07-20 + + appengine-api-1.0-sdk - 1.9.96 + com.google.appengine + 2.0.8 javax.servlet @@ -76,13 +83,56 @@ ${project.build.directory}/${project.build.finalName}/WEB-INF/classes + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + + java + + + + + com.google.template.soy.SoyParseInfoGenerator + + --generateInvocationBuilders + --javaPackage + ${soy.package} + --javaClassNameSource + filename + --srcs + ${soy.root}/input_form.soy,${soy.root}/result.soy,${soy.root}/result_error.soy,${soy.root}/result_file.soy + --outputDirectory + src/main/java/com/google/phonenumbers/demo/template/ + + + com.google.cloud.tools appengine-maven-plugin - 1.3.1 + 2.4.4 + + maven-compiler-plugin + + 8 + 8 + + org.apache.maven.plugins + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.4.1 + + ${soy.package} + + + diff --git a/java/demo/src/main/java/com/google/phonenumbers/PhoneNumberParserServlet.java b/java/demo/src/main/java/com/google/phonenumbers/PhoneNumberParserServlet.java deleted file mode 100644 index 40f0fa8f9..000000000 --- a/java/demo/src/main/java/com/google/phonenumbers/PhoneNumberParserServlet.java +++ /dev/null @@ -1,441 +0,0 @@ -/* - * Copyright (C) 2011 The Libphonenumber Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @author Shaopeng Jia - */ - -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; -import com.google.i18n.phonenumbers.PhoneNumberToCarrierMapper; -import com.google.i18n.phonenumbers.PhoneNumberToTimeZonesMapper; -import com.google.i18n.phonenumbers.PhoneNumberUtil; -import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; -import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberType; -import com.google.i18n.phonenumbers.PhoneNumberUtil.ValidationResult; -import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; -import com.google.i18n.phonenumbers.ShortNumberInfo; -import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.Locale; -import java.util.StringTokenizer; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.commons.fileupload.FileItemIterator; -import org.apache.commons.fileupload.FileItemStream; -import org.apache.commons.fileupload.FileUploadException; -import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.apache.commons.fileupload.util.Streams; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringEscapeUtils; - -/** - * A servlet that accepts requests that contain strings representing a phone number and a default - * country, and responds with results from parsing, validating and formatting the number. The - * default country is a two-letter region code representing the country that we are expecting the - * number to be from. - */ -@SuppressWarnings("serial") -public class PhoneNumberParserServlet extends HttpServlet { - private PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); - private ShortNumberInfo shortInfo = ShortNumberInfo.getInstance(); - - public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { - String phoneNumber = null; - String defaultCountry = null; - String languageCode = "en"; // Default languageCode to English if nothing is entered. - String regionCode = ""; - String fileContents = null; - ServletFileUpload upload = new ServletFileUpload(); - upload.setSizeMax(50000); - try { - FileItemIterator iterator = upload.getItemIterator(req); - while (iterator.hasNext()) { - FileItemStream item = iterator.next(); - InputStream in = item.openStream(); - if (item.isFormField()) { - String fieldName = item.getFieldName(); - if (fieldName.equals("phoneNumber")) { - phoneNumber = Streams.asString(in, UTF_8.name()); - } else if (fieldName.equals("defaultCountry")) { - defaultCountry = Streams.asString(in).toUpperCase(); - } else if (fieldName.equals("languageCode")) { - String languageEntered = Streams.asString(in).toLowerCase(); - if (languageEntered.length() > 0) { - languageCode = languageEntered; - } - } else if (fieldName.equals("regionCode")) { - regionCode = Streams.asString(in).toUpperCase(); - } - } else { - try { - fileContents = IOUtils.toString(in); - } finally { - IOUtils.closeQuietly(in); - } - } - } - } catch (FileUploadException e1) { - e1.printStackTrace(); - } - - StringBuilder output; - resp.setContentType("text/html"); - resp.setCharacterEncoding(UTF_8.name()); - if (fileContents == null || fileContents.length() == 0) { - // 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, false /* absoluteURL */)); - } 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.setContentType("text/html"); - resp.setCharacterEncoding(UTF_8.name()); - resp.getWriter() - .println(getOutputForSingleNumber(phoneNumber, defaultCountry, geocodingLocale)); - } - - private StringBuilder getOutputForFile(String defaultCountry, String fileContents) { - StringBuilder output = - new StringBuilder( - "Results generated from phone numbers in the file provided:" - + ""); - output.append(""); - output.append(""); - output.append(""); - output.append(""); - output.append(""); - - int phoneNumberId = 0; - StringTokenizer tokenizer = new StringTokenizer(fileContents, ","); - while (tokenizer.hasMoreTokens()) { - String numberStr = tokenizer.nextToken(); - phoneNumberId++; - output.append(""); - output.append(" \n"); - output - .append(" \n"); - try { - PhoneNumber number = phoneUtil.parseAndKeepRawInput(numberStr, defaultCountry); - boolean isNumberValid = phoneUtil.isValidNumber(number); - String prettyFormat = - isNumberValid ? phoneUtil.formatInOriginalFormat(number, defaultCountry) : "invalid"; - String internationalFormat = - isNumberValid ? phoneUtil.format(number, PhoneNumberFormat.INTERNATIONAL) : "invalid"; - - output - .append(" \n"); - output - .append(" \n"); - } catch (NumberParseException e) { - output - .append(" \n"); - } - output.append(""); - } - output.append(""); - return output; - } - - private void appendLine(String title, String data, StringBuilder output) { - output.append(""); - output.append(""); - output.append(""); - output.append(""); - } - - /** Returns a stable URL pointing to the result page for the given input. */ - private String getPermaLinkURL( - String phoneNumber, String defaultCountry, Locale geocodingLocale, boolean absoluteURL) { - // If absoluteURL is false, generate a relative path. Otherwise, produce an absolute URL. - StringBuilder permaLink = - new StringBuilder( - absoluteURL - ? "http://libphonenumber.appspot.com/phonenumberparser" - : "/phonenumberparser"); - try { - permaLink.append( - "?number=" + URLEncoder.encode(phoneNumber != null ? phoneNumber : "", UTF_8.name())); - if (defaultCountry != null && !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(); - } - - private static final String NEW_ISSUE_BASE_URL = - "https://issuetracker.google.com/issues/new?component=192347&title="; - - /** Returns a link to create a new github issue with the relevant information. */ - private String getNewIssueLink( - String phoneNumber, String defaultCountry, Locale geocodingLocale) { - boolean hasDefaultCountry = !defaultCountry.isEmpty() && defaultCountry != "ZZ"; - String issueTitle = - "Validation issue with " - + phoneNumber - + (hasDefaultCountry ? " (" + defaultCountry + ")" : ""); - - String newIssueLink = NEW_ISSUE_BASE_URL; - try { - newIssueLink += URLEncoder.encode(issueTitle, 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 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, Locale geocodingLocale) { - StringBuilder output = new StringBuilder(""); - output.append(""); - output.append(""); - output.append(""); - output.append("Phone Number entered: " + StringEscapeUtils.escapeHtml(phoneNumber) + "
"); - output.append( - "defaultCountry entered: " + StringEscapeUtils.escapeHtml(defaultCountry) + "
"); - output.append( - "Language entered: " - + StringEscapeUtils.escapeHtml(geocodingLocale.toLanguageTag()) - + "
"); - try { - PhoneNumber number = phoneUtil.parseAndKeepRawInput(phoneNumber, defaultCountry); - output.append("
"); - output.append("
IDRaw phone numberPretty formattingInternational format
").append(phoneNumberId).append(" ") - .append(StringEscapeUtils.escapeHtml(numberStr)) - .append(" ") - .append(StringEscapeUtils.escapeHtml(prettyFormat)) - .append(" ") - .append(StringEscapeUtils.escapeHtml(internationalFormat)) - .append(" ") - .append(StringEscapeUtils.escapeHtml(e.toString())) - .append("
").append(title).append("").append(data.length() > 0 ? data : " ").append("
"); - output.append(""); - - appendLine("country_code", Integer.toString(number.getCountryCode()), output); - appendLine("national_number", Long.toString(number.getNationalNumber()), output); - appendLine("extension", number.getExtension(), output); - appendLine("country_code_source", number.getCountryCodeSource().toString(), output); - appendLine("italian_leading_zero", Boolean.toString(number.isItalianLeadingZero()), output); - appendLine("raw_input", number.getRawInput(), output); - output.append("
Parsing Result (parseAndKeepRawInput())
"); - output.append(""); - - boolean isPossible = phoneUtil.isPossibleNumber(number); - boolean isNumberValid = phoneUtil.isValidNumber(number); - PhoneNumberType numberType = phoneUtil.getNumberType(number); - boolean hasDefaultCountry = !defaultCountry.isEmpty() && defaultCountry != "ZZ"; - - output.append("
"); - output.append(""); - output.append(""); - appendLine("Result from isPossibleNumber()", Boolean.toString(isPossible), output); - if (isPossible) { - if (phoneUtil.isPossibleNumberWithReason(number) - == ValidationResult.IS_POSSIBLE_LOCAL_ONLY) { - appendLine("Result from isPossibleNumberWithReason()", "IS_POSSIBLE_LOCAL_ONLY", output); - output.append( - ""); - } else { - appendLine("Result from isValidNumber()", Boolean.toString(isNumberValid), output); - if (isNumberValid && hasDefaultCountry) { - appendLine( - "Result from isValidNumberForRegion()", - Boolean.toString(phoneUtil.isValidNumberForRegion(number, defaultCountry)), - output); - } - String region = phoneUtil.getRegionCodeForNumber(number); - appendLine("Phone Number region", region == null ? "" : region, output); - appendLine("Result from getNumberType()", numberType.toString(), output); - } - } else { - appendLine( - "Result from isPossibleNumberWithReason()", - phoneUtil.isPossibleNumberWithReason(number).toString(), - output); - output.append( - ""); - } - output.append("
Validation Results
Number is considered invalid as it is " - + "not a possible national number.
Note: Numbers that are not possible have type UNKNOWN," - + " an unknown region, and are considered invalid.
"); - output.append("
"); - - if (!isNumberValid) { - output.append("
"); - output.append(""); - output.append(""); - boolean isPossibleShort = shortInfo.isPossibleShortNumber(number); - appendLine( - "Result from isPossibleShortNumber()", Boolean.toString(isPossibleShort), output); - if (isPossibleShort) { - appendLine( - "Result from isValidShortNumber()", - Boolean.toString(shortInfo.isValidShortNumber(number)), - output); - if (hasDefaultCountry) { - boolean isPossibleShortForRegion = - shortInfo.isPossibleShortNumberForRegion(number, defaultCountry); - appendLine( - "Result from isPossibleShortNumberForRegion()", - Boolean.toString(isPossibleShortForRegion), - output); - if (isPossibleShortForRegion) { - appendLine( - "Result from isValidShortNumberForRegion()", - Boolean.toString(shortInfo.isValidShortNumberForRegion(number, defaultCountry)), - output); - } - } - } - output.append("
Short Number Results
"); - output.append("
"); - } - - output.append("
"); - output.append(""); - output.append(""); - appendLine( - "E164 format", - isNumberValid ? phoneUtil.format(number, PhoneNumberFormat.E164) : "invalid", - output); - appendLine( - "Original format", phoneUtil.formatInOriginalFormat(number, defaultCountry), output); - appendLine("National format", phoneUtil.format(number, PhoneNumberFormat.NATIONAL), output); - appendLine( - "International format", - isNumberValid ? phoneUtil.format(number, PhoneNumberFormat.INTERNATIONAL) : "invalid", - output); - appendLine( - "Out-of-country format from US", - isNumberValid ? phoneUtil.formatOutOfCountryCallingNumber(number, "US") : "invalid", - output); - appendLine( - "Out-of-country format from CH", - isNumberValid ? phoneUtil.formatOutOfCountryCallingNumber(number, "CH") : "invalid", - output); - output.append("
Formatting Results
"); - output.append("
"); - - AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(defaultCountry); - int rawNumberLength = phoneNumber.length(); - output.append("
"); - output.append(""); - output.append(""); - for (int i = 0; i < rawNumberLength; i++) { - // Note this doesn't handle supplementary characters, but it shouldn't be a big deal as - // there are no dial-pad characters in the supplementary range. - char inputChar = phoneNumber.charAt(i); - appendLine( - "Char entered: '" + inputChar + "' Output: ", formatter.inputDigit(inputChar), output); - } - output.append("
AsYouTypeFormatter Results
"); - output.append("
"); - - if (isNumberValid) { - output.append("
"); - output.append(""); - output.append(""); - appendLine( - "Location", - PhoneNumberOfflineGeocoder.getInstance() - .getDescriptionForNumber(number, geocodingLocale), - output); - output.append("
PhoneNumberOfflineGeocoder Results
"); - output.append("
"); - - output.append("
"); - output.append(""); - output.append(""); - appendLine( - "Time zone(s)", - PhoneNumberToTimeZonesMapper.getInstance().getTimeZonesForNumber(number).toString(), - output); - output.append("
PhoneNumberToTimeZonesMapper Results
"); - output.append("
"); - - if (numberType == PhoneNumberType.MOBILE - || numberType == PhoneNumberType.FIXED_LINE_OR_MOBILE - || numberType == PhoneNumberType.PAGER) { - output.append("
"); - output.append(""); - output.append(""); - appendLine( - "Carrier", - PhoneNumberToCarrierMapper.getInstance().getNameForNumber(number, geocodingLocale), - output); - output.append("
PhoneNumberToCarrierMapper Results
"); - output.append("
"); - } - } - - String newIssueLink = getNewIssueLink(phoneNumber, defaultCountry, geocodingLocale); - String guidelinesLink = - "https://github.com/google/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 (NumberParseException e) { - output.append(StringEscapeUtils.escapeHtml(e.toString())); - } - output.append(""); - return output; - } -} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/InputServlet.java b/java/demo/src/main/java/com/google/phonenumbers/demo/InputServlet.java new file mode 100644 index 000000000..ebb93e209 --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/InputServlet.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @author Shaopeng Jia + */ + +package com.google.phonenumbers.demo; + +import static java.nio.charset.StandardCharsets.UTF_8; + +import com.google.phonenumbers.demo.render.InputFormRenderer; +import java.io.IOException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * A servlet that accepts requests that contain strings representing a phone number and a default + * country, and responds with results from parsing, validating and formatting the number. The + * default country is a two-letter region code representing the country that we are expecting the + * number to be from. + */ +@SuppressWarnings("serial") +public class InputServlet extends HttpServlet { + + /** Handle the get request to get information about a number based on query parameters. */ + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.setContentType("text/html"); + resp.setCharacterEncoding(UTF_8.name()); + resp.getWriter().println(new InputFormRenderer().genHtml()); + } +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/ResultServlet.java b/java/demo/src/main/java/com/google/phonenumbers/demo/ResultServlet.java new file mode 100644 index 000000000..04dc0af7a --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/ResultServlet.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @author Shaopeng Jia + */ + +package com.google.phonenumbers.demo; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Locale.ENGLISH; + +import com.google.i18n.phonenumbers.NumberParseException; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.phonenumbers.demo.helper.WebHelper; +import com.google.phonenumbers.demo.render.ErrorRenderer; +import com.google.phonenumbers.demo.render.ResultFileRenderer; +import com.google.phonenumbers.demo.render.ResultRenderer; +import java.io.IOException; +import java.io.InputStream; +import java.util.Locale; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.fileupload.FileItemIterator; +import org.apache.commons.fileupload.FileItemStream; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.fileupload.util.Streams; +import org.apache.commons.io.IOUtils; + +/** + * A servlet that accepts requests that contain strings representing a phone number and a default + * country, and responds with results from parsing, validating and formatting the number. The + * default country is a two-letter region code representing the country that we are expecting the + * number to be from. + */ +@SuppressWarnings("serial") +public class ResultServlet extends HttpServlet { + + private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); + + public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + String phoneNumber = null; + String defaultCountry = null; + String languageCode = "en"; // Default languageCode to English if nothing is entered. + String regionCode = ""; + String fileContents = null; + ServletFileUpload upload = new ServletFileUpload(); + upload.setSizeMax(50000); + try { + FileItemIterator iterator = upload.getItemIterator(req); + while (iterator.hasNext()) { + FileItemStream item = iterator.next(); + InputStream in = item.openStream(); + if (item.isFormField()) { + String fieldName = item.getFieldName(); + if (fieldName.equals("phoneNumber")) { + phoneNumber = Streams.asString(in, UTF_8.name()); + } else if (fieldName.equals("defaultCountry")) { + defaultCountry = Streams.asString(in).toUpperCase(); + } else if (fieldName.equals("languageCode")) { + String languageEntered = Streams.asString(in).toLowerCase(); + if (languageEntered.length() > 0) { + languageCode = languageEntered; + } + } else if (fieldName.equals("regionCode")) { + regionCode = Streams.asString(in).toUpperCase(); + } + } else { + try { + fileContents = IOUtils.toString(in); + } finally { + IOUtils.closeQuietly(in); + } + } + } + } catch (FileUploadException e1) { + e1.printStackTrace(); + } + + resp.setContentType("text/html"); + resp.setCharacterEncoding(UTF_8.name()); + if (fileContents == null || fileContents.length() == 0) { + // Redirect to a URL with the given input encoded in the query parameters. + Locale geocodingLocale = new Locale(languageCode, regionCode); + resp.sendRedirect( + WebHelper.getPermaLinkURL( + phoneNumber, defaultCountry, geocodingLocale, false /* absoluteURL */)); + } else { + resp.getWriter().println(new ResultFileRenderer(defaultCountry, fileContents).genHtml()); + } + } + + /** 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.setContentType("text/html"); + resp.setCharacterEncoding(UTF_8.name()); + resp.getWriter() + .println(getOutputForSingleNumber(phoneNumber, defaultCountry, geocodingLocale)); + } + + /** + * 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 String getOutputForSingleNumber( + String phoneNumber, String defaultCountry, Locale geocodingLocale) { + try { + PhoneNumber number = phoneUtil.parseAndKeepRawInput(phoneNumber, defaultCountry); + return new ResultRenderer(phoneNumber, defaultCountry, geocodingLocale, number).genHtml(); + } catch (NumberParseException e) { + return new ErrorRenderer(phoneNumber, defaultCountry, geocodingLocale, e.toString()) + .genHtml(); + } + } +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/helper/WebHelper.java b/java/demo/src/main/java/com/google/phonenumbers/demo/helper/WebHelper.java new file mode 100644 index 000000000..6430bb88a --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/helper/WebHelper.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @author Shaopeng Jia + */ + +package com.google.phonenumbers.demo.helper; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Locale.ENGLISH; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Locale; + +public class WebHelper { + private static final String NEW_ISSUE_BASE_URL = + "https://issuetracker.google.com/issues/new?component=192347&title="; + /** Returns a stable URL pointing to the result page for the given input. */ + public static String getPermaLinkURL( + String phoneNumber, String defaultCountry, Locale geocodingLocale, boolean absoluteURL) { + // If absoluteURL is false, generate a relative path. Otherwise, produce an absolute URL. + StringBuilder permaLink = + new StringBuilder( + absoluteURL + ? "http://libphonenumber.appspot.com/phonenumberparser" + : "/phonenumberparser"); + try { + permaLink.append( + "?number=" + URLEncoder.encode(phoneNumber != null ? phoneNumber : "", UTF_8.name())); + if (defaultCountry != null && !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. */ + public static String getNewIssueLink( + String phoneNumber, String defaultCountry, Locale geocodingLocale) { + boolean hasDefaultCountry = !defaultCountry.isEmpty() && defaultCountry != "ZZ"; + String issueTitle = + "Validation issue with " + + phoneNumber + + (hasDefaultCountry ? " (" + defaultCountry + ")" : ""); + + String newIssueLink = NEW_ISSUE_BASE_URL; + try { + newIssueLink += URLEncoder.encode(issueTitle, UTF_8.name()); + } catch (UnsupportedEncodingException e) { + // UTF-8 is guaranteed in Java, so this should be impossible. + throw new AssertionError(e); + } + return newIssueLink; + } +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/render/ErrorRenderer.java b/java/demo/src/main/java/com/google/phonenumbers/demo/render/ErrorRenderer.java new file mode 100644 index 000000000..ec1d214bc --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/render/ErrorRenderer.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @author Tobias Rogg + */ + +package com.google.phonenumbers.demo.render; + +import com.google.phonenumbers.demo.template.ResultErrorTemplates; +import com.google.phonenumbers.demo.template.ResultErrorTemplates.Error; +import java.util.Locale; + +public class ErrorRenderer extends LibPhoneNumberRenderer { + private final String phoneNumber; + private final String defaultCountry; + private final Locale geocodingLocale; + private final String error; + + public ErrorRenderer( + String phoneNumber, String defaultCountry, Locale geocodingLocale, String error) { + super("result_error.soy", "com.google.phonenumbers.demo.error"); + this.phoneNumber = phoneNumber; + this.defaultCountry = defaultCountry; + this.geocodingLocale = geocodingLocale; + this.error = error; + } + + @Override + public String genHtml() { + return super.render( + ResultErrorTemplates.Error.builder() + .setPhoneNumber(phoneNumber) + .setDefaultCountry(defaultCountry) + .setGeocodingLocale(geocodingLocale.toLanguageTag()) + .setError(error) + .build()); + } +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/render/InputFormRenderer.java b/java/demo/src/main/java/com/google/phonenumbers/demo/render/InputFormRenderer.java new file mode 100644 index 000000000..62d980de7 --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/render/InputFormRenderer.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @author Tobias Rogg + */ + +package com.google.phonenumbers.demo.render; + +import com.google.phonenumbers.demo.template.InputFormTemplates; +import com.google.phonenumbers.demo.template.InputFormTemplates.InputForm; + +public class InputFormRenderer extends LibPhoneNumberRenderer { + + public InputFormRenderer() { + super("input_form.soy", "com.google.phonenumbers.demo.inputForm"); + } + + @Override + public String genHtml() { + return super.render( + InputFormTemplates.InputForm.builder() + .setWelcomeTitle("Phone Number Parser Demo for LibPhoneNumber") + .build()); + } +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/render/LibPhoneNumberRenderer.java b/java/demo/src/main/java/com/google/phonenumbers/demo/render/LibPhoneNumberRenderer.java new file mode 100644 index 000000000..f20e29745 --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/render/LibPhoneNumberRenderer.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @author Tobias Rogg + */ + +package com.google.phonenumbers.demo.render; + +import com.google.template.soy.SoyFileSet; +import com.google.template.soy.data.SoyTemplate; +import com.google.template.soy.tofu.SoyTofu; +import java.net.URL; + +public abstract class LibPhoneNumberRenderer { + private final String template; + private final String namespace; + + public LibPhoneNumberRenderer(String template, String namespace) { + this.template = template; + this.namespace = namespace; + } + + private URL getResource() { + return LibPhoneNumberRenderer.class.getResource("../" + template); + } + + String render(T soyTemplate) { + SoyFileSet sfs = SoyFileSet.builder().add(getResource()).build(); + SoyTofu tofu = sfs.compileToTofu(); + // For convenience, create another SoyTofu object that has a + // namespace specified, so you can pass partial template names to + // the newRenderer() method. + SoyTofu simpleTofu = tofu.forNamespace(namespace); + return simpleTofu.newRenderer(soyTemplate).render(); + } + + public abstract String genHtml(); +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/render/ResultFileRenderer.java b/java/demo/src/main/java/com/google/phonenumbers/demo/render/ResultFileRenderer.java new file mode 100644 index 000000000..125542b28 --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/render/ResultFileRenderer.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @author Tobias Rogg + */ + +package com.google.phonenumbers.demo.render; + +import com.google.i18n.phonenumbers.NumberParseException; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.phonenumbers.demo.template.ResultFileTemplates.File; +import java.util.StringTokenizer; + +public class ResultFileRenderer extends LibPhoneNumberRenderer { + private final String defaultCountry; + private final String fileContents; + private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); + + public ResultFileRenderer(String defaultCountry, String fileContents) { + super("result_file.soy", "com.google.phonenumbers.demo.file"); + this.fileContents = fileContents; + this.defaultCountry = defaultCountry; + } + + @Override + public String genHtml() { + File.Builder soyTemplate = File.builder(); + int phoneNumberId = 0; + StringTokenizer tokenizer = new StringTokenizer(fileContents, ","); + while (tokenizer.hasMoreTokens()) { + String numberStr = tokenizer.nextToken(); + phoneNumberId++; + try { + PhoneNumber number = phoneUtil.parseAndKeepRawInput(numberStr, defaultCountry); + boolean isNumberValid = phoneUtil.isValidNumber(number); + soyTemplate.addRows( + phoneNumberId, + numberStr, + isNumberValid ? phoneUtil.formatInOriginalFormat(number, defaultCountry) : "invalid", + isNumberValid ? phoneUtil.format(number, PhoneNumberFormat.INTERNATIONAL) : "invalid", + null); + } catch (NumberParseException e) { + soyTemplate.addRows(phoneNumberId, numberStr, null, null, e.toString()); + } + } + return super.render(soyTemplate.build()); + } +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/render/ResultRenderer.java b/java/demo/src/main/java/com/google/phonenumbers/demo/render/ResultRenderer.java new file mode 100644 index 000000000..9c5507e3f --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/render/ResultRenderer.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @author Tobias Rogg + */ + +package com.google.phonenumbers.demo.render; + +import com.google.common.collect.ImmutableList; +import com.google.i18n.phonenumbers.AsYouTypeFormatter; +import com.google.i18n.phonenumbers.PhoneNumberToCarrierMapper; +import com.google.i18n.phonenumbers.PhoneNumberToTimeZonesMapper; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.i18n.phonenumbers.ShortNumberInfo; +import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder; +import com.google.phonenumbers.demo.helper.WebHelper; +import com.google.phonenumbers.demo.template.ResultTemplates.SingleNumber; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public class ResultRenderer extends LibPhoneNumberRenderer { + private final String phoneNumber; + private final String defaultCountry; + private final Locale geocodingLocale; + private final PhoneNumber number; + private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); + private final ShortNumberInfo shortInfo = ShortNumberInfo.getInstance(); + + public ResultRenderer( + String phoneNumber, String defaultCountry, Locale geocodingLocale, PhoneNumber number) { + super("result.soy", "com.google.phonenumbers.demo.singleNumber"); + this.phoneNumber = phoneNumber; + this.defaultCountry = defaultCountry; + this.geocodingLocale = geocodingLocale; + this.number = number; + } + + @Override + public String genHtml() { + // Header info at Start of Page + SingleNumber.Builder soyTemplate = + SingleNumber.builder() + .setPhoneNumber(phoneNumber) + .setDefaultCountry(defaultCountry) + .setGeocodingLocale(geocodingLocale.toLanguageTag()); + + soyTemplate + .setCountryCode(number.getCountryCode()) + .setNationalNumber(number.getNationalNumber()) + .setExtension(number.getExtension()) + .setCountryCodeSource(number.getCountryCodeSource().toString()) + .setItalianLeadingZero(number.isItalianLeadingZero()) + .setRawInput(number.getRawInput()); + + boolean isNumberValid = phoneUtil.isValidNumber(number); + boolean hasDefaultCountry = !defaultCountry.isEmpty() && !defaultCountry.equals("ZZ"); + + // Validation Results Table + soyTemplate + .setIsPossibleNumber(phoneUtil.isPossibleNumber(number)) + .setIsValidNumber(isNumberValid) + .setIsValidNumberForRegion( + isNumberValid && hasDefaultCountry + ? phoneUtil.isValidNumberForRegion(number, defaultCountry) + : null) + .setPhoneNumberRegion(phoneUtil.getRegionCodeForNumber(number)) + .setNumberType(phoneUtil.getNumberType(number).toString()) + .setValidationResult(phoneUtil.isPossibleNumberWithReason(number).toString()); + + // Short Number Results Table + soyTemplate + .setIsPossibleShortNumber(shortInfo.isPossibleShortNumber(number)) + .setIsValidShortNumber(shortInfo.isValidShortNumber(number)) + .setIsPossibleShortNumberForRegion( + hasDefaultCountry + ? shortInfo.isPossibleShortNumberForRegion(number, defaultCountry) + : null) + .setIsValidShortNumberForRegion( + hasDefaultCountry + ? shortInfo.isValidShortNumberForRegion(number, defaultCountry) + : null); + + // Formatting Results Table + soyTemplate + .setE164Format(isNumberValid ? phoneUtil.format(number, PhoneNumberFormat.E164) : "invalid") + .setOriginalFormat(phoneUtil.formatInOriginalFormat(number, defaultCountry)) + .setNationalFormat(phoneUtil.format(number, PhoneNumberFormat.NATIONAL)) + .setInternationalFormat( + isNumberValid ? phoneUtil.format(number, PhoneNumberFormat.INTERNATIONAL) : "invalid") + .setOutOfCountryFormatFromUs( + isNumberValid ? phoneUtil.formatOutOfCountryCallingNumber(number, "US") : "invalid") + .setOutOfCountryFormatFromCh( + isNumberValid ? phoneUtil.formatOutOfCountryCallingNumber(number, "CH") : "invalid"); + + // Get As You Type Formatter Table + List> rows = new ArrayList<>(); + AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(defaultCountry); + int rawNumberLength = phoneNumber.length(); + for (int i = 0; i < rawNumberLength; i++) { + // Note this doesn't handle supplementary characters, but it shouldn't be a big deal as + // there are no dial-pad characters in the supplementary range. + char inputChar = phoneNumber.charAt(i); + rows.add(ImmutableList.of(String.valueOf(inputChar), formatter.inputDigit(inputChar))); + } + soyTemplate.setRows(rows); + + // Geo Info Tables + String guidelinesLink = "https://github.com/google/libphonenumber/blob/master/CONTRIBUTING.md"; + soyTemplate + .setDescriptionForNumber( + PhoneNumberOfflineGeocoder.getInstance() + .getDescriptionForNumber(number, geocodingLocale)) + .setTimeZonesForNumber( + PhoneNumberToTimeZonesMapper.getInstance().getTimeZonesForNumber(number).toString()) + .setNameForNumber( + PhoneNumberToCarrierMapper.getInstance().getNameForNumber(number, geocodingLocale)) + .setNewIssueLink(WebHelper.getNewIssueLink(phoneNumber, defaultCountry, geocodingLocale)) + .setGuidelinesLink(guidelinesLink); + + return super.render(soyTemplate.build()); + } +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/template/InputFormTemplates.java b/java/demo/src/main/java/com/google/phonenumbers/demo/template/InputFormTemplates.java new file mode 100644 index 000000000..439522820 --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/template/InputFormTemplates.java @@ -0,0 +1,95 @@ +// This file was automatically generated by the Soy compiler. +// Please don't edit this file by hand. +// source: src/main/resources/com/google/phonenumbers/demo/input_form.soy + +package com.google.phonenumbers.demo.template; + + +/** + * Wrapper class containing {@link com.google.template.soy.data.SoyTemplate} builders for each + * template in: input_form.soy. + */ +@javax.annotation.Generated("com.google.template.soy.SoyParseInfoGenerator") +public final class InputFormTemplates { + + /** A map of filepath to symbol used for CSS resolution on server edit-refresh. */ + private static final com.google.common.collect.ImmutableMap __PROVIDED_CSS_MAP__ = com.google.common.collect.ImmutableMap.of(); + + /** A list of provided symbols used for css validation on edit refresh. */ + private static final com.google.common.collect.ImmutableList __PROVIDED_CSS__ = com.google.common.collect.ImmutableList.of(); + + /** Template params for com.google.phonenumbers.demo.inputForm.inputForm. */ + public static final class InputForm extends com.google.template.soy.data.BaseSoyTemplateImpl { + + private static final java.lang.String __NAME__ = "com.google.phonenumbers.demo.inputForm.inputForm"; + + /** Wraps a ListenableFuture as a SoyTemplate.AsyncWrapper */ + public static com.google.template.soy.data.SoyTemplate.AsyncWrapper wrapFuture(com.google.common.util.concurrent.ListenableFuture paramsFuture) { + return new com.google.template.soy.data.SoyTemplate.AsyncWrapper<>(__NAME__, paramsFuture); + } + + private InputForm(com.google.common.collect.ImmutableMap data) { + super(data); + } + + @java.lang.Override + public final java.lang.String getTemplateName() { + return __NAME__; + } + + /** Creates a new Builder instance. */ + public static Builder builder() { + return new Builder(); + } + + /** {@param welcomeTitle} */ + public static final com.google.template.soy.data.SoyTemplateParam + WELCOME_TITLE = + com.google.template.soy.data.SoyTemplateParam.standard( + "welcomeTitle", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@inject csp_style_nonce} Created by ContentSecurityPolicyNonceInjectionPass. */ + public static final com.google.template.soy.data.SoyTemplateParam + CSP_STYLE_NONCE = + com.google.template.soy.data.SoyTemplateParam.injected( + "csp_style_nonce", + /* required= */ false, + com.google.common.reflect.TypeToken.of(java.lang.Object.class)); + + private static final com.google.common.collect.ImmutableSet> __PARAMS__ = com.google.common.collect.ImmutableSet.of( + WELCOME_TITLE); + + public static final class Builder extends com.google.template.soy.data.BaseSoyTemplateImpl.AbstractBuilder { + + private Builder() { + super(1); + } + + @java.lang.Override + protected com.google.common.collect.ImmutableSet> allParams() { + return __PARAMS__; + } + + @java.lang.Override + protected InputForm buildInternal(com.google.common.collect.ImmutableMap data) { + return new InputForm(data); + } + + /** Sets welcomeTitle. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setWelcomeTitle(java.lang.String value) { + return setParamInternal(WELCOME_TITLE, asString(value)); + } + + /** Future compatible version of {@link #setWelcomeTitle(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setWelcomeTitleFuture(java.util.concurrent.Future future) { + return setParamInternal(WELCOME_TITLE, asFuture(future, AbstractBuilder::asString)); + } + + } + } + +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultErrorTemplates.java b/java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultErrorTemplates.java new file mode 100644 index 000000000..7e4e9e69b --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultErrorTemplates.java @@ -0,0 +1,158 @@ +// This file was automatically generated by the Soy compiler. +// Please don't edit this file by hand. +// source: src/main/resources/com/google/phonenumbers/demo/result_error.soy + +package com.google.phonenumbers.demo.template; + + +/** + * Wrapper class containing {@link com.google.template.soy.data.SoyTemplate} builders for each + * template in: result_error.soy. + */ +@javax.annotation.Generated("com.google.template.soy.SoyParseInfoGenerator") +public final class ResultErrorTemplates { + + /** A map of filepath to symbol used for CSS resolution on server edit-refresh. */ + private static final com.google.common.collect.ImmutableMap __PROVIDED_CSS_MAP__ = com.google.common.collect.ImmutableMap.of(); + + /** A list of provided symbols used for css validation on edit refresh. */ + private static final com.google.common.collect.ImmutableList __PROVIDED_CSS__ = com.google.common.collect.ImmutableList.of(); + + /** Template params for com.google.phonenumbers.demo.error.error. */ + public static final class Error extends com.google.template.soy.data.BaseSoyTemplateImpl { + + private static final java.lang.String __NAME__ = "com.google.phonenumbers.demo.error.error"; + + /** Wraps a ListenableFuture as a SoyTemplate.AsyncWrapper */ + public static com.google.template.soy.data.SoyTemplate.AsyncWrapper wrapFuture(com.google.common.util.concurrent.ListenableFuture paramsFuture) { + return new com.google.template.soy.data.SoyTemplate.AsyncWrapper<>(__NAME__, paramsFuture); + } + + private Error(com.google.common.collect.ImmutableMap data) { + super(data); + } + + @java.lang.Override + public final java.lang.String getTemplateName() { + return __NAME__; + } + + /** Creates a new Builder instance. */ + public static Builder builder() { + return new Builder(); + } + + /** {@param phoneNumber} */ + public static final com.google.template.soy.data.SoyTemplateParam + PHONE_NUMBER = + com.google.template.soy.data.SoyTemplateParam.standard( + "phoneNumber", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param defaultCountry} */ + public static final com.google.template.soy.data.SoyTemplateParam + DEFAULT_COUNTRY = + com.google.template.soy.data.SoyTemplateParam.standard( + "defaultCountry", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param geocodingLocale} */ + public static final com.google.template.soy.data.SoyTemplateParam + GEOCODING_LOCALE = + com.google.template.soy.data.SoyTemplateParam.standard( + "geocodingLocale", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param error} */ + public static final com.google.template.soy.data.SoyTemplateParam + ERROR = + com.google.template.soy.data.SoyTemplateParam.standard( + "error", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@inject csp_style_nonce} Created by ContentSecurityPolicyNonceInjectionPass. */ + public static final com.google.template.soy.data.SoyTemplateParam + CSP_STYLE_NONCE = + com.google.template.soy.data.SoyTemplateParam.injected( + "csp_style_nonce", + /* required= */ false, + com.google.common.reflect.TypeToken.of(java.lang.Object.class)); + + private static final com.google.common.collect.ImmutableSet> __PARAMS__ = com.google.common.collect.ImmutableSet.of( + PHONE_NUMBER, + DEFAULT_COUNTRY, + GEOCODING_LOCALE, + ERROR); + + public static final class Builder extends com.google.template.soy.data.BaseSoyTemplateImpl.AbstractBuilder { + + private Builder() { + super(4); + } + + @java.lang.Override + protected com.google.common.collect.ImmutableSet> allParams() { + return __PARAMS__; + } + + @java.lang.Override + protected Error buildInternal(com.google.common.collect.ImmutableMap data) { + return new Error(data); + } + + /** Sets phoneNumber. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setPhoneNumber(java.lang.String value) { + return setParamInternal(PHONE_NUMBER, asString(value)); + } + + /** Future compatible version of {@link #setPhoneNumber(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setPhoneNumberFuture(java.util.concurrent.Future future) { + return setParamInternal(PHONE_NUMBER, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets defaultCountry. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setDefaultCountry(java.lang.String value) { + return setParamInternal(DEFAULT_COUNTRY, asString(value)); + } + + /** Future compatible version of {@link #setDefaultCountry(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setDefaultCountryFuture(java.util.concurrent.Future future) { + return setParamInternal(DEFAULT_COUNTRY, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets geocodingLocale. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setGeocodingLocale(java.lang.String value) { + return setParamInternal(GEOCODING_LOCALE, asString(value)); + } + + /** Future compatible version of {@link #setGeocodingLocale(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setGeocodingLocaleFuture(java.util.concurrent.Future future) { + return setParamInternal(GEOCODING_LOCALE, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets error. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setError(java.lang.String value) { + return setParamInternal(ERROR, asString(value)); + } + + /** Future compatible version of {@link #setError(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setErrorFuture(java.util.concurrent.Future future) { + return setParamInternal(ERROR, asFuture(future, AbstractBuilder::asString)); + } + + } + } + +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultFileTemplates.java b/java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultFileTemplates.java new file mode 100644 index 000000000..9578a9c3c --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultFileTemplates.java @@ -0,0 +1,90 @@ +// This file was automatically generated by the Soy compiler. +// Please don't edit this file by hand. +// source: src/main/resources/com/google/phonenumbers/demo/result_file.soy + +package com.google.phonenumbers.demo.template; + + +/** + * Wrapper class containing {@link com.google.template.soy.data.SoyTemplate} builders for each + * template in: result_file.soy. + */ +@javax.annotation.Generated("com.google.template.soy.SoyParseInfoGenerator") +public final class ResultFileTemplates { + + /** A map of filepath to symbol used for CSS resolution on server edit-refresh. */ + private static final com.google.common.collect.ImmutableMap __PROVIDED_CSS_MAP__ = com.google.common.collect.ImmutableMap.of(); + + /** A list of provided symbols used for css validation on edit refresh. */ + private static final com.google.common.collect.ImmutableList __PROVIDED_CSS__ = com.google.common.collect.ImmutableList.of(); + + /** Template params for com.google.phonenumbers.demo.file.file. */ + public static final class File extends com.google.template.soy.data.BaseSoyTemplateImpl { + + private static final java.lang.String __NAME__ = "com.google.phonenumbers.demo.file.file"; + + /** Wraps a ListenableFuture as a SoyTemplate.AsyncWrapper */ + public static com.google.template.soy.data.SoyTemplate.AsyncWrapper wrapFuture(com.google.common.util.concurrent.ListenableFuture paramsFuture) { + return new com.google.template.soy.data.SoyTemplate.AsyncWrapper<>(__NAME__, paramsFuture); + } + + private File(com.google.common.collect.ImmutableMap data) { + super(data); + } + + @java.lang.Override + public final java.lang.String getTemplateName() { + return __NAME__; + } + + /** Creates a new Builder instance. */ + public static Builder builder() { + return new Builder(); + } + + /** {@param rows} */ + private static final com.google.template.soy.data.SoyTemplateParam + ROWS = + com.google.template.soy.data.SoyTemplateParam.standard( + "rows", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.Object.class)); + + /** {@inject csp_style_nonce} Created by ContentSecurityPolicyNonceInjectionPass. */ + public static final com.google.template.soy.data.SoyTemplateParam + CSP_STYLE_NONCE = + com.google.template.soy.data.SoyTemplateParam.injected( + "csp_style_nonce", + /* required= */ false, + com.google.common.reflect.TypeToken.of(java.lang.Object.class)); + + private static final com.google.common.collect.ImmutableSet> __PARAMS__ = com.google.common.collect.ImmutableSet.of( + ROWS); + + public static final class Builder extends com.google.template.soy.data.BaseSoyTemplateImpl.AbstractBuilderWithAccumulatorParameters { + + private Builder() { + super(1); + initListParam(ROWS); + } + + @java.lang.Override + protected com.google.common.collect.ImmutableSet> allParams() { + return __PARAMS__; + } + + @java.lang.Override + protected File buildInternal(com.google.common.collect.ImmutableMap data) { + return new File(data); + } + + /** Sets rows. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder addRows(long id, java.lang.String numberStr, @javax.annotation.Nullable java.lang.String prettyFormat, @javax.annotation.Nullable java.lang.String internationalFormat, @javax.annotation.Nullable java.lang.String error) { + return addToListParam(ROWS, asRecord("id", asInt(id), "numberStr", asString(numberStr), "prettyFormat", asNullableString(prettyFormat), "internationalFormat", asNullableString(internationalFormat), "error", asNullableString(error))); + } + + } + } + +} diff --git a/java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultTemplates.java b/java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultTemplates.java new file mode 100644 index 000000000..3532c53e6 --- /dev/null +++ b/java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultTemplates.java @@ -0,0 +1,731 @@ +// This file was automatically generated by the Soy compiler. +// Please don't edit this file by hand. +// source: src/main/resources/com/google/phonenumbers/demo/result.soy + +package com.google.phonenumbers.demo.template; + + +/** + * Wrapper class containing {@link com.google.template.soy.data.SoyTemplate} builders for each + * template in: result.soy. + */ +@javax.annotation.Generated("com.google.template.soy.SoyParseInfoGenerator") +public final class ResultTemplates { + + /** A map of filepath to symbol used for CSS resolution on server edit-refresh. */ + private static final com.google.common.collect.ImmutableMap __PROVIDED_CSS_MAP__ = com.google.common.collect.ImmutableMap.of(); + + /** A list of provided symbols used for css validation on edit refresh. */ + private static final com.google.common.collect.ImmutableList __PROVIDED_CSS__ = com.google.common.collect.ImmutableList.of(); + + /** Template params for com.google.phonenumbers.demo.singleNumber.singleNumber. */ + public static final class SingleNumber extends com.google.template.soy.data.BaseSoyTemplateImpl { + + private static final java.lang.String __NAME__ = "com.google.phonenumbers.demo.singleNumber.singleNumber"; + + /** Wraps a ListenableFuture as a SoyTemplate.AsyncWrapper */ + public static com.google.template.soy.data.SoyTemplate.AsyncWrapper wrapFuture(com.google.common.util.concurrent.ListenableFuture paramsFuture) { + return new com.google.template.soy.data.SoyTemplate.AsyncWrapper<>(__NAME__, paramsFuture); + } + + private SingleNumber(com.google.common.collect.ImmutableMap data) { + super(data); + } + + @java.lang.Override + public final java.lang.String getTemplateName() { + return __NAME__; + } + + /** Creates a new Builder instance. */ + public static Builder builder() { + return new Builder(); + } + + /** {@param phoneNumber} */ + public static final com.google.template.soy.data.SoyTemplateParam + PHONE_NUMBER = + com.google.template.soy.data.SoyTemplateParam.standard( + "phoneNumber", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param defaultCountry} */ + public static final com.google.template.soy.data.SoyTemplateParam + DEFAULT_COUNTRY = + com.google.template.soy.data.SoyTemplateParam.standard( + "defaultCountry", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param geocodingLocale} */ + public static final com.google.template.soy.data.SoyTemplateParam + GEOCODING_LOCALE = + com.google.template.soy.data.SoyTemplateParam.standard( + "geocodingLocale", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param countryCode} */ + public static final com.google.template.soy.data.SoyTemplateParam + COUNTRY_CODE = + com.google.template.soy.data.SoyTemplateParam.standard( + "countryCode", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.Long.class)); + + /** {@param nationalNumber} */ + public static final com.google.template.soy.data.SoyTemplateParam + NATIONAL_NUMBER = + com.google.template.soy.data.SoyTemplateParam.standard( + "nationalNumber", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.Long.class)); + + /** {@param extension} */ + public static final com.google.template.soy.data.SoyTemplateParam + EXTENSION = + com.google.template.soy.data.SoyTemplateParam.standard( + "extension", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param countryCodeSource} */ + public static final com.google.template.soy.data.SoyTemplateParam + COUNTRY_CODE_SOURCE = + com.google.template.soy.data.SoyTemplateParam.standard( + "countryCodeSource", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param italianLeadingZero} */ + public static final com.google.template.soy.data.SoyTemplateParam + ITALIAN_LEADING_ZERO = + com.google.template.soy.data.SoyTemplateParam.standard( + "italianLeadingZero", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.Boolean.class)); + + /** {@param rawInput} */ + public static final com.google.template.soy.data.SoyTemplateParam + RAW_INPUT = + com.google.template.soy.data.SoyTemplateParam.standard( + "rawInput", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param isPossibleNumber} */ + public static final com.google.template.soy.data.SoyTemplateParam + IS_POSSIBLE_NUMBER = + com.google.template.soy.data.SoyTemplateParam.standard( + "isPossibleNumber", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.Boolean.class)); + + /** {@param isValidNumber} */ + public static final com.google.template.soy.data.SoyTemplateParam + IS_VALID_NUMBER = + com.google.template.soy.data.SoyTemplateParam.standard( + "isValidNumber", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.Boolean.class)); + + /** {@param isValidNumberForRegion} */ + public static final com.google.template.soy.data.SoyTemplateParam + IS_VALID_NUMBER_FOR_REGION = + com.google.template.soy.data.SoyTemplateParam.standard( + "isValidNumberForRegion", + /* required= */ false, + com.google.common.reflect.TypeToken.of(java.lang.Boolean.class)); + + /** {@param phoneNumberRegion} */ + public static final com.google.template.soy.data.SoyTemplateParam + PHONE_NUMBER_REGION = + com.google.template.soy.data.SoyTemplateParam.standard( + "phoneNumberRegion", + /* required= */ false, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param numberType} */ + public static final com.google.template.soy.data.SoyTemplateParam + NUMBER_TYPE = + com.google.template.soy.data.SoyTemplateParam.standard( + "numberType", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param validationResult} */ + public static final com.google.template.soy.data.SoyTemplateParam + VALIDATION_RESULT = + com.google.template.soy.data.SoyTemplateParam.standard( + "validationResult", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param isPossibleShortNumber} */ + public static final com.google.template.soy.data.SoyTemplateParam + IS_POSSIBLE_SHORT_NUMBER = + com.google.template.soy.data.SoyTemplateParam.standard( + "isPossibleShortNumber", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.Boolean.class)); + + /** {@param isValidShortNumber} */ + public static final com.google.template.soy.data.SoyTemplateParam + IS_VALID_SHORT_NUMBER = + com.google.template.soy.data.SoyTemplateParam.standard( + "isValidShortNumber", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.Boolean.class)); + + /** {@param isPossibleShortNumberForRegion} */ + public static final com.google.template.soy.data.SoyTemplateParam + IS_POSSIBLE_SHORT_NUMBER_FOR_REGION = + com.google.template.soy.data.SoyTemplateParam.standard( + "isPossibleShortNumberForRegion", + /* required= */ false, + com.google.common.reflect.TypeToken.of(java.lang.Boolean.class)); + + /** {@param isValidShortNumberForRegion} */ + public static final com.google.template.soy.data.SoyTemplateParam + IS_VALID_SHORT_NUMBER_FOR_REGION = + com.google.template.soy.data.SoyTemplateParam.standard( + "isValidShortNumberForRegion", + /* required= */ false, + com.google.common.reflect.TypeToken.of(java.lang.Boolean.class)); + + /** {@param e164Format} */ + public static final com.google.template.soy.data.SoyTemplateParam + E_164_FORMAT = + com.google.template.soy.data.SoyTemplateParam.standard( + "e164Format", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param originalFormat} */ + public static final com.google.template.soy.data.SoyTemplateParam + ORIGINAL_FORMAT = + com.google.template.soy.data.SoyTemplateParam.standard( + "originalFormat", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param nationalFormat} */ + public static final com.google.template.soy.data.SoyTemplateParam + NATIONAL_FORMAT = + com.google.template.soy.data.SoyTemplateParam.standard( + "nationalFormat", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param internationalFormat} */ + public static final com.google.template.soy.data.SoyTemplateParam + INTERNATIONAL_FORMAT = + com.google.template.soy.data.SoyTemplateParam.standard( + "internationalFormat", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param outOfCountryFormatFromUs} */ + public static final com.google.template.soy.data.SoyTemplateParam + OUT_OF_COUNTRY_FORMAT_FROM_US = + com.google.template.soy.data.SoyTemplateParam.standard( + "outOfCountryFormatFromUs", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param outOfCountryFormatFromCh} */ + public static final com.google.template.soy.data.SoyTemplateParam + OUT_OF_COUNTRY_FORMAT_FROM_CH = + com.google.template.soy.data.SoyTemplateParam.standard( + "outOfCountryFormatFromCh", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param rows} */ + public static final com.google.template.soy.data.SoyTemplateParam>> + ROWS = + com.google.template.soy.data.SoyTemplateParam.standard( + "rows", + /* required= */ true, + new com.google.common.reflect.TypeToken>>() {}); + + /** {@param descriptionForNumber} */ + public static final com.google.template.soy.data.SoyTemplateParam + DESCRIPTION_FOR_NUMBER = + com.google.template.soy.data.SoyTemplateParam.standard( + "descriptionForNumber", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param timeZonesForNumber} */ + public static final com.google.template.soy.data.SoyTemplateParam + TIME_ZONES_FOR_NUMBER = + com.google.template.soy.data.SoyTemplateParam.standard( + "timeZonesForNumber", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param nameForNumber} */ + public static final com.google.template.soy.data.SoyTemplateParam + NAME_FOR_NUMBER = + com.google.template.soy.data.SoyTemplateParam.standard( + "nameForNumber", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param newIssueLink} */ + public static final com.google.template.soy.data.SoyTemplateParam + NEW_ISSUE_LINK = + com.google.template.soy.data.SoyTemplateParam.standard( + "newIssueLink", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@param guidelinesLink} */ + public static final com.google.template.soy.data.SoyTemplateParam + GUIDELINES_LINK = + com.google.template.soy.data.SoyTemplateParam.standard( + "guidelinesLink", + /* required= */ true, + com.google.common.reflect.TypeToken.of(java.lang.String.class)); + + /** {@inject csp_style_nonce} Created by ContentSecurityPolicyNonceInjectionPass. */ + public static final com.google.template.soy.data.SoyTemplateParam + CSP_STYLE_NONCE = + com.google.template.soy.data.SoyTemplateParam.injected( + "csp_style_nonce", + /* required= */ false, + com.google.common.reflect.TypeToken.of(java.lang.Object.class)); + + private static final com.google.common.collect.ImmutableSet> __PARAMS__ = com.google.common.collect.ImmutableSet.of( + PHONE_NUMBER, + DEFAULT_COUNTRY, + GEOCODING_LOCALE, + COUNTRY_CODE, + NATIONAL_NUMBER, + EXTENSION, + COUNTRY_CODE_SOURCE, + ITALIAN_LEADING_ZERO, + RAW_INPUT, + IS_POSSIBLE_NUMBER, + IS_VALID_NUMBER, + IS_VALID_NUMBER_FOR_REGION, + PHONE_NUMBER_REGION, + NUMBER_TYPE, + VALIDATION_RESULT, + IS_POSSIBLE_SHORT_NUMBER, + IS_VALID_SHORT_NUMBER, + IS_POSSIBLE_SHORT_NUMBER_FOR_REGION, + IS_VALID_SHORT_NUMBER_FOR_REGION, + E_164_FORMAT, + ORIGINAL_FORMAT, + NATIONAL_FORMAT, + INTERNATIONAL_FORMAT, + OUT_OF_COUNTRY_FORMAT_FROM_US, + OUT_OF_COUNTRY_FORMAT_FROM_CH, + ROWS, + DESCRIPTION_FOR_NUMBER, + TIME_ZONES_FOR_NUMBER, + NAME_FOR_NUMBER, + NEW_ISSUE_LINK, + GUIDELINES_LINK); + + public static final class Builder extends com.google.template.soy.data.BaseSoyTemplateImpl.AbstractBuilder { + + private Builder() { + super(31); + } + + @java.lang.Override + protected com.google.common.collect.ImmutableSet> allParams() { + return __PARAMS__; + } + + @java.lang.Override + protected SingleNumber buildInternal(com.google.common.collect.ImmutableMap data) { + return new SingleNumber(data); + } + + /** Sets phoneNumber. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setPhoneNumber(java.lang.String value) { + return setParamInternal(PHONE_NUMBER, asString(value)); + } + + /** Future compatible version of {@link #setPhoneNumber(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setPhoneNumberFuture(java.util.concurrent.Future future) { + return setParamInternal(PHONE_NUMBER, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets defaultCountry. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setDefaultCountry(java.lang.String value) { + return setParamInternal(DEFAULT_COUNTRY, asString(value)); + } + + /** Future compatible version of {@link #setDefaultCountry(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setDefaultCountryFuture(java.util.concurrent.Future future) { + return setParamInternal(DEFAULT_COUNTRY, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets geocodingLocale. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setGeocodingLocale(java.lang.String value) { + return setParamInternal(GEOCODING_LOCALE, asString(value)); + } + + /** Future compatible version of {@link #setGeocodingLocale(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setGeocodingLocaleFuture(java.util.concurrent.Future future) { + return setParamInternal(GEOCODING_LOCALE, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets countryCode. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setCountryCode(long value) { + return setParamInternal(COUNTRY_CODE, asInt(value)); + } + + /** Future compatible version of {@link #setCountryCode(long)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setCountryCodeFuture(java.util.concurrent.Future future) { + return setParamInternal(COUNTRY_CODE, asFuture(future, AbstractBuilder::asBoxedInt)); + } + + /** Sets nationalNumber. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setNationalNumber(long value) { + return setParamInternal(NATIONAL_NUMBER, asInt(value)); + } + + /** Future compatible version of {@link #setNationalNumber(long)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setNationalNumberFuture(java.util.concurrent.Future future) { + return setParamInternal(NATIONAL_NUMBER, asFuture(future, AbstractBuilder::asBoxedInt)); + } + + /** Sets extension. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setExtension(java.lang.String value) { + return setParamInternal(EXTENSION, asString(value)); + } + + /** Future compatible version of {@link #setExtension(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setExtensionFuture(java.util.concurrent.Future future) { + return setParamInternal(EXTENSION, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets countryCodeSource. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setCountryCodeSource(java.lang.String value) { + return setParamInternal(COUNTRY_CODE_SOURCE, asString(value)); + } + + /** Future compatible version of {@link #setCountryCodeSource(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setCountryCodeSourceFuture(java.util.concurrent.Future future) { + return setParamInternal(COUNTRY_CODE_SOURCE, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets italianLeadingZero. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setItalianLeadingZero(boolean value) { + return setParamInternal(ITALIAN_LEADING_ZERO, asBool(value)); + } + + /** Future compatible version of {@link #setItalianLeadingZero(boolean)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setItalianLeadingZeroFuture(java.util.concurrent.Future future) { + return setParamInternal(ITALIAN_LEADING_ZERO, asFuture(future, AbstractBuilder::asBool)); + } + + /** Sets rawInput. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setRawInput(java.lang.String value) { + return setParamInternal(RAW_INPUT, asString(value)); + } + + /** Future compatible version of {@link #setRawInput(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setRawInputFuture(java.util.concurrent.Future future) { + return setParamInternal(RAW_INPUT, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets isPossibleNumber. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsPossibleNumber(boolean value) { + return setParamInternal(IS_POSSIBLE_NUMBER, asBool(value)); + } + + /** Future compatible version of {@link #setIsPossibleNumber(boolean)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsPossibleNumberFuture(java.util.concurrent.Future future) { + return setParamInternal(IS_POSSIBLE_NUMBER, asFuture(future, AbstractBuilder::asBool)); + } + + /** Sets isValidNumber. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsValidNumber(boolean value) { + return setParamInternal(IS_VALID_NUMBER, asBool(value)); + } + + /** Future compatible version of {@link #setIsValidNumber(boolean)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsValidNumberFuture(java.util.concurrent.Future future) { + return setParamInternal(IS_VALID_NUMBER, asFuture(future, AbstractBuilder::asBool)); + } + + /** Sets isValidNumberForRegion. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsValidNumberForRegion(@javax.annotation.Nullable java.lang.Boolean value) { + return setParamInternal(IS_VALID_NUMBER_FOR_REGION, asNullableBool(value)); + } + + /** Future compatible version of {@link #setIsValidNumberForRegion(java.lang.Boolean)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsValidNumberForRegionFuture(java.util.concurrent.Future future) { + return setParamInternal(IS_VALID_NUMBER_FOR_REGION, asFuture(future, AbstractBuilder::asNullableBool)); + } + + /** Sets phoneNumberRegion. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setPhoneNumberRegion(@javax.annotation.Nullable java.lang.String value) { + return setParamInternal(PHONE_NUMBER_REGION, asNullableString(value)); + } + + /** Future compatible version of {@link #setPhoneNumberRegion(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setPhoneNumberRegionFuture(java.util.concurrent.Future future) { + return setParamInternal(PHONE_NUMBER_REGION, asFuture(future, AbstractBuilder::asNullableString)); + } + + /** Sets numberType. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setNumberType(java.lang.String value) { + return setParamInternal(NUMBER_TYPE, asString(value)); + } + + /** Future compatible version of {@link #setNumberType(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setNumberTypeFuture(java.util.concurrent.Future future) { + return setParamInternal(NUMBER_TYPE, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets validationResult. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setValidationResult(java.lang.String value) { + return setParamInternal(VALIDATION_RESULT, asString(value)); + } + + /** Future compatible version of {@link #setValidationResult(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setValidationResultFuture(java.util.concurrent.Future future) { + return setParamInternal(VALIDATION_RESULT, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets isPossibleShortNumber. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsPossibleShortNumber(boolean value) { + return setParamInternal(IS_POSSIBLE_SHORT_NUMBER, asBool(value)); + } + + /** Future compatible version of {@link #setIsPossibleShortNumber(boolean)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsPossibleShortNumberFuture(java.util.concurrent.Future future) { + return setParamInternal(IS_POSSIBLE_SHORT_NUMBER, asFuture(future, AbstractBuilder::asBool)); + } + + /** Sets isValidShortNumber. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsValidShortNumber(boolean value) { + return setParamInternal(IS_VALID_SHORT_NUMBER, asBool(value)); + } + + /** Future compatible version of {@link #setIsValidShortNumber(boolean)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsValidShortNumberFuture(java.util.concurrent.Future future) { + return setParamInternal(IS_VALID_SHORT_NUMBER, asFuture(future, AbstractBuilder::asBool)); + } + + /** Sets isPossibleShortNumberForRegion. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsPossibleShortNumberForRegion(@javax.annotation.Nullable java.lang.Boolean value) { + return setParamInternal(IS_POSSIBLE_SHORT_NUMBER_FOR_REGION, asNullableBool(value)); + } + + /** + * Future compatible version of {@link + * #setIsPossibleShortNumberForRegion(java.lang.Boolean)}. + */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsPossibleShortNumberForRegionFuture(java.util.concurrent.Future future) { + return setParamInternal(IS_POSSIBLE_SHORT_NUMBER_FOR_REGION, asFuture(future, AbstractBuilder::asNullableBool)); + } + + /** Sets isValidShortNumberForRegion. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsValidShortNumberForRegion(@javax.annotation.Nullable java.lang.Boolean value) { + return setParamInternal(IS_VALID_SHORT_NUMBER_FOR_REGION, asNullableBool(value)); + } + + /** + * Future compatible version of {@link + * #setIsValidShortNumberForRegion(java.lang.Boolean)}. + */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setIsValidShortNumberForRegionFuture(java.util.concurrent.Future future) { + return setParamInternal(IS_VALID_SHORT_NUMBER_FOR_REGION, asFuture(future, AbstractBuilder::asNullableBool)); + } + + /** Sets e164Format. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setE164Format(java.lang.String value) { + return setParamInternal(E_164_FORMAT, asString(value)); + } + + /** Future compatible version of {@link #setE164Format(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setE164FormatFuture(java.util.concurrent.Future future) { + return setParamInternal(E_164_FORMAT, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets originalFormat. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setOriginalFormat(java.lang.String value) { + return setParamInternal(ORIGINAL_FORMAT, asString(value)); + } + + /** Future compatible version of {@link #setOriginalFormat(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setOriginalFormatFuture(java.util.concurrent.Future future) { + return setParamInternal(ORIGINAL_FORMAT, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets nationalFormat. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setNationalFormat(java.lang.String value) { + return setParamInternal(NATIONAL_FORMAT, asString(value)); + } + + /** Future compatible version of {@link #setNationalFormat(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setNationalFormatFuture(java.util.concurrent.Future future) { + return setParamInternal(NATIONAL_FORMAT, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets internationalFormat. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setInternationalFormat(java.lang.String value) { + return setParamInternal(INTERNATIONAL_FORMAT, asString(value)); + } + + /** Future compatible version of {@link #setInternationalFormat(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setInternationalFormatFuture(java.util.concurrent.Future future) { + return setParamInternal(INTERNATIONAL_FORMAT, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets outOfCountryFormatFromUs. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setOutOfCountryFormatFromUs(java.lang.String value) { + return setParamInternal(OUT_OF_COUNTRY_FORMAT_FROM_US, asString(value)); + } + + /** Future compatible version of {@link #setOutOfCountryFormatFromUs(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setOutOfCountryFormatFromUsFuture(java.util.concurrent.Future future) { + return setParamInternal(OUT_OF_COUNTRY_FORMAT_FROM_US, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets outOfCountryFormatFromCh. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setOutOfCountryFormatFromCh(java.lang.String value) { + return setParamInternal(OUT_OF_COUNTRY_FORMAT_FROM_CH, asString(value)); + } + + /** Future compatible version of {@link #setOutOfCountryFormatFromCh(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setOutOfCountryFormatFromChFuture(java.util.concurrent.Future future) { + return setParamInternal(OUT_OF_COUNTRY_FORMAT_FROM_CH, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets rows. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setRows(java.lang.Iterable> value) { + return setParamInternal(ROWS, asList(value, v -> asList(v, AbstractBuilder::asString))); + } + + /** Future compatible version of {@link #setRows(java.lang.Iterable>)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setRowsFuture(java.util.concurrent.Future>> future) { + return setParamInternal(ROWS, asFuture(future, v -> asList(v, v1 -> asList(v1, AbstractBuilder::asString)))); + } + + /** Sets descriptionForNumber. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setDescriptionForNumber(java.lang.String value) { + return setParamInternal(DESCRIPTION_FOR_NUMBER, asString(value)); + } + + /** Future compatible version of {@link #setDescriptionForNumber(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setDescriptionForNumberFuture(java.util.concurrent.Future future) { + return setParamInternal(DESCRIPTION_FOR_NUMBER, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets timeZonesForNumber. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setTimeZonesForNumber(java.lang.String value) { + return setParamInternal(TIME_ZONES_FOR_NUMBER, asString(value)); + } + + /** Future compatible version of {@link #setTimeZonesForNumber(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setTimeZonesForNumberFuture(java.util.concurrent.Future future) { + return setParamInternal(TIME_ZONES_FOR_NUMBER, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets nameForNumber. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setNameForNumber(java.lang.String value) { + return setParamInternal(NAME_FOR_NUMBER, asString(value)); + } + + /** Future compatible version of {@link #setNameForNumber(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setNameForNumberFuture(java.util.concurrent.Future future) { + return setParamInternal(NAME_FOR_NUMBER, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets newIssueLink. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setNewIssueLink(java.lang.String value) { + return setParamInternal(NEW_ISSUE_LINK, asString(value)); + } + + /** Future compatible version of {@link #setNewIssueLink(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setNewIssueLinkFuture(java.util.concurrent.Future future) { + return setParamInternal(NEW_ISSUE_LINK, asFuture(future, AbstractBuilder::asString)); + } + + /** Sets guidelinesLink. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setGuidelinesLink(java.lang.String value) { + return setParamInternal(GUIDELINES_LINK, asString(value)); + } + + /** Future compatible version of {@link #setGuidelinesLink(java.lang.String)}. */ + @com.google.errorprone.annotations.CanIgnoreReturnValue + public Builder setGuidelinesLinkFuture(java.util.concurrent.Future future) { + return setParamInternal(GUIDELINES_LINK, asFuture(future, AbstractBuilder::asString)); + } + + } + } + +} diff --git a/java/demo/src/main/webapp/phonenumberparser.jsp b/java/demo/src/main/resources/com/google/phonenumbers/demo/input_form.soy similarity index 89% rename from java/demo/src/main/webapp/phonenumberparser.jsp rename to java/demo/src/main/resources/com/google/phonenumbers/demo/input_form.soy index 4e7b7f2f9..c10314572 100644 --- a/java/demo/src/main/webapp/phonenumberparser.jsp +++ b/java/demo/src/main/resources/com/google/phonenumbers/demo/input_form.soy @@ -1,15 +1,17 @@ -<%@ page contentType="text/html;charset=UTF-8" language="java" %> +{namespace com.google.phonenumbers.demo.inputForm} +{template inputForm} +{@param welcomeTitle: string} -

Phone Number Parser Demo

+

{$welcomeTitle}

Step 1

- Specify a Phone Number: + Specify a Phone Number:

Or Upload a file containing phone numbers separated by comma.

@@ -37,3 +39,4 @@

+{/template} diff --git a/java/demo/src/main/resources/com/google/phonenumbers/demo/result.soy b/java/demo/src/main/resources/com/google/phonenumbers/demo/result.soy new file mode 100644 index 000000000..b448bf21c --- /dev/null +++ b/java/demo/src/main/resources/com/google/phonenumbers/demo/result.soy @@ -0,0 +1,253 @@ +{namespace com.google.phonenumbers.demo.singleNumber} +{template singleNumber} +{@param phoneNumber: string} +{@param defaultCountry: string} +{@param geocodingLocale: string} + +{@param countryCode: int} +{@param nationalNumber: int} +{@param extension: string} +{@param countryCodeSource: string} +{@param italianLeadingZero: bool} +{@param rawInput: string} + +{@param isPossibleNumber: bool} +{@param isValidNumber: bool} +{@param isValidNumberForRegion: bool|null} +{@param phoneNumberRegion: string|null} +{@param numberType: string} +{@param validationResult: string} + +{@param isPossibleShortNumber: bool} +{@param isValidShortNumber: bool} +{@param isPossibleShortNumberForRegion: bool|null} +{@param isValidShortNumberForRegion: bool|null} + +{@param e164Format: string} +{@param originalFormat: string} +{@param nationalFormat: string} +{@param internationalFormat: string} +{@param outOfCountryFormatFromUs: string} +{@param outOfCountryFormatFromCh: string} + +{@param rows: list>} + +{@param descriptionForNumber: string} +{@param timeZonesForNumber: string} +{@param nameForNumber: string} +{@param newIssueLink: string} +{@param guidelinesLink: string} + + + + + + + Results for {$phoneNumber} + + +

Phone Number entered: {$phoneNumber}

+

Default Country entered: {$defaultCountry}

+

Language entered: {$geocodingLocale}

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parsing Result (parseAndKeepRawInput())
country_code{$countryCode}
national_number{$nationalNumber}
extension{$extension}
country_code_source{$countryCodeSource}
italian_leading_zero{$italianLeadingZero}
raw_input{$rawInput}
+
+
+ + + + + + + + +{if $isPossibleNumber} + {if $validationResult == "IS_POSSIBLE_LOCAL_ONLY"} + + + + + + + + {else} + + + + + {if $isValidNumberForRegion != null} + + + + + {/if} + + + + + + + + + {/if} +{else} + + + + + + + +{/if} +
Validation Results
Result from isPossibleNumber(){$isPossibleNumber}
Result from isPossibleNumberWithReason(){$validationResult}
Number is considered invalid as it is not a possible national number.
Result from isValidNumber(){$isValidNumber}
Result from isValidNumberForRegion(){$isValidNumberForRegion}
Phone Number region{$phoneNumberRegion ?: ""}
Result from getNumberType(){$numberType}
Result from isPossibleNumberWithReason(){$validationResult}
Note: Numbers that are not possible have type UNKNOWN, an unknown region, and are considered invalid.
+
+ +{if not $isValidNumber} +
+ + + + + + + {if $isPossibleShortNumber} + + + + + {/if} + {if $isPossibleShortNumberForRegion != null} + + + + + {if $isPossibleShortNumberForRegion and $isValidShortNumberForRegion != null} + + + + + {/if} + {/if} +
Short Number Results
Result from isPossibleShortNumber(){$isPossibleShortNumber}
Result from isValidShortNumber(){$isValidShortNumber}
Result from isPossibleShortNumberForRegion(){$isPossibleShortNumberForRegion}
Result from isValidShortNumberForRegion(){$isValidShortNumberForRegion}
+
+{/if} + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Formatting Results
E164 format{$e164Format}
Original format{$originalFormat}
National format{$nationalFormat}
International format{$internationalFormat}
Out-of-country format from US{$outOfCountryFormatFromUs}
Out-of-country format from CH{$outOfCountryFormatFromCh}
+
+ +
+ + + + + {for $row in $rows} + + + + + {/for} + +
AsYouTypeFormatter Results
Char entered: '{$row[0]}' Output: "{$row[1]}
+
+ + +{if $isValidNumber} + +
+ + + + + + + + +
PhoneNumberOfflineGeocoder Results
Location{$descriptionForNumber}
+
+
+ + + + + + + + +
PhoneNumberToTimeZonesMapper Results
Time zone(s){$timeZonesForNumber}
+
+ {if ['MOBILE', 'FIXED_LINE_OR_MOBILE', 'PAGER'].contains($numberType)} +
+ + + + + + + + +
PhoneNumberToCarrierMapper Results
Carrier{$nameForNumber}
+
+ {/if} +{/if} + +File an issue: by clicking on this link, I confirm that I have read the contributor's guidelines. + + +{/template} \ No newline at end of file diff --git a/java/demo/src/main/resources/com/google/phonenumbers/demo/result_error.soy b/java/demo/src/main/resources/com/google/phonenumbers/demo/result_error.soy new file mode 100644 index 000000000..1f3c4007b --- /dev/null +++ b/java/demo/src/main/resources/com/google/phonenumbers/demo/result_error.soy @@ -0,0 +1,20 @@ +{namespace com.google.phonenumbers.demo.error} +{template error} +{@param phoneNumber: string} +{@param defaultCountry: string} +{@param geocodingLocale: string} +{@param error: string} + + + + + Results for {$phoneNumber} + + +

Phone Number entered: {$phoneNumber}

+

Default Country entered: {$defaultCountry}

+

Language entered: {$geocodingLocale}

+

An error occurred while parsing the input: {$error} + + +{/template} \ No newline at end of file diff --git a/java/demo/src/main/resources/com/google/phonenumbers/demo/result_file.soy b/java/demo/src/main/resources/com/google/phonenumbers/demo/result_file.soy new file mode 100644 index 000000000..fd921fe43 --- /dev/null +++ b/java/demo/src/main/resources/com/google/phonenumbers/demo/result_file.soy @@ -0,0 +1,44 @@ +{namespace com.google.phonenumbers.demo.file} +{template file} + {@param rows: list<[id: int, numberStr: string, prettyFormat: string|null, internationalFormat: string|null, error: string|null]>} + + + + + + Results generated from phone numbers in the file provided + + + +

Results generated from phone numbers in the file provided:

+ + + + + + + + + {for $row in $rows} + + + + {if $row.error == null} + + + {else} + + {/if} + + {ifempty} + + + + {/for} + + +
IdRaw phone numberPretty formattingInternational format
{$row.id}{$row.numberStr}{$row.prettyFormat}{$row.internationalFormat}{$row.error}
No data in file detected!
+ + + +{/template} \ No newline at end of file diff --git a/java/demo/src/main/webapp/WEB-INF/web.xml b/java/demo/src/main/webapp/WEB-INF/web.xml index 5a4ba5c97..9be0a5f56 100644 --- a/java/demo/src/main/webapp/WEB-INF/web.xml +++ b/java/demo/src/main/webapp/WEB-INF/web.xml @@ -1,18 +1,25 @@ + version="2.5" + xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee + http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> + com.google.phonenumbers.demo.ResultServlet PhoneNumberParser - com.google.phonenumbers.PhoneNumberParserServlet + + + com.google.phonenumbers.demo.InputServlet + Input PhoneNumberParser /phonenumberparser + + Input + /inputform + - phonenumberparser.jsp + Input