Skip to content

Commit

Permalink
MID-2413 shadow filtering/delete on debug pages
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Jun 19, 2015
1 parent 913aa9f commit 46dc660
Show file tree
Hide file tree
Showing 7 changed files with 172 additions and 44 deletions.
Expand Up @@ -28,6 +28,13 @@
<select class="form-control input-sm" wicket:id="choice"/>
</div>

<wicket:enclosure child="resource">
<div class="form-group">
<label class="sr-only"><wicket:message key="pageDebugList.resource"/></label>
<select class="form-control input-sm" wicket:id="resource"/>
</div>
</wicket:enclosure>

<div wicket:id="basicSearch" />
</form>
</div>
Expand Down
Expand Up @@ -47,12 +47,14 @@
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.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.configuration.component.DebugButtonPanel;
import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction;
import com.evolveum.midpoint.web.page.admin.configuration.component.PageDebugDownloadBehaviour;
import com.evolveum.midpoint.web.page.admin.configuration.dto.DebugConfDialogDto;
import com.evolveum.midpoint.web.page.admin.configuration.dto.DebugObjectItem;
import com.evolveum.midpoint.web.page.admin.configuration.dto.DebugSearchDto;
import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto;
import com.evolveum.midpoint.web.session.ConfigurationStorage;
import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.web.util.ObjectTypeGuiDescriptor;
Expand Down Expand Up @@ -96,6 +98,8 @@ public class PageDebugList extends PageAdminConfiguration {

private static final String OPERATION_LAXATIVE_DELETE = DOT_CLASS + "laxativeDelete";

private static final String OPERATION_LOAD_RESOURCES = DOT_CLASS + "loadResources";

private static final String ID_CONFIRM_DELETE_POPUP = "confirmDeletePopup";
private static final String ID_MAIN_FORM = "mainForm";
private static final String ID_ZIP_CHECK = "zipCheck";
Expand All @@ -106,13 +110,15 @@ public class PageDebugList extends PageAdminConfiguration {
private static final String ID_SEARCH_FORM = "searchForm";
private static final String ID_BASIC_SEARCH = "basicSearch";
private static final String ID_DELETE_ALL_DIALOG = "confirmDeleteAll";
private static final String ID_RESOURCE = "resource";

private static final Integer DELETE_LOG_INTERVAL = 50;

// search form model;
private IModel<DebugSearchDto> searchModel;
// confirmation dialog model
private IModel<DebugConfDialogDto> confDialogModel;
private IModel<List<ObjectViewDto>> resourcesModel;

private int objectsDeleted = 0;

Expand All @@ -138,10 +144,45 @@ protected DebugConfDialogDto load() {
}
};

resourcesModel= new LoadableModel<List<ObjectViewDto>>() {

@Override
protected List<ObjectViewDto> load() {
return loadResources();
}
};

getSessionStorage().clearPagingInSession(clearPagingInSession);
initLayout();
}

private List<ObjectViewDto> loadResources() {
List<ObjectViewDto> objects = new ArrayList<>();

try {
OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCES);
List<PrismObject<ResourceType>> list = WebModelUtils.searchObjects(ResourceType.class, null,
SelectorOptions.createCollection(GetOperationOptions.createRaw()), result, this, null);

for (PrismObject obj : list) {
ObjectViewDto dto = new ObjectViewDto(obj.getOid(), WebMiscUtil.getName(obj));
objects.add(dto);
}
} catch (Exception ex) {
//todo implement error handling
}

Collections.sort(objects, new Comparator<ObjectViewDto>() {

@Override
public int compare(ObjectViewDto o1, ObjectViewDto o2) {
return String.CASE_INSENSITIVE_ORDER.compare(o1.getName(), o2.getName());
}
});

return objects;
}

