/*
* Copyright 2016 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.
*/
package com.google.appengine.demos.asyncrest;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Queue;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Abstract base class for REST servlets.
*/
public class AbstractRestServlet extends HttpServlet {
protected static final int MAX_RESULTS = 5;
protected static final String STYLE = "<style type='text/css'>"
+ " img.thumb:hover {height:50px}"
+ " img.thumb {vertical-align:text-top}"
+ " span.red {color: #ff0000}"
+ " span.green {color: #00ff00}"
+ " iframe {border: 0px}" + "</style>";
protected static final String APPKEY = "com.google.appengine.demos.asyncrest.appKey";
protected static final String APPKEY_ENV = "PLACES_APPKEY";
protected static final String LOC_PARAM = "loc";
protected static final String ITEMS_PARAM = "items";
protected static final String LATITUDE_PARAM = "lat";
protected static final String LONGITUDE_PARAM = "long";
protected static final String RADIUS_PARAM = "radius";
protected String key;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// First try the servlet context init-param.
String source = "InitParameter";
key = servletConfig.getInitParameter(APPKEY);
if (key == null || key.startsWith("${")) {
source = "System Property";
key = System.getProperty(APPKEY);
}
if (key == null || key.startsWith("${")) {
source = "Environment Variable";
key = System.getenv(APPKEY_ENV);
}
if (key == null) {
throw new UnavailableException("Places App Key not set");
}
if (key.startsWith("${")) {
throw new UnavailableException("Places App Key not expanded from " + source);
}
}
public static String sanitize(String str) {
if (str == null) {
return null;
}
return str.replace("<", "?").replace("&", "?").replace("\n", "?");
}
protected String restQuery(String coordinates, String radius, String item) {
try {
return "https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=" + key
+ "&location=" + URLEncoder.encode(coordinates, "UTF-8")
+ "&types=" + URLEncoder.encode(item, "UTF-8")
+ "&radius=" + URLEncoder.encode(radius, "UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String generateResults(Queue<Map<String, Object>> results) {
StringBuilder thumbs = new StringBuilder();
int resultCount = 0;
Iterator<Map<String, Object>> itor = results.iterator();
while (resultCount < MAX_RESULTS && itor.hasNext()) {
Map map = (Map) itor.next();
String name = (String) map.get("name");
Object[] photos = (Object[]) map.get("photos");
if (photos != null && photos.length > 0) {
resultCount++;
thumbs.append(
"<img class='thumb' border='1px' height='40px' "
+ "src='" + getPhotoUrl((String) (((Map) photos[0]).get("photo_reference"))) + "' "
+ "title='" + name + "' />");
thumbs.append("</a> ");
}
}
return thumbs.toString();
}
public String getPhotoUrl(String photoref) {
return "https://maps.googleapis.com/maps/api/place/photo?key=" + key + "&photoreference=" + photoref
+ "&maxheight=40";
}
protected String ms(long nano) {
BigDecimal dec = new BigDecimal(nano);
return dec.divide(new BigDecimal(1000000L)).setScale(1, RoundingMode.UP).toString();
}
protected int width(long nano) {
int width = (int) ((nano + 999999L) / 5000000L);
if (width == 0) {
width = 2;
}
return width;
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}