Skip to content

Commit

Permalink
cleanup added to diff editor, now can switch sides
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Apr 24, 2024
1 parent 8707401 commit 9a656ff
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 91 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.evolveum.midpoint.studio.action.task;

import com.evolveum.midpoint.common.cleanup.*;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.common.cleanup.CleanupItem;
import com.evolveum.midpoint.common.cleanup.CleanupItemType;
import com.evolveum.midpoint.common.cleanup.CleanupResult;
import com.evolveum.midpoint.common.cleanup.ObjectCleaner;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismParser;
import com.evolveum.midpoint.prism.PrismSerializer;
Expand All @@ -14,25 +16,22 @@
import com.evolveum.midpoint.studio.client.ClientUtils;
import com.evolveum.midpoint.studio.client.MidPointObject;
import com.evolveum.midpoint.studio.impl.*;
import com.evolveum.midpoint.studio.impl.configuration.*;
import com.evolveum.midpoint.studio.impl.psi.search.ObjectFileBasedIndexImpl;
import com.evolveum.midpoint.studio.impl.configuration.CleanupService;
import com.evolveum.midpoint.studio.impl.configuration.MissingRef;
import com.evolveum.midpoint.studio.impl.configuration.MissingRefAction;
import com.evolveum.midpoint.studio.impl.configuration.MissingRefObject;
import com.evolveum.midpoint.studio.ui.cleanup.MissingRefKey;
import com.evolveum.midpoint.studio.ui.cleanup.MissingRefUtils;
import com.evolveum.midpoint.studio.util.MavenUtils;
import com.evolveum.midpoint.studio.util.MidPointUtils;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.intellij.notification.NotificationAction;
import com.intellij.notification.NotificationType;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.ui.messages.MessageDialog;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import org.apache.commons.lang3.StringUtils;
Expand Down Expand Up @@ -143,9 +142,7 @@ private String cleanupObject(MidPointObject object) {
CleanupService cs = CleanupService.get(getProject());

ObjectCleaner processor = cs.createCleanupProcessor();

DefaultCleanupListener handler = getListener(cs);
processor.setListener(handler);
processor.setListener(new StudioCleanupListener(getProject(), client, MidPointUtils.DEFAULT_PRISM_CONTEXT));

ObjectValidator validator = new ObjectValidator();
validator.setAllWarnings();
Expand Down Expand Up @@ -192,63 +189,6 @@ private void updateMissingReferencesSummary(MidPointObject object, List<CleanupI
}
}

@NotNull
private DefaultCleanupListener getListener(CleanupService cs) {
DefaultCleanupListener listener = new DefaultCleanupListener(MidPointUtils.DEFAULT_PRISM_CONTEXT) {

@Override
public boolean onConfirmOptionalCleanup(CleanupEvent<Item<?, ?>> event) {
return CleanupFileTask.this.onConfirmOptionalCleanup(event);
}

@Override
protected String getMidpointVersion() {
String current = MavenUtils.getMidpointVersion(getProject());
return current != null ? current : MidPointConstants.DEFAULT_MIDPOINT_VERSION;
}

@Override
protected <O extends ObjectType> boolean canResolveLocalObject(Class<O> type, String oid) {
return CleanupFileTask.this.canResolveLocalObject(type, oid);
}

@Override
protected PrismObject<ConnectorType> resolveConnector(String oid) {
return CleanupFileTask.this.resolveConnector(oid);
}
};

CleanupConfiguration configuration = cs.getSettings();
listener.setWarnAboutMissingReferences(configuration.isWarnAboutMissingReferences());

return listener;
}

private <O extends ObjectType> PrismObject<O> resolveConnector(String oid) {
try {
MidPointObject object = client.get(ConnectorType.class, oid, new SearchOptions().raw(true));
if (object == null) {
return null;
}

return (PrismObject<O>) client.parseObject(object.getContent());
} catch (Exception ex) {
throw new SystemException(ex);
}
}

private <O extends ObjectType> boolean canResolveLocalObject(Class<O> type, String oid) {
if (oid == null) {
return false;
}

List<VirtualFile> files = ApplicationManager.getApplication().runReadAction(
(Computable<List<VirtualFile>>) () ->
ObjectFileBasedIndexImpl.getVirtualFiles(oid, getProject(), true));

return !files.isEmpty();
}