private void initLayout() {
DeleteAllDialog deleteAllDialog = new DeleteAllDialog(ID_DELETE_ALL_DIALOG,
createStringResource("pageDebugList.dialog.title.deleteAll")){
Expand Down Expand Up @@ -380,6 +421,24 @@ public void onSubmit(AjaxRequestTarget target, Form<?> form) {
// }
// }));

headerMenuItems.add(new InlineMenuItem(createStringResource("pageDebugList.menu.deleteShadowsOnResource"),
new Model(true),
new AbstractReadOnlyModel<Boolean>() {

@Override
public Boolean getObject() {
DebugSearchDto dto = searchModel.getObject();
return ObjectTypes.SHADOW.equals(dto.getType());
}

}, false, new HeaderMenuAction(this) {

@Override
public void onClick(AjaxRequestTarget target) {
deleteAllShadowsOnResource(target);
}
}));

headerMenuItems.add(new InlineMenuItem());

headerMenuItems.add(new InlineMenuItem(createStringResource("pageDebugList.menu.deleteAllIdentities"), true,
Expand All @@ -399,7 +458,25 @@ private boolean hasToZip() {
return zipCheck.getModelObject();
}

private void initSearchForm(Form searchForm) {
private IChoiceRenderer<ObjectViewDto> createResourceRenderer() {
return new IChoiceRenderer<ObjectViewDto>() {

@Override
public Object getDisplayValue(ObjectViewDto object) {
if (object == null) {
return getString("pageDebugList.resource");
}
return object.getName();
}

@Override
public String getIdValue(ObjectViewDto object, int index) {
return Integer.toString(index);
}
};
}

private void initSearchForm(final Form searchForm) {
IChoiceRenderer<ObjectTypes> renderer = new IChoiceRenderer<ObjectTypes>() {

@Override
Expand All @@ -423,10 +500,24 @@ public String getIdValue(ObjectTypes object, int index) {

@Override
protected void onUpdate(AjaxRequestTarget target) {
target.add(searchForm);
listObjectsPerformed(target);
}
});

DropDownChoice resource = new DropDownChoice(ID_RESOURCE, new PropertyModel(searchModel, DebugSearchDto.F_RESOURCE_OID),
resourcesModel, createResourceRenderer());
resource.setNullValid(true);
resource.add(new VisibleEnableBehaviour() {

@Override
public boolean isVisible() {
DebugSearchDto dto = searchModel.getObject();
return ObjectTypes.SHADOW.equals(dto.getType());
}
});
searchForm.add(resource);

BasicSearchPanel<DebugSearchDto> basicSearch = new BasicSearchPanel<DebugSearchDto>(ID_BASIC_SEARCH) {

@Override
Expand Down Expand Up @@ -498,21 +589,34 @@ private void listObjectsPerformed(AjaxRequestTarget target) {

private ObjectQuery createQuery(){
DebugSearchDto dto = searchModel.getObject();
String nameText = dto.getText();
ObjectQuery query = new ObjectQuery();

if (StringUtils.isNotEmpty(nameText)) {
PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer();
String normalizedString = normalizer.normalize(nameText);
List<ObjectFilter> filters = new ArrayList<>();
if (dto.getResource() != null) {
String oid = dto.getResource().getOid();
RefFilter ref = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class,
getPrismContext(), oid);
filters.add(ref);
}

if (StringUtils.isNotEmpty(dto.getText())) {
String nameText = dto.getText();
PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer();
String normalizedString = normalizer.normalize(nameText);

ObjectFilter substring = SubstringFilter.createSubstring(ObjectType.F_NAME, ObjectType.class, getPrismContext(),
PolyStringNormMatchingRule.NAME, normalizedString);
query.setFilter(substring);
ObjectFilter substring = SubstringFilter.createSubstring(ObjectType.F_NAME, ObjectType.class,
getPrismContext(), PolyStringNormMatchingRule.NAME, normalizedString);
filters.add(substring);
}

return query;
if (filters.isEmpty()) {
return null;
}

return null;
ObjectFilter filter = filters.size() > 1 ? AndFilter.createAnd(filters) : filters.get(0);
ObjectQuery query = new ObjectQuery();
query.setFilter(filter);

return query;
}

private void objectEditPerformed(AjaxRequestTarget target, String oid, Class<? extends ObjectType> type) {
Expand Down Expand Up @@ -776,20 +880,28 @@ private void deleteSelectedConfirmed(AjaxRequestTarget target, List<DebugObjectI
}

private void clearSearchPerformed(AjaxRequestTarget target){
DebugSearchDto dto = new DebugSearchDto();
DebugSearchDto dto = searchModel.getObject();
dto.setText(null);

TablePanel panel = getListTable();
DataTable table = panel.getDataTable();
RepositoryObjectDataProvider provider = (RepositoryObjectDataProvider) table.getDataProvider();
provider.setQuery(null);
target.add(get(ID_SEARCH_FORM));
listObjectsPerformed(target);
}

provider.setType(dto.getType().getClassDefinition());
searchModel.setObject(new DebugSearchDto());
private void deleteAllShadowsOnResource(AjaxRequestTarget target) {
DebugSearchDto dto = searchModel.getObject();
if (dto.getResource() == null) {
error(getString("pageDebugList.message.resourceNotSelected"));
target.add(getFeedbackPanel());
return;
}

ConfigurationStorage storage = getSessionStorage().getConfiguration();
storage.setDebugSearchDto(searchModel.getObject());
//todo show confirmation dialog
}

target.add(get(ID_SEARCH_FORM));
target.add(panel);
private void deleteAllShadowsOnResourceConfirmed(AjaxRequestTarget target) {
DebugSearchDto dto = searchModel.getObject();
String resourceOid = dto.getResource().getOid();

//todo implement
}
}
Expand Up @@ -43,4 +43,8 @@ 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.message.laxativeProblem=Drop all identities operation has not performed successfully
pageDebugList.resource=Resource
resource.nullValid=Choose resource...
pageDebugList.menu.deleteShadowsOnResource=Delete shadows on resource
pageDebugList.message.resourceNotSelected=Resource not selected.
Expand Up @@ -30,7 +30,7 @@
public class DebugConfDialogDto implements Serializable {

public static enum Operation {
DELETE_SELECTED, DELETE_ALL_TYPE;
DELETE_SELECTED, DELETE_ALL_TYPE, DELETE_RESOURCE_SHADOWS;
}

private Operation operation;
Expand Down
Expand Up @@ -17,6 +17,7 @@
package com.evolveum.midpoint.web.page.admin.configuration.dto;

import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto;

import java.io.Serializable;

Expand All @@ -27,9 +28,11 @@ public class DebugSearchDto implements Serializable {

public static final String F_TEXT = "text";
public static final String F_TYPE = "type";
public static final String F_RESOURCE_OID = "resource";

private String text;
private ObjectTypes type;
private ObjectViewDto resource;

public String getText() {
return text;
Expand All @@ -49,4 +52,12 @@ public ObjectTypes getType() {
public void setType(ObjectTypes type) {
this.type = type;
}

public ObjectViewDto getResource() {
return resource;
}

public void setResource(ObjectViewDto resource) {
this.resource = resource;
}
}
Expand Up @@ -119,29 +119,23 @@ protected void deleteSyncTokenPerformed(AjaxRequestTarget target, IModel<Resourc
OperationResult result = new OperationResult(OPERATION_DELETE_SYNC_TOKEN);
ObjectQuery query;

try {
ObjectFilter refFilter = RefFilter.createReferenceEqual(TaskType.F_OBJECT_REF, TaskType.class,
getPrismContext(), resourceOid);

ObjectFilter filterHandleUri = EqualFilter.createEqual(TaskType.F_HANDLER_URI, TaskType.class,
getPrismContext(), null, handlerUri);
ObjectFilter refFilter = RefFilter.createReferenceEqual(TaskType.F_OBJECT_REF, TaskType.class,
getPrismContext(), resourceOid);

query = new ObjectQuery();
query.setFilter(AndFilter.createAnd(refFilter, filterHandleUri));
ObjectFilter filterHandleUri = EqualFilter.createEqual(TaskType.F_HANDLER_URI, TaskType.class,
getPrismContext(), null, handlerUri);

List<PrismObject<TaskType>> taskList = WebModelUtils.searchObjects(TaskType.class, query,
result, this);
query = new ObjectQuery();
query.setFilter(AndFilter.createAnd(refFilter, filterHandleUri));

if(taskList.size() != 1){
error(getString("pageResource.message.invalidTaskSearch"));
} else {
oldTask = taskList.get(0);
saveTask(oldTask, result);
}
List<PrismObject<TaskType>> taskList = WebModelUtils.searchObjects(TaskType.class, query,
result, this);

}catch (SchemaException e){
LoggingUtils.logException(LOGGER, "Couldn't create reference query for task.", e);
error("Couldn't create reference query for task." + e.getMessage());
if(taskList.size() != 1){
error(getString("pageResource.message.invalidTaskSearch"));
} else {
oldTask = taskList.get(0);
saveTask(oldTask, result);
}

result.recomputeStatus();
Expand Down
Expand Up @@ -91,7 +91,7 @@ public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefini

// beware, creating reference with (oid, ObjectType) may result in not matching a concrete reference of e.g. (oid, RoleType)
public static <O extends Containerable> RefFilter createReferenceEqual(QName propertyName, Class<O> type, PrismContext prismContext,
String... oids) throws SchemaException {
String... oids) {
ItemPath path = new ItemPath(propertyName);
PrismReferenceDefinition refDefinition = (PrismReferenceDefinition) findItemDefinition(path, type, prismContext);
return createReferenceEqual(path, refDefinition, oids);
Expand Down

0 comments on commit 46dc660

Please sign in to comment.