/* * Copyright 2014 Google Inc. All rights reserved. * * 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.samples.apps.iosched.server.schedule.server.servlet; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.ShortBlob; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.google.samples.apps.iosched.server.schedule.server.UpdateRunLogger; import com.google.samples.apps.iosched.server.schedule.server.cloudstorage.CloudFileManager; import java.io.IOException; import java.text.DateFormat; import java.util.Date; import java.util.List; import java.util.Map.Entry; import java.util.TreeMap; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * A basic servlet that serves log from previous Updater runs as a JSON object. * */ public class LogDataServlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("application/json"); UpdateRunLogger logger = new UpdateRunLogger(); JsonObject response = new JsonObject(); int limitElements = 10; if (req.getParameter("limit")!=null) { limitElements = Integer.parseInt(req.getParameter("limit")); } List<Entity> lastRunsEntities = logger.getMostRecentRuns(limitElements); JsonArray lastRuns = new JsonArray(); for (Entity run: lastRunsEntities) { JsonObject obj= new JsonObject(); JsonObject timings = new JsonObject(); TreeMap<String, Object> sortedMap = new TreeMap<String, Object>(run.getProperties()); for (Entry<String, Object> property: sortedMap.entrySet()) { Object value = property.getValue(); String key = property.getKey(); if (key.startsWith("time_")) { timings.add(key.substring("time_".length()), new JsonPrimitive((Number) value)); } else { JsonPrimitive converted = null; if (value instanceof ShortBlob) { converted = new JsonPrimitive(bytesToHex(((ShortBlob) value).getBytes())); } else if (value instanceof String) { converted = new JsonPrimitive((String) value); } else if (value instanceof Number) { converted = new JsonPrimitive((Number) value); } else if (value instanceof Boolean) { converted = new JsonPrimitive((Boolean) value); } else if (value instanceof Character) { converted = new JsonPrimitive((Character) value); } else if (value instanceof Date) { converted = new JsonPrimitive(DateFormat.getDateTimeInstance().format((Date) value)); } if (converted != null) { obj.add(key, converted); } } } obj.add("timings", timings); lastRuns.add(obj); } response.add("lastruns", lastRuns); CloudFileManager cloudManager = new CloudFileManager(); response.add("bucket", new JsonPrimitive(cloudManager.getBucketName())); response.add("productionManifest", new JsonPrimitive(cloudManager.getProductionManifestURL())); response.add("stagingManifest", new JsonPrimitive(cloudManager.getStagingManifestURL())); new GsonBuilder() .setPrettyPrinting() .disableHtmlEscaping() .create().toJson(response, resp.getWriter()); } final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); public static String bytesToHex(byte[] bytes) { char[] hexChars = new char[bytes.length * 2]; for ( int j = 0; j < bytes.length; j++ ) { int v = bytes[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } }