Skip to content

Commit

Permalink
ASTDiff GUI: Beta version of SinglePageView
Browse files Browse the repository at this point in the history
  • Loading branch information
pouryafard75 committed Jul 5, 2024
1 parent 7d71090 commit 4cc313f
Show file tree
Hide file tree
Showing 9 changed files with 338 additions and 254 deletions.
64 changes: 42 additions & 22 deletions src/main/java/gui/webdiff/DirectoryDiffView.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,16 @@

public class DirectoryDiffView implements Renderable {
protected final DirComparator comparator;
private final boolean external;

public DirectoryDiffView(DirComparator comparator) {
this.comparator = comparator;
this.external = false;
}

public DirectoryDiffView(DirComparator comparator, boolean external) {
this.comparator = comparator;
this.external = external;
}

protected boolean isMovedCode(TreeNodeInfo info) {
Expand All @@ -37,14 +44,16 @@ public void renderOn(HtmlCanvas html) throws IOException {
.html(lang("en"))
.render(new Header())
.body()
.div(class_("container-fluid"))
.div(class_("container-fluid").style("padding: 0;"))
.div(class_("row"))
.render(new MenuBar())
._div()
.div(class_("row justify-content-center"))
.button(class_("btn btn-primary col-6").style("height: 50px;").onClick("window.location.href='/singleView'"))
.content("Single Page View (Beta)")
._div()
.if_(!external)
.div(class_("row justify-content-center"))
.button(class_("btn btn-primary col-6").style("height: 50px;").onClick("window.location.href='/singleView'"))
.content("Single Page View (Beta)")
._div()
._if()
.div(class_("row mt-3 mb-3"))
.div(class_("col"))
.div(class_("card"))
Expand All @@ -58,6 +67,7 @@ public void renderOn(HtmlCanvas html) throws IOException {
._div()
._div()
._div()
.if_(!external)
.div(class_("row mb-3"))
.div(class_("col"))
.div(class_("card"))
Expand All @@ -68,7 +78,7 @@ public void renderOn(HtmlCanvas html) throws IOException {
._h4()
._div()
.render_if(new AddedOrDeletedFiles(comparator.getRemovedFilesName()),
comparator.getRemovedFilesName().size() > 0)
!comparator.getRemovedFilesName().isEmpty())
._div()
._div()
.div(class_("col"))
Expand All @@ -80,10 +90,11 @@ public void renderOn(HtmlCanvas html) throws IOException {
._h4()
._div()
.render_if(new AddedOrDeletedFiles(comparator.getAddedFilesName()),
comparator.getAddedFilesName().size() > 0)
!comparator.getAddedFilesName().isEmpty())
._div()
._div()
._div()
._if()
._div()
._body()
._html();
Expand All @@ -100,7 +111,6 @@ private void renderNode(HtmlCanvas ul, DefaultMutableTreeNode node) throws IOExc
if (node == null) {
return;
}

// Start a list item for this node
HtmlCanvas li = null;
if (!node.isLeaf())
Expand Down Expand Up @@ -150,17 +160,23 @@ else if(isMovedCode(nodeInfo)) {
}
}
ul.tr()
//.td().content(nodeInfo.getName())
.td().a(href("/monaco-page/" + nodeInfo.getId())).img(src(iconPath).width(iconWidth).height(iconHeight)).write(" " + description)._a()._td()
.td(style("white-space: normal; word-wrap: break-word; word-break: break-all;"))
.a(href("/monaco-page/" + nodeInfo.getId()))
.img(src(iconPath).width(iconWidth).height(iconHeight))
.write(" " + description)
._a()
._td()
.if_(!external)
.td()
.div(class_("btn-toolbar justify-content-end"))
.div(class_("btn-group"))
.a(class_("btn btn-primary btn-sm").href("/monaco-page/" + nodeInfo.getId())).content("MonacoDiff")
.a(class_("btn btn-primary btn-sm").href("/vanilla-diff/" + nodeInfo.getId())).content("ClassicDiff")
._div()
._div()
._div() // Close btn-group
._div() // Close btn-toolbar
._td()
._tr();
._if()
._tr();
}
else {
li.summary().content(nodeInfo.getName());
Expand Down Expand Up @@ -216,18 +232,22 @@ private AddedOrDeletedFiles(Set<String> files) {

@Override
public void renderOn(HtmlCanvas html) throws IOException {
HtmlCanvas tbody = html
.table(class_("table card-table table-striped table-condensed mb-0"))
.tbody();
html
.div(class_("row"))
.div(class_("col-md-12"))
.table(class_("table card-table table-striped table-condensed mb-0"))
.tbody();
for (String filename : files) {
tbody
.tr()
html
.tr()
.td().content(filename)
._tr();
._tr();
}
tbody
._tbody()
._table();
html
._tbody()
._table()
._div()
._div();
}
}

Expand Down
201 changes: 201 additions & 0 deletions src/main/java/gui/webdiff/MonacoDiffViewCore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
package gui.webdiff;

import com.github.gumtreediff.actions.Diff;
import com.github.gumtreediff.actions.TreeClassifier;
import com.github.gumtreediff.matchers.MappingStore;
import com.github.gumtreediff.tree.Tree;
import org.refactoringminer.astDiff.actions.classifier.ExtendedTreeClassifier;
import org.refactoringminer.astDiff.actions.model.MultiMove;
import org.refactoringminer.astDiff.models.ASTDiff;
import org.rendersnake.HtmlCanvas;

import java.io.IOException;

import static org.rendersnake.HtmlAttributesFactory.class_;
import static org.rendersnake.HtmlAttributesFactory.id;

/* Created by pourya on 2024-07-05*/
public class MonacoDiffViewCore {
public MonacoDiffViewCore(Diff diff, int id) {
this.diff = diff;
this.id = id;
if (diff instanceof ASTDiff){
this.srcFileName = ((ASTDiff) diff).getSrcPath();
this.dstFileName = ((ASTDiff) diff).getDstPath();
}
}

private final Diff diff;
private final int id;
private String srcFileName;
private String dstFileName;

void addDiffContainers(HtmlCanvas html) throws IOException {
html
.div(class_("row h-100"))
.div(class_("col-6 h-100"))
.h6().content(srcFileName)
.div(id("left-container").style("height: calc(100% - 80px); border:1px solid grey;"))._div()
._div()
.div(class_("col-6 h-100"))
.h6().content(dstFileName)
.div(id("right-container").style("height: calc(100% - 80px); border:1px solid grey;"))._div()
._div();
}

String getLeftJsConfig() {
if (diff instanceof ASTDiff) {
ExtendedTreeClassifier c = (ExtendedTreeClassifier) diff.createRootNodesClassifier();
StringBuilder b = new StringBuilder();
b.append("{");
b.append("url:").append("\"/left/" + id + "\"").append(",");
b.append("ranges: [");
for (Tree t : diff.src.getRoot().preOrder()) {
if (c.getMovedSrcs().contains(t))
appendRange(b, t, "moved", null);
if (c.getUpdatedSrcs().contains(t))
appendRange(b, t, "updated", null);
if (c.getDeletedSrcs().contains(t))
appendRange(b, t, "deleted", null);
if (c.getSrcMoveOutTreeMap().containsKey(t))
appendRange(b, t, "moveOut", c.getSrcMoveOutTreeMap().get(t).toString());
if (c.getMultiMapSrc().containsKey(t)) {
String tag = "mm";
boolean _isUpdated = ((MultiMove) (c.getMultiMapSrc().get(t))).isUpdated();
if (_isUpdated) {
tag += " updOnTop";
}
appendRange(b, t, tag, null);
}
}
b.append("]").append(",");
b.append("}");
return b.toString();
}
else {
TreeClassifier c = diff.createRootNodesClassifier();
StringBuilder b = new StringBuilder();
b.append("{");
b.append("url:").append("\"/left/" + id + "\"").append(",");
b.append("ranges: [");
for (Tree t: diff.src.getRoot().preOrder()) {
if (c.getMovedSrcs().contains(t))
appendRange(b, t, "moved","");
if (c.getUpdatedSrcs().contains(t))
appendRange(b, t, "updated","");
if (c.getDeletedSrcs().contains(t))
appendRange(b, t, "deleted","");
}
b.append("]").append(",");
b.append("}");
return b.toString();
}
}

String getRightJsConfig() {
if (diff instanceof ASTDiff) {
ExtendedTreeClassifier c = (ExtendedTreeClassifier) diff.createRootNodesClassifier();
StringBuilder b = new StringBuilder();
b.append("{");
b.append("url:").append("\"/right/" + id + "\"").append(",");
b.append("ranges: [");
for (Tree t : diff.dst.getRoot().preOrder()) {
if (c.getMovedDsts().contains(t))
appendRange(b, t, "moved", null);
if (c.getUpdatedDsts().contains(t))
appendRange(b, t, "updated", null);
if (c.getInsertedDsts().contains(t))
appendRange(b, t, "inserted", null);
if (c.getDstMoveInTreeMap().containsKey(t))
appendRange(b, t, "moveIn", c.getDstMoveInTreeMap().get(t).toString());
if (c.getMultiMapDst().containsKey(t)) {
String tag = "mm";
boolean _isUpdated = ((MultiMove) (c.getMultiMapDst().get(t))).isUpdated();
if (_isUpdated) {
tag += " updOnTop";
}
appendRange(b, t, tag, null);
}
}
b.append("]").append(",");
b.append("}");
return b.toString();
}
else{
TreeClassifier c = diff.createRootNodesClassifier();
StringBuilder b = new StringBuilder();
b.append("{");
b.append("url:").append("\"/right/" + id + "\"").append(",");
b.append("ranges: [");
for (Tree t: diff.dst.getRoot().preOrder()) {
if (c.getMovedDsts().contains(t))
appendRange(b, t, "moved","");
if (c.getUpdatedDsts().contains(t))
appendRange(b, t, "updated","");
if (c.getInsertedDsts().contains(t))
appendRange(b, t, "inserted","");
}
b.append("]").append(",");
b.append("}");
return b.toString();
}
}

String getMappingsJsConfig() {
if (diff instanceof ASTDiff) {
ASTDiff astDiff = (ASTDiff) diff;
MappingStore monoMappingStore = astDiff.getAllMappings().getMonoMappingStore();
ExtendedTreeClassifier c = (ExtendedTreeClassifier) diff.createRootNodesClassifier();
StringBuilder b = new StringBuilder();
b.append("[");
for (Tree t : diff.src.getRoot().preOrder()) {
if (c.getMovedSrcs().contains(t) || c.getUpdatedSrcs().contains(t)) {
Tree d = ((ASTDiff)diff).getAllMappings().getDsts(t).iterator().next();
b.append(String.format("[%s, %s, %s, %s], ", t.getPos(), t.getEndPos(), d.getPos(), d.getEndPos()));
}
else {
if (monoMappingStore.isSrcMapped(t)) {
b.append(String.format("[%s, %s, %s, %s], ",
t.getPos(),
t.getEndPos(),
monoMappingStore.getDstForSrc(t).getPos(),
monoMappingStore.getDstForSrc(t).getEndPos()));
}
}
}
b.append("]").append(",");
return b.toString();
}
else {
TreeClassifier c = diff.createRootNodesClassifier();
StringBuilder b = new StringBuilder();
b.append("[");
for (Tree t: diff.src.getRoot().preOrder()) {
if (c.getMovedSrcs().contains(t) || c.getUpdatedSrcs().contains(t)) {

Tree d = diff.mappings.getDstForSrc(t);
b.append(String.format("[%s, %s, %s, %s], ", t.getPos(), t.getEndPos(), d.getPos(), d.getEndPos()));
}
}
b.append("]").append(",");
return b.toString();
}
}

private void appendRange(StringBuilder b, Tree t, String kind, String tip) {
String tooltip = tooltip(t);
if (tip != null) tooltip = tip;
b.append("{")
.append("from: ").append(t.getPos())
.append(",").append("to: ").append(t.getEndPos()).append(",")
.append("index: ").append(t.getMetrics().depth).append(",")
.append("kind: ").append("\"" + kind + "\"").append(",")
.append("tooltip: ").append("\"" + tooltip + "\"").append(",")
.append("}").append(",");
}

private static String tooltip(Tree t) {
return (t.getParent() != null)
? t.getParent().getType() + "/" + t.getType() + "/" + t.getPos() + "/" + t.getEndPos() : t.getType().toString() + t.getPos() + t.getEndPos();
}
}
Loading

0 comments on commit 4cc313f

Please sign in to comment.