package com.anjlab.ping.services;
import static com.google.appengine.api.taskqueue.TaskOptions.Builder.withUrl;
import java.security.Principal;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.apache.tapestry5.services.RequestGlobals;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.appengine.api.taskqueue.TransientFailureException;
import com.google.appengine.api.taskqueue.TaskOptions.Method;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
public class GAEHelper {
private static final Logger logger = LoggerFactory.getLogger(GAEHelper.class);
private RequestGlobals requestGlobals;
private UserService userService;
private Map<String, String> cachedLoginUrls;
private Map<String, String> cachedLogoutUrls;
public GAEHelper(RequestGlobals requestGlobals) {
this.requestGlobals = requestGlobals;
this.userService = UserServiceFactory.getUserService();
this.cachedLoginUrls = new HashMap<String, String>();
this.cachedLogoutUrls = new HashMap<String, String>();
}
public Principal getUserPrincipal() {
return requestGlobals.getHTTPServletRequest().getUserPrincipal();
}
public String createLoginURL() {
return createLoginURL(requestGlobals.getHTTPServletRequest().getRequestURI());
}
public String createLogoutURL() {
return createLogoutURL(requestGlobals.getHTTPServletRequest().getRequestURI());
}
public String createLogoutURL(String returnURL) {
if (!cachedLogoutUrls.containsKey(returnURL)) {
cachedLogoutUrls.put(returnURL, userService.createLogoutURL(returnURL));
}
return cachedLogoutUrls.get(returnURL);
}
public String createLoginURL(String returnURL) {
if (!cachedLoginUrls.containsKey(returnURL)) {
cachedLoginUrls.put(returnURL, userService.createLoginURL(returnURL));
}
return cachedLoginUrls.get(returnURL);
}
public static TaskOptions buildTaskUrl(String path) {
return withUrl(path.endsWith("/") ? path : path + "/").method(Method.GET);
}
public static void addTaskNonTransactional(Queue queue, TaskOptions options) {
addTaskNonTransactional(queue, Arrays.asList(options));
}
public static void addTaskNonTransactional(Queue queue, Iterable<TaskOptions> options) {
int retryCount = 0;
while (true) {
try {
queue.add(null, options);
break;
} catch (TransientFailureException e) {
retryCount++;
if (retryCount > 3) {
logger.error("Give up");
break;
}
logger.debug("Retry #{} after TransientFailureException: {}", retryCount, e);
}
}
}
}