package fr.openwide.core.wicket.more.console.maintenance.task.model; import java.io.IOException; import org.apache.wicket.injection.Injector; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; import fr.openwide.core.jpa.more.business.task.model.BatchReportBean; import fr.openwide.core.jpa.more.business.task.model.QueuedTaskHolder; import fr.openwide.core.jpa.more.config.spring.AbstractTaskManagementConfig; public class BatchReportBeanModel<B extends BatchReportBean> extends LoadableDetachableModel<B> { private static final long serialVersionUID = 1226667856014694255L; private static final Logger LOGGER = LoggerFactory.getLogger(BatchReportBeanModel.class); public static BatchReportBeanModel<BatchReportBean> fromString(IModel<String> reportModel) { return new BatchReportBeanModel<BatchReportBean>(BatchReportBean.class, reportModel); } public static BatchReportBeanModel<BatchReportBean> fromTask(IModel<QueuedTaskHolder> queuedTaskHolderModel) { return new TaskBatchReportBeanModel<BatchReportBean>(BatchReportBean.class, queuedTaskHolderModel); } @SpringBean(name = AbstractTaskManagementConfig.OBJECT_MAPPER_BEAN_NAME) private ObjectMapper queuedTaskHolderObjectMapper; private final Class<B> clazz; private final IModel<String> reportModel; public BatchReportBeanModel(Class<B> clazz, IModel<String> reportModel) { super(); this.clazz = clazz; this.reportModel = reportModel; Injector.get().inject(this); } @Override protected void onDetach() { super.onDetach(); reportModel.detach(); } @SuppressWarnings("unchecked") @Override protected B load() { String report = reportModel.getObject(); if (StringUtils.hasText(report)) { try { BatchReportBean reportBean = queuedTaskHolderObjectMapper.readValue(report, BatchReportBean.class); if (reportBean != null && clazz.isAssignableFrom(reportBean.getClass())) { return (B) reportBean; } } catch (IOException e) { LOGGER.error("Error while reading serialized BatchReportBean.", e); } } return null; } }