Browse Source

Demo migration (#2826)

Migration of Demo to Soy/Closure templates
pull/2827/head
Tobias Rogg 3 years ago
committed by GitHub
parent
commit
4d9158eb5b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 2071 additions and 455 deletions
  1. +7
    -1
      java/demo/README.md
  2. +54
    -4
      java/demo/pom.xml
  3. +0
    -441
      java/demo/src/main/java/com/google/phonenumbers/PhoneNumberParserServlet.java
  4. +44
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/InputServlet.java
  5. +144
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/ResultServlet.java
  6. +76
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/helper/WebHelper.java
  7. +50
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/render/ErrorRenderer.java
  8. +37
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/render/InputFormRenderer.java
  9. +50
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/render/LibPhoneNumberRenderer.java
  10. +62
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/render/ResultFileRenderer.java
  11. +137
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/render/ResultRenderer.java
  12. +95
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/template/InputFormTemplates.java
  13. +158
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultErrorTemplates.java
  14. +90
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultFileTemplates.java
  15. +731
    -0
      java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultTemplates.java
  16. +6
    -3
      java/demo/src/main/resources/com/google/phonenumbers/demo/input_form.soy
  17. +253
    -0
      java/demo/src/main/resources/com/google/phonenumbers/demo/result.soy
  18. +20
    -0
      java/demo/src/main/resources/com/google/phonenumbers/demo/result_error.soy
  19. +44
    -0
      java/demo/src/main/resources/com/google/phonenumbers/demo/result_file.soy
  20. +13
    -6
      java/demo/src/main/webapp/WEB-INF/web.xml

+ 7
- 1
java/demo/README.md View File

@ -1,15 +1,21 @@
## Prerequisite: ## Prerequisite:
### Linux ### Linux
#### Install the Appengine SDK. #### Install the Appengine SDK.
`$ sudo apt-get install google-cloud-sdk-app-engine-java` `$ sudo apt-get install google-cloud-sdk-app-engine-java`
### Mac ### Mac
#### Install the Google Cloud SDK. #### Install the Google Cloud SDK.
`$ brew install google-cloud-sdk` `$ brew install google-cloud-sdk`
#### Use GCloud CLI to install the Java Appengine #### Use GCloud CLI to install the Java Appengine
`$ gcloud components install app-engine-java` `$ gcloud components install app-engine-java`
## How to regenerate the WAR, deploy and run in appengine? ## How to regenerate the WAR, deploy and run in appengine?
`$ mvn appengine:run`
`$ mvn appengine:run`

+ 54
- 4
java/demo/pom.xml View File

@ -4,7 +4,7 @@
<groupId>com.googlecode.libphonenumber</groupId> <groupId>com.googlecode.libphonenumber</groupId>
<artifactId>demo</artifactId> <artifactId>demo</artifactId>
<version>8.12.57-SNAPSHOT</version> <version>8.12.57-SNAPSHOT</version>
<packaging>war</packaging>
<packaging>war</packaging>
<url>https://github.com/google/libphonenumber/</url> <url>https://github.com/google/libphonenumber/</url>
<parent> <parent>
<groupId>com.googlecode.libphonenumber</groupId> <groupId>com.googlecode.libphonenumber</groupId>
@ -20,6 +20,8 @@
<maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.showDeprecation>true</maven.compiler.showDeprecation> <maven.compiler.showDeprecation>true</maven.compiler.showDeprecation>
<archiveClasses>true</archiveClasses> <archiveClasses>true</archiveClasses>
<soy.root>src/main/resources/com/google/phonenumbers/demo</soy.root>
<soy.package>com.google.phonenumbers.demo.template</soy.package>
</properties> </properties>
<prerequisites> <prerequisites>
@ -29,9 +31,14 @@
<dependencies> <dependencies>
<!-- Compile/runtime dependencies --> <!-- Compile/runtime dependencies -->
<dependency> <dependency>
<groupId>com.google.appengine</groupId>
<artifactId>soy</artifactId>
<groupId>com.google.template</groupId>
<version>2022-07-20</version>
</dependency>
<dependency>
<artifactId>appengine-api-1.0-sdk</artifactId> <artifactId>appengine-api-1.0-sdk</artifactId>
<version>1.9.96</version>
<groupId>com.google.appengine</groupId>
<version>2.0.8</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.servlet</groupId> <groupId>javax.servlet</groupId>
@ -76,13 +83,56 @@
<!-- for hot reload of the web application--> <!-- for hot reload of the web application-->
<outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory> <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
<plugins> <plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.google.template.soy.SoyParseInfoGenerator</mainClass>
<arguments>
<argument>--generateInvocationBuilders</argument>
<argument>--javaPackage</argument>
<argument>${soy.package}</argument>
<argument>--javaClassNameSource</argument>
<argument>filename</argument>
<argument>--srcs</argument>
<argument>${soy.root}/input_form.soy,${soy.root}/result.soy,${soy.root}/result_error.soy,${soy.root}/result_file.soy</argument>
<argument>--outputDirectory</argument>
<argument>src/main/java/com/google/phonenumbers/demo/template/</argument>
</arguments>
</configuration>
</plugin>
<plugin> <plugin>
<groupId>com.google.cloud.tools</groupId> <groupId>com.google.cloud.tools</groupId>
<artifactId>appengine-maven-plugin</artifactId> <artifactId>appengine-maven-plugin</artifactId>
<version>1.3.1</version>
<version>2.4.4</version>
<configuration> <configuration>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
<groupId>org.apache.maven.plugins</groupId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.4.1</version>
<configuration>
<excludePackageNames>${soy.package}</excludePackageNames>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

+ 0
- 441
java/demo/src/main/java/com/google/phonenumbers/PhoneNumberParserServlet.java View File

@ -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(
"<HTML><HEAD><TITLE>Results generated from phone numbers in the file provided:"
+ "</TITLE></HEAD><BODY>");
output.append("<TABLE align=center border=1>");
output.append("<TH align=center>ID</TH>");
output.append("<TH align=center>Raw phone number</TH>");
output.append("<TH align=center>Pretty formatting</TH>");
output.append("<TH align=center>International format</TH>");
int phoneNumberId = 0;
StringTokenizer tokenizer = new StringTokenizer(fileContents, ",");
while (tokenizer.hasMoreTokens()) {
String numberStr = tokenizer.nextToken();
phoneNumberId++;
output.append("<TR>");
output.append("<TD align=center>").append(phoneNumberId).append(" </TD> \n");
output
.append("<TD align=center>")
.append(StringEscapeUtils.escapeHtml(numberStr))
.append(" </TD> \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("<TD align=center>")
.append(StringEscapeUtils.escapeHtml(prettyFormat))
.append(" </TD> \n");
output
.append("<TD align=center>")
.append(StringEscapeUtils.escapeHtml(internationalFormat))
.append(" </TD> \n");
} catch (NumberParseException e) {
output
.append("<TD align=center colspan=2>")
.append(StringEscapeUtils.escapeHtml(e.toString()))
.append(" </TD> \n");
}
output.append("</TR>");
}
output.append("</BODY></HTML>");
return output;
}
private void appendLine(String title, String data, StringBuilder output) {
output.append("<TR>");
output.append("<TH>").append(title).append("</TH>");
output.append("<TD>").append(data.length() > 0 ? data : "&nbsp;").append("</TD>");
output.append("</TR>");
}
/** 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("<HTML><HEAD>");
output.append("<LINK type=\"text/css\" rel=\"stylesheet\" href=\"/stylesheets/main.css\" />");
output.append("</HEAD>");
output.append("<BODY>");
output.append("Phone Number entered: " + StringEscapeUtils.escapeHtml(phoneNumber) + "<BR>");
output.append(
"defaultCountry entered: " + StringEscapeUtils.escapeHtml(defaultCountry) + "<BR>");
output.append(
"Language entered: "
+ StringEscapeUtils.escapeHtml(geocodingLocale.toLanguageTag())
+ "<BR>");
try {
PhoneNumber number = phoneUtil.parseAndKeepRawInput(phoneNumber, defaultCountry);
output.append("<DIV>");
output.append("<TABLE border=1>");
output.append("<TR><TD colspan=2>Parsing Result (parseAndKeepRawInput())</TD></TR>");
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("</TABLE>");
output.append("</DIV>");
boolean isPossible = phoneUtil.isPossibleNumber(number);
boolean isNumberValid = phoneUtil.isValidNumber(number);
PhoneNumberType numberType = phoneUtil.getNumberType(number);
boolean hasDefaultCountry = !defaultCountry.isEmpty() && defaultCountry != "ZZ";
output.append("<DIV>");
output.append("<TABLE border=1>");
output.append("<TR><TD colspan=2>Validation Results</TD></TR>");
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(
"<TR><TD colspan=2>Number is considered invalid as it is "
+ "not a possible national number.</TD></TR>");
} 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(
"<TR><TD colspan=2>Note: Numbers that are not possible have type UNKNOWN,"
+ " an unknown region, and are considered invalid.</TD></TR>");
}
output.append("</TABLE>");
output.append("</DIV>");
if (!isNumberValid) {
output.append("<DIV>");
output.append("<TABLE border=1>");
output.append("<TR><TD colspan=2>Short Number Results</TD></TR>");
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("</TABLE>");
output.append("</DIV>");
}
output.append("<DIV>");
output.append("<TABLE border=1>");
output.append("<TR><TD colspan=2>Formatting Results</TD></TR>");
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("</TABLE>");
output.append("</DIV>");
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(defaultCountry);
int rawNumberLength = phoneNumber.length();
output.append("<DIV>");
output.append("<TABLE border=1>");
output.append("<TR><TD colspan=2>AsYouTypeFormatter Results</TD></TR>");
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("</TABLE>");
output.append("</DIV>");
if (isNumberValid) {
output.append("<DIV>");
output.append("<TABLE border=1>");
output.append("<TR><TD colspan=2>PhoneNumberOfflineGeocoder Results</TD></TR>");
appendLine(
"Location",
PhoneNumberOfflineGeocoder.getInstance()
.getDescriptionForNumber(number, geocodingLocale),
output);
output.append("</TABLE>");
output.append("</DIV>");
output.append("<DIV>");
output.append("<TABLE border=1>");
output.append("<TR><TD colspan=2>PhoneNumberToTimeZonesMapper Results</TD></TR>");
appendLine(
"Time zone(s)",
PhoneNumberToTimeZonesMapper.getInstance().getTimeZonesForNumber(number).toString(),
output);
output.append("</TABLE>");
output.append("</DIV>");
if (numberType == PhoneNumberType.MOBILE
|| numberType == PhoneNumberType.FIXED_LINE_OR_MOBILE
|| numberType == PhoneNumberType.PAGER) {
output.append("<DIV>");
output.append("<TABLE border=1>");
output.append("<TR><TD colspan=2>PhoneNumberToCarrierMapper Results</TD></TR>");
appendLine(
"Carrier",
PhoneNumberToCarrierMapper.getInstance().getNameForNumber(number, geocodingLocale),
output);
output.append("</TABLE>");
output.append("</DIV>");
}
}
String newIssueLink = getNewIssueLink(phoneNumber, defaultCountry, geocodingLocale);
String guidelinesLink =
"https://github.com/google/libphonenumber/blob/master/CONTRIBUTING.md";
output.append(
"<b style=\"color:red\">File an issue</b>: by clicking on "
+ "<a target=\"_blank\" href=\""
+ newIssueLink
+ "\">this link</a>, I confirm that I "
+ "have read the <a target=\"_blank\" href=\""
+ guidelinesLink
+ "\">contributor's guidelines</a>.");
} catch (NumberParseException e) {
output.append(StringEscapeUtils.escapeHtml(e.toString()));
}
output.append("</BODY></HTML>");
return output;
}
}

+ 44
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/InputServlet.java View File

@ -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());
}
}

+ 144
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/ResultServlet.java View File

@ -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();
}
}
}

+ 76
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/helper/WebHelper.java View File

@ -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;
}
}

+ 50
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/render/ErrorRenderer.java View File

@ -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<Error> {
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());
}
}

+ 37
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/render/InputFormRenderer.java View File

@ -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<InputForm> {
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());
}
}

+ 50
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/render/LibPhoneNumberRenderer.java View File

@ -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<T extends SoyTemplate> {
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();
}

+ 62
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/render/ResultFileRenderer.java View File

@ -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<File> {
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());
}
}

+ 137
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/render/ResultRenderer.java View File

@ -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<SingleNumber> {
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<List<String>> 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());
}
}

+ 95
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/template/InputFormTemplates.java View File

@ -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<java.lang.String, java.lang.String> __PROVIDED_CSS_MAP__ = com.google.common.collect.ImmutableMap.<java.lang.String, java.lang.String>of();
/** A list of provided symbols used for css validation on edit refresh. */
private static final com.google.common.collect.ImmutableList<java.lang.String> __PROVIDED_CSS__ = com.google.common.collect.ImmutableList.<java.lang.String>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<InputForm> as a SoyTemplate.AsyncWrapper<InputForm> */
public static com.google.template.soy.data.SoyTemplate.AsyncWrapper<InputForm> wrapFuture(com.google.common.util.concurrent.ListenableFuture<InputForm> paramsFuture) {
return new com.google.template.soy.data.SoyTemplate.AsyncWrapper<>(__NAME__, paramsFuture);
}
private InputForm(com.google.common.collect.ImmutableMap<java.lang.String, com.google.template.soy.data.SoyValueProvider> 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<java.lang.String>
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<java.lang.Object>
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<com.google.template.soy.data.SoyTemplateParam<?>> __PARAMS__ = com.google.common.collect.ImmutableSet.of(
WELCOME_TITLE);
public static final class Builder extends com.google.template.soy.data.BaseSoyTemplateImpl.AbstractBuilder<Builder, InputForm> {
private Builder() {
super(1);
}
@java.lang.Override
protected com.google.common.collect.ImmutableSet<com.google.template.soy.data.SoyTemplateParam<?>> allParams() {
return __PARAMS__;
}
@java.lang.Override
protected InputForm buildInternal(com.google.common.collect.ImmutableMap<java.lang.String, com.google.template.soy.data.SoyValueProvider> 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<java.lang.String> future) {
return setParamInternal(WELCOME_TITLE, asFuture(future, AbstractBuilder::asString));
}
}
}
}

