• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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