package de.flower.common.ui.ajax;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.cycle.RequestCycle;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* See http://www.wicket-praxis.de/blog/2010/03/07/wicket-heatmap-ajax-mit-parametern/.
*/
public abstract class AbstractParameterizedDefaultAjaxBehavior extends AbstractDefaultAjaxBehavior {
@Override
protected void respond(AjaxRequestTarget target) {
Request request = RequestCycle.get().getRequest();
Map<String, Object> map = new HashMap<String, Object>();
Parameter<?>[] parameter = getParameter();
for (Parameter<?> p : parameter) {
String svalue = request.getRequestParameters().getParameterValue(p.getName()).toOptionalString();
if (svalue != null) {
Object value = getComponent().getConverter(p.getType()).convertToObject(svalue, getComponent().getLocale());
map.put(p.getName(), value);
}
}
respond(target, new ParameterMap(map));
}
@Override
public CharSequence getCallbackUrl() {
StringBuilder sb = new StringBuilder();
sb.append(super.getCallbackUrl());
Parameter<?>[] parameter = getParameter();
for (Parameter<?> p : parameter) {
sb.append("&").append(p.getName()).append("='+").append(p.getJavascript()).append("+'");
}
return sb.toString();
}
public static class Parameter<T> implements Serializable{
String _name;
Class<T> _type;
String _javascript;
protected Parameter(String name, Class<T> type, String javascript) {
_name = name;
_type = type;
_javascript = javascript;
}
protected String getName() {
return _name;
}
protected Class<T> getType() {
return _type;
}
protected String getJavascript() {
return _javascript;
}
public static <T> Parameter<T> of(String name, Class<T> type, String javascript) {
return new Parameter<T>(name, type, javascript);
}
}
protected static class ParameterMap {
Map<String, Object> _map;
protected ParameterMap(Map<String, Object> map) {
_map = map;
}
public <T> T getValue(Parameter<T> parameter) {
return (T) _map.get(parameter.getName());
}
}
protected abstract void respond(AjaxRequestTarget target, ParameterMap parameterMap);
protected abstract Parameter<?>[] getParameter();
}