/* * Copyright (c) 2010-2015 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.evolveum.midpoint.web.page.admin.certification; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.model.api.AccessCertificationService; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.application.AuthorizationAction; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.data.BoxedTablePanel; import com.evolveum.midpoint.web.component.data.ObjectDataProvider; import com.evolveum.midpoint.web.component.data.Table; import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction; import com.evolveum.midpoint.web.component.data.column.DoubleButtonColumn; import com.evolveum.midpoint.web.component.data.column.EnumPropertyColumn; import com.evolveum.midpoint.web.component.data.column.InlineMenuHeaderColumn; import com.evolveum.midpoint.web.component.data.column.LinkColumn; import com.evolveum.midpoint.web.component.data.column.SingleButtonColumn; import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel; import com.evolveum.midpoint.web.component.dialog.Popupable; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.util.Selectable; import com.evolveum.midpoint.web.page.admin.certification.dto.CertCampaignListItemDto; import com.evolveum.midpoint.web.page.admin.certification.dto.CertCampaignListItemDtoProvider; import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction; import com.evolveum.midpoint.web.session.UserProfileStorage; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignStateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationDefinitionType; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author mederly */ @PageDescriptor(url = "/admin/certification/campaigns", encoder = OnePageParameterEncoder.class, action = { @AuthorizationAction(actionUri = PageAdminCertification.AUTH_CERTIFICATION_ALL, label = PageAdminCertification.AUTH_CERTIFICATION_ALL_LABEL, description = PageAdminCertification.AUTH_CERTIFICATION_ALL_DESCRIPTION), @AuthorizationAction(actionUri = PageAdminCertification.AUTH_CERTIFICATION_CAMPAIGNS, label = PageAdminCertification.AUTH_CERTIFICATION_CAMPAIGNS_LABEL, description = PageAdminCertification.AUTH_CERTIFICATION_CAMPAIGNS_DESCRIPTION) }) public class PageCertCampaigns extends PageAdminCertification { private static final Trace LOGGER = TraceManager.getTrace(PageCertCampaigns.class); private static final String DOT_CLASS = "PageCertCampaigns" + "."; private static final String OPERATION_DELETE_CAMPAIGNS = DOT_CLASS + "deleteCampaigns"; private static final String OPERATION_ADVANCE_LIFECYCLE = DOT_CLASS + "advanceLifecycle"; private static final String OPERATION_OPEN_NEXT_STAGE = DOT_CLASS + "openNextStage"; private static final String OPERATION_CLOSE_STAGE = DOT_CLASS + "closeStage"; private static final String OPERATION_CLOSE_CAMPAIGN = DOT_CLASS + "closeCampaign"; private static final String OPERATION_START_CAMPAIGN = DOT_CLASS + "startCampaign"; private static final String OPERATION_START_REMEDIATION = DOT_CLASS + "startRemediation"; private static final String ID_MAIN_FORM = "mainForm"; private static final String ID_CAMPAIGNS_TABLE = "campaignsTable"; public static final String OP_START_CAMPAIGN = "PageCertCampaigns.button.startCampaign"; public static final String OP_CLOSE_CAMPAIGN = "PageCertCampaigns.button.closeCampaign"; public static final String OP_CLOSE_STAGE = "PageCertCampaigns.button.closeStage"; public static final String OP_OPEN_NEXT_STAGE = "PageCertCampaigns.button.openNextStage"; public static final String OP_START_REMEDIATION = "PageCertCampaigns.button.startRemediation"; // campaign on which close-stage/close-campaign/delete has to be executed // (if chosen directly from row menu) private CertCampaignListItemDto relevantCampaign; private String definitionOid; public PageCertCampaigns(PageParameters parameters) { definitionOid = getPageParameters().get(OnePageParameterEncoder.PARAMETER).toString(); initLayout(); } // region Data management private CertCampaignListItemDtoProvider createProvider() { CertCampaignListItemDtoProvider provider = new CertCampaignListItemDtoProvider(this) { @Override public CertCampaignListItemDto createDataObjectWrapper( PrismObject<AccessCertificationCampaignType> obj) { CertCampaignListItemDto dto = super.createDataObjectWrapper(obj); createInlineMenuForItem(dto); return dto; } }; provider.setQuery(createQuery()); provider.setOptions(null); return provider; } private ObjectQuery createQuery() { // TODO filtering based on e.g. campaign state/stage (not started, // active, finished) if (definitionOid == null) { return new ObjectQuery(); } else { return QueryBuilder.queryFor(AccessCertificationCampaignType.class, getPrismContext()) .item(AccessCertificationCampaignType.F_DEFINITION_REF).ref(definitionOid) .build(); } } // endregion // region Layout @Override protected IModel<String> createPageTitleModel() { return new AbstractReadOnlyModel<String>() { @Override public String getObject() { if (definitionOid == null) { return createStringResource("PageCertCampaigns.title", "").getString(); } Task task = createSimpleTask("dummy"); PrismObject<AccessCertificationDefinitionType> definitionPrismObject = WebModelServiceUtils .loadObject(AccessCertificationDefinitionType.class, definitionOid, PageCertCampaigns.this, task, task.getResult()); String name = definitionPrismObject == null ? "" : WebComponentUtil.getName(definitionPrismObject); return createStringResource("PageCertCampaigns.title", name).getString(); } }; } private void initLayout() { Form mainForm = new Form(ID_MAIN_FORM); add(mainForm); CertCampaignListItemDtoProvider provider = createProvider(); int itemsPerPage = (int) getItemsPerPage(UserProfileStorage.TableId.PAGE_CERT_CAMPAIGNS_PANEL); BoxedTablePanel<CertCampaignListItemDto> table = new BoxedTablePanel<>(ID_CAMPAIGNS_TABLE, provider, initColumns(), UserProfileStorage.TableId.PAGE_CERT_CAMPAIGNS_PANEL, itemsPerPage); table.setShowPaging(true); table.setOutputMarkupId(true); table.setItemsPerPage(itemsPerPage); mainForm.add(table); } private IModel<String> createCloseStageConfirmString() { return new AbstractReadOnlyModel<String>() { @Override public String getObject() { return createStringResource("PageCertCampaigns.message.closeStageConfirmSingle", relevantCampaign.getName()).getString(); } }; } private IModel<String> createCloseCampaignConfirmString() { return new AbstractReadOnlyModel<String>() { @Override public String getObject() { return createStringResource("PageCertCampaigns.message.closeCampaignConfirmSingle", relevantCampaign.getName()).getString(); } }; } private IModel<String> createCloseSelectedCampaignsConfirmString() { return new AbstractReadOnlyModel<String>() { @Override public String getObject() { final List<Selectable> selectedData = WebComponentUtil.getSelectedData(getCampaignsTable()); if (selectedData.size() > 1) { return createStringResource("PageCertCampaigns.message.closeCampaignConfirmMultiple", selectedData.size()).getString(); } else if (selectedData.size() == 1) { return createStringResource("PageCertCampaigns.message.closeCampaignConfirmSingle", ((CertCampaignListItemDto) selectedData.get(0)).getName()).getString(); } else { return "EMPTY"; } } }; } private IModel<String> createDeleteCampaignConfirmString() { return new AbstractReadOnlyModel<String>() { @Override public String getObject() { return createStringResource("PageCertCampaigns.message.deleteCampaignConfirmSingle", relevantCampaign.getName()).getString(); } }; } private IModel<String> createDeleteSelectedCampaignsConfirmString() { return new AbstractReadOnlyModel<String>() { @Override public String getObject() { final List<Selectable> selectedData = WebComponentUtil.getSelectedData(getCampaignsTable()); if (selectedData.size() > 1) { return createStringResource("PageCertCampaigns.message.deleteCampaignConfirmMultiple", selectedData.size()).getString(); } else if (selectedData.size() == 1) { return createStringResource("PageCertCampaigns.message.deleteCampaignConfirmSingle", ((CertCampaignListItemDto) selectedData.get(0)).getName()).getString(); } else { return "EMPTY"; } } }; } private Table getTable() { return (Table) get(createComponentPath(ID_MAIN_FORM, ID_CAMPAIGNS_TABLE)); } private List<IColumn<CertCampaignListItemDto, String>> initColumns() { List<IColumn<CertCampaignListItemDto, String>> columns = new ArrayList<>(); IColumn column; column = new CheckBoxHeaderColumn<>(); columns.add(column); column = new LinkColumn<CertCampaignListItemDto>(createStringResource("PageCertCampaigns.table.name"), AccessCertificationCampaignType.F_NAME.getLocalPart(), CertCampaignListItemDto.F_NAME) { @Override public void onClick(AjaxRequestTarget target, IModel<CertCampaignListItemDto> rowModel) { campaignDetailsPerformed(target, rowModel.getObject().getOid()); } }; columns.add(column); column = new PropertyColumn(createStringResource("PageCertCampaigns.table.description"), CertCampaignListItemDto.F_DESCRIPTION); columns.add(column); column = new EnumPropertyColumn(createStringResource("PageCertCampaigns.table.state"), CertCampaignListItemDto.F_STATE) { @Override protected String translate(Enum en) { return createStringResourceStatic(getPage(), en).getString(); } }; columns.add(column); column = new PropertyColumn(createStringResource("PageCertCampaigns.table.stage"), CertCampaignListItemDto.F_CURRENT_STAGE_NUMBER); columns.add(column); column = new PropertyColumn(createStringResource("PageCertCampaigns.table.escalationLevel"), CertCampaignListItemDto.F_ESCALATION_LEVEL_NUMBER); columns.add(column); column = new PropertyColumn(createStringResource("PageCertCampaigns.table.stages"), CertCampaignListItemDto.F_NUMBER_OF_STAGES); columns.add(column); column = new PropertyColumn(createStringResource("PageCertCampaigns.table.deadline"), CertCampaignListItemDto.F_DEADLINE_AS_STRING); columns.add(column); column = new SingleButtonColumn<CertCampaignListItemDto>(new Model(), null) { @Override public boolean isButtonEnabled(IModel<CertCampaignListItemDto> model) { final AccessCertificationCampaignType campaign = model.getObject().getCampaign(); String button = determineAction(campaign); return button != null; } @Override public boolean isButtonVisible(IModel<CertCampaignListItemDto> model) { final AccessCertificationCampaignType campaign = model.getObject().getCampaign(); return campaign.getState() != AccessCertificationCampaignStateType.IN_REMEDIATION && campaign.getState() != AccessCertificationCampaignStateType.CLOSED; } @Override public String getCaption() { AccessCertificationCampaignType campaign = getRowModel().getObject().getCampaign(); String button = determineAction(campaign); if (button != null) { return PageCertCampaigns.this.createStringResource(button).getString(); } else { return ""; } } @Override public String getButtonCssColorClass() { return DoubleButtonColumn.BUTTON_COLOR_CLASS.PRIMARY.toString(); } @Override public String getButtonCssSizeClass() { return DoubleButtonColumn.BUTTON_SIZE_CLASS.SMALL.toString(); } @Override public void clickPerformed(AjaxRequestTarget target, IModel<CertCampaignListItemDto> model) { AccessCertificationCampaignType campaign = model.getObject().getCampaign(); String action = determineAction(campaign); switch (action) { case OP_START_CAMPAIGN: case OP_OPEN_NEXT_STAGE: openNextStagePerformed(target, campaign); break; case OP_CLOSE_STAGE: closeStageConfirmation(target, model.getObject()); break; case OP_START_REMEDIATION: startRemediationPerformed(target, campaign); break; case OP_CLOSE_CAMPAIGN: // not used default: throw new IllegalStateException("Unknown action: " + action); } } }; columns.add(column); columns.add(new InlineMenuHeaderColumn(createInlineMenu())); return columns; } private List<InlineMenuItem> createInlineMenu() { List<InlineMenuItem> items = new ArrayList<>(); items.add(new InlineMenuItem(createStringResource("PageCertCampaigns.menu.startSelected"), false, new HeaderMenuAction(this) { @Override public void onClick(AjaxRequestTarget target) { startSelectedCampaignsPerformed(target); } })); items.add(new InlineMenuItem(createStringResource("PageCertCampaigns.menu.closeSelected"), false, new HeaderMenuAction(this) { @Override public void onClick(AjaxRequestTarget target) { closeSelectedCampaignsConfirmation(target); } })); items.add(new InlineMenuItem(createStringResource("PageCertCampaigns.menu.deleteSelected"), false, new HeaderMenuAction(this) { @Override public void onClick(AjaxRequestTarget target) { deleteSelectedCampaignsConfirmation(target); } })); return items; } private void createInlineMenuForItem(final CertCampaignListItemDto dto) { dto.getMenuItems().clear(); dto.getMenuItems().add(new InlineMenuItem(createStringResource("PageCertCampaigns.menu.close"), new ColumnMenuAction<CertCampaignListItemDto>() { @Override public void onClick(AjaxRequestTarget target) { closeCampaignConfirmation(target, dto); } }) { @Override public IModel<Boolean> getEnabled() { return new AbstractReadOnlyModel<Boolean>() { @Override public Boolean getObject() { return dto.getState() != AccessCertificationCampaignStateType.CLOSED; } }; } }); dto.getMenuItems().add(new InlineMenuItem(createStringResource("PageCertCampaigns.menu.delete"), new ColumnMenuAction<CertCampaignListItemDto>() { @Override public void onClick(AjaxRequestTarget target) { deleteCampaignConfirmation(target, dto); } })); } private Table getCampaignsTable() { return (Table) get(createComponentPath(ID_MAIN_FORM, ID_CAMPAIGNS_TABLE)); } // endregion // region Actions // first, actions requiring confirmations are listed here (state = before // confirmation) // These actions are responsible for setting/unsetting relevantCampaign // field. // multi-item versions private void closeSelectedCampaignsConfirmation(AjaxRequestTarget target) { this.relevantCampaign = null; if (!ensureSomethingIsSelected(target)) { return; } showMainPopup(getCloseSelectedCampaignsConfirmationPanel(), target); } private Popupable getCloseSelectedCampaignsConfirmationPanel() { return new ConfirmationPanel(getMainPopupBodyId(), createCloseSelectedCampaignsConfirmString()) { private static final long serialVersionUID = 1L; @Override public void yesPerformed(AjaxRequestTarget target) { ModalWindow modalWindow = findParent(ModalWindow.class); if (modalWindow != null) { modalWindow.close(target); closeSelectedCampaignsConfirmedPerformed(target); } } @Override public StringResourceModel getTitle() { return createStringResource("PageCertCampaigns.dialog.title.confirmCloseCampaign"); } }; } private void deleteSelectedCampaignsConfirmation(AjaxRequestTarget target) { this.relevantCampaign = null; if (!ensureSomethingIsSelected(target)) { return; } showMainPopup(getDeleteSelectedCampaignsConfirmationPanel(), target); } private Popupable getDeleteSelectedCampaignsConfirmationPanel() { return new ConfirmationPanel(getMainPopupBodyId(), createDeleteSelectedCampaignsConfirmString()) { private static final long serialVersionUID = 1L; @Override public void yesPerformed(AjaxRequestTarget target) { ModalWindow modalWindow = findParent(ModalWindow.class); if (modalWindow != null) { modalWindow.close(target); deleteSelectedCampaignsConfirmedPerformed(target); } } @Override public StringResourceModel getTitle() { return createStringResource("PageCertCampaigns.dialog.title.confirmDeleteCampaign"); } }; } private boolean ensureSomethingIsSelected(AjaxRequestTarget target) { if (relevantCampaign != null) { return true; } else if (!WebComponentUtil.getSelectedData(getTable()).isEmpty()) { return true; } else { warn(getString("PageCertCampaigns.message.noCampaignsSelected")); target.add(getFeedbackPanel()); return false; } } // single-item versions private void closeStageConfirmation(AjaxRequestTarget target, CertCampaignListItemDto campaignDto) { this.relevantCampaign = campaignDto; showMainPopup(getCloseStageConfirmationPanel(), target); } private Popupable getCloseStageConfirmationPanel() { return new ConfirmationPanel(getMainPopupBodyId(), createCloseStageConfirmString()) { private static final long serialVersionUID = 1L; @Override public void yesPerformed(AjaxRequestTarget target) { ModalWindow modalWindow = findParent(ModalWindow.class); if (modalWindow != null) { modalWindow.close(target); closeStageConfirmedPerformed(target, relevantCampaign); } } @Override public StringResourceModel getTitle() { return createStringResource("PageCertCampaigns.dialog.title.confirmCloseStage"); } }; } private void closeCampaignConfirmation(AjaxRequestTarget target, CertCampaignListItemDto campaignDto) { this.relevantCampaign = campaignDto; showMainPopup(getCloseCampaignConfirmationPanel(), target); } private Popupable getCloseCampaignConfirmationPanel() { return new ConfirmationPanel(getMainPopupBodyId(), createCloseCampaignConfirmString()) { private static final long serialVersionUID = 1L; @Override public void yesPerformed(AjaxRequestTarget target) { ModalWindow modalWindow = findParent(ModalWindow.class); if (modalWindow != null) { modalWindow.close(target); closeCampaignConfirmedPerformed(target, relevantCampaign); } } @Override public StringResourceModel getTitle() { return createStringResource("PageCertCampaigns.dialog.title.confirmCloseCampaign"); } }; } private void deleteCampaignConfirmation(AjaxRequestTarget target, CertCampaignListItemDto campaignDto) { this.relevantCampaign = campaignDto; showMainPopup(getDeleteCampaignConfirmationPanel(), target); } private Popupable getDeleteCampaignConfirmationPanel() { return new ConfirmationPanel(getMainPopupBodyId(), createDeleteCampaignConfirmString()) { private static final long serialVersionUID = 1L; @Override public void yesPerformed(AjaxRequestTarget target) { ModalWindow modalWindow = findParent(ModalWindow.class); if (modalWindow != null) { modalWindow.close(target); deleteCampaignConfirmedPerformed(target); } } @Override public StringResourceModel getTitle() { return createStringResource("PageCertCampaigns.dialog.title.confirmDeleteCampaign"); } }; } // actions after confirmation (single and multiple versions mixed) private void deleteCampaignConfirmedPerformed(AjaxRequestTarget target) { deleteCampaignsPerformed(target, Arrays.asList(relevantCampaign)); } private void deleteSelectedCampaignsConfirmedPerformed(AjaxRequestTarget target) { deleteCampaignsPerformed(target, (List) WebComponentUtil.getSelectedData(getCampaignsTable())); } private void closeSelectedCampaignsConfirmedPerformed(AjaxRequestTarget target) { actOnCampaignsPerformed(target, OPERATION_CLOSE_CAMPAIGN, (List) WebComponentUtil.getSelectedData(getCampaignsTable())); } private void startSelectedCampaignsPerformed(AjaxRequestTarget target) { actOnCampaignsPerformed(target, OPERATION_START_CAMPAIGN, (List) WebComponentUtil.getSelectedData(getCampaignsTable())); } protected String determineAction(AccessCertificationCampaignType campaign) { int currentStage = campaign.getStageNumber(); int numOfStages = CertCampaignTypeUtil.getNumberOfStages(campaign); AccessCertificationCampaignStateType state = campaign.getState(); String button; switch (state) { case CREATED: button = numOfStages > 0 ? OP_START_CAMPAIGN : null; break; case IN_REVIEW_STAGE: button = OP_CLOSE_STAGE; break; case REVIEW_STAGE_DONE: button = currentStage < numOfStages ? OP_OPEN_NEXT_STAGE : OP_START_REMEDIATION; break; case IN_REMEDIATION: case CLOSED: default: button = null; break; } return button; } private void startRemediationPerformed(AjaxRequestTarget target, AccessCertificationCampaignType campaign) { LOGGER.debug("Start remediation performed for {}", campaign.asPrismObject()); OperationResult result = new OperationResult(OPERATION_START_REMEDIATION); AccessCertificationService acs = getCertificationService(); try { Task task = createSimpleTask(OPERATION_START_REMEDIATION); acs.startRemediation(campaign.getOid(), task, result); } catch (Exception ex) { result.recordFatalError(ex); } finally { result.computeStatusIfUnknown(); } showResult(result); target.add((Component) getCampaignsTable()); target.add(getFeedbackPanel()); } private void openNextStagePerformed(AjaxRequestTarget target, AccessCertificationCampaignType campaign) { LOGGER.debug("Start campaign / open next stage performed for {}", campaign.asPrismObject()); OperationResult result = new OperationResult(OPERATION_OPEN_NEXT_STAGE); AccessCertificationService acs = getCertificationService(); try { Task task = createSimpleTask(OPERATION_OPEN_NEXT_STAGE); int currentStage = campaign.getStageNumber(); acs.openNextStage(campaign.getOid(), currentStage + 1, task, result); } catch (Exception ex) { result.recordFatalError(ex); } finally { result.computeStatusIfUnknown(); } showResult(result); target.add((Component) getCampaignsTable()); target.add(getFeedbackPanel()); } private void closeCampaignConfirmedPerformed(AjaxRequestTarget target, CertCampaignListItemDto campaignDto) { AccessCertificationCampaignType campaign = campaignDto.getCampaign(); LOGGER.debug("Close certification campaign performed for {}", campaign.asPrismObject()); OperationResult result = new OperationResult(OPERATION_CLOSE_CAMPAIGN); try { AccessCertificationService acs = getCertificationService(); Task task = createSimpleTask(OPERATION_CLOSE_CAMPAIGN); acs.closeCampaign(campaign.getOid(), task, result); } catch (Exception ex) { result.recordFatalError(ex); } finally { result.computeStatusIfUnknown(); } showResult(result); target.add((Component) getCampaignsTable()); target.add(getFeedbackPanel()); } private void closeStageConfirmedPerformed(AjaxRequestTarget target, CertCampaignListItemDto campaignDto) { AccessCertificationCampaignType campaign = campaignDto.getCampaign(); LOGGER.debug("Close certification stage performed for {}", campaign.asPrismObject()); OperationResult result = new OperationResult(OPERATION_CLOSE_STAGE); try { AccessCertificationService acs = getCertificationService(); Task task = createSimpleTask(OPERATION_CLOSE_STAGE); acs.closeCurrentStage(campaign.getOid(), campaign.getStageNumber(), task, result); } catch (Exception ex) { result.recordFatalError(ex); } finally { result.computeStatusIfUnknown(); } showResult(result); target.add((Component) getCampaignsTable()); target.add(getFeedbackPanel()); } private void campaignDetailsPerformed(AjaxRequestTarget target, String oid) { PageParameters parameters = new PageParameters(); parameters.add(OnePageParameterEncoder.PARAMETER, oid); navigateToNext(PageCertCampaign.class, parameters); } private void deleteCampaignsPerformed(AjaxRequestTarget target, List<CertCampaignListItemDto> itemsToDelete) { if (itemsToDelete.isEmpty()) { warn(getString("PageCertCampaigns.message.noCampaignsSelected")); target.add(getFeedbackPanel()); return; } OperationResult result = new OperationResult(OPERATION_DELETE_CAMPAIGNS); for (CertCampaignListItemDto itemToDelete : itemsToDelete) { try { Task task = createSimpleTask(OPERATION_DELETE_CAMPAIGNS); ObjectDelta<AccessCertificationCampaignType> delta = ObjectDelta.createDeleteDelta( AccessCertificationCampaignType.class, itemToDelete.getOid(), getPrismContext()); getModelService().executeChanges(WebComponentUtil.createDeltaCollection(delta), null, task, result); } catch (Exception ex) { result.recordPartialError("Couldn't delete campaign.", ex); LoggingUtils.logUnexpectedException(LOGGER, "Couldn't delete campaign", ex); } } result.recomputeStatus(); if (result.isSuccess()) { result.recordStatus(OperationResultStatus.SUCCESS, "The campaign(s) have been successfully deleted."); } Table campaignsTable = getCampaignsTable(); ObjectDataProvider provider = (ObjectDataProvider) campaignsTable.getDataTable().getDataProvider(); provider.clearCache(); showResult(result); target.add(getFeedbackPanel(), (Component) campaignsTable); } private void actOnCampaignsPerformed(AjaxRequestTarget target, String operationName, List<CertCampaignListItemDto> items) { int processed = 0; AccessCertificationService acs = getCertificationService(); OperationResult result = new OperationResult(operationName); for (CertCampaignListItemDto item : items) { try { AccessCertificationCampaignType campaign = item.getCampaign(); Task task = createSimpleTask(operationName); switch (operationName) { case OPERATION_START_CAMPAIGN: if (campaign.getState() == AccessCertificationCampaignStateType.CREATED) { acs.openNextStage(campaign.getOid(), 1, task, result); processed++; } break; case OPERATION_CLOSE_CAMPAIGN: if (campaign.getState() != AccessCertificationCampaignStateType.CLOSED) { acs.closeCampaign(campaign.getOid(), task, result); processed++; } break; default: throw new IllegalStateException("Unknown action: " + operationName); } } catch (Exception ex) { result.recordPartialError("Couldn't process campaign.", ex); LoggingUtils.logUnexpectedException(LOGGER, "Couldn't process campaign", ex); } } if (processed == 0) { warn(getString("PageCertCampaigns.message.noCampaignsSelected")); target.add(getFeedbackPanel()); return; } result.recomputeStatus(); if (result.isSuccess()) { result.recordStatus(OperationResultStatus.SUCCESS, processed + " campaign(s) have been successfully processed."); } showResult(result); target.add(getFeedbackPanel(), (Component) getCampaignsTable()); } // endregion }