package nl.topicus.onderwijs.dashboard.web.components; import java.io.IOException; import org.apache.wicket.Application; import org.apache.wicket.Component; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.model.IModel; import org.apache.wicket.request.IRequestCycle; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.http.WebResponse; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JsonResourceBehavior<T> extends AbstractDefaultAjaxBehavior { private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory .getLogger(JsonResourceBehavior.class); private IModel<T> model; public JsonResourceBehavior(IModel<T> model) { this.model = model; } @Override protected void respond(AjaxRequestTarget target) { RequestCycle cycle = RequestCycle.get(); cycle.scheduleRequestHandlerAfterCurrent(new IRequestHandler() { @Override public void detach(IRequestCycle requestCycle) { } @Override public void respond(IRequestCycle requestCycle) { WebResponse r = (WebResponse) requestCycle.getResponse(); // Determine encoding final String encoding = Application.get() .getRequestCycleSettings().getResponseRequestEncoding(); r.setContentType("application/json; charset=" + encoding); // Make sure it is not cached by a r.setHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); r.setHeader("Cache-Control", "no-cache, must-revalidate"); r.setHeader("Pragma", "no-cache"); ObjectMapper mapper = new ObjectMapper(); try { r.write(mapper.writeValueAsString(model.getObject())); } catch (JsonGenerationException e) { log.error("Unable to serialize value", e); } catch (JsonMappingException e) { log.error("Unable to serialize value", e); } catch (IOException e) { log.error("Unable to serialize value", e); } } }); } @Override public void detach(Component component) { super.detach(component); model.detach(); } }