+ 158
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultErrorTemplates.java View File

@ -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<java.lang.String, java.lang.String> __PROVIDED_CSS_MAP__ = com.google.common.collect.ImmutableMap.<java.lang.String, java.lang.String>of();
/** A list of provided symbols used for css validation on edit refresh. */
private static final com.google.common.collect.ImmutableList<java.lang.String> __PROVIDED_CSS__ = com.google.common.collect.ImmutableList.<java.lang.String>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<Error> as a SoyTemplate.AsyncWrapper<Error> */
public static com.google.template.soy.data.SoyTemplate.AsyncWrapper<Error> wrapFuture(com.google.common.util.concurrent.ListenableFuture<Error> paramsFuture) {
return new com.google.template.soy.data.SoyTemplate.AsyncWrapper<>(__NAME__, paramsFuture);
}
private Error(com.google.common.collect.ImmutableMap<java.lang.String, com.google.template.soy.data.SoyValueProvider> 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<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.Object>
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<com.google.template.soy.data.SoyTemplateParam<?>> __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<Builder, Error> {
private Builder() {
super(4);
}
@java.lang.Override
protected com.google.common.collect.ImmutableSet<com.google.template.soy.data.SoyTemplateParam<?>> allParams() {
return __PARAMS__;
}
@java.lang.Override
protected Error buildInternal(com.google.common.collect.ImmutableMap<java.lang.String, com.google.template.soy.data.SoyValueProvider> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> future) {
return setParamInternal(ERROR, asFuture(future, AbstractBuilder::asString));
}
}
}
}

