diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDialog.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDialog.java index 3138348f16a..df85f12b4f9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDialog.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDialog.java @@ -15,9 +15,12 @@ */ package com.evolveum.midpoint.web.component.dialog; -import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.prism.PrismObject; 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.ResultHandler; import com.evolveum.midpoint.schema.SelectorOptions; @@ -39,8 +42,10 @@ 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 javax.xml.namespace.QName; import java.util.ArrayList; import java.util.Collection; @@ -68,29 +73,15 @@ public class DeleteAllDialog extends ModalWindow{ private static final String ID_YES = "yes"; private static final String ID_NO = "no"; private static final String ID_TOTAL = "totalCountLabel"; - private static final String EMPTY_LABEL = ""; - - private static final String ID_FOCUS_TYPE_ORG = "OrgType"; - private static final String ID_FOCUS_TYPE_ROLE = "RoleType"; - - private IModel messageUsers; - private IModel messageOrgUnits; - private IModel messageAccountShadows; - private IModel messageRoleShadows; - private IModel messageOrgShadows; - private IModel messageTotal; - protected IModel deleteUsers = Model.of(Boolean.FALSE); - protected IModel deleteOrgs = Model.of(Boolean.FALSE); - protected IModel deleteAccountShadow = Model.of(Boolean.FALSE); - protected IModel deleteRoleShadow = Model.of(Boolean.FALSE); - protected IModel deleteOrgShadow = Model.of(Boolean.FALSE); - - private int objectsToDelete = 0; - private int accountShadowTypeCount = 0; - private int orgUnitCount = 0; - private int userCount = 0; - private int orgShadowCount = 0; - private int roleShadowCount = 0; + + private IModel model = new Model(new DeleteAllDto()); + +// private int objectsToDelete = 0; +// private int accountShadowTypeCount = 0; +// private int orgUnitCount = 0; +// private int userCount = 0; +// private int orgShadowCount = 0; +// private int roleShadowCount = 0; public DeleteAllDialog(String id, IModel title){ super(id); @@ -99,7 +90,6 @@ public DeleteAllDialog(String id, IModel title){ setTitle(title); } - loadMessages(); setCssClassName(ModalWindow.CSS_CLASS_GRAY); setCookieName(ConfirmationDialog.class.getSimpleName() + ((int) (Math.random() * 100))); showUnloadConfirmation(false); @@ -130,139 +120,127 @@ public void onClose(AjaxRequestTarget target) { initLayout(content); } - private void loadMessages(){ - messageUsers = new LoadableModel() { - @Override - protected String load() { - return createDeleteUsersMessage(); - } - }; - - messageOrgUnits = new LoadableModel() { - @Override - protected String load() { - return createDeleteOrgUnitsMessage(); - } - }; - - messageAccountShadows = new LoadableModel() { - @Override - protected String load() { - return createDeleteAccountShadowsMessage(); - } - }; - - messageOrgShadows = new LoadableModel() { - @Override - protected String load() { - return createDeleteShadowsMessage(ID_FOCUS_TYPE_ORG); - } - }; + public IModel getModel(){ + return model; + } - messageRoleShadows = new LoadableModel() { - @Override - protected String load() { - return createDeleteShadowsMessage(ID_FOCUS_TYPE_ROLE); - } - }; + private void updateLabelModel(AjaxRequestTarget target, String labelID){ + LoadableModel model = (LoadableModel)getLabel(labelID).getDefaultModel(); + model.reset(); - messageTotal = new LoadableModel() { + model = (LoadableModel)getLabel(ID_TOTAL).getDefaultModel(); + model.reset(); - @Override - protected String load() { - return createTotalMessage(); - } - }; + target.add(getLabel(labelID)); + target.add(getLabel(ID_TOTAL)); } private void initLayout(WebMarkupContainer content){ - CheckBox deleteUsersCheckbox = new CheckBox(ID_CHB_USERS, deleteUsers); + CheckBox deleteUsersCheckbox = new CheckBox(ID_CHB_USERS, new PropertyModel(model, DeleteAllDto.F_USERS)); deleteUsersCheckbox.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { - messageUsers.setObject(createDeleteUsersMessage()); - messageTotal.setObject(createTotalMessage()); - target.add(getLabel(ID_TEXT_USERS)); - target.add(getLabel(ID_TOTAL)); + updateLabelModel(target, ID_TEXT_USERS); } }); content.add(deleteUsersCheckbox); - CheckBox deleteOrgsCheckbox = new CheckBox(ID_CHB_ORG, deleteOrgs); + CheckBox deleteOrgsCheckbox = new CheckBox(ID_CHB_ORG, new PropertyModel(model, DeleteAllDto.F_ORGS)); deleteOrgsCheckbox.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { - messageOrgUnits.setObject(createDeleteOrgUnitsMessage()); - messageTotal.setObject(createTotalMessage()); - target.add(getLabel(ID_TEXT_ORGS)); - target.add(getLabel(ID_TOTAL)); + updateLabelModel(target, ID_TEXT_ORGS); } }); content.add(deleteOrgsCheckbox); - CheckBox deleteAccountShadowsCheckbox = new CheckBox(ID_CHB_ACCOUNT_SHADOW, deleteAccountShadow); + CheckBox deleteAccountShadowsCheckbox = new CheckBox(ID_CHB_ACCOUNT_SHADOW, + new PropertyModel(model, DeleteAllDto.F_ACC_SHADOW)); deleteAccountShadowsCheckbox.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { - messageAccountShadows.setObject(createDeleteAccountShadowsMessage()); - messageTotal.setObject(createTotalMessage()); - target.add(getLabel(ID_TEXT_ACC_SHADOWS)); - target.add(getLabel(ID_TOTAL)); + updateLabelModel(target, ID_TEXT_ACC_SHADOWS); } }); content.add(deleteAccountShadowsCheckbox); - CheckBox deleteOrgShadowsCheckbox = new CheckBox(ID_CHB_ORG_SHADOW, deleteOrgShadow); + CheckBox deleteOrgShadowsCheckbox = new CheckBox(ID_CHB_ORG_SHADOW, + new PropertyModel(model, DeleteAllDto.F_ORG_SHADOW)); deleteOrgShadowsCheckbox.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { - messageOrgShadows.setObject(createDeleteShadowsMessage(ID_FOCUS_TYPE_ORG)); - messageTotal.setObject(createTotalMessage()); - target.add(getLabel(ID_TEXT_ORG_SHADOWS)); - target.add(getLabel(ID_TOTAL)); + updateLabelModel(target, ID_TEXT_ORG_SHADOWS); } }); content.add(deleteOrgShadowsCheckbox); - CheckBox deleteRoleShadowsCheckbox = new CheckBox(ID_CHB_ROLE_SHADOW, deleteRoleShadow); + CheckBox deleteRoleShadowsCheckbox = new CheckBox(ID_CHB_ROLE_SHADOW, + new PropertyModel(model, DeleteAllDto.F_ROLE_SHADOW)); deleteRoleShadowsCheckbox.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { - messageRoleShadows.setObject(createDeleteShadowsMessage(ID_FOCUS_TYPE_ROLE)); - messageTotal.setObject(createTotalMessage()); - target.add(getLabel(ID_TEXT_ROLE_SHADOWS)); - target.add(getLabel(ID_TOTAL)); + updateLabelModel(target, ID_TEXT_ROLE_SHADOWS); } }); content.add(deleteRoleShadowsCheckbox); - Label usersLabel = new Label(ID_TEXT_USERS, messageUsers); + Label usersLabel = new Label(ID_TEXT_USERS, new LoadableModel() { + @Override + protected String load() { + return createDeleteUsersMessage(); + } + }); usersLabel.setOutputMarkupId(true); content.add(usersLabel); - Label orgsLabel = new Label(ID_TEXT_ORGS, messageOrgUnits); + Label orgsLabel = new Label(ID_TEXT_ORGS, new LoadableModel() { + @Override + protected String load() { + return createDeleteOrgUnitsMessage(); + } + }); orgsLabel.setOutputMarkupId(true); content.add(orgsLabel); - Label accShadowsLabel = new Label(ID_TEXT_ACC_SHADOWS, messageAccountShadows); + Label accShadowsLabel = new Label(ID_TEXT_ACC_SHADOWS, new LoadableModel() { + @Override + protected String load() { + return createDeleteAccountShadowsMessage(); + } + }); accShadowsLabel.setOutputMarkupId(true); content.add(accShadowsLabel); - Label orgShadowsLabel = new Label(ID_TEXT_ORG_SHADOWS, messageOrgShadows); + Label orgShadowsLabel = new Label(ID_TEXT_ORG_SHADOWS, new LoadableModel() { + @Override + protected String load() { + return createDeleteShadowsMessage(OrgType.COMPLEX_TYPE); + } + }); orgShadowsLabel.setOutputMarkupId(true); content.add(orgShadowsLabel); - Label roleShadowsLabel = new Label(ID_TEXT_ROLE_SHADOWS, messageRoleShadows); + Label roleShadowsLabel = new Label(ID_TEXT_ROLE_SHADOWS, new LoadableModel() { + @Override + protected String load() { + return createDeleteShadowsMessage(RoleType.COMPLEX_TYPE); + } + }); roleShadowsLabel.setOutputMarkupId(true); content.add(roleShadowsLabel); - Label countLabel = new Label(ID_TOTAL, messageTotal); + Label countLabel = new Label(ID_TOTAL, new LoadableModel() { + @Override + protected String load() { + return createTotalMessage(); + } + }); countLabel.setOutputMarkupId(true); content.add(countLabel); @@ -296,131 +274,118 @@ public StringResourceModel createStringResource(String resourceKey, Object... ob } private String createTotalMessage(){ - objectsToDelete = 0; - if(deleteUsers.getObject()){ - objectsToDelete += userCount; + DeleteAllDto dto = model.getObject(); + dto.setObjectsToDelete(0); + + if(dto.getDeleteUsers()){ + dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getUserCount()); } - if(deleteOrgs.getObject()){ - objectsToDelete += orgUnitCount; + if(dto.getDeleteOrgs()){ + dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getOrgUnitCount()); } - if(deleteAccountShadow.getObject()){ - objectsToDelete += accountShadowTypeCount; + if(dto.getDeleteAccountShadow()){ + dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getAccountShadowTypeCount()); } - if(deleteOrgShadow.getObject()){ - objectsToDelete += orgShadowCount; + if(dto.getDeleteOrgShadow()){ + dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getOrgShadowCount()); } - if(deleteRoleShadow.getObject()){ - objectsToDelete += roleShadowCount; + if(dto.getDeleteRoleShadow()){ + dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getRoleShadowCount()); } - return createStringResource("pageDebugList.label.totalToDelete", objectsToDelete).getString(); + return createStringResource("deleteAllDialog.label.totalToDelete", dto.getObjectsToDelete()).getString(); } private String createDeleteUsersMessage(){ - if(!deleteUsers.getObject()){ - return createStringResource("pageDebugList.label.usersDelete", 0).getString(); + if(!model.getObject().getDeleteUsers()){ + return createStringResource("deleteAllDialog.label.usersDelete", 0).getString(); } - - userCount = 0; - - Task task = createSimpleTask(OPERATION_COUNT_TASK); + DeleteAllDto dto = model.getObject(); + Task task = getPagebase().createSimpleTask(OPERATION_COUNT_TASK); OperationResult result = new OperationResult(OPERATION_COUNT_TASK); - Collection> options = new ArrayList>(); + Collection> options = new ArrayList<>(); GetOperationOptions opt = GetOperationOptions.createRaw(); options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); try { - userCount = getModelService().countObjects(UserType.class, null, options, task, result); + dto.setUserCount(getPagebase().getModelService().countObjects(UserType.class, null, options, task, result)); //We need to substract 1, because we are not deleting user 'Administrator' - userCount--; - objectsToDelete += userCount; + dto.setUserCount(dto.getUserCount()-1); + dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getUserCount()); } catch (Exception ex) { - result.computeStatus(getString("pageDebugList.message.countSearchProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.countSearchProblem"), ex); + result.computeStatus(getString("deleteAllDialog.message.countSearchProblem")); + LoggingUtils.logException(LOGGER, getString("deleteAllDialog.message.countSearchProblem"), ex); } - return createStringResource("pageDebugList.label.usersDelete", userCount).getString(); + return createStringResource("deleteAllDialog.label.usersDelete", dto.getUserCount()).getString(); } private String createDeleteOrgUnitsMessage(){ - if(!deleteOrgs.getObject()){ - return createStringResource("pageDebugList.label.orgUnitsDelete", 0).getString(); + if(!model.getObject().getDeleteOrgs()){ + return createStringResource("deleteAllDialog.label.orgUnitsDelete", 0).getString(); } - orgUnitCount = 0; - - Task task = createSimpleTask(OPERATION_COUNT_TASK); + DeleteAllDto dto = model.getObject(); + Task task = getPagebase().createSimpleTask(OPERATION_COUNT_TASK); OperationResult result = new OperationResult(OPERATION_COUNT_TASK); - Collection> options = new ArrayList>(); + Collection> options = new ArrayList<>(); GetOperationOptions opt = GetOperationOptions.createRaw(); options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); try { - orgUnitCount = getModelService().countObjects(OrgType.class, null, options, task, result); + dto.setOrgUnitCount(getPagebase().getModelService().countObjects(OrgType.class, null, options, task, result)); - objectsToDelete += orgUnitCount; + dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getOrgUnitCount()); } catch (Exception ex) { - result.computeStatus(getString("pageDebugList.message.countSearchProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.countSearchProblem"), ex); + result.computeStatus(getString("deleteAllDialog.message.countSearchProblem")); + LoggingUtils.logException(LOGGER, getString("deleteAllDialog.message.countSearchProblem"), ex); } - return createStringResource("pageDebugList.label.orgUnitsDelete", orgUnitCount).getString(); + return createStringResource("deleteAllDialog.label.orgUnitsDelete", dto.getOrgUnitCount()).getString(); } private String createDeleteAccountShadowsMessage(){ - if(!deleteAccountShadow.getObject()){ - return createStringResource("pageDebugList.label.accountShadowsDelete", 0).getString(); + if(!model.getObject().getDeleteAccountShadow()){ + return createStringResource("deleteAllDialog.label.accountShadowsDelete", 0).getString(); } - accountShadowTypeCount = 0; - - Task task = createSimpleTask(OPERATION_SEARCH_ITERATIVE_TASK); + DeleteAllDto dto = model.getObject(); + Task task = getPagebase().createSimpleTask(OPERATION_SEARCH_ITERATIVE_TASK); OperationResult result = new OperationResult(OPERATION_SEARCH_ITERATIVE_TASK); - Collection> options = new ArrayList>(); + Collection> options = new ArrayList<>(); GetOperationOptions opt = GetOperationOptions.createRaw(); options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); - ResultHandler accountShadowHandler = new ResultHandler() { - @Override - public boolean handle(PrismObject object, OperationResult parentResult) { - ShadowType shadow = (ShadowType)object.asObjectable(); - if(ShadowKindType.ACCOUNT.equals(shadow.getKind())){ - accountShadowTypeCount++; - } - return true; - } - }; - try { - getModelService().searchObjectsIterative(ShadowType.class, null, accountShadowHandler, options, task, result); - objectsToDelete += accountShadowTypeCount; + ObjectFilter filter = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPagebase().getPrismContext(), null, ShadowKindType.ACCOUNT); + ObjectQuery query = ObjectQuery.createObjectQuery(filter); + dto.setAccountShadowTypeCount(getPagebase().getModelService().countObjects(ShadowType.class, query, options, task, result)); + dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getAccountShadowTypeCount()); } catch (Exception ex) { - result.computeStatus(getString("pageDebugList.message.countSearchProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.countSearchProblem"), ex); + result.computeStatus(getString("deleteAllDialog.message.countSearchProblem")); + LoggingUtils.logException(LOGGER, getString("deleteAllDialog.message.countSearchProblem"), ex); } - return createStringResource("pageDebugList.label.accountShadowsDelete", accountShadowTypeCount).getString(); + return createStringResource("deleteAllDialog.label.accountShadowsDelete", dto.getAccountShadowTypeCount()).getString(); } - private String createDeleteShadowsMessage(final String focus){ - if(ID_FOCUS_TYPE_ORG.equals(focus) && !deleteOrgShadow.getObject()){ - return createStringResource("pageDebugList.label.orgShadowsDelete", 0).getString(); - } else if(ID_FOCUS_TYPE_ROLE.equals(focus) && !deleteRoleShadow.getObject()){ - return createStringResource("pageDebugList.label.roleShadowsDelete", 0).getString(); + private String createDeleteShadowsMessage(final QName focus){ + if(OrgType.COMPLEX_TYPE.equals(focus) && !model.getObject().getDeleteOrgShadow()){ + return createStringResource("deleteAllDialog.label.orgShadowsDelete", 0).getString(); + } else if(RoleType.COMPLEX_TYPE.equals(focus) && !model.getObject().getDeleteRoleShadow()){ + return createStringResource("deleteAllDialog.label.roleShadowsDelete", 0).getString(); } - - orgShadowCount = 0; - roleShadowCount = 0; + DeleteAllDto dto = model.getObject(); int count = 0; - Task task = createSimpleTask(OPERATION_SEARCH_ITERATIVE_TASK); + Task task = getPagebase().createSimpleTask(OPERATION_SEARCH_ITERATIVE_TASK); final OperationResult result = new OperationResult(OPERATION_SEARCH_ITERATIVE_TASK); - Collection> options = new ArrayList>(); + Collection> options = new ArrayList<>(); GetOperationOptions opt = GetOperationOptions.createRaw(); options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); @@ -428,18 +393,22 @@ private String createDeleteShadowsMessage(final String focus){ @Override public boolean handle(PrismObject object, OperationResult parentResult) { ShadowType shadow = (ShadowType)object.asObjectable(); - if(!ShadowKindType.ACCOUNT.equals(shadow.getKind())){ - String oid = shadow.getResourceRef().getOid(); + String oid = shadow.getResourceRef().getOid(); + + if(model.getObject().getResourceFocusMap().containsKey(oid)){ + addShadowType(model.getObject().getResourceFocusMap().get(oid)); + return true; + } - PrismObject resource = WebModelUtils.loadObject(ResourceType.class, oid, result, (PageBase) getPage()); + PrismObject resource = WebModelUtils.loadObject(ResourceType.class, oid, result, getPagebase()); - if(resource != null && resource.asObjectable() != null){ - SynchronizationType sync = resource.asObjectable().getSynchronization(); + if(resource != null && resource.asObjectable() != null){ + SynchronizationType sync = resource.asObjectable().getSynchronization(); - for(ObjectSynchronizationType s: sync.getObjectSynchronization()){ - if(s.getFocusType() != null && focus.equals(s.getFocusType().getLocalPart())){ - addShadowType(focus); - } + for(ObjectSynchronizationType s: sync.getObjectSynchronization()){ + if(s.getFocusType() != null && focus.getLocalPart().equals(s.getFocusType().getLocalPart())){ + model.getObject().getResourceFocusMap().put(oid, s.getFocusType().getLocalPart()); + addShadowType(focus.getLocalPart()); } } } @@ -448,46 +417,45 @@ public boolean handle(PrismObject object, OperationResult parentResult) { }; try { - getModelService().searchObjectsIterative(ShadowType.class, null, orgShadowHandler, options, task, result); - if(ID_FOCUS_TYPE_ORG.equals(focus)){ - count = orgShadowCount; - } else if(ID_FOCUS_TYPE_ROLE.equals(focus)){ - count = roleShadowCount; + ObjectFilter filter = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPagebase().getPrismContext(), null, ShadowKindType.ACCOUNT); + ObjectQuery query = ObjectQuery.createObjectQuery(NotFilter.createNot(filter)); + getPagebase().getModelService().searchObjectsIterative(ShadowType.class, query, orgShadowHandler, options, task, result); + if(OrgType.COMPLEX_TYPE.equals(focus)){ + count = dto.getOrgShadowCount(); + } else if(RoleType.COMPLEX_TYPE.equals(focus)){ + count = dto.getRoleShadowCount(); } - objectsToDelete += count; + dto.setObjectsToDelete(dto.getObjectsToDelete() + count); } catch (Exception ex) { - result.computeStatus(getString("pageDebugList.message.countSearchProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.countSearchProblem"), ex); + result.computeStatus(getString("deleteAllDialog.message.countSearchProblem")); + LoggingUtils.logException(LOGGER, getString("deleteAllDialog.message.countSearchProblem"), ex); } - if(ID_FOCUS_TYPE_ORG.equals(focus)){ - return createStringResource("pageDebugList.label.orgShadowsDelete", count).getString(); - } else if(ID_FOCUS_TYPE_ROLE.equals(focus)){ - return createStringResource("pageDebugList.label.roleShadowsDelete", count).getString(); + if(OrgType.COMPLEX_TYPE.equals(focus)){ + return createStringResource("deleteAllDialog.label.orgShadowsDelete", count).getString(); + } else if(RoleType.COMPLEX_TYPE.equals(focus)){ + return createStringResource("deleteAllDialog.label.roleShadowsDelete", count).getString(); } else { - return EMPTY_LABEL; + return null; } } public int getObjectsToDelete(){ - return objectsToDelete; + return model.getObject().getObjectsToDelete(); } private void addShadowType(String focus){ - if(ID_FOCUS_TYPE_ORG.equals(focus)){ - orgShadowCount++; - } else if(ID_FOCUS_TYPE_ROLE.equals(focus)){ - roleShadowCount++; + DeleteAllDto dto = model.getObject(); + if(OrgType.COMPLEX_TYPE.getLocalPart().equals(focus)){ + dto.setOrgShadowCount(dto.getOrgShadowCount() + 1); + } else if(RoleType.COMPLEX_TYPE.getLocalPart().equals(focus)){ + dto.setOrgShadowCount(dto.getRoleShadowCount() + 1); } } - public Task createSimpleTask(String operation){ - return null; - } - - public ModelService getModelService(){ - return null; + private PageBase getPagebase(){ + return (PageBase) getPage(); } public void yesPerformed(AjaxRequestTarget target) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDialog.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDialog.properties index ec56d3c3ad8..888d11659bc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDialog.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDialog.properties @@ -22,3 +22,9 @@ deleteAllDialog.label.org=Org. Units deleteAllDialog.label.shadow.account=Account shadows deleteAllDialog.label.shadow.role=Role shadows deleteAllDialog.label.shadow.org=Org. unit shadows +deleteAllDialog.label.usersDelete=Users to delete: {0} (User 'Administrator' will not be deleted) +deleteAllDialog.label.orgUnitsDelete=Org. units to delete: {0} +deleteAllDialog.label.accountShadowsDelete=Account shadows to delete: {0} +deleteAllDialog.label.orgShadowsDelete=Org. unit shadows to delete: {0} +deleteAllDialog.label.roleShadowsDelete=Role shadows to delete: {0} +deleteAllDialog.label.totalToDelete=Total objects to delete: {0} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDto.java new file mode 100644 index 00000000000..f042e9e0b05 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllDto.java @@ -0,0 +1,143 @@ +/* + * 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 java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +/** + * @author shood + * */ +public class DeleteAllDto implements Serializable{ + + public static final String F_USERS = "deleteUsers"; + public static final String F_ORGS = "deleteOrgs"; + public static final String F_ACC_SHADOW = "deleteAccountShadow"; + public static final String F_ORG_SHADOW = "deleteOrgShadow"; + public static final String F_ROLE_SHADOW = "deleteRoleShadow"; + + private boolean deleteUsers = false; + private boolean deleteOrgs = false; + private boolean deleteAccountShadow = false; + private boolean deleteRoleShadow = false; + private boolean deleteOrgShadow = false; + + private int objectsToDelete = 0; + private int accountShadowTypeCount = 0; + private int orgUnitCount = 0; + private int userCount = 0; + private int orgShadowCount = 0; + private int roleShadowCount = 0; + + private Map resourceFocusMap = new HashMap<>(); + + public Map getResourceFocusMap() { + return resourceFocusMap; + } + + public void setResourceFocusMap(Map resourceFocusMap) { + this.resourceFocusMap = resourceFocusMap; + } + + public boolean getDeleteUsers() { + return deleteUsers; + } + + public void setDeleteUsers(boolean deleteUsers) { + this.deleteUsers = deleteUsers; + } + + public boolean getDeleteOrgs() { + return deleteOrgs; + } + + public void setDeleteOrgs(boolean deleteOrgs) { + this.deleteOrgs = deleteOrgs; + } + + public boolean getDeleteAccountShadow() { + return deleteAccountShadow; + } + + public void setDeleteAccountShadow(boolean deleteAccountShadow) { + this.deleteAccountShadow = deleteAccountShadow; + } + + public boolean getDeleteRoleShadow() { + return deleteRoleShadow; + } + + public void setDeleteRoleShadow(boolean deleteRoleShadow) { + this.deleteRoleShadow = deleteRoleShadow; + } + + public boolean getDeleteOrgShadow() { + return deleteOrgShadow; + } + + public void setDeleteOrgShadow(boolean deleteOrgShadow) { + this.deleteOrgShadow = deleteOrgShadow; + } + + public int getObjectsToDelete() { + return objectsToDelete; + } + + public void setObjectsToDelete(int objectsToDelete) { + this.objectsToDelete = objectsToDelete; + } + + public int getAccountShadowTypeCount() { + return accountShadowTypeCount; + } + + public void setAccountShadowTypeCount(int accountShadowTypeCount) { + this.accountShadowTypeCount = accountShadowTypeCount; + } + + public int getOrgUnitCount() { + return orgUnitCount; + } + + public void setOrgUnitCount(int orgUnitCount) { + this.orgUnitCount = orgUnitCount; + } + + public int getUserCount() { + return userCount; + } + + public void setUserCount(int userCount) { + this.userCount = userCount; + } + + public int getOrgShadowCount() { + return orgShadowCount; + } + + public void setOrgShadowCount(int orgShadowCount) { + this.orgShadowCount = orgShadowCount; + } + + public int getRoleShadowCount() { + return roleShadowCount; + } + + public void setRoleShadowCount(int roleShadowCount) { + this.roleShadowCount = roleShadowCount; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java index 571f369bd72..cad3d190731 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java @@ -17,16 +17,12 @@ package com.evolveum.midpoint.web.page.admin.configuration; import com.evolveum.midpoint.model.api.ModelExecuteOptions; -import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; -import com.evolveum.midpoint.prism.query.InOidFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.SubstringFilter; +import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.SelectorOptions; @@ -48,6 +44,7 @@ import com.evolveum.midpoint.web.component.data.column.LinkColumn; import com.evolveum.midpoint.web.component.dialog.ConfirmationDialog; import com.evolveum.midpoint.web.component.dialog.DeleteAllDialog; +import com.evolveum.midpoint.web.component.dialog.DeleteAllDto; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.util.LoadableModel; import com.evolveum.midpoint.web.page.PageBase; @@ -81,6 +78,7 @@ import org.apache.wicket.model.*; import org.apache.wicket.request.mapper.parameter.PageParameters; +import javax.xml.namespace.QName; import java.util.*; /** @@ -110,15 +108,12 @@ public class PageDebugList extends PageAdminConfiguration { private static final String ID_BASIC_SEARCH = "basicSearch"; private static final String ID_DELETE_ALL_DIALOG = "confirmDeleteAll"; - private static final String ID_FOCUS_TYPE_ORG = "OrgType"; - private static final String ID_FOCUS_TYPE_ROLE = "RoleType"; - - private static final String PRINT_LABEL_HTML_NEWLINE = "
"; + private static final Integer DELETE_LOG_INTERVAL = 50; // search form model; private IModel searchModel; // confirmation dialog model - private IModel confDialogModel = new Model(); + private IModel confDialogModel; private int objectsDeleted = 0; @@ -132,6 +127,14 @@ protected DebugSearchDto load() { } }; + confDialogModel = new LoadableModel() { + + @Override + protected DebugConfDialogDto load() { + return new DebugConfDialogDto(); + } + }; + initLayout(); } @@ -139,21 +142,11 @@ private void initLayout() { DeleteAllDialog deleteAllDialog = new DeleteAllDialog(ID_DELETE_ALL_DIALOG, createStringResource("pageDebugList.dialog.title.deleteAll")){ - @Override - public Task createSimpleTask(String operation){ - return PageDebugList.this.createSimpleTask(operation); - } - - @Override - public ModelService getModelService(){ - return PageDebugList.this.getModelService(); - } - @Override public void yesPerformed(AjaxRequestTarget target) { close(target); - Collection> options = new ArrayList>(); + Collection> options = new ArrayList<>(); GetOperationOptions opt = GetOperationOptions.createRaw(); options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); @@ -161,20 +154,22 @@ public void yesPerformed(AjaxRequestTarget target) { OperationResult result = new OperationResult(OPERATION_LAXATIVE_DELETE); objectsDeleted = 0; - if(deleteUsers.getObject()){ + DeleteAllDto dto = getModel().getObject(); + + if(dto.getDeleteUsers()){ deleteAllUsers(task, result, options); } - if(deleteOrgs.getObject()){ + if(dto.getDeleteOrgs()){ deleteAllOrgUnits(task, result, options); } - if(deleteAccountShadow.getObject()){ + if(dto.getDeleteAccountShadow()){ deleteAllAccountShadows(task, result, options); } - if(deleteOrgShadow.getObject()){ - deleteAllNonAccountShadows(task, result, options, ID_FOCUS_TYPE_ORG); + if(dto.getDeleteOrgShadow()){ + deleteAllNonAccountShadows(task, result, options, OrgType.COMPLEX_TYPE); } - if(deleteRoleShadow.getObject()){ - deleteAllNonAccountShadows(task, result, options, ID_FOCUS_TYPE_ROLE); + if(dto.getDeleteRoleShadow()){ + deleteAllNonAccountShadows(task, result, options, RoleType.COMPLEX_TYPE); } LOGGER.info("Deleted {} out of {} objects.", objectsDeleted, getObjectsToDelete()); @@ -257,7 +252,7 @@ private void addOrReplaceTable(RepositoryObjectDataProvider provider) { } private List initColumns(final Class type) { - List columns = new ArrayList(); + List columns = new ArrayList<>(); IColumn column = new CheckBoxHeaderColumn(); columns.add(column); @@ -324,7 +319,7 @@ public void populateItem(Item> cellItem, String c } private List initInlineMenu() { - List headerMenuItems = new ArrayList(); + List headerMenuItems = new ArrayList<>(); headerMenuItems.add(new InlineMenuItem(createStringResource("pageDebugList.menu.exportSelected"), true, new HeaderMenuAction(this) { @@ -444,7 +439,7 @@ private IModel> createChoiceModel(final IChoiceRenderer load() { - List choices = new ArrayList(); + List choices = new ArrayList<>(); Collections.addAll(choices, ObjectTypes.values()); choices.remove(ObjectTypes.OBJECT); @@ -550,7 +545,7 @@ public String getObject() { }; } - private void deleteAllUsers(Task task, OperationResult result, Collection> options){ + private void deleteAllUsers(Task task, final OperationResult result, Collection> options){ ResultHandler userHandler = new ResultHandler() { @Override @@ -558,13 +553,13 @@ public boolean handle(PrismObject object, OperationResult parentResult) { if (!SystemObjectsType.USER_ADMINISTRATOR.value().equals(object.asObjectable().getOid())) { ObjectDelta delta = ObjectDelta.createDeleteDelta(UserType.class, object.asObjectable().getOid(), getPrismContext()); Task task = createSimpleTask(OPERATION_LAXATIVE_DELETE); - OperationResult r = new OperationResult(OPERATION_LAXATIVE_DELETE); + OperationResult r = result.createMinorSubresult(OPERATION_LAXATIVE_DELETE); try { getModelService().executeChanges(WebMiscUtil.createDeltaCollection(delta), ModelExecuteOptions.createRaw(), task, r); objectsDeleted++; - if (objectsDeleted % 10 == 0) + if (objectsDeleted % DELETE_LOG_INTERVAL == 0) LOGGER.info("Deleted {} out of {} objects.", objectsDeleted, getObjectsToDelete()); r.recordSuccess(); @@ -586,20 +581,20 @@ public boolean handle(PrismObject object, OperationResult parentResult) { } } - private void deleteAllOrgUnits(Task task, OperationResult result, Collection> options){ + private void deleteAllOrgUnits(Task task, final OperationResult result, Collection> options){ ResultHandler userHandler = new ResultHandler() { @Override public boolean handle(PrismObject object, OperationResult parentResult) { ObjectDelta delta = ObjectDelta.createDeleteDelta(OrgType.class, object.asObjectable().getOid(), getPrismContext()); Task task = createSimpleTask(OPERATION_LAXATIVE_DELETE); - OperationResult r = new OperationResult(OPERATION_LAXATIVE_DELETE); + OperationResult r = result.createMinorSubresult(OPERATION_LAXATIVE_DELETE); try { getModelService().executeChanges(WebMiscUtil.createDeltaCollection(delta), ModelExecuteOptions.createRaw(), task, r); objectsDeleted++; - if (objectsDeleted % 10 == 0) + if (objectsDeleted % DELETE_LOG_INTERVAL == 0) LOGGER.info("Deleted {} out of {} objects.", objectsDeleted, getObjectsToDelete()); r.recordSuccess(); @@ -621,38 +616,36 @@ public boolean handle(PrismObject object, OperationResult parentResult) { } } - private void deleteAllAccountShadows(Task task, OperationResult result, Collection> options){ + private void deleteAllAccountShadows(Task task, final OperationResult result, Collection> options){ ResultHandler shadowHandler = new ResultHandler() { @Override public boolean handle(PrismObject object, OperationResult parentResult) { - ShadowType shadow = (ShadowType)object.asObjectable(); - if(ShadowKindType.ACCOUNT.equals(shadow.getKind())){ - ObjectDelta delta = ObjectDelta.createDeleteDelta(ShadowType.class, object.asObjectable().getOid(), getPrismContext()); - Task task = createSimpleTask(OPERATION_LAXATIVE_DELETE); - OperationResult r = new OperationResult(OPERATION_LAXATIVE_DELETE); + ObjectDelta delta = ObjectDelta.createDeleteDelta(ShadowType.class, object.asObjectable().getOid(), getPrismContext()); + Task task = createSimpleTask(OPERATION_LAXATIVE_DELETE); + OperationResult r = result.createMinorSubresult(OPERATION_LAXATIVE_DELETE); - try { - getModelService().executeChanges(WebMiscUtil.createDeltaCollection(delta), ModelExecuteOptions.createRaw(), task, r); - objectsDeleted++; + try { + getModelService().executeChanges(WebMiscUtil.createDeltaCollection(delta), ModelExecuteOptions.createRaw(), task, r); + objectsDeleted++; - if (objectsDeleted % 10 == 0) - LOGGER.info("Deleted {} out of {} objects.", objectsDeleted, getObjectsToDelete()); + if (objectsDeleted % DELETE_LOG_INTERVAL == 0) + LOGGER.info("Deleted {} out of {} objects.", objectsDeleted, getObjectsToDelete()); - r.recordSuccess(); - } catch (Exception ex) { - r.computeStatus(getString("pageDebugList.message.singleShadowDeleteProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.singleShadowDeleteProblem"), ex); - } - parentResult.addSubresult(r); + r.recordSuccess(); + } catch (Exception ex) { + r.computeStatus(getString("pageDebugList.message.singleShadowDeleteProblem")); + LoggingUtils.logException(LOGGER, getString("pageDebugList.message.singleShadowDeleteProblem"), ex); } - + parentResult.addSubresult(r); return true; } }; try { - getModelService().searchObjectsIterative(ShadowType.class, null, shadowHandler, options, task, result); + ObjectFilter filter = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPrismContext(), null, ShadowKindType.ACCOUNT); + ObjectQuery query = ObjectQuery.createObjectQuery(filter); + getModelService().searchObjectsIterative(ShadowType.class, query, shadowHandler, options, task, result); } catch (Exception ex) { result.computeStatus(getString("pageDebugList.message.laxativeProblem")); LoggingUtils.logException(LOGGER, getString("pageDebugList.message.laxativeProblem"), ex); @@ -660,56 +653,65 @@ public boolean handle(PrismObject object, OperationResult parentResult) { } private void deleteAllNonAccountShadows(Task task, final OperationResult result, Collection> options, - final String focus){ + final QName focus){ ResultHandler shadowHandler = new ResultHandler() { @Override public boolean handle(PrismObject object, OperationResult parentResult) { ShadowType shadow = (ShadowType)object.asObjectable(); + String oid = shadow.getResourceRef().getOid(); - if(!ShadowKindType.ACCOUNT.equals(shadow.getKind())){ - ObjectDelta delta = ObjectDelta.createDeleteDelta(ShadowType.class, object.asObjectable().getOid(), getPrismContext()); - Task task = createSimpleTask(OPERATION_LAXATIVE_DELETE); - OperationResult r = new OperationResult(OPERATION_LAXATIVE_DELETE); - String oid = shadow.getResourceRef().getOid(); - - PrismObject resource = WebModelUtils.loadObject(ResourceType.class, oid, result, (PageBase)getPage()); - - if(resource != null && resource.asObjectable() != null){ - SynchronizationType sync = resource.asObjectable().getSynchronization(); - - for(ObjectSynchronizationType s: sync.getObjectSynchronization()){ - if(s.getFocusType() != null && focus.equals(s.getFocusType().getLocalPart())){ - try { - getModelService().executeChanges(WebMiscUtil.createDeltaCollection(delta), ModelExecuteOptions.createRaw(), task, r); - objectsDeleted++; - - if (objectsDeleted % 10 == 0) - LOGGER.info("Deleted {} out of {} objects.", objectsDeleted, getObjectsToDelete()); - - r.recordSuccess(); - } catch (Exception ex) { - r.computeStatus(getString("pageDebugList.message.singleShadowDeleteProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.singleShadowDeleteProblem"), ex); - } - parentResult.addSubresult(r); - } + if(confDialogModel.getObject().getResourceFocusMap().containsKey(oid)){ + deleteShadow(parentResult, object); + return true; + } + + PrismObject resource = WebModelUtils.loadObject(ResourceType.class, oid, result, (PageBase)getPage()); + + if(resource != null && resource.asObjectable() != null){ + SynchronizationType sync = resource.asObjectable().getSynchronization(); + + for(ObjectSynchronizationType s: sync.getObjectSynchronization()){ + if(s.getFocusType() != null && focus.getLocalPart().equals(s.getFocusType().getLocalPart())){ + confDialogModel.getObject().getResourceFocusMap().put(oid, s.getFocusType().getLocalPart()); + deleteShadow(parentResult, object); } } } - return true; } }; try { - getModelService().searchObjectsIterative(ShadowType.class, null, shadowHandler, options, task, result); + ObjectFilter filter = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPrismContext(), null, ShadowKindType.ACCOUNT); + ObjectQuery query = ObjectQuery.createObjectQuery(NotFilter.createNot(filter)); + getModelService().searchObjectsIterative(ShadowType.class, query, shadowHandler, options, task, result); } catch (Exception ex) { result.computeStatus(getString("pageDebugList.message.laxativeProblem")); LoggingUtils.logException(LOGGER, getString("pageDebugList.message.laxativeProblem"), ex); } } + private void deleteShadow(final OperationResult result, PrismObject object){ + ObjectDelta delta = ObjectDelta.createDeleteDelta(ShadowType.class, object.asObjectable().getOid(), getPrismContext()); + Task task = createSimpleTask(OPERATION_LAXATIVE_DELETE); + OperationResult r = result.createMinorSubresult(OPERATION_LAXATIVE_DELETE); + + try { + getModelService().executeChanges(WebMiscUtil.createDeltaCollection(delta), ModelExecuteOptions.createRaw(), task, r); + objectsDeleted++; + + if (objectsDeleted % DELETE_LOG_INTERVAL == 0) + LOGGER.info("Deleted {} out of {} objects.", objectsDeleted, getObjectsToDelete()); + + r.recordSuccess(); + } catch (Exception ex) { + r.computeStatus(getString("pageDebugList.message.singleShadowDeleteProblem")); + LoggingUtils.logException(LOGGER, getString("pageDebugList.message.singleShadowDeleteProblem"), ex); + } + result.addSubresult(r); + } + private int getObjectsToDelete(){ DeleteAllDialog dialog = (DeleteAllDialog)get(ID_DELETE_ALL_DIALOG); return dialog.getObjectsToDelete(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.properties index ebb9edb2829..e18c107da49 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.properties @@ -43,10 +43,4 @@ pageDebugList.message.countSearchProblem=Couldn't perform search operation on us pageDebugList.message.singleUserDeleteProblem=Couldn't delete user pageDebugList.message.singleOrgDeleteProblem=Couldn't delete org. unit pageDebugList.message.singleShadowDeleteProblem=Couldn't delete shadow -pageDebugList.message.laxativeProblem=Drop all identities operation has not performed successfully -pageDebugList.label.usersDelete=Users to delete: {0} (User 'Administrator' will not be deleted) -pageDebugList.label.orgUnitsDelete=Org. units to delete: {0} -pageDebugList.label.accountShadowsDelete=Account shadows to delete: {0} -pageDebugList.label.orgShadowsDelete=Org. unit shadows to delete: {0} -pageDebugList.label.roleShadowsDelete=Role shadows to delete: {0} -pageDebugList.label.totalToDelete=Total objects to delete: {0} +pageDebugList.message.laxativeProblem=Drop all identities operation has not performed successfully \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/DebugConfDialogDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/DebugConfDialogDto.java index 33eb800fb9a..99d88015547 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/DebugConfDialogDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/DebugConfDialogDto.java @@ -19,7 +19,10 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author lazyman @@ -33,6 +36,11 @@ public static enum Operation { private Operation operation; private List objects; private Class type; + private Map resourceFocusMap = new HashMap<>(); + + public DebugConfDialogDto(){ + this(null, new ArrayList(), null); + } public DebugConfDialogDto(Operation operation, List objects, Class type) { this.operation = operation; @@ -40,6 +48,14 @@ public DebugConfDialogDto(Operation operation, List objects, Cl this.type = type; } + public Map getResourceFocusMap() { + return resourceFocusMap; + } + + public void setResourceFocusMap(Map resourceFocusMap) { + this.resourceFocusMap = resourceFocusMap; + } + public Operation getOperation() { return operation; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java index 0eba7a9cc9e..ec1cd86ccec 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java @@ -23,11 +23,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.impl.ModelConstants; import com.evolveum.midpoint.model.impl.sync.SynchronizeAccountResultHandler; -import com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler; import com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeTaskHandler; import com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.prism.PrismObject; @@ -180,11 +178,12 @@ protected SynchronizeAccountResultHandler createHandler(TaskRunResult runResult, return null; } - return createHandler(resource, runResult, task, opResult); + return createHandler(resource, null, runResult, task, opResult); } - - private SynchronizeAccountResultHandler createHandler(ResourceType resource, TaskRunResult runResult, Task task, - OperationResult opResult) { + + // shadowToImport - it is used to derive objectClass/intent/kind when importing a single shadow + private SynchronizeAccountResultHandler createHandler(ResourceType resource, PrismObject shadowToImport, + TaskRunResult runResult, Task task, OperationResult opResult) { RefinedResourceSchema refinedSchema; try { @@ -200,7 +199,12 @@ private SynchronizeAccountResultHandler createHandler(ResourceType resource, Tas LOGGER.trace("Refined schema:\n{}", refinedSchema.debugDump()); } - ObjectClassComplexTypeDefinition objectClass = Utils.determineObjectClass(refinedSchema, task); + ObjectClassComplexTypeDefinition objectClass; + if (shadowToImport != null) { + objectClass = Utils.determineObjectClass(refinedSchema, shadowToImport); + } else { + objectClass = Utils.determineObjectClass(refinedSchema, task); + } if (objectClass == null) { LOGGER.error("Import: No objectclass specified and no default can be determined."); opResult.recordFatalError("No objectclass specified and no default can be determined"); @@ -260,7 +264,7 @@ public boolean importSingleShadow(String shadowOid, Task task, OperationResult p // Create a result handler just for one object. Invoke the handle() method manually. TaskRunResult runResult = new TaskRunResult(); - SynchronizeAccountResultHandler resultHandler = createHandler(resource.asObjectable(), runResult, task, parentResult); + SynchronizeAccountResultHandler resultHandler = createHandler(resource.asObjectable(), shadow, runResult, task, parentResult); if (resultHandler == null) { return false; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java index 84de67662e4..ca06280b947 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java @@ -280,27 +280,38 @@ private static void resolveRef(PrismReferenceValue refVal, RepositoryService rep refVal.setOid(oid); result.recordSuccessIfUnknown(); } - - public static ObjectClassComplexTypeDefinition determineObjectClass(RefinedResourceSchema refinedSchema, Task task) { + + public static ObjectClassComplexTypeDefinition determineObjectClass(RefinedResourceSchema refinedSchema, Task task) { + + QName objectclass = null; + PrismProperty objectclassProperty = task.getExtensionProperty(ModelConstants.OBJECTCLASS_PROPERTY_NAME); + if (objectclassProperty != null) { + objectclass = objectclassProperty.getValue().getValue(); + } + + ShadowKindType kind = null; + PrismProperty kindProperty = task.getExtensionProperty(ModelConstants.KIND_PROPERTY_NAME); + if (kindProperty != null) { + kind = kindProperty.getValue().getValue(); + } + + String intent = null; + PrismProperty intentProperty = task.getExtensionProperty(ModelConstants.INTENT_PROPERTY_NAME); + if (intentProperty != null) { + intent = intentProperty.getValue().getValue(); + } + + return determineObjectClassInternal(refinedSchema, objectclass, kind, intent, task); + } + + public static ObjectClassComplexTypeDefinition determineObjectClass(RefinedResourceSchema refinedSchema, PrismObject shadowToImport) { + ShadowType s = shadowToImport.asObjectable(); + return determineObjectClassInternal(refinedSchema, s.getObjectClass(), s.getKind(), s.getIntent(), s); + } + + private static ObjectClassComplexTypeDefinition determineObjectClassInternal( + RefinedResourceSchema refinedSchema, QName objectclass, ShadowKindType kind, String intent, Object source) { - QName objectclass = null; - PrismProperty objectclassProperty = task.getExtensionProperty(ModelConstants.OBJECTCLASS_PROPERTY_NAME); - if (objectclassProperty != null) { - objectclass = objectclassProperty.getValue().getValue(); - } - - ShadowKindType kind = null; - PrismProperty kindProperty = task.getExtensionProperty(ModelConstants.KIND_PROPERTY_NAME); - if (kindProperty != null) { - kind = kindProperty.getValue().getValue(); - } - - String intent = null; - PrismProperty intentProperty = task.getExtensionProperty(ModelConstants.INTENT_PROPERTY_NAME); - if (intentProperty != null) { - intent = intentProperty.getValue().getValue(); - } - if (kind == null && intent == null && objectclass != null) { // Return generic object class definition from resource schema. No kind/intent means that we want // to process all kinds and intents in the object class. @@ -320,7 +331,7 @@ public static ObjectClassComplexTypeDefinition determineObjectClass(RefinedResou new Object[]{refinedObjectClassDefinition, objectclass}); } else { if (LOGGER.isTraceEnabled()) { - LOGGER.debug("No kind or objectclass specified in the task {}, using default values", task); + LOGGER.debug("No kind or objectclass specified in {}, using default values", source); } refinedObjectClassDefinition = refinedSchema.getRefinedDefinition(ShadowKindType.ACCOUNT, (String)null); LOGGER.trace("Determined refined object class {} by using default ACCOUNT kind", diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryConfiguration.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryConfiguration.java index d3d01b7d10c..d7ea83083c9 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryConfiguration.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryConfiguration.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.repo.api.RepositoryServiceFactoryException; import com.evolveum.midpoint.repo.sql.util.MidPointConnectionCustomizer; import com.evolveum.midpoint.repo.sql.util.MidPointMySQLDialect; +import com.evolveum.midpoint.repo.sql.util.MidPointPostgreSQLDialect; import com.evolveum.midpoint.repo.sql.util.UnicodeSQLServer2008Dialect; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -488,7 +489,8 @@ public boolean isUsingMySQL() { public boolean isUsingPostgreSQL() { return isUsingDialect(PostgresPlusDialect.class) - || isUsingDialect(PostgreSQLDialect.class); + || isUsingDialect(PostgreSQLDialect.class) + || isUsingDialect(MidPointPostgreSQLDialect.class); } public boolean isUsingSQLServer() {