Skip to content

Commit

Permalink
avoid phantom changes while deleting task statistics and result
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed Apr 17, 2020
1 parent 017c743 commit 43e85a9
Showing 1 changed file with 40 additions and 30 deletions.
@@ -1,10 +1,7 @@
package com.evolveum.midpoint.web.page.admin.server;

import java.io.InputStream;
import java.util.Collection;
import java.util.Collections;

import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel;
import java.util.*;

import org.apache.wicket.Page;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand All @@ -29,7 +26,9 @@
import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipal;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
Expand All @@ -54,8 +53,8 @@
import com.evolveum.midpoint.web.component.AjaxDownloadBehaviorFromStream;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.ObjectSummaryPanel;
import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel;
import com.evolveum.midpoint.web.component.objectdetails.AbstractObjectMainPanel;
import com.evolveum.midpoint.web.component.prism.ValueStatus;
import com.evolveum.midpoint.web.component.refresh.Refreshable;
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
Expand All @@ -66,8 +65,6 @@
import com.evolveum.midpoint.web.util.TaskOperationUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import static com.evolveum.midpoint.web.component.data.column.ColumnUtils.createStringResource;

@PageDescriptor(
urls = {
@Url(mountUrl = "/admin/task", matchUrlForSecurity = "/admin/task")
Expand Down Expand Up @@ -365,11 +362,11 @@ public StringResourceModel getTitle() {
@Override
public void yesPerformed(AjaxRequestTarget target) {
try {
deleteItem(TaskType.F_OPERATION_STATS);
} catch (SchemaException e){
LOGGER.error("Cannot clear task results: {}", e.getMessage());
deleteItem(target, TaskType.F_OPERATION_STATS);
} catch (Exception e) {
LOGGER.error("Cannot delete task operation statistics, {}", e.getMessage(), e);
getSession().error(PageTask.this.getString("PageTask.cleanup.operationStatistics.failed"));
}
saveTaskChanges(target);
}
};
showMainPopup(dialog, target);
Expand All @@ -380,6 +377,26 @@ public void yesPerformed(AjaxRequestTarget target) {
repeatingView.add(cleanupPerformance);
}

private void deleteItem(AjaxRequestTarget target, ItemName... itemName) throws SchemaException {
List<ItemName> items = Arrays.asList(itemName);

Collection<ItemDelta<?, ?>> itemDeltas = new ArrayList<>();
for (ItemName item : items) {
ItemDelta<?, ?> delta = createDeleteItemDelta(item);
if (delta == null) {
LOGGER.trace("Nothing to delete for {}", item);
continue;
}
itemDeltas.add(delta);
}

ObjectDelta<TaskType> taskDelta = getPrismContext().deltaFor(TaskType.class)
.asObjectDelta(getTask().getOid());
taskDelta.addModifications(itemDeltas);

saveTaskChanges(target, taskDelta);
}

private void createCleanupResultsButton(RepeatingView repeatingView) {
AjaxCompositedIconButton cleanupResults = new AjaxCompositedIconButton(repeatingView.newChildId(), getTaskCleanupCompositedIcon(GuiStyleConstants.CLASS_ICON_TASK_RESULTS),
createStringResource("operationalButtonsPanel.cleanupResults")) {
Expand All @@ -397,12 +414,11 @@ public StringResourceModel getTitle() {
@Override
public void yesPerformed(AjaxRequestTarget target) {
try {
deleteItem(TaskType.F_RESULT);
deleteItem(TaskType.F_RESULT_STATUS);
} catch (SchemaException e){
deleteItem(target, TaskType.F_RESULT, TaskType.F_RESULT_STATUS);
} catch (Exception e){
LOGGER.error("Cannot clear task results: {}", e.getMessage());
getSession().error(PageTask.this.getString("PageTask.cleanup.result.failed"));
}
saveTaskChanges(target);
}
};
showMainPopup(dialog, target);
Expand All @@ -413,32 +429,26 @@ public void yesPerformed(AjaxRequestTarget target) {
repeatingView.add(cleanupResults);
}

private void deleteItem(ItemName itemName) throws SchemaException {
private ItemDelta<?, ?> createDeleteItemDelta(ItemName itemName) throws SchemaException {
ItemWrapper<?, ?, ?, ?> item = getObjectWrapper().findItem(itemName, ItemWrapper.class);
if (item == null) {
return;
return null;
}

PrismValueWrapper<?, ?> itemValue = item.getValue();
if (itemValue == null) {
return;
return null;
}

itemValue.setStatus(ValueStatus.DELETED);
PrismValue oldValue = itemValue.getOldValue().clone();

}
return getPrismContext().deltaFor(TaskType.class)
.item(itemName)
.delete(oldValue)
.asItemDelta();

private void saveTaskChanges(AjaxRequestTarget target) {
try {
ObjectDelta<TaskType> taskDelta = getObjectWrapper().getObjectDelta();
saveTaskChanges(target, taskDelta);
} catch (SchemaException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Cannot get task delta.", e);
getSession().error("Cannot save changes, there were problems with computing changes: " + e.getMessage());
target.add(getFeedbackPanel());
}
}

private void saveTaskChanges(AjaxRequestTarget target, ObjectDelta<TaskType> taskDelta){
if (taskDelta.isEmpty()) {
getSession().warn("Nothing to save, no changes were made.");
Expand Down

0 comments on commit 43e85a9

Please sign in to comment.