+ 90
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultFileTemplates.java View File

@ -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<java.lang.String, java.lang.String> __PROVIDED_CSS_MAP__ = com.google.common.collect.ImmutableMap.<java.lang.String, java.lang.String>of();
/** A list of provided symbols used for css validation on edit refresh. */
private static final com.google.common.collect.ImmutableList<java.lang.String> __PROVIDED_CSS__ = com.google.common.collect.ImmutableList.<java.lang.String>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<File> as a SoyTemplate.AsyncWrapper<File> */
public static com.google.template.soy.data.SoyTemplate.AsyncWrapper<File> wrapFuture(com.google.common.util.concurrent.ListenableFuture<File> paramsFuture) {
return new com.google.template.soy.data.SoyTemplate.AsyncWrapper<>(__NAME__, paramsFuture);
}
private File(com.google.common.collect.ImmutableMap<java.lang.String, com.google.template.soy.data.SoyValueProvider> 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<java.lang.Object>
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<com.google.template.soy.data.SoyTemplateParam<?>> __PARAMS__ = com.google.common.collect.ImmutableSet.of(
ROWS);
public static final class Builder extends com.google.template.soy.data.BaseSoyTemplateImpl.AbstractBuilderWithAccumulatorParameters<Builder, File> {
private Builder() {
super(1);
initListParam(ROWS);
}
@java.lang.Override
protected com.google.common.collect.ImmutableSet<com.google.template.soy.data.SoyTemplateParam<?>> allParams() {
return __PARAMS__;
}
@java.lang.Override
protected File buildInternal(com.google.common.collect.ImmutableMap<java.lang.String, com.google.template.soy.data.SoyValueProvider> 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)));
}
}
}
}

