package org.jboss.capedwarf.tasks; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Map; import com.google.appengine.api.taskqueue.RetryOptions; import com.google.appengine.api.taskqueue.TaskOptions; import org.jboss.capedwarf.shared.reflection.ReflectionUtils; import org.jboss.capedwarf.shared.reflection.TargetInvocation; /** * @author <a href="mailto:mluksa@redhat.com">Marko Luksa</a> */ public class TaskOptionsHelper { private static final TargetInvocation<TaskOptions.Method> getMethod = ReflectionUtils.cacheInvocation(TaskOptions.class, "getMethod"); private static final TargetInvocation<String> getTaskName = ReflectionUtils.cacheInvocation(TaskOptions.class, "getTaskName"); private static final TargetInvocation<Long> getEtaMillis = ReflectionUtils.cacheInvocation(TaskOptions.class, "getEtaMillis"); private static final TargetInvocation<Long> getCountdownMillis = ReflectionUtils.cacheInvocation(TaskOptions.class, "getCountdownMillis"); private static final TargetInvocation<RetryOptions> getRetryOptions = ReflectionUtils.cacheInvocation(TaskOptions.class, "getRetryOptions"); private static final TargetInvocation<byte[]> getPayload = ReflectionUtils.cacheInvocation(TaskOptions.class, "getPayload"); private static final TargetInvocation<List<Object>> getParams = ReflectionUtils.cacheInvocation(TaskOptions.class, "getParams"); private static final TargetInvocation<Map<String, List<String>>> getHeaders = ReflectionUtils.cacheInvocation(TaskOptions.class, "getHeaders"); private static final TargetInvocation<Integer> getTaskRetryLimit = ReflectionUtils.cacheInvocation(RetryOptions.class, "getTaskRetryLimit"); private static final TargetInvocation<Boolean> supportsBody = ReflectionUtils.cacheInvocation(TaskOptions.Method.class, "supportsBody"); private TaskOptions taskOptions; public TaskOptionsHelper(TaskOptions taskOptions) { this.taskOptions = taskOptions; } public RetryOptions getRetryOptions() { return invoke(taskOptions, getRetryOptions); } public Integer getTaskRetryLimit() { RetryOptions retryOptions = getRetryOptions(); if (retryOptions == null) { return null; } return invoke(retryOptions, getTaskRetryLimit); } public Long getEtaMillis() { return invoke(taskOptions, getEtaMillis); } public Long getCountdownMillis() { return invoke(taskOptions, getCountdownMillis); } public String getTaskName() { return invoke(taskOptions, getTaskName); } public TaskOptions.Method getMethod() { return invoke(taskOptions, getMethod); } public byte[] getPayload() { return invoke(taskOptions, getPayload); } public List<Object> getParams() { return invoke(taskOptions, getParams); } public Map<String, List<String>> getHeaders() { return invoke(taskOptions, getHeaders); } private <T> T invoke(Object target, TargetInvocation<T> targetInvocation) { try { return targetInvocation.invoke(target); } catch (Exception e) { throw new RuntimeException(e); } } public String getUrl() { return taskOptions.getUrl(); } public String getTag() throws UnsupportedEncodingException { return taskOptions.getTag(); } public byte[] getTagAsBytes() { return taskOptions.getTagAsBytes(); } public TaskOptions getTaskOptions() { return taskOptions; } public boolean isPayloadAllowed() { return invoke(getMethod(), supportsBody); } public Long getCalculatedEtaMillis() { if (getEtaMillis() == null) { if (getCountdownMillis() == null) { return null; } else { return System.currentTimeMillis() + getCountdownMillis(); } } else { return getEtaMillis(); } } }