/*
* 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;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.ShortBlob;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.logging.Logger;
/**
* Hold log information for each run of the Updater and save this to the datastore.
*
*/
public class UpdateRunLogger {
private static final String UPDATERUN_ENTITY_KIND = "UpdateRun";
private final Logger logger = Logger.getLogger(UpdateRunLogger.class.getName());
private DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
private long lastStart;
private HashMap<String, Long> timers;
public UpdateRunLogger() {
timers = new HashMap<String, Long>();
}
public void startTimer() {
this.lastStart = System.currentTimeMillis();
}
public void stopTimer(String description) {
timers.put((timers.size()+1)+"_"+description, System.currentTimeMillis() - lastStart);
}
public Entity getLastRun() {
Query query = new Query(UPDATERUN_ENTITY_KIND).addSort("date", Query.SortDirection.DESCENDING);
List<Entity> result = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(1));
if (result == null || result.isEmpty()) {
return null;
}
return result.get(0);
}
public List<Entity> getMostRecentRuns(int number) {
Query query = new Query(UPDATERUN_ENTITY_KIND).addSort("date", Query.SortDirection.DESCENDING);
return datastore.prepare(query).asList(FetchOptions.Builder.withLimit(number));
}
public void logNoopRun() {
logger.fine("Run APIUpdater. No updates required.");
}
public void logUpdateRun(int majorVersion, int minorVersion, String filename, byte[] hash,
JsonObject data, boolean forced) {
Entity updateRun = new Entity(UPDATERUN_ENTITY_KIND);
updateRun.setProperty("date", new Date());
updateRun.setProperty("hash", new ShortBlob(hash));
updateRun.setProperty("forced", forced);
updateRun.setProperty("majorVersion", majorVersion);
updateRun.setProperty("minorVersion", minorVersion);
for (Entry<String, Long> performanceItem: timers.entrySet()) {
updateRun.setProperty("time_"+performanceItem.getKey(), performanceItem.getValue());
}
updateRun.setProperty("filename", filename);
StringBuilder sb = new StringBuilder();
for (Entry<String, JsonElement> el: data.entrySet()) {
if (el.getValue().isJsonArray()) {
sb.append(el.getKey()).append("=").append(el.getValue().getAsJsonArray().size()).append(" ");
}
}
if (sb.length()>0) {
// remove trailing space
sb.deleteCharAt(sb.length()-1);
}
updateRun.setProperty("summary", sb.toString());
datastore.put(updateRun);
timers.clear();
}
}