+ 731
- 0
java/demo/src/main/java/com/google/phonenumbers/demo/template/ResultTemplates.java View File

@ -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<java.lang.String, java.lang.String> __PROVIDED_CSS_MAP__ = com.google.common.collect.ImmutableMap.<java.lang.String, java.lang.String>of();
/** A list of provided symbols used for css validation on edit refresh. */
private static final com.google.common.collect.ImmutableList<java.lang.String> __PROVIDED_CSS__ = com.google.common.collect.ImmutableList.<java.lang.String>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<SingleNumber> as a SoyTemplate.AsyncWrapper<SingleNumber> */
public static com.google.template.soy.data.SoyTemplate.AsyncWrapper<SingleNumber> wrapFuture(com.google.common.util.concurrent.ListenableFuture<SingleNumber> paramsFuture) {
return new com.google.template.soy.data.SoyTemplate.AsyncWrapper<>(__NAME__, paramsFuture);
}
private SingleNumber(com.google.common.collect.ImmutableMap<java.lang.String, com.google.template.soy.data.SoyValueProvider> 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<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.Long>
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<java.lang.Long>
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<java.lang.String>
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<java.lang.String>
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<java.lang.Boolean>
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<java.lang.String>
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<java.lang.Boolean>
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<java.lang.Boolean>
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<java.lang.Boolean>
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<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.Boolean>
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<java.lang.Boolean>
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<java.lang.Boolean>
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<java.lang.Boolean>
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<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.Iterable<? extends java.util.Collection<java.lang.String>>>
ROWS =
com.google.template.soy.data.SoyTemplateParam.standard(
"rows",
/* required= */ true,
new com.google.common.reflect.TypeToken<java.lang.Iterable<? extends java.util.Collection<java.lang.String>>>() {});
/** {@param descriptionForNumber} */
public static final com.google.template.soy.data.SoyTemplateParam<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.String>
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<java.lang.Object>
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<com.google.template.soy.data.SoyTemplateParam<?>> __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<Builder, SingleNumber> {
private Builder() {
super(31);
}
@java.lang.Override
protected com.google.common.collect.ImmutableSet<com.google.template.soy.data.SoyTemplateParam<?>> allParams() {
return __PARAMS__;
}
@java.lang.Override
protected SingleNumber buildInternal(com.google.common.collect.ImmutableMap<java.lang.String, com.google.template.soy.data.SoyValueProvider> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> 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<? extends java.lang.Number> 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<? extends java.lang.Number> 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<java.lang.String> 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<java.lang.String> 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<java.lang.Boolean> 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<java.lang.String> 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<java.lang.Boolean> 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<java.lang.Boolean> 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<java.lang.Boolean> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> 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<java.lang.Boolean> 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<java.lang.Boolean> 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<java.lang.Boolean> 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<java.lang.Boolean> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> 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<? extends java.util.Collection<java.lang.String>> 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<? extends java.util.Collection<? extends java.util.Collection<java.lang.String>>> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> 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<java.lang.String> future) {
return setParamInternal(GUIDELINES_LINK, asFuture(future, AbstractBuilder::asString));
}
}
}
}

java/demo/src/main/webapp/phonenumberparser.jsp → java/demo/src/main/resources/com/google/phonenumbers/demo/input_form.soy View File


+ 253
- 0
java/demo/src/main/resources/com/google/phonenumbers/demo/result.soy View File

@ -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<list<string>>}
{@param descriptionForNumber: string}
{@param timeZonesForNumber: string}
{@param nameForNumber: string}
{@param newIssueLink: string}
{@param guidelinesLink: string}
<!DOCTYPE html>
<HTML lang="en">
<HEAD>
<LINK type="text/css" rel="stylesheet" href="/stylesheets/main.css"/>
<title>Results for {$phoneNumber}</title>
</HEAD>
<BODY>
<p>Phone Number entered: {$phoneNumber}</p>
<p>Default Country entered: {$defaultCountry}</p>
<p>Language entered: {$geocodingLocale}</p>
<DIV>
<TABLE border=1>
<TR>
<TD colspan=2>Parsing Result (parseAndKeepRawInput())</TD>
</TR>
<TR>
<TH>country_code</TH>
<TD>{$countryCode}</TD>
</TR>
<TR>
<TH>national_number</TH>
<TD>{$nationalNumber}</TD>
</TR>
<TR>
<TH>extension</TH>
<TD>{$extension}</TD>
</TR>
<TR>
<TH>country_code_source</TH>
<TD>{$countryCodeSource}</TD>
</TR>
<TR>
<TH>italian_leading_zero</TH>
<TD>{$italianLeadingZero}</TD>
</TR>
<TR>
<TH>raw_input</TH>
<TD>{$rawInput}</TD>
</TR>
</TABLE>
</DIV>
<DIV>
<TABLE border=1>
<TR>
<TD colspan=2>Validation Results</TD>
</TR>
<TR>
<TH>Result from isPossibleNumber()</TH>
<TD>{$isPossibleNumber}</TD>
</TR>
{if $isPossibleNumber}
{if $validationResult == "IS_POSSIBLE_LOCAL_ONLY"}
<TR>
<TH>Result from isPossibleNumberWithReason()</TH>
<TD>{$validationResult}</TD>
</TR>
<TR>
<TD colspan=2>Number is considered invalid as it is not a possible national number.</TD>
</TR>
{else}
<TR>
<TH>Result from isValidNumber()</TH>
<TD>{$isValidNumber}</TD>
</TR>
{if $isValidNumberForRegion != null}
<TR>
<TH>Result from isValidNumberForRegion()</TH>
<TD>{$isValidNumberForRegion}</TD>
</TR>
{/if}
<TR>
<TH>Phone Number region</TH>
<TD>{$phoneNumberRegion ?: ""}</TD>
</TR>
<TR>
<TH>Result from getNumberType()</TH>
<TD>{$numberType}</TD>
</TR>
{/if}
{else}
<TR>
<TH>Result from isPossibleNumberWithReason()</TH>
<TD>{$validationResult}</TD>
</TR>
<TR>
<TD colspan=2>Note: Numbers that are not possible have type UNKNOWN, an unknown region, and are considered invalid.</TD>
</TR>
{/if}
</TABLE>
</DIV>
{if not $isValidNumber}
<DIV>
<TABLE border=1>
<TR><TD colspan=2>Short Number Results</TD></TR>
<TR>
<TH>Result from isPossibleShortNumber()</TH>
<TD>{$isPossibleShortNumber}</TD>
</TR>
{if $isPossibleShortNumber}
<TR>
<TH>Result from isValidShortNumber()</TH>
<TD>{$isValidShortNumber}</TD>
</TR>
{/if}
{if $isPossibleShortNumberForRegion != null}
<TR>
<TH>Result from isPossibleShortNumberForRegion()</TH>
<TD>{$isPossibleShortNumberForRegion}</TD>
</TR>
{if $isPossibleShortNumberForRegion and $isValidShortNumberForRegion != null}
<TR>
<TH>Result from isValidShortNumberForRegion()</TH>
<TD>{$isValidShortNumberForRegion}</TD>
</TR>
{/if}
{/if}
</TABLE>
</DIV>
{/if}
<DIV>
<TABLE border=1>
<TR>
<TD colspan=2>Formatting Results</TD>
</TR>
<TR>
<TH>E164 format</TH>
<TD>{$e164Format}</TD>
</TR>
<TR>
<TH>Original format</TH>
<TD>{$originalFormat}</TD>
</TR>
<TR>
<TH>National format</TH>
<TD>{$nationalFormat}</TD>
</TR>
<TR>
<TH>International format</TH>
<TD>{$internationalFormat}</TD>
</TR>
<TR>
<TH>Out-of-country format from US</TH>
<TD>{$outOfCountryFormatFromUs}</TD>
</TR>
<TR>
<TH>Out-of-country format from CH</TH>
<TD>{$outOfCountryFormatFromCh}</TD>
</TR>
</TABLE>
</DIV>
<DIV>
<TABLE border=1>
<TR>
<TD colspan=2>AsYouTypeFormatter Results</TD>
</TR>
{for $row in $rows}
<TR>
<TH>Char entered: '{$row[0]}' Output: "</TH>
<TD>{$row[1]}</TD>
</TR>
{/for}
</TABLE>
</DIV>
{if $isValidNumber}
<DIV>
<TABLE border=1>
<TR>
<TD colspan=2>PhoneNumberOfflineGeocoder Results</TD>
</TR>
<TR>
<TH>Location</TH>
<TD>{$descriptionForNumber}</TD>
</TR>
</TABLE>
</DIV>
<DIV>
<TABLE border=1>
<TR>
<TD colspan=2>PhoneNumberToTimeZonesMapper Results</TD>
</TR>
<TR>
<TH>Time zone(s)</TH>
<TD>{$timeZonesForNumber}</TD>
</TR>
</TABLE>
</DIV>
{if ['MOBILE', 'FIXED_LINE_OR_MOBILE', 'PAGER'].contains($numberType)}
<DIV>
<TABLE border=1>
<TR>
<TD colspan=2>PhoneNumberToCarrierMapper Results</TD>
</TR>
<TR>
<TH>Carrier</TH>
<TD>{$nameForNumber}</TD>
</TR>
</TABLE>
</DIV>
{/if}
{/if}
<b style="color:red">File an issue</b>: by clicking on <a target="_blank" href="{$newIssueLink}">this link</a>, I confirm that I have read the <a target="_blank" href="{$guidelinesLink}">contributor's guidelines</a>.
</BODY>
</HTML>
{/template}

