package fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.itemit; import java.io.IOException; import java.io.StringWriter; import java.util.List; import java.util.Locale; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.behavior.AbstractAjaxBehavior; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.handler.TextRequestHandler; import org.apache.wicket.util.string.Strings; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.CollectionType; import com.google.common.collect.Lists; import fr.openwide.core.jpa.util.HibernateUtils; public abstract class AjaxItemItBehavior<I, J> extends AbstractAjaxBehavior { private static final long serialVersionUID = -7329322381118427479L; private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); public abstract List<I> getValues(String term); public abstract J newAutocompleteJson(Integer index, I item, Locale locale); public abstract Class<?> getJsonType(); public AjaxItemItBehavior() { } @Override public void onRequest() { String term = this.getComponent().getRequest().getQueryParameters().getParameterValue("term").toString(); if (!Strings.isEmpty(term)) { StringWriter sw = new StringWriter(); try { J value = null; Integer index = 0; List<J> toSerializeObjects = Lists.newArrayList(); for (I item : getValues(term)) { item = HibernateUtils.unwrap(item); index++; value = newAutocompleteJson(index, item, getComponent().getLocale()); toSerializeObjects.add(value); } // il est important d'utiliser un typeReference sinon les paramètres de sérialisation // polymorphiques de J ne seront pas appliqués. CollectionType collectionType = OBJECT_MAPPER.getTypeFactory() .constructCollectionType(List.class, getJsonType()); OBJECT_MAPPER.writerFor(collectionType).writeValue(sw, toSerializeObjects); } catch (IOException e) { throw new WicketRuntimeException(e); } RequestCycle.get().scheduleRequestHandlerAfterCurrent( new TextRequestHandler("application/json", "utf-8", sw.toString())); } } }