package fr.openwide.core.basicapp.web.application.history.renderer; import java.util.Locale; import java.util.Map; import org.apache.wicket.model.IModel; import com.google.common.base.Function; import com.google.common.base.Optional; import fr.openwide.core.basicapp.core.business.history.model.HistoryDifference; import fr.openwide.core.basicapp.core.util.binding.Bindings; import fr.openwide.core.commons.util.fieldpath.FieldPath; import fr.openwide.core.jpa.more.business.history.model.embeddable.HistoryValue; import fr.openwide.core.wicket.more.rendering.Renderer; import fr.openwide.core.wicket.more.util.model.Models; import fr.openwide.core.wicket.more.util.model.Models.MapModelBuilder; public final class DefaultHistoryDifferenceValueRenderer extends AbstractHistoryRenderer<HistoryDifference> { private static final long serialVersionUID = 1L; private static final Renderer<HistoryDifference> BEFORE = new DefaultHistoryDifferenceValueRenderer( Bindings.historyDifference().before()); private static final Renderer<HistoryDifference> AFTER = new DefaultHistoryDifferenceValueRenderer( Bindings.historyDifference().after()); private static final String DEFAULT_KEY = "history.difference.common.default.value"; public static Renderer<HistoryDifference> before() { return BEFORE; } public static Renderer<HistoryDifference> after() { return AFTER; } private final Renderer<HistoryDifference> valueRenderer; private DefaultHistoryDifferenceValueRenderer(Function<HistoryDifference, HistoryValue> valueFunction) { this.valueRenderer = HistoryValueRenderer.get().onResultOf(valueFunction).orBlank(); } @Override public String render(HistoryDifference difference, Locale locale) { FieldPath path = difference.getAbsolutePath(); String pathResourceKeyPart = getFieldPathKeyPart(path); IModel<?> dataModel = Models.dataMap() .put("current", valueRenderer.asModel(Models.transientModel(difference))) .put("children", createChildrenMap(difference)) .build(); String entityResourceKeyPart = getEntityResourceKeyPart(difference); Optional<String> result = getStringOptional( JOINER.join(HISTORY_DIFFERENCE_ROOT, entityResourceKeyPart, pathResourceKeyPart, ".value"), locale, dataModel ); if (!result.isPresent()) { result = getStringOptional(JOINER.join(HISTORY_DIFFERENCE_ROOT, ".common", pathResourceKeyPart, ".value"), locale, dataModel); } if (result.isPresent()) { return result.get(); } else { return getString(DEFAULT_KEY, locale, dataModel); } } private IModel<Map<String, Object>> createChildrenMap(HistoryDifference difference) { MapModelBuilder<String, Object> builder = Models.dataMap(); for (HistoryDifference child : difference.getDifferences()) { FieldPath path = child.getRelativePath(); if (!path.isItem()) { builder = builder.put(path.toString().replace(".", ""), valueRenderer.asModel(Models.transientModel(child))); } } return builder.build(); } }