+ 20
- 0
java/demo/src/main/resources/com/google/phonenumbers/demo/result_error.soy View File

@ -0,0 +1,20 @@
{namespace com.google.phonenumbers.demo.error}
{template error}
{@param phoneNumber: string}
{@param defaultCountry: string}
{@param geocodingLocale: string}
{@param error: string}
<!DOCTYPE html>
<HTML lang="en">
<HEAD>
<LINK type="text/css" rel="stylesheet" href="/stylesheets/main.css"/>
<title>Results for {$phoneNumber}</title>
</HEAD>
<BODY>
<p>Phone Number entered: {$phoneNumber}</p>
<p>Default Country entered: {$defaultCountry}</p>
<p>Language entered: {$geocodingLocale}</p>
<p>An error occurred while parsing the input: {$error}
</BODY>
</HTML>
{/template}

+ 44
- 0
java/demo/src/main/resources/com/google/phonenumbers/demo/result_file.soy View File

@ -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]>}
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="/stylesheets/main.css" />
<title>Results generated from phone numbers in the file provided</title>
</head>
<body>
<h2>Results generated from phone numbers in the file provided:</h2>
<table>
<tr>
<th>Id</th>
<th>Raw phone number</th>
<th>Pretty formatting</th>
<th>International format</th>
</tr>
{for $row in $rows}
<tr>
<td>{$row.id}</td>
<td>{$row.numberStr}</td>
{if $row.error == null}
<td>{$row.prettyFormat}</td>
<td>{$row.internationalFormat}</td>
{else}
<td colspan=2>{$row.error}</td>
{/if}
</tr>
{ifempty}
<tr>
<td colspan=4>No data in file detected!</td>
</tr>
{/for}
</table>
</body>
</html>
{/template}