private void publishNotification(
MidPointObject object, List<CleanupItem<?>> cleanupMessages, List<ValidationItem> validationMessages) {

Expand Down Expand Up @@ -360,14 +300,6 @@ private NotificationAction[] createNotificationActions(VirtualFile file, List<Mi
return actions.toArray(NotificationAction[]::new);
}

private boolean onConfirmOptionalCleanup(CleanupEvent<Item<?, ?>> event) {
int result = MidPointUtils.showConfirmationDialog(
getProject(), null, "Do you really want to remove item " + event.path() + "?",
"Confirm remove", "Remove", "Skip");

return result == MessageDialog.OK_EXIT_CODE;
}

@Override
protected NotificationAction[] getNotificationActionsAfterFinish() {
// todo fix this for whole cleanup - how to compute missing references and download only
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.evolveum.midpoint.studio.impl;

import com.evolveum.midpoint.common.cleanup.CleanupEvent;
import com.evolveum.midpoint.common.cleanup.DefaultCleanupListener;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.studio.MidPointConstants;
import com.evolveum.midpoint.studio.client.MidPointObject;
import com.evolveum.midpoint.studio.impl.psi.search.ObjectFileBasedIndexImpl;
import com.evolveum.midpoint.studio.util.MavenUtils;
import com.evolveum.midpoint.studio.util.MidPointUtils;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.messages.MessageDialog;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;

public class StudioCleanupListener extends DefaultCleanupListener {

private final Project project;

private final MidPointClient client;

public StudioCleanupListener(
@NotNull Project project, @Nullable MidPointClient client, @NotNull PrismContext prismContext) {

super(prismContext);

this.project = project;
this.client = client;
}

@Override
public boolean onConfirmOptionalCleanup(CleanupEvent<Item<?, ?>> event) {
int result = MidPointUtils.showConfirmationDialog(
project, null, "Do you really want to remove item " + event.path() + "?",
"Confirm remove", "Remove", "Skip");

return result == MessageDialog.OK_EXIT_CODE;
}

@Override
protected String getMidpointVersion() {
String current = MavenUtils.getMidpointVersion(project);
return current != null ? current : MidPointConstants.DEFAULT_MIDPOINT_VERSION;
}

@Override
protected <O extends ObjectType> boolean canResolveLocalObject(Class<O> type, String oid) {
if (oid == null) {
return false;
}

List<VirtualFile> files = ApplicationManager.getApplication().runReadAction(
(Computable<List<VirtualFile>>) () ->
ObjectFileBasedIndexImpl.getVirtualFiles(oid, project, true));

return !files.isEmpty();
}

@Override
protected PrismObject<ConnectorType> resolveConnector(String oid) {
if (client == null) {
return null;
}

try {
MidPointObject object = client.get(ConnectorType.class, oid, new SearchOptions().raw(true));
if (object == null) {
return null;
}

return (PrismObject<ConnectorType>) client.parseObject(object.getContent());
} catch (Exception ex) {
throw new SystemException(ex);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ public class DiffEditor implements FileEditor {

private final List<PropertyChangeListener> propertyChangeListeners = new ArrayList<>();

public DiffEditor(@NotNull Project project, @NotNull VirtualFile file) {
this.file = (DiffVirtualFile) file;
public DiffEditor(@NotNull Project project, @NotNull DiffVirtualFile file) {
this.file = file;
this.project = project;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public boolean accept(@NotNull Project project, @NotNull VirtualFile file) {

@Override
public @NotNull FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
return new DiffEditor(project, file);
return new DiffEditor(project, (DiffVirtualFile) file);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public DiffPanel() {
}

public void setTargetName(@NotNull String targetName) {
label.setText(targetName);
label.setText("Select changes to be applied to '" + targetName + "' object:");
}

public void setDelta(@NotNull ObjectDelta<O> delta) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
package com.evolveum.midpoint.studio.ui.diff;

import com.evolveum.midpoint.common.cleanup.ObjectCleaner;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismParser;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.studio.client.ClientUtils;
import com.evolveum.midpoint.studio.impl.Environment;
import com.evolveum.midpoint.studio.impl.EnvironmentService;
import com.evolveum.midpoint.studio.impl.MidPointClient;
import com.evolveum.midpoint.studio.impl.StudioCleanupListener;
import com.evolveum.midpoint.studio.impl.configuration.CleanupService;
import com.evolveum.midpoint.studio.ui.UiAction;
import com.evolveum.midpoint.studio.util.MidPointUtils;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand All @@ -15,6 +21,7 @@
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Separator;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.ui.components.JBLabel;
import org.jetbrains.annotations.NotNull;
Expand All @@ -28,6 +35,12 @@

public class DiffProcessor<O extends ObjectType> {

private static final Logger LOG = Logger.getInstance(DiffProcessor.class);

private enum Direction {
LEFT_TO_RIGHT, RIGHT_TO_LEFT
}

private final Project project;

private final DiffSource leftSource;
Expand All @@ -40,6 +53,8 @@ public class DiffProcessor<O extends ObjectType> {

private DiffPanel<O> panel;

private Direction direction = Direction.RIGHT_TO_LEFT;

private DiffStrategy strategy = DiffStrategy.REAL_VALUE_CONSIDER_DIFFERENT_IDS; // todo use natural keys by default

public DiffProcessor(@NotNull Project project, @NotNull DiffSource left, @NotNull DiffSource right) {
Expand Down Expand Up @@ -84,15 +99,24 @@ public void initialize() {
leftObject = parseObject(leftSource);
rightObject = parseObject(rightSource);

delta = leftObject.diff(rightObject, strategy.getStrategy());

panel.setTargetName(leftSource.file().getName() + " (" + leftSource.type() + ")");
panel.setDelta(delta);
recomputeDelta();
} catch (Exception ex) {
throw new RuntimeException("Couldn't parse object", ex);
}
}

private void recomputeDelta() {
DiffSource toSource = direction == Direction.LEFT_TO_RIGHT ? rightSource : leftSource;

PrismObject<O> from = direction == Direction.LEFT_TO_RIGHT ? leftObject : rightObject;
PrismObject<O> to = direction == Direction.LEFT_TO_RIGHT ? rightObject : leftObject;

delta = from.diff(to, strategy.getStrategy());

panel.setTargetName(toSource.file().getName() + " (" + toSource.type() + ")");
panel.setDelta(delta);
}

private void onTreeSelectionChanged(List<DefaultMutableTreeNode> selected) {
// todo implement
}
Expand Down Expand Up @@ -121,6 +145,8 @@ public void setSelected(DiffStrategy selected) {

actions.add(new Separator());

actions.add(new UiAction("Switch sides", AllIcons.Diff.ArrowLeftRight, e -> switchSidesPerformed()));

actions.add(new UiAction("Accept", AllIcons.RunConfigurations.ShowPassed, e -> acceptPerformed()) {

@Override
Expand Down Expand Up @@ -171,20 +197,19 @@ private void diffStrategyChanged(@NotNull DiffStrategy strategy) {
this.strategy = strategy;

initialize();
// todo implement
}

protected void acceptPerformed() {
try {
List<DefaultMutableTreeNode> selected = panel.getSelectedNodes();

// todo implement - apply partial delta
applyDeltaNodesToObject(leftObject, selected);
PrismObject<O> object = direction == Direction.LEFT_TO_RIGHT ? rightObject : leftObject;

applyDeltaNodesToObject(object, selected);

panel.removeNodes(selected);
} catch (Exception ex) {
// todo fix
ex.printStackTrace();
throw new RuntimeException("Couldn't apply delta", ex);
}
}

Expand Down Expand Up @@ -243,6 +268,26 @@ private void ignorePerformed() {
}

private void cleanupPerformed() {
// todo implement
CleanupService cs = CleanupService.get(project);

MidPointClient client = null;
Environment environment = EnvironmentService.getInstance(project).getSelected();
if (environment != null) {
client = new MidPointClient(project, environment, false, false);
}

ObjectCleaner processor = cs.createCleanupProcessor();
processor.setListener(new StudioCleanupListener(project, client, MidPointUtils.DEFAULT_PRISM_CONTEXT));

processor.process(leftObject);
processor.process(rightObject);

recomputeDelta();
}

private void switchSidesPerformed() {
direction = direction == Direction.LEFT_TO_RIGHT ? Direction.RIGHT_TO_LEFT : Direction.LEFT_TO_RIGHT;

recomputeDelta();
}
}

0 comments on commit 9a656ff

Please sign in to comment.