Skip to content

Commit

Permalink
synchronization process, wip
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Apr 23, 2024
1 parent 5530ff3 commit 61da037
Show file tree
Hide file tree
Showing 15 changed files with 277 additions and 72 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ public static MidPointObject copy(MidPointObject object) {
return o;
}

public MidPointObject copy() {
return MidPointObject.copy(this);
}

public String getContent() {
return content;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import com.evolveum.midpoint.studio.client.MidPointObject;
import com.evolveum.midpoint.studio.impl.Environment;
import com.evolveum.midpoint.studio.impl.SearchOptions;
import com.evolveum.midpoint.studio.ui.diff.SynchronizationFileItem;
import com.evolveum.midpoint.studio.ui.diff.FileItem;
import com.evolveum.midpoint.studio.ui.diff.SynchronizationManager;
import com.evolveum.midpoint.studio.ui.diff.SynchronizationObjectItem;
import com.evolveum.midpoint.studio.ui.diff.ObjectItem;
import com.evolveum.midpoint.studio.util.MidPointUtils;
import com.intellij.notification.NotificationType;
import com.intellij.openapi.diagnostic.Logger;
Expand Down Expand Up @@ -45,6 +45,9 @@ protected void doRun(ProgressIndicator indicator) {
}

private void processFiles(ProgressIndicator indicator, List<VirtualFile> files) {
client.setSuppressConsole(true);
client.setSuppressNotifications(true);

SynchronizationManager sm = SynchronizationManager.get(getProject());

int skipped = 0;
Expand Down Expand Up @@ -79,8 +82,8 @@ private void processFiles(ProgressIndicator indicator, List<VirtualFile> files)
continue;
}

List<SynchronizationFileItem> items = new ArrayList<>();
SynchronizationFileItem item = new SynchronizationFileItem(file, new ArrayList<>());
List<FileItem> items = new ArrayList<>();
FileItem item = new FileItem(file, new ArrayList<>());
items.add(item);

for (MidPointObject object : objects) {
Expand All @@ -98,7 +101,7 @@ private void processFiles(ProgressIndicator indicator, List<VirtualFile> files)
}

item.objects().add(
new SynchronizationObjectItem(
new ObjectItem(
item, object.getOid(), object.getName(), object.getType(), object, newObject));

diffed.incrementAndGet();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.studio.client.*;
import com.evolveum.midpoint.studio.impl.configuration.MidPointService;
import com.evolveum.midpoint.studio.impl.configuration.MidPointConfiguration;
import com.evolveum.midpoint.studio.impl.configuration.MidPointService;
import com.evolveum.midpoint.studio.util.MidPointUtils;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down Expand Up @@ -44,9 +44,9 @@ public class MidPointClient {

private final Environment environment;

private final boolean suppressNotifications;
private boolean suppressNotifications;

private final boolean suppressConsole;
private boolean suppressConsole;

private final Optional<Console> console;

Expand Down Expand Up @@ -481,4 +481,12 @@ public Map<SchemaFileType, String> getExtensionSchemas() {

return result;
}

public void setSuppressConsole(boolean suppressConsole) {
this.suppressConsole = suppressConsole;
}

public void setSuppressNotifications(boolean suppressNotifications) {
this.suppressNotifications = suppressNotifications;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,15 @@ public abstract class DiffPanel<O extends ObjectType> extends JBPanel {

private ObjectDeltaTree<O> deltaTree;

private String targetName;

private ObjectDelta<O> delta;

public DiffPanel(@NotNull Project project, ObjectDelta<O> delta) {
public DiffPanel(@NotNull Project project, String targetName, ObjectDelta<O> delta) {
super(new BorderLayout());

this.project = project;
this.targetName = targetName != null ? targetName : "target";
this.delta = delta;

initLayout();
Expand Down Expand Up @@ -62,7 +65,7 @@ private JBPanel createDeltaTablePanel() {
JBPanel treePanel = new JBPanel(new BorderLayout());
treePanel.setBorder(JBUI.Borders.customLineBottom(JBUI.CurrentTheme.Editor.BORDER_COLOR));

JBLabel label = new JBLabel("Review changes loaded from remote object:");
JBLabel label = new JBLabel("Select changes to be applied to '" + targetName + "' object:");
label.setBorder(JBUI.Borders.emptyLeft(12));
treePanel.add(label, BorderLayout.NORTH); // todo fix

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.intellij.diff.requests.ContentDiffRequest;
import com.intellij.diff.util.DiffUserDataKeysEx;
import com.intellij.icons.AllIcons;
import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Separator;
Expand Down Expand Up @@ -67,6 +68,14 @@ public DiffProcessor(
this.rightSource = right;
}

public PrismObject<O> getLeftObject() {
return leftObject;
}

public PrismObject<O> getRightObject() {
return rightObject;
}

public void initialize() {
try {
leftObject = parseObject(leftSource);
Expand All @@ -78,8 +87,18 @@ public void initialize() {

String leftTextContent = ClientUtils.serialize(MidPointUtils.DEFAULT_PRISM_CONTEXT, leftObjectPreview);
String rightTextContent = ClientUtils.serialize(MidPointUtils.DEFAULT_PRISM_CONTEXT, rightObject);
leftPreviewFile = new LightVirtualFile(buildTextDiffFileName(leftSource, true), leftTextContent);
LightVirtualFile right = new LightVirtualFile(buildTextDiffFileName(rightSource, false), rightTextContent);

leftPreviewFile = new LightVirtualFile(
buildTextDiffFileName(leftSource, true),
XmlFileType.INSTANCE,
leftTextContent,
System.currentTimeMillis());

LightVirtualFile right = new LightVirtualFile(
buildTextDiffFileName(rightSource, false),
XmlFileType.INSTANCE,
rightTextContent,
System.currentTimeMillis());

ContentDiffRequest request = DiffRequestFactory.getInstance().createFromFiles(project, leftPreviewFile, right);
DiffRequestChain chain = new SimpleDiffRequestChain(request);
Expand All @@ -99,7 +118,7 @@ public void initialize() {
};
diffProcessor.updateRequest();

panel = new DiffPanel<>(project, delta) {
panel = new DiffPanel<>(project, leftSource.file().getName() + "(" + leftSource.type() + ")", delta) { // todo fix

@Override
protected JComponent createTextDiff() {
Expand Down Expand Up @@ -166,6 +185,8 @@ public void setSelected(DiffStrategy selected) {

actions.add(new Separator());

actions.add(new UiAction("Cleanup right", AllIcons.General.InspectionsEye, e -> cleanupPerformed()));

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

@Override
Expand All @@ -187,15 +208,8 @@ public void update(@NotNull AnActionEvent e) {
}
});


actions.add(new UiAction("Cleanup right", AllIcons.General.InspectionsEye, e -> cleanupPerformed()));
// group.add(new UiAction("Show text diff"));// todo implement

actions.add(new Separator());

actions.add(new UiAction("Save", AllIcons.General.GreenCheckmark, e -> savePerformed()));
actions.add(new UiAction("Roll back", AllIcons.Actions.Rollback, e -> rollbackPerformed()));

return actions;
}

Expand All @@ -208,8 +222,9 @@ private <O extends ObjectType> PrismObject<O> parseObject(DiffSource source) thr
}

private String buildTextDiffFileName(DiffSource source, boolean result) {
String resultLabel = result ? ", result" : "";
return source.getName() + " (" + source.type().name() + resultLabel + ")";
String resultLabel = result ? "Result: " : "Source: ";

return resultLabel + source.file().getName() + "(" + source.type() + ")";
}

public String getName() {
Expand Down Expand Up @@ -240,7 +255,7 @@ private void diffStrategyChanged(DiffStrategy strategy) {
// todo implement
}

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

Expand All @@ -249,7 +264,7 @@ private void acceptPerformed() {

panel.removeNodes(selected);


updateLeftPreviewFile();
} catch (Exception ex) {
// todo fix
ex.printStackTrace();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@

import java.util.List;

public record SynchronizationFileItem(
@NotNull VirtualFile local, List<SynchronizationObjectItem> objects) {
public record FileItem(
@NotNull VirtualFile local, List<ObjectItem> objects) {
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package com.evolveum.midpoint.studio.ui.diff;

import com.evolveum.midpoint.prism.ModificationType;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.studio.util.StudioLocalization;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.intellij.openapi.Disposable;
import com.intellij.ui.render.LabelBasedRenderer;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.ui.UIUtil;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.xml.namespace.QName;
import java.awt.*;
import java.util.HashSet;
import java.util.Set;
Expand Down Expand Up @@ -58,6 +63,12 @@ private void setup() {
}

private Color computeColor(Object userObject) {
ModificationType type = getModificationType(userObject);

return SynchronizationUtil.getColorForModificationType(type);
}

private ModificationType getModificationType(Object userObject) {
ModificationType type = null;
if (userObject instanceof DeltaItem di) {
type = di.modificationType();
Expand All @@ -67,7 +78,7 @@ private Color computeColor(Object userObject) {
type = getModificationType(od);
}

return SynchronizationUtil.getColorForModificationType(type);
return type;
}

private ModificationType getModificationType(ObjectDelta<?> delta) {
Expand Down Expand Up @@ -106,10 +117,29 @@ private ModificationType getModificationType(Set<ModificationType> modificationT
@Override
public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;

if (node.getUserObject() instanceof ObjectDelta<?> od) {
return "All";
} else if (node.getUserObject() instanceof DeltaItem di) {
value = di.value();
ModificationType modificationType = getModificationType(node.getUserObject());
String prefix = modificationType == ModificationType.REPLACE ? "Replace existing with: " : "";

PrismValue prismValue = di.value();
if (prismValue instanceof PrismPropertyValue<?> property) {
value = property.getRealValue();
} else if (prismValue instanceof PrismReferenceValue ref) {
QName relation = ref.getRelation();
String relationStr = relation != null ? QNameUtil.prettyPrint(relation) : "";

ObjectTypes type = ObjectTypes.getObjectTypeFromTypeQNameIfKnown(ref.getTargetType());
String typeStr = type != null ? StudioLocalization.get().translateEnum(type) : "";

value = ref.getOid() + " (" + StringUtils.joinWith(", ", typeStr, relationStr) + ")";
} else if (prismValue instanceof PrismContainerValue<?> container) {
return container.debugDump();
}

value = prefix + value;
} else if (node.getUserObject() instanceof ItemDelta<?, ?> id) {
value = id.getPath().toString();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.evolveum.midpoint.studio.ui.diff;

import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.studio.client.MidPointObject;

public record ObjectItem(
FileItem item, String oid, String name, ObjectTypes type, MidPointObject local, MidPointObject remote) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.evolveum.midpoint.studio.ui.diff;

import org.jetbrains.annotations.NotNull;

import java.util.List;

public class SynchronizationFile {

private final FileItem item;

private final List<SynchronizationObject> objects;

public SynchronizationFile(@NotNull FileItem item, List<SynchronizationObject> objects) {
this.item = item;
this.objects = objects != null ? objects : List.of();
}

public FileItem getItem() {
return item;
}

public List<SynchronizationObject> getObjects() {
return objects;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class SynchronizationManager {

// todo move this to some kind of SynchronizationSession object that will be simpler to manage in
// terms of threading (start/finish, cancel multiple ones)
private final List<SynchronizationFileItem> items = new ArrayList<>();
private final List<SynchronizationFile> items = new ArrayList<>();

private boolean running = false;

Expand All @@ -38,24 +38,38 @@ public void synchronize(@NotNull List<VirtualFile> files, @NotNull Environment e
ProgressManager.getInstance().run(task);
}

public void add(@NotNull List<SynchronizationFileItem> items) {
this.items.addAll(items);
public void add(@NotNull List<FileItem> items) {
List<SynchronizationFile> files = new ArrayList<>();

// todo notify synchronization tree model in tool window
for (FileItem fi : items) {
List<SynchronizationObject> objects = new ArrayList<>();
for (ObjectItem oi : fi.objects()) {
objects.add(new SynchronizationObject(oi));
}

updateSynchronizationPanel(panel -> panel.getModel().addData(items));
files.add(new SynchronizationFile(fi, objects));
}

this.items.addAll(files);

updateSynchronizationToolWindow(panel -> panel.getModel().addData(files));
}

// todo improve this
public void start() {
if (running == true) {
return;
}

running = true;

items.clear();

updateSynchronizationPanel(panel -> panel.getModel().setData(new ArrayList<>()));
updateSynchronizationToolWindow(panel -> panel.getModel().setData(new ArrayList<>()));
// todo implement
}

private void updateSynchronizationPanel(Consumer<SynchronizationPanel> consumer) {
private void updateSynchronizationToolWindow(Consumer<SynchronizationPanel> consumer) {
RunnableUtils.invokeLaterIfNeeded(() -> {
SynchronizationPanel panel = (SynchronizationPanel) ToolWindowManager.getInstance(project)
.getToolWindow("Synchronization").getContentManager().getContent(0).getComponent();
Expand Down

0 comments on commit 61da037

Please sign in to comment.