@Override public String apply(List<Object> input) { Iterator<?> tri = input.iterator(); Object[] vv = new Object[args.length]; int i=0; for (Object arg : args) { if (arg instanceof TaskAdaptable || arg instanceof TaskFactory) vv[i] = tri.next(); else if (arg instanceof DeferredSupplier) vv[i] = ((DeferredSupplier<?>) arg).get(); else vv[i] = arg; i++; } return String.format(spec, vv); }}, taskArgs);
@Override @Nullable public String apply(@Nullable List<Object> input) { Object resolvedArg; if (arg instanceof TaskAdaptable || arg instanceof TaskFactory) resolvedArg = Iterables.getOnlyElement(input); else if (arg instanceof DeferredSupplier) resolvedArg = ((DeferredSupplier<?>) arg).get(); else resolvedArg = arg; if (resolvedArg == null) return null; String resolvedString = resolvedArg.toString(); return Urls.encode(resolvedString); } },
/** * Resolves the argument as follows: * * If the argument is a DeferredSupplier, we will block and wait for it to resolve. If the argument is TaskAdaptable or TaskFactory, * we will assume that the resolved task has been queued on the {@code taskArgsIterator}, otherwise the argument has already been resolved. * * @param type coerces the return value to the requested type */ private static <T> T resolveArgument(Object argument, Iterator<?> taskArgsIterator, Class<T> type) { Object resolvedArgument; if (argument instanceof TaskAdaptable) { resolvedArgument = taskArgsIterator.next(); } else if (argument instanceof DeferredSupplier) { resolvedArgument = ((DeferredSupplier<?>) argument).get(); } else { resolvedArgument = argument; } return TypeCoercions.coerce(resolvedArgument, type); }
@Override public Object call() throws Exception { try { Tasks.setBlockingDetails("Retrieving "+ds); return ds.get(); } finally { Tasks.resetBlockingDetails(); } } }; String description = getDescription();
try { Tasks.setBlockingDetails("Retrieving (non-task) "+ds); v = ((DeferredSupplier<?>) ds).get(); } finally { Tasks.resetBlockingDetails();