Skip to content

Commit

Permalink
MID-1954 - delete all identites function redesigned.
Browse files Browse the repository at this point in the history
  • Loading branch information
Erik Suta committed Jul 10, 2014
1 parent b48915b commit c795df6
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 248 deletions.
Expand Up @@ -60,25 +60,13 @@

<div class="row" style="margin: 0px 0px 0px 0px">
<div class="col-md-4">
<label><wicket:message key="deleteAllDialog.label.shadow.role" /></label>
<label><wicket:message key="deleteAllDialog.label.shadow.nonAccount" /></label>
</div>
<div class="col-md-1">
<input type="checkbox" wicket:id="checkboxRoleShadow"/>
<input type="checkbox" wicket:id="checkboxNonAccountShadow"/>
</div>
<div class="col-md-6">
<span wicket:id="confirmTextRoleShadows" />
</div>
</div>

<div class="row" style="margin: 0px 0px 0px 0px">
<div class="col-md-4">
<label><wicket:message key="deleteAllDialog.label.shadow.org" /></label>
</div>
<div class="col-md-1">
<input type="checkbox" wicket:id="checkboxOrgShadow"/>
</div>
<div class="col-md-6">
<span wicket:id="confirmTextOrgShadows" />
<span wicket:id="confirmTextNonAccountShadows" />
</div>
</div>

Expand Down
Expand Up @@ -15,14 +15,12 @@
*/
package com.evolveum.midpoint.web.component.dialog;

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;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
Expand All @@ -32,7 +30,6 @@
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.web.util.WebModelUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
Expand All @@ -45,7 +42,6 @@
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;

Expand All @@ -63,26 +59,17 @@ public class DeleteAllDialog extends ModalWindow{
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_ROLE_SHADOW = "checkboxRoleShadow";
private static final String ID_CHB_ORG_SHADOW = "checkboxOrgShadow";
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_ROLE_SHADOWS = "confirmTextRoleShadows";
private static final String ID_TEXT_ORG_SHADOWS = "confirmTextOrgShadows";
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());

// 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<String> title){
super(id);

Expand All @@ -94,7 +81,7 @@ public DeleteAllDialog(String id, IModel<String> title){
setCookieName(ConfirmationDialog.class.getSimpleName() + ((int) (Math.random() * 100)));
showUnloadConfirmation(false);
setResizable(false);
setInitialWidth(550);
setInitialWidth(650);
setInitialHeight(350);
setWidthUnit("px");

Expand Down Expand Up @@ -168,27 +155,16 @@ protected void onUpdate(AjaxRequestTarget target) {
});
content.add(deleteAccountShadowsCheckbox);

CheckBox deleteOrgShadowsCheckbox = new CheckBox(ID_CHB_ORG_SHADOW,
new PropertyModel<Boolean>(model, DeleteAllDto.F_ORG_SHADOW));
deleteOrgShadowsCheckbox.add(new OnChangeAjaxBehavior() {

@Override
protected void onUpdate(AjaxRequestTarget target) {
updateLabelModel(target, ID_TEXT_ORG_SHADOWS);
}
});
content.add(deleteOrgShadowsCheckbox);

CheckBox deleteRoleShadowsCheckbox = new CheckBox(ID_CHB_ROLE_SHADOW,
new PropertyModel<Boolean>(model, DeleteAllDto.F_ROLE_SHADOW));
deleteRoleShadowsCheckbox.add(new OnChangeAjaxBehavior() {
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_ROLE_SHADOWS);
updateLabelModel(target, ID_TEXT_NON_ACC_SHADOW);
}
});
content.add(deleteRoleShadowsCheckbox);
content.add(deleteNonAccountShadowsCheckbox);

