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);
}
}
}