1 /* 2 * Copyright (C) 2022 The Libphonenumber Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 * @author Shaopeng Jia 17 */ 18 19 package com.google.phonenumbers.demo; 20 21 import static java.nio.charset.StandardCharsets.UTF_8; 22 import static java.util.Locale.ENGLISH; 23 24 import com.google.i18n.phonenumbers.NumberParseException; 25 import com.google.i18n.phonenumbers.PhoneNumberUtil; 26 import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; 27 import com.google.phonenumbers.demo.helper.WebHelper; 28 import com.google.phonenumbers.demo.render.ErrorRenderer; 29 import com.google.phonenumbers.demo.render.ResultFileRenderer; 30 import com.google.phonenumbers.demo.render.ResultRenderer; 31 import java.io.IOException; 32 import java.io.InputStream; 33 import java.util.Locale; 34 import javax.servlet.http.HttpServlet; 35 import javax.servlet.http.HttpServletRequest; 36 import javax.servlet.http.HttpServletResponse; 37 import org.apache.commons.fileupload.FileItemIterator; 38 import org.apache.commons.fileupload.FileItemStream; 39 import org.apache.commons.fileupload.FileUploadException; 40 import org.apache.commons.fileupload.servlet.ServletFileUpload; 41 import org.apache.commons.fileupload.util.Streams; 42 import org.apache.commons.io.IOUtils; 43 44 /** 45 * A servlet that accepts requests that contain strings representing a phone number and a default 46 * country, and responds with results from parsing, validating and formatting the number. The 47 * default country is a two-letter region code representing the country that we are expecting the 48 * number to be from. 49 */ 50 @SuppressWarnings("serial") 51 public class ResultServlet extends HttpServlet { 52 53 private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); 54 doPost(HttpServletRequest req, HttpServletResponse resp)55 public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 56 String phoneNumber = null; 57 String defaultCountry = null; 58 String languageCode = "en"; // Default languageCode to English if nothing is entered. 59 String regionCode = ""; 60 String fileContents = null; 61 ServletFileUpload upload = new ServletFileUpload(); 62 upload.setSizeMax(50000); 63 try { 64 FileItemIterator iterator = upload.getItemIterator(req); 65 while (iterator.hasNext()) { 66 FileItemStream item = iterator.next(); 67 InputStream in = item.openStream(); 68 if (item.isFormField()) { 69 String fieldName = item.getFieldName(); 70 if (fieldName.equals("phoneNumber")) { 71 phoneNumber = Streams.asString(in, UTF_8.name()); 72 } else if (fieldName.equals("defaultCountry")) { 73 defaultCountry = Streams.asString(in).toUpperCase(); 74 } else if (fieldName.equals("languageCode")) { 75 String languageEntered = Streams.asString(in).toLowerCase(); 76 if (languageEntered.length() > 0) { 77 languageCode = languageEntered; 78 } 79 } else if (fieldName.equals("regionCode")) { 80 regionCode = Streams.asString(in).toUpperCase(); 81 } 82 } else { 83 try { 84 fileContents = IOUtils.toString(in); 85 } finally { 86 IOUtils.closeQuietly(in); 87 } 88 } 89 } 90 } catch (FileUploadException e1) { 91 e1.printStackTrace(); 92 } 93 94 resp.setContentType("text/html"); 95 resp.setCharacterEncoding(UTF_8.name()); 96 if (fileContents == null || fileContents.length() == 0) { 97 // Redirect to a URL with the given input encoded in the query parameters. 98 Locale geocodingLocale = new Locale(languageCode, regionCode); 99 resp.sendRedirect( 100 WebHelper.getPermaLinkURL( 101 phoneNumber, defaultCountry, geocodingLocale, false /* absoluteURL */)); 102 } else { 103 resp.getWriter().println(new ResultFileRenderer(defaultCountry, fileContents).genHtml()); 104 } 105 } 106 107 /** Handle the get request to get information about a number based on query parameters. */ doGet(HttpServletRequest req, HttpServletResponse resp)108 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 109 String phoneNumber = req.getParameter("number"); 110 if (phoneNumber == null) { 111 phoneNumber = ""; 112 } 113 String defaultCountry = req.getParameter("country"); 114 if (defaultCountry == null) { 115 defaultCountry = ""; 116 } 117 String geocodingParam = req.getParameter("geocodingLocale"); 118 Locale geocodingLocale; 119 if (geocodingParam == null) { 120 geocodingLocale = ENGLISH; // Default languageCode to English if nothing is entered. 121 } else { 122 geocodingLocale = Locale.forLanguageTag(geocodingParam); 123 } 124 resp.setContentType("text/html"); 125 resp.setCharacterEncoding(UTF_8.name()); 126 resp.getWriter() 127 .println(getOutputForSingleNumber(phoneNumber, defaultCountry, geocodingLocale)); 128 } 129 130 /** 131 * The defaultCountry here is used for parsing phoneNumber. The geocodingLocale is used to specify 132 * the language used for displaying the area descriptions generated from phone number geocoding. 133 */ getOutputForSingleNumber( String phoneNumber, String defaultCountry, Locale geocodingLocale)134 private String getOutputForSingleNumber( 135 String phoneNumber, String defaultCountry, Locale geocodingLocale) { 136 try { 137 PhoneNumber number = phoneUtil.parseAndKeepRawInput(phoneNumber, defaultCountry); 138 return new ResultRenderer(phoneNumber, defaultCountry, geocodingLocale, number).genHtml(); 139 } catch (NumberParseException e) { 140 return new ErrorRenderer(phoneNumber, defaultCountry, geocodingLocale, e.toString()) 141 .genHtml(); 142 } 143 } 144 } 145