Label usersLabel = new Label(ID_TEXT_USERS, new LoadableModel<String>() {
@Override
Expand Down Expand Up @@ -217,23 +193,15 @@ protected String load() {
accShadowsLabel.setOutputMarkupId(true);
content.add(accShadowsLabel);

Label orgShadowsLabel = new Label(ID_TEXT_ORG_SHADOWS, new LoadableModel<String>() {
@Override
protected String load() {
return createDeleteShadowsMessage(OrgType.COMPLEX_TYPE);
}
});
orgShadowsLabel.setOutputMarkupId(true);
content.add(orgShadowsLabel);
Label nonAccShadowsLabel = new Label(ID_TEXT_NON_ACC_SHADOW, new LoadableModel<String>() {

Label roleShadowsLabel = new Label(ID_TEXT_ROLE_SHADOWS, new LoadableModel<String>() {
@Override
protected String load() {
return createDeleteShadowsMessage(RoleType.COMPLEX_TYPE);
return createDeleteNonAccountShadowsMessage();
}
});
roleShadowsLabel.setOutputMarkupId(true);
content.add(roleShadowsLabel);
nonAccShadowsLabel.setOutputMarkupId(true);
content.add(nonAccShadowsLabel);

Label countLabel = new Label(ID_TOTAL, new LoadableModel<String>() {
@Override
Expand Down Expand Up @@ -284,13 +252,10 @@ private String createTotalMessage(){
dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getOrgUnitCount());
}
if(dto.getDeleteAccountShadow()){
dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getAccountShadowTypeCount());
}
if(dto.getDeleteOrgShadow()){
dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getOrgShadowCount());
dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getAccountShadowCount());
}
if(dto.getDeleteRoleShadow()){
dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getRoleShadowCount());
if(dto.getDeleteNonAccountShadow()){
dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getNonAccountShadowCount());
}

return createStringResource("deleteAllDialog.label.totalToDelete", dto.getObjectsToDelete()).getString();
Expand Down Expand Up @@ -347,11 +312,7 @@ private String createDeleteOrgUnitsMessage(){
return createStringResource("deleteAllDialog.label.orgUnitsDelete", dto.getOrgUnitCount()).getString();
}

private String createDeleteAccountShadowsMessage(){
if(!model.getObject().getDeleteAccountShadow()){
return createStringResource("deleteAllDialog.label.accountShadowsDelete", 0).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);
Expand All @@ -362,98 +323,48 @@ private String createDeleteAccountShadowsMessage(){

try {
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());
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);
}

return createStringResource("deleteAllDialog.label.accountShadowsDelete", dto.getAccountShadowTypeCount()).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();
private String createDeleteNonAccountShadowsMessage(){
if(!model.getObject().getDeleteNonAccountShadow()){
return createStringResource("deleteAllDialog.label.nonAccountShadowsDelete", 0).getString();
}
DeleteAllDto dto = model.getObject();
int count = 0;

Task task = getPagebase().createSimpleTask(OPERATION_SEARCH_ITERATIVE_TASK);
final OperationResult result = new OperationResult(OPERATION_SEARCH_ITERATIVE_TASK);
countShadows(false);

Collection<SelectorOptions<GetOperationOptions>> options = new ArrayList<>();
GetOperationOptions opt = GetOperationOptions.createRaw();
options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt));

ResultHandler<ShadowType> orgShadowHandler = new ResultHandler<ShadowType>() {
@Override
public boolean handle(PrismObject object, OperationResult parentResult) {
ShadowType shadow = (ShadowType)object.asObjectable();
String oid = shadow.getResourceRef().getOid();

if(model.getObject().getResourceFocusMap().containsKey(oid)){
addShadowType(model.getObject().getResourceFocusMap().get(oid));
return true;
}

PrismObject<ResourceType> resource = WebModelUtils.loadObject(ResourceType.class, oid, result, getPagebase());

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())){
model.getObject().getResourceFocusMap().put(oid, s.getFocusType().getLocalPart());
addShadowType(focus.getLocalPart());
}
}
}
return true;
}
};

try {
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();
}
return createStringResource("deleteAllDialog.label.nonAccountShadowsDelete", dto.getNonAccountShadowCount()).getString();
}

dto.setObjectsToDelete(dto.getObjectsToDelete() + count);
} catch (Exception ex) {
result.computeStatus(getString("deleteAllDialog.message.countSearchProblem"));
LoggingUtils.logException(LOGGER, getString("deleteAllDialog.message.countSearchProblem"), ex);
private String createDeleteAccountShadowsMessage(){
if(!model.getObject().getDeleteAccountShadow()){
return createStringResource("deleteAllDialog.label.accountShadowsDelete", 0).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 null;
}
DeleteAllDto dto = model.getObject();
countShadows(true);

return createStringResource("deleteAllDialog.label.accountShadowsDelete", dto.getAccountShadowCount()).getString();
}

public int getObjectsToDelete(){
return model.getObject().getObjectsToDelete();
}

private void addShadowType(String focus){
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);
}
}

private PageBase getPagebase(){
return (PageBase) getPage();
}
Expand Down
Expand Up @@ -20,11 +20,11 @@ deleteAllDialog.message.choose=Choose object types to delete:
deleteAllDialog.label.users=Users
deleteAllDialog.label.org=Org. Units
deleteAllDialog.label.shadow.account=Account shadows
deleteAllDialog.label.shadow.nonAccount=Non-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.nonAccountShadowsDelete=Non-Account shadows to delete: {0}
deleteAllDialog.label.totalToDelete=Total objects to delete: {0}

0 comments on commit c795df6

Please sign in to comment.