diff --git a/java/demo/build.xml b/java/demo/build.xml new file mode 100644 index 000000000..b9ed0cb59 --- /dev/null +++ b/java/demo/build.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/demo/src/com/google/phonenumbers/PhoneNumberParserServlet.java b/java/demo/src/com/google/phonenumbers/PhoneNumberParserServlet.java new file mode 100644 index 000000000..7fa6dcad9 --- /dev/null +++ b/java/demo/src/com/google/phonenumbers/PhoneNumberParserServlet.java @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2011 Google Inc. + * + * 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 com.google.i18n.phonenumbers.AsYouTypeFormatter; +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 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 java.io.IOException; +import java.io.InputStream; +import java.util.StringTokenizer; + +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 PhoneNumberParserServlet extends HttpServlet { + private PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); + public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + String phoneNumber = null; + String defaultCountry = null; + 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()) { + if (item.getFieldName().equals("phoneNumber")) { + phoneNumber = Streams.asString(in, "UTF-8"); + } else if (item.getFieldName().equals("defaultCountry")) { + defaultCountry = Streams.asString(in); + } + } else { + try { + fileContents = IOUtils.toString(in); + } finally { + IOUtils.closeQuietly(in); + } + } + } + } catch (FileUploadException e1) { + e1.printStackTrace(); + } + + StringBuffer output; + if (fileContents.length() == 0) { + output = getOutputForSingleNumber(phoneNumber, defaultCountry); + resp.setContentType("text/plain"); + resp.getWriter().println("Phone Number entered: " + phoneNumber); + resp.getWriter().println("defaultCountry entered: " + defaultCountry); + } else { + output = getOutputForFile(defaultCountry, fileContents); + resp.setContentType("text/html"); + } + resp.getWriter().println(output); + } + + private StringBuffer getOutputForFile(String defaultCountry, String fileContents) { + StringBuffer output = new StringBuffer(); + output.append("Results generated from phone numbers in the file provided:" + + ""); + output.append(""); + output.append(""); + output.append(""); + output.append(""); + output.append(""); + + int phoneNumberId = 0; + StringTokenizer tokenizer = new StringTokenizer(fileContents, ","); + while (tokenizer.hasMoreTokens()) { + String numberStr = tokenizer.nextToken(); + phoneNumberId++; + output.append(""); + output.append(" \n"); + output.append(" \n"); + try { + PhoneNumber number = phoneUtil.parseAndKeepRawInput(numberStr, defaultCountry); + boolean isNumberValid = phoneUtil.isValidNumber(number); + String prettyFormat = isNumberValid + ? phoneUtil.formatInOriginalFormat(number, defaultCountry) + : "invalid"; + String internationalFormat = isNumberValid + ? phoneUtil.format(number, PhoneNumberFormat.INTERNATIONAL) + : "invalid"; + + output.append(" \n"); + output.append(" \n"); + } catch (NumberParseException e) { + output.append(" \n"); + } + output.append(""); + } + output.append(""); + return output; + } + + private StringBuffer getOutputForSingleNumber(String phoneNumber, String defaultCountry) { + StringBuffer output = new StringBuffer(); + try { + PhoneNumber number = phoneUtil.parseAndKeepRawInput(phoneNumber, defaultCountry); + output.append("\n\n****Parsing Result:****"); + output.append("\ncountry_code: ").append(number.getCountryCode()); + output.append("\nnational_number: ").append(number.getNationalNumber()); + output.append("\nextension:").append(number.getExtension()); + output.append("\ncountry_code_source: ").append(number.getCountryCodeSource()); + output.append("\nitalian_leading_zero: ").append(number.getItalianLeadingZero()); + output.append("\nraw_input: ").append(number.getRawInput()); + + output.append("\n\n****Validation Results:****"); + boolean isNumberValid = phoneUtil.isValidNumber(number); + output.append("\nResult from isValidNumber(): ").append(isNumberValid); + output.append("\nResult from isValidNumberForRegion(): ").append( + phoneUtil.isValidNumberForRegion(number, defaultCountry)); + output.append("\nResult from isPossibleNumber(): ").append( + phoneUtil.isPossibleNumber(number)); + output.append("\nResult from getNumberType(): ").append(phoneUtil.getNumberType(number)); + + output.append("\n\n****Formatting Results:**** "); + output.append("\nE164 format: ").append( + isNumberValid ? phoneUtil.format(number, PhoneNumberFormat.E164) : "invalid"); + output.append("\nOriginal format: ").append( + phoneUtil.formatInOriginalFormat(number, defaultCountry)); + output.append("\nInternational format: ").append( + isNumberValid ? phoneUtil.format(number, PhoneNumberFormat.INTERNATIONAL) : "invalid"); + output.append("\nNational format: ").append( + phoneUtil.format(number, PhoneNumberFormat.NATIONAL)); + output.append("\nOut-of-country format from US: ").append( + isNumberValid ? phoneUtil.formatOutOfCountryCallingNumber(number, "US") : "invalid"); + output.append("\n\n****AsYouTypeFormatter Results****"); + 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); + output.append("\nChar entered: ").append(inputChar).append(" Output: ") + .append(formatter.inputDigit(inputChar)); + } + output.append("\n\n"); + } catch (NumberParseException e) { + output.append(e.toString()); + } + return output; + } +} diff --git a/java/demo/war/WEB-INF/appengine-web.xml b/java/demo/war/WEB-INF/appengine-web.xml new file mode 100644 index 000000000..06c15d529 --- /dev/null +++ b/java/demo/war/WEB-INF/appengine-web.xml @@ -0,0 +1,10 @@ + + + libphonenumber + 1 + + + + + + diff --git a/java/demo/war/WEB-INF/lib/commons-fileupload-1.2.1.jar b/java/demo/war/WEB-INF/lib/commons-fileupload-1.2.1.jar new file mode 100644 index 000000000..aa209b388 Binary files /dev/null and b/java/demo/war/WEB-INF/lib/commons-fileupload-1.2.1.jar differ diff --git a/java/demo/war/WEB-INF/lib/commons-io-1.4.jar b/java/demo/war/WEB-INF/lib/commons-io-1.4.jar new file mode 100644 index 000000000..133dc6cb3 Binary files /dev/null and b/java/demo/war/WEB-INF/lib/commons-io-1.4.jar differ diff --git a/java/demo/war/WEB-INF/logging.properties b/java/demo/war/WEB-INF/logging.properties new file mode 100644 index 000000000..a17206681 --- /dev/null +++ b/java/demo/war/WEB-INF/logging.properties @@ -0,0 +1,13 @@ +# A default java.util.logging configuration. +# (All App Engine logging is through java.util.logging by default). +# +# To use this configuration, copy it into your application's WEB-INF +# folder and add the following to your appengine-web.xml: +# +# +# +# +# + +# Set the default logging level for all loggers to WARNING +.level = WARNING diff --git a/java/demo/war/WEB-INF/web.xml b/java/demo/war/WEB-INF/web.xml new file mode 100644 index 000000000..5a4ba5c97 --- /dev/null +++ b/java/demo/war/WEB-INF/web.xml @@ -0,0 +1,18 @@ + + + + PhoneNumberParser + com.google.phonenumbers.PhoneNumberParserServlet + + + PhoneNumberParser + /phonenumberparser + + + phonenumberparser.jsp + + diff --git a/java/demo/war/phonenumberparser.jsp b/java/demo/war/phonenumberparser.jsp new file mode 100644 index 000000000..4860f2498 --- /dev/null +++ b/java/demo/war/phonenumberparser.jsp @@ -0,0 +1,28 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + +

Phone Number Parser Demo

+ +

Step 1

+

+ Specify a Phone Number: +

+ Or Upload a file containing phone numbers separated by comma. +

+ +

+

Step 2

+

+ Specify a Default Country: + + ( + ISO 3166-1 two-letter country code) +

+ + +

+ Back to libphonenumber + + + diff --git a/java/release_notes.txt b/java/release_notes.txt index 33f862a88..c26cb85b9 100644 --- a/java/release_notes.txt +++ b/java/release_notes.txt @@ -1,3 +1,7 @@ +Mar 10th, 2011 +* Code changes: + - releasing the code to run the demo on localhost or appengine. + Mar 3rd, 2011 * Metadata changes: - Adding support for AC
IDRaw phone numberPretty formattingInternational format
").append(phoneNumberId).append(" ").append(numberStr).append(" ").append(prettyFormat).append(" ").append(internationalFormat).append(" ").append(e.toString()).append("