package be.selckin.swu.jquery; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.collect.Iterables; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.ResourceReference; import java.lang.reflect.Type; import java.util.Arrays; public class Javascripter { private static final Gson gson = new GsonBuilder().serializeNulls().registerTypeAdapter(ResourceReference.class, new ResourceReferenceSerializer()).create(); private static final Joiner JOINER = Joiner.on(", "); private static class ResourceReferenceSerializer implements JsonSerializer<ResourceReference> { @Override public JsonElement serialize(ResourceReference src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(RequestCycle.get().urlFor(src, new PageParameters()).toString()); } } private Javascripter() { // empty } public static void callFunction(IHeaderResponse response, String function, Object... args) { response.render(OnDomReadyHeaderItem.forScript(function + "(" + JOINER.join(Iterables.transform(Arrays.asList(args), new GsonFunction())) + ");")); } private static class GsonFunction implements Function<Object, String> { @Override public String apply(Object from) { if (from instanceof CharSequence) return gson.toJson(from.toString()); return gson.toJson(from); } } }