+ 13
- 6
java/demo/src/main/webapp/WEB-INF/web.xml View File

@ -1,18 +1,25 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
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">
<servlet> <servlet>
<servlet-class>com.google.phonenumbers.demo.ResultServlet</servlet-class>
<servlet-name>PhoneNumberParser</servlet-name> <servlet-name>PhoneNumberParser</servlet-name>
<servlet-class>com.google.phonenumbers.PhoneNumberParserServlet</servlet-class>
</servlet>
<servlet>
<servlet-class>com.google.phonenumbers.demo.InputServlet</servlet-class>
<servlet-name>Input</servlet-name>
</servlet> </servlet>
<servlet-mapping> <servlet-mapping>
<servlet-name>PhoneNumberParser</servlet-name> <servlet-name>PhoneNumberParser</servlet-name>
<url-pattern>/phonenumberparser</url-pattern> <url-pattern>/phonenumberparser</url-pattern>
</servlet-mapping> </servlet-mapping>
<servlet-mapping>
<servlet-name>Input</servlet-name>
<url-pattern>/inputform</url-pattern>
</servlet-mapping>
<welcome-file-list> <welcome-file-list>
<welcome-file>phonenumberparser.jsp</welcome-file>
<welcome-file>Input</welcome-file>
</welcome-file-list> </welcome-file-list>
</web-app> </web-app>

Loading…
Cancel
Save