Java tutorial
/* * Copyright (c) 2010-2013 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.component.dialog; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.NotFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; 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.component.AjaxButton; import com.evolveum.midpoint.web.component.util.LoadableModel; import com.evolveum.midpoint.web.page.PageBase; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; import java.util.ArrayList; import java.util.Collection; /** * @author shood * */ public class DeleteAllDialog extends ModalWindow { private static final Trace LOGGER = TraceManager.getTrace(DeleteAllDialog.class); private static final String DOT_CLASS = DeleteAllDialog.class.getName() + "."; private static final String OPERATION_SEARCH_ITERATIVE_TASK = DOT_CLASS + "searchIterativeTask"; private static final String OPERATION_COUNT_TASK = DOT_CLASS + "countObjectsTask"; private static final String ID_CHB_USERS = "checkboxUsers"; private static final String ID_CHB_ORG = "checkboxOrg"; private static final String ID_CHB_ACCOUNT_SHADOW = "checkboxAccountShadow"; private static final String ID_CHB_NON_ACCOUNT_SHADOW = "checkboxNonAccountShadow"; private static final String ID_TEXT_USERS = "confirmTextUsers"; private static final String ID_TEXT_ORGS = "confirmTextOrgUnits"; private static final String ID_TEXT_ACC_SHADOWS = "confirmTextAccountShadow"; private static final String ID_TEXT_NON_ACC_SHADOW = "confirmTextNonAccountShadows"; private static final String ID_YES = "yes"; private static final String ID_NO = "no"; private static final String ID_TOTAL = "totalCountLabel"; private IModel<DeleteAllDto> model = new Model(new DeleteAllDto()); public DeleteAllDialog(String id, IModel<String> title) { super(id); if (title != null) { setTitle(title); } setCssClassName(ModalWindow.CSS_CLASS_GRAY); setCookieName(ConfirmationDialog.class.getSimpleName() + ((int) (Math.random() * 100))); showUnloadConfirmation(false); setResizable(false); setInitialWidth(650); setInitialHeight(350); setWidthUnit("px"); setCloseButtonCallback(new ModalWindow.CloseButtonCallback() { @Override public boolean onCloseButtonClicked(AjaxRequestTarget target) { return true; } }); setWindowClosedCallback(new ModalWindow.WindowClosedCallback() { @Override public void onClose(AjaxRequestTarget target) { DeleteAllDialog.this.close(target); } }); WebMarkupContainer content = new WebMarkupContainer(getContentId()); setContent(content); initLayout(content); } public IModel<DeleteAllDto> getModel() { return model; } private void updateLabelModel(AjaxRequestTarget target, String labelID) { LoadableModel<String> model = (LoadableModel<String>) getLabel(labelID).getDefaultModel(); model.reset(); model = (LoadableModel<String>) getLabel(ID_TOTAL).getDefaultModel(); model.reset(); target.add(getLabel(labelID)); target.add(getLabel(ID_TOTAL)); } private void initLayout(WebMarkupContainer content) { CheckBox deleteUsersCheckbox = new CheckBox(ID_CHB_USERS, new PropertyModel<Boolean>(model, DeleteAllDto.F_USERS)); deleteUsersCheckbox.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { updateLabelModel(target, ID_TEXT_USERS); } }); content.add(deleteUsersCheckbox); CheckBox deleteOrgsCheckbox = new CheckBox(ID_CHB_ORG, new PropertyModel<Boolean>(model, DeleteAllDto.F_ORGS)); deleteOrgsCheckbox.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { updateLabelModel(target, ID_TEXT_ORGS); } }); content.add(deleteOrgsCheckbox); CheckBox deleteAccountShadowsCheckbox = new CheckBox(ID_CHB_ACCOUNT_SHADOW, new PropertyModel<Boolean>(model, DeleteAllDto.F_ACC_SHADOW)); deleteAccountShadowsCheckbox.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { updateLabelModel(target, ID_TEXT_ACC_SHADOWS); } }); content.add(deleteAccountShadowsCheckbox); CheckBox deleteNonAccountShadowsCheckbox = new CheckBox(ID_CHB_NON_ACCOUNT_SHADOW, new PropertyModel<Boolean>(model, DeleteAllDto.F_NON_ACC_SHADOW)); deleteNonAccountShadowsCheckbox.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { updateLabelModel(target, ID_TEXT_NON_ACC_SHADOW); } }); content.add(deleteNonAccountShadowsCheckbox); Label usersLabel = new Label(ID_TEXT_USERS, new LoadableModel<String>() { @Override protected String load() { return createDeleteUsersMessage(); } }); usersLabel.setOutputMarkupId(true); content.add(usersLabel); Label orgsLabel = new Label(ID_TEXT_ORGS, new LoadableModel<String>() { @Override protected String load() { return createDeleteOrgUnitsMessage(); } }); orgsLabel.setOutputMarkupId(true); content.add(orgsLabel); Label accShadowsLabel = new Label(ID_TEXT_ACC_SHADOWS, new LoadableModel<String>() { @Override protected String load() { return createDeleteAccountShadowsMessage(); } }); accShadowsLabel.setOutputMarkupId(true); content.add(accShadowsLabel); Label nonAccShadowsLabel = new Label(ID_TEXT_NON_ACC_SHADOW, new LoadableModel<String>() { @Override protected String load() { return createDeleteNonAccountShadowsMessage(); } }); nonAccShadowsLabel.setOutputMarkupId(true); content.add(nonAccShadowsLabel); Label countLabel = new Label(ID_TOTAL, new LoadableModel<String>() { @Override protected String load() { return createTotalMessage(); } }); countLabel.setOutputMarkupId(true); content.add(countLabel); AjaxButton yesButton = new AjaxButton(ID_YES, new StringResourceModel("deleteAllDialog.yes", this, null)) { @Override public void onClick(AjaxRequestTarget target) { yesPerformed(target); } }; content.add(yesButton); AjaxButton noButton = new AjaxButton(ID_NO, new StringResourceModel("deleteAllDialog.no", this, null)) { @Override public void onClick(AjaxRequestTarget target) { noPerformed(target); } }; content.add(noButton); } private Label getLabel(String ID) { return (Label) get(getContentId() + ":" + ID); } public StringResourceModel createStringResource(String resourceKey, Object... objects) { return new StringResourceModel(resourceKey, this, new Model<String>(), resourceKey, objects); } private String createTotalMessage() { DeleteAllDto dto = model.getObject(); dto.setObjectsToDelete(0); if (dto.getDeleteUsers()) { dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getUserCount()); } if (dto.getDeleteOrgs()) { dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getOrgUnitCount()); } if (dto.getDeleteAccountShadow()) { dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getAccountShadowCount()); } if (dto.getDeleteNonAccountShadow()) { dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getNonAccountShadowCount()); } return createStringResource("deleteAllDialog.label.totalToDelete", dto.getObjectsToDelete()).getString(); } private String createDeleteUsersMessage() { if (!model.getObject().getDeleteUsers()) { return createStringResource("deleteAllDialog.label.usersDelete", 0).getString(); } DeleteAllDto dto = model.getObject(); Task task = getPagebase().createSimpleTask(OPERATION_COUNT_TASK); OperationResult result = new OperationResult(OPERATION_COUNT_TASK); Collection<SelectorOptions<GetOperationOptions>> options = new ArrayList<>(); GetOperationOptions opt = GetOperationOptions.createRaw(); options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); try { dto.setUserCount( getPagebase().getModelService().countObjects(UserType.class, null, options, task, result)); //We need to substract 1, because we are not deleting user 'Administrator' dto.setUserCount(dto.getUserCount() - 1); dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getUserCount()); } catch (Exception ex) { result.computeStatus(getString("deleteAllDialog.message.countSearchProblem")); LoggingUtils.logException(LOGGER, getString("deleteAllDialog.message.countSearchProblem"), ex); } return createStringResource("deleteAllDialog.label.usersDelete", dto.getUserCount()).getString(); } private String createDeleteOrgUnitsMessage() { if (!model.getObject().getDeleteOrgs()) { return createStringResource("deleteAllDialog.label.orgUnitsDelete", 0).getString(); } DeleteAllDto dto = model.getObject(); Task task = getPagebase().createSimpleTask(OPERATION_COUNT_TASK); OperationResult result = new OperationResult(OPERATION_COUNT_TASK); Collection<SelectorOptions<GetOperationOptions>> options = new ArrayList<>(); GetOperationOptions opt = GetOperationOptions.createRaw(); options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); try { dto.setOrgUnitCount( getPagebase().getModelService().countObjects(OrgType.class, null, options, task, result)); dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getOrgUnitCount()); } catch (Exception ex) { result.computeStatus(getString("deleteAllDialog.message.countSearchProblem")); LoggingUtils.logException(LOGGER, getString("deleteAllDialog.message.countSearchProblem"), ex); } return createStringResource("deleteAllDialog.label.orgUnitsDelete", dto.getOrgUnitCount()).getString(); } private void countShadows(boolean isAccountShadow) { DeleteAllDto dto = model.getObject(); Task task = getPagebase().createSimpleTask(OPERATION_SEARCH_ITERATIVE_TASK); OperationResult result = new OperationResult(OPERATION_SEARCH_ITERATIVE_TASK); Collection<SelectorOptions<GetOperationOptions>> options = new ArrayList<>(); GetOperationOptions opt = GetOperationOptions.createRaw(); options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); try { ObjectFilter filter = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPagebase().getPrismContext(), null, ShadowKindType.ACCOUNT); if (isAccountShadow) { ObjectQuery query = ObjectQuery.createObjectQuery(filter); dto.setAccountShadowCount(getPagebase().getModelService().countObjects(ShadowType.class, query, options, task, result)); dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getAccountShadowCount()); } else { ObjectQuery query = ObjectQuery.createObjectQuery(NotFilter.createNot(filter)); dto.setNonAccountShadowCount(getPagebase().getModelService().countObjects(ShadowType.class, query, options, task, result)); dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getNonAccountShadowCount()); } } catch (Exception ex) { result.computeStatus(getString("deleteAllDialog.message.countSearchProblem")); LoggingUtils.logException(LOGGER, getString("deleteAllDialog.message.countSearchProblem"), ex); } } private String createDeleteNonAccountShadowsMessage() { if (!model.getObject().getDeleteNonAccountShadow()) { return createStringResource("deleteAllDialog.label.nonAccountShadowsDelete", 0).getString(); } DeleteAllDto dto = model.getObject(); countShadows(false); return createStringResource("deleteAllDialog.label.nonAccountShadowsDelete", dto.getNonAccountShadowCount()) .getString(); } private String createDeleteAccountShadowsMessage() { if (!model.getObject().getDeleteAccountShadow()) { return createStringResource("deleteAllDialog.label.accountShadowsDelete", 0).getString(); } DeleteAllDto dto = model.getObject(); countShadows(true); return createStringResource("deleteAllDialog.label.accountShadowsDelete", dto.getAccountShadowCount()) .getString(); } public int getObjectsToDelete() { return model.getObject().getObjectsToDelete(); } private PageBase getPagebase() { return (PageBase) getPage(); } public void yesPerformed(AjaxRequestTarget target) { } public void noPerformed(AjaxRequestTarget target) { close(target); } }