package fr.openwide.core.showcase.web.application.task.page; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.Session; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; 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 fr.openwide.core.jpa.more.business.task.model.QueuedTaskHolder; import fr.openwide.core.jpa.more.business.task.model.QueuedTaskHolderBinding; import fr.openwide.core.jpa.more.business.task.service.IQueuedTaskHolderManager; import fr.openwide.core.jpa.more.business.task.service.IQueuedTaskHolderService; import fr.openwide.core.showcase.core.business.task.model.FailedTask; import fr.openwide.core.showcase.core.business.task.model.FailedWithBusinessExceptionTask; import fr.openwide.core.showcase.core.business.task.model.ShowcaseTaskQueueId; import fr.openwide.core.showcase.core.business.task.model.SuccessTask; import fr.openwide.core.showcase.core.business.task.model.SuccessWithAlertTask; import fr.openwide.core.showcase.core.business.task.model.SuccessWithErrorTask; import fr.openwide.core.showcase.web.application.task.component.ShowcaseTaskQueueIdDropDownChoice; import fr.openwide.core.showcase.web.application.task.component.TaskPortfolioPanel; import fr.openwide.core.showcase.web.application.task.component.TaskSearchPanel; import fr.openwide.core.showcase.web.application.task.model.TaskDataProvider; import fr.openwide.core.showcase.web.application.util.property.ShowcaseWebappPropertyIds; import fr.openwide.core.showcase.web.application.util.template.MainTemplate; import fr.openwide.core.wicket.behavior.ClassAttributeAppender; import fr.openwide.core.wicket.more.condition.Condition; 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.markup.html.basic.PlaceholderContainer; import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils; import fr.openwide.core.wicket.more.markup.html.form.LabelPlaceholderBehavior; import fr.openwide.core.wicket.more.model.ApplicationPropertyModel; import fr.openwide.core.wicket.more.model.BindingModel; public class TaskMainPage extends MainTemplate { private static final long serialVersionUID = 4305540423473999086L; private static final Logger LOGGER = LoggerFactory.getLogger(TaskMainPage.class); public static final IPageLinkDescriptor linkDescriptor() { return LinkDescriptorBuilder.start() .page(TaskMainPage.class); } @SpringBean private IQueuedTaskHolderManager queuedTaskHolderManager; @SpringBean private IQueuedTaskHolderService queuedTaskHolderService; public TaskMainPage(PageParameters parameters) { super(parameters); final IModel<ShowcaseTaskQueueId> queueIdModel = Model.of(); Form<?> form = new Form<Void>("taskForm"); add(form); form.add( new ShowcaseTaskQueueIdDropDownChoice("queueId", queueIdModel) .setLabel(new ResourceModel("tasks.queue")) .add(new LabelPlaceholderBehavior()) ); form.add(new AjaxSubmitLink("createSuccessTask") { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { try { queuedTaskHolderManager.submit(new SuccessTask(queueIdModel.getObject())); Session.get().success(getString("tasks.createTask.add.success")); target.add(getPage()); } catch (Exception e) { LOGGER.error("Unexpected error while adding a task", e); Session.get().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } }); form.add(new AjaxSubmitLink("createSuccessWithAlertTask") { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { try { queuedTaskHolderManager.submit(new SuccessWithAlertTask(queueIdModel.getObject())); Session.get().success(getString("tasks.createTask.add.success")); target.add(getPage()); } catch (Exception e) { LOGGER.error("Unexpected error while adding a task", e); Session.get().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } }); form.add(new AjaxSubmitLink("createSuccessWithErrorTask") { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { try { queuedTaskHolderManager.submit(new SuccessWithErrorTask(queueIdModel.getObject())); Session.get().success(getString("tasks.createTask.add.success")); target.add(getPage()); } catch (Exception e) { LOGGER.error("Unexpected error while adding a task", e); Session.get().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } }); form.add(new AjaxSubmitLink("createFailedTask") { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { try { queuedTaskHolderManager.submit(new FailedTask(queueIdModel.getObject())); Session.get().success(getString("tasks.createTask.add.success")); target.add(getPage()); } catch (Exception e) { LOGGER.error("Unexpected error while adding a task", e); Session.get().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } }); form.add(new AjaxSubmitLink("createFailedWithBusinessExceptionTask") { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { try { queuedTaskHolderManager.submit(new FailedWithBusinessExceptionTask(queueIdModel.getObject())); Session.get().success(getString("tasks.createTask.add.success")); target.add(getPage()); } catch (Exception e) { LOGGER.error("Unexpected error while adding a task", e); Session.get().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } }); form.add(new AjaxSubmitLink("createStopQueueTask") { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { try { queuedTaskHolderManager.submit(new SuccessTask(queueIdModel.getObject())); queuedTaskHolderManager.stop(); Session.get().success(getString("tasks.createTask.add.success")); target.add(getPage()); } catch (Exception e) { LOGGER.error("Unexpected error while adding a task", e); Session.get().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } }); AjaxLink<Void> startManager = new AjaxLink<Void>("start") { private static final long serialVersionUID = 1L; @Override protected void onInitialize() { super.onInitialize(); add(new ClassAttributeAppender("disabled") { private static final long serialVersionUID = 1L; @Override public boolean isEnabled(Component component) { return queuedTaskHolderManager.isActive(); } }); } @Override public void onClick(AjaxRequestTarget target) { try { if (queuedTaskHolderManager.isAvailableForAction()) { queuedTaskHolderManager.start(); getSession().success(getString("tasks.manager.start.success")); } else { getSession().error(getString("tasks.manager.unavailable")); } FeedbackUtils.refreshFeedback(target, getPage()); target.add(getPage()); } catch (Exception e) { LOGGER.error("Unexpected error while trying to stop the queue.", e); Session.get().error(getString("common.error.unexpectedr")); } FeedbackUtils.refreshFeedback(target, getPage()); } }; add(startManager); AjaxLink<Void> stopManager = new AjaxLink<Void>("stop") { private static final long serialVersionUID = 1L; @Override protected void onInitialize() { super.onInitialize(); add(new ClassAttributeAppender("disabled") { private static final long serialVersionUID = 1L; @Override public boolean isEnabled(Component component) { return !queuedTaskHolderManager.isActive(); } }); } @Override public void onClick(AjaxRequestTarget target) { try { if (queuedTaskHolderManager.isAvailableForAction()) { queuedTaskHolderManager.stop(); getSession().success(getString("tasks.manager.stop.success")); } else { getSession().error(getString("tasks.manager.unavailable")); } FeedbackUtils.refreshFeedback(target, getPage()); target.add(getPage()); } catch (Exception e) { LOGGER.error("Unexpected error while trying to stop the queue.", e); Session.get().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } }; add(stopManager); IModel<List<QueuedTaskHolder>> queuedTaskHoldersListModel = new LoadableDetachableModel<List<QueuedTaskHolder>>() { private static final long serialVersionUID = 1L; @Override protected List<QueuedTaskHolder> load() { return queuedTaskHolderService.list(); } }; add(new ListView<QueuedTaskHolder>("queuedTaskHolders", queuedTaskHoldersListModel) { private static final long serialVersionUID = 1L; QueuedTaskHolderBinding queuedTaskHolderBinding = new QueuedTaskHolderBinding(); @Override protected void populateItem(ListItem<QueuedTaskHolder> item) { item.add(new Label("id", BindingModel.of(item.getModel(), queuedTaskHolderBinding.id()))); item.add(new Label("name", BindingModel.of(item.getModel(), queuedTaskHolderBinding.name()))); item.add(new Label("status", BindingModel.of(item.getModel(), queuedTaskHolderBinding.status()))); } }); add(new PlaceholderContainer("placeholder").condition(Condition.collectionModelNotEmpty(queuedTaskHoldersListModel))); // Search & porfolio TaskDataProvider dataProvider = new TaskDataProvider(); TaskPortfolioPanel portfolio = new TaskPortfolioPanel("portfolio", dataProvider, ApplicationPropertyModel.of(ShowcaseWebappPropertyIds.PORTFOLIO_ITEMS_PER_PAGE).getObject()); add( new TaskSearchPanel("search", portfolio.getPageable(), dataProvider), portfolio ); } @Override protected Class<? extends WebPage> getFirstMenuPage() { return TaskMainPage.class; } @Override protected Class<? extends WebPage> getSecondMenuPage() { return null; } }