package fr.openwide.core.wicket.more.console.maintenance.task.page; import org.apache.wicket.Component; import org.apache.wicket.RestartResponseException; import org.apache.wicket.Session; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.spring.injection.annot.SpringBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; import com.fasterxml.jackson.databind.SerializationFeature; import fr.openwide.core.jpa.more.business.task.model.AbstractTask; import fr.openwide.core.jpa.more.business.task.model.QueuedTaskHolder; import fr.openwide.core.jpa.more.business.task.service.IQueuedTaskHolderManager; import fr.openwide.core.jpa.more.business.task.service.IQueuedTaskHolderService; import fr.openwide.core.jpa.more.business.task.util.TaskResult; import fr.openwide.core.jpa.more.business.task.util.TaskStatus; import fr.openwide.core.jpa.more.util.binding.CoreJpaMoreBindings; import fr.openwide.core.wicket.markup.html.basic.CoreLabel; import fr.openwide.core.wicket.markup.html.basic.EnumCoreLabel; import fr.openwide.core.wicket.more.condition.Condition; import fr.openwide.core.wicket.more.console.maintenance.task.component.TaskExecutionResultPanel; import fr.openwide.core.wicket.more.console.maintenance.task.component.TaskResultPanel; import fr.openwide.core.wicket.more.console.maintenance.task.component.TaskStatusPanel; import fr.openwide.core.wicket.more.console.maintenance.template.ConsoleMaintenanceTemplate; import fr.openwide.core.wicket.more.console.template.ConsoleTemplate; import fr.openwide.core.wicket.more.link.descriptor.IPageLinkDescriptor; import fr.openwide.core.wicket.more.link.descriptor.builder.LinkDescriptorBuilder; import fr.openwide.core.wicket.more.link.descriptor.parameter.CommonParameters; import fr.openwide.core.wicket.more.markup.html.action.AbstractAjaxAction; import fr.openwide.core.wicket.more.markup.html.basic.DateLabel; import fr.openwide.core.wicket.more.markup.html.basic.PlaceholderContainer; import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.confirm.component.AjaxConfirmLink; import fr.openwide.core.wicket.more.model.BindingModel; import fr.openwide.core.wicket.more.model.GenericEntityModel; import fr.openwide.core.wicket.more.util.DatePattern; public class ConsoleMaintenanceTaskDescriptionPage extends ConsoleMaintenanceTemplate { private static final long serialVersionUID = 7622945973237519021L; private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleMaintenanceTaskDescriptionPage.class); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().enableDefaultTyping(DefaultTyping.NON_FINAL) .enable(SerializationFeature.INDENT_OUTPUT); public static final IPageLinkDescriptor linkDescriptor(IModel<QueuedTaskHolder> queuedTaskHolderModel) { return LinkDescriptorBuilder.start() .map(CommonParameters.ID, queuedTaskHolderModel, QueuedTaskHolder.class).mandatory() .page(ConsoleMaintenanceTaskDescriptionPage.class); } @SpringBean private IQueuedTaskHolderManager queuedTaskHolderManager; @SpringBean private IQueuedTaskHolderService queuedTaskHolderService; public ConsoleMaintenanceTaskDescriptionPage(PageParameters parameters) { super(parameters); setOutputMarkupId(true); final IModel<QueuedTaskHolder> queuedTaskHolderModel = new GenericEntityModel<Long, QueuedTaskHolder>(null); linkDescriptor(queuedTaskHolderModel).extractSafely(parameters, ConsoleMaintenanceTaskListPage.linkDescriptor(), getString("common.notExists")); addHeadPageTitleKey("console.maintenance.tasks"); WebMarkupContainer statusContainer = new WebMarkupContainer("statusContainer") { private static final long serialVersionUID = 1L; @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); QueuedTaskHolder queuedTaskHolder = queuedTaskHolderModel.getObject(); String classAttribute = null; switch (queuedTaskHolder.getStatus()) { case COMPLETED: TaskResult result = queuedTaskHolder.getResult(); if (result == null) { classAttribute = "alert-info"; break; } switch (result) { case SUCCESS: classAttribute = "alert-success"; break; case WARN: classAttribute = "alert-warning"; break; case ERROR: case FATAL: classAttribute = "alert-danger"; break; } break; case TO_RUN: classAttribute = "alert-info"; break; case RUNNING: classAttribute = "alert-warning"; break; case FAILED: case CANCELLED: case INTERRUPTED: default: classAttribute = "alert-danger"; break; } tag.append("class", classAttribute, " "); } }; add(statusContainer); statusContainer.add(new EnumCoreLabel<TaskStatus>("status", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().status())) { private static final long serialVersionUID = 1L; @Override protected String resourceKey(TaskStatus value) { return "console.maintenance.task.description.mainInformation." + super.resourceKey(value); } }); statusContainer.add( AjaxConfirmLink.<QueuedTaskHolder>build() .title(new ResourceModel("console.maintenance.task.description.mainInformation.reload.title")) .content(new ResourceModel("console.maintenance.task.description.mainInformation.reload.confirmation")) .keepMarkup() .yesNo() .onClick(new AbstractAjaxAction() { private static final long serialVersionUID = 1L; @Override public void execute(AjaxRequestTarget target) { try { queuedTaskHolderManager.reload(queuedTaskHolderModel.getObject().getId()); Session.get().success(getString("console.maintenance.task.description.mainInformation.reload.success")); throw linkDescriptor(queuedTaskHolderModel).newRestartResponseException(); } catch (RestartResponseException e) { throw e; } catch (Exception e) { LOGGER.error("Unexpected error while reloading task", e); getSession().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } }) .create("reload", queuedTaskHolderModel) .add( new Condition() { private static final long serialVersionUID = 1L; @Override public boolean applies() { return queuedTaskHolderService.isReloadable(queuedTaskHolderModel.getObject()); } }.thenShowInternal() ) ); statusContainer.add( AjaxConfirmLink.<QueuedTaskHolder>build() .title(new ResourceModel("console.maintenance.task.description.mainInformation.cancel.title")) .content(new ResourceModel("console.maintenance.task.description.mainInformation.cancel.confirmation")) .keepMarkup() .yesNo() .onClick(new AbstractAjaxAction() { private static final long serialVersionUID = 1L; @Override public void execute(AjaxRequestTarget target) { try { queuedTaskHolderManager.cancel(queuedTaskHolderModel.getObject().getId()); Session.get().success(getString("console.maintenance.task.description.mainInformation.cancel.success")); throw linkDescriptor(queuedTaskHolderModel).newRestartResponseException(); } catch (RestartResponseException e) { throw e; } catch (Exception e) { LOGGER.error("Unexpected error while cancelling task", e); getSession().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } }) .create("cancel", queuedTaskHolderModel) .add( new Condition() { private static final long serialVersionUID = 1L; @Override public boolean applies() { return queuedTaskHolderService.isCancellable(queuedTaskHolderModel.getObject()); } } .thenShowInternal() ) ); // Main information detail Component queue = new CoreLabel("queue", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().queueId())).hideIfEmpty(); add( new Label("name", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().name())), queue, new PlaceholderContainer("defaultQueue").condition(Condition.componentVisible(queue)), new DateLabel("creationDate", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().creationDate()), DatePattern.SHORT_DATETIME), new DateLabel("startDate", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().startDate()), DatePattern.SHORT_DATETIME), new DateLabel("endDate", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().endDate()), DatePattern.SHORT_DATETIME), new EnumCoreLabel<TaskStatus>("status", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().status())), new TaskStatusPanel("statusIcon", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().status())), new EnumCoreLabel<TaskResult>("result", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().result())), new TaskResultPanel("resultIcon", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().result())) ); // Stack trace add(new CoreLabel("stackTrace", BindingModel.of(queuedTaskHolderModel, CoreJpaMoreBindings.queuedTaskHolder().stackTrace())) .hideIfEmpty()); // Serialized task add(new Label("serializedTask", new LoadableDetachableModel<String>() { private static final long serialVersionUID = 1L; @Override protected String load() { try { AbstractTask runnableTask = OBJECT_MAPPER.readValue(queuedTaskHolderModel.getObject().getSerializedTask(), AbstractTask.class); return OBJECT_MAPPER.writeValueAsString(runnableTask); } catch (Exception e) { LOGGER.error("Error parsing the task: " + queuedTaskHolderModel.getObject()); return "Error parsing the task"; } } })); // Execution result add(new TaskExecutionResultPanel("executionResult", queuedTaskHolderModel)); } @Override protected Class<? extends ConsoleTemplate> getMenuItemPageClass() { return ConsoleMaintenanceTaskListPage.class; } }