From 599da6a9321084e0ceda57fe1e2e8c3d66a8daa9 Mon Sep 17 00:00:00 2001 From: quynh921999 <37545540+quynh921999@users.noreply.github.com> Date: Mon, 22 Mar 2021 22:03:47 +0700 Subject: [PATCH 1/6] new parser for xml file in mybatis --- .../cia/java/project/JavaProject.java | 5 +- .../cia/java/jdt/ProjectBuilders.java | 7 +- .../cia/java/jdt/project/Project.java | 7 +- .../java/jdt/project/builder/JavaNodes.java | 173 +++++++++++++++++- .../project/builder/JavaSnapshotBuilder.java | 7 +- .../project/builder/JavaSnapshotParser.java | 69 +++++-- .../cia/java/jdt/tree/node/RootNode.java | 1 + .../cia/java/jdt/tree/node/XMLNode.java | 1 + .../test/java/mrmathami/cia/java/jdt/X.java | 10 +- .../test/java/mrmathami/cia/java/jdt/Y.java | 15 +- .../test/java/mrmathami/cia/java/jdt/Z.java | 7 +- 11 files changed, 267 insertions(+), 35 deletions(-) diff --git a/core/src/main/java/mrmathami/cia/java/project/JavaProject.java b/core/src/main/java/mrmathami/cia/java/project/JavaProject.java index 190a8b7..25ed336 100644 --- a/core/src/main/java/mrmathami/cia/java/project/JavaProject.java +++ b/core/src/main/java/mrmathami/cia/java/project/JavaProject.java @@ -22,7 +22,10 @@ import mrmathami.cia.java.JavaCiaException; import mrmathami.cia.java.tree.dependency.JavaDependencyWeightTable; import mrmathami.utils.Pair; +import org.xml.sax.SAXException; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; import java.nio.file.Path; import java.util.List; import java.util.Map; @@ -52,7 +55,7 @@ public interface JavaProject { @Nonnull JavaProjectSnapshot createSnapshot(@Nonnull String snapshotName, @Nonnull Map>> javaSources, @Nonnull List classPaths, - @Nonnull JavaDependencyWeightTable dependencyWeightTable, boolean enableRecovery) throws JavaCiaException; + @Nonnull JavaDependencyWeightTable dependencyWeightTable, boolean enableRecovery, Path configurationPath) throws JavaCiaException, ParserConfigurationException, SAXException, IOException; /** * @param comparisonName comparison name diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/ProjectBuilders.java b/jdt/src/main/java/mrmathami/cia/java/jdt/ProjectBuilders.java index dc29c4e..2fc23e0 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/ProjectBuilders.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/ProjectBuilders.java @@ -28,7 +28,10 @@ import mrmathami.cia.java.project.JavaProjectSnapshotComparison; import mrmathami.cia.java.tree.dependency.JavaDependencyWeightTable; import mrmathami.utils.Pair; +import org.xml.sax.SAXException; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; import java.nio.file.Path; import java.util.List; import java.util.Map; @@ -46,8 +49,8 @@ public static JavaProject createProject(@Nonnull String name) { @Nonnull public static JavaProjectSnapshot createProjectSnapshot(@Nonnull String snapshotName, @Nonnull Map>> javaSources, @Nonnull List classPaths, - @Nonnull JavaDependencyWeightTable dependencyWeightTable, boolean enableRecovery) throws JavaCiaException { - return JavaSnapshotBuilder.build(snapshotName, javaSources, classPaths, dependencyWeightTable, enableRecovery); + @Nonnull JavaDependencyWeightTable dependencyWeightTable, boolean enableRecovery, Path configurationPath) throws JavaCiaException, ParserConfigurationException, SAXException, IOException { + return JavaSnapshotBuilder.build(snapshotName, javaSources, classPaths, dependencyWeightTable, enableRecovery, configurationPath); } @Nonnull diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/Project.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/Project.java index c1efec6..e7ec864 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/Project.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/Project.java @@ -27,7 +27,10 @@ import mrmathami.cia.java.project.JavaProjectSnapshotComparison; import mrmathami.cia.java.tree.dependency.JavaDependencyWeightTable; import mrmathami.utils.Pair; +import org.xml.sax.SAXException; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; import java.io.Serializable; import java.nio.file.Path; import java.util.Collections; @@ -82,9 +85,9 @@ public List getSnapshotComparisons() { @Override public JavaProjectSnapshot createSnapshot(@Nonnull String snapshotName, @Nonnull Map>> javaSources, @Nonnull List classPaths, - @Nonnull JavaDependencyWeightTable dependencyWeightTable, boolean enableRecovery) throws JavaCiaException { + @Nonnull JavaDependencyWeightTable dependencyWeightTable, boolean enableRecovery, Path configurationPath) throws JavaCiaException, ParserConfigurationException, SAXException, IOException { final ProjectSnapshot snapshot = JavaSnapshotBuilder.build( - snapshotName, javaSources, classPaths, dependencyWeightTable, enableRecovery); + snapshotName, javaSources, classPaths, dependencyWeightTable, enableRecovery, configurationPath); snapshots.add(snapshot); return snapshot; } diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java index 9bd8a72..71d1ab5 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java @@ -23,11 +23,14 @@ import org.eclipse.jface.text.IDocument; import org.eclipse.text.edits.MalformedTreeException; import org.eclipse.text.edits.TextEdit; +import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import org.w3c.dom.traversal.DocumentTraversal; import org.w3c.dom.traversal.NodeFilter; import org.w3c.dom.traversal.TreeWalker; +import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; import java.util.IdentityHashMap; @@ -44,8 +47,6 @@ final class JavaNodes { @Nonnull private final JavaDependencies dependencies = new JavaDependencies(); @Nonnull private final JavaAnnotates annotates = new JavaAnnotates(dependencies); @Nonnull private final JavaTypes types = new JavaTypes(dependencies, annotates); - - @Nonnull private final RootNode rootNode = new RootNode(); @Nonnull private final Map> packageNodeMap = new HashMap<>(); @@ -59,6 +60,7 @@ final class JavaNodes { @Nonnull private final List> delayedDependencyWalkers = new LinkedList<>(); @Nullable private Set perFileNodeSet; + private Map mapXMlDependency; JavaNodes(@Nonnull CodeFormatter formatter, boolean enableRecovery) { @@ -66,9 +68,10 @@ final class JavaNodes { this.enableRecovery = enableRecovery; } - void build(@Nonnull Set perFileNodeSet, @Nonnull CompilationUnit compilationUnit) + void build(@Nonnull Set perFileNodeSet, @Nonnull CompilationUnit compilationUnit, Map mapXMlDependency) throws JavaCiaException { this.perFileNodeSet = perFileNodeSet; + this.mapXMlDependency = mapXMlDependency; final PackageDeclaration packageDeclaration = compilationUnit.getPackage(); if (packageDeclaration != null) { @@ -86,11 +89,11 @@ void build(@Nonnull Set perFileNodeSet, @Nonnull CompilationUnit c } } } - this.perFileNodeSet = null; } - void build(@Nonnull Set perFileNodeSet, @Nonnull org.w3c.dom.Document document, String pathFile) throws JavaCiaException { + //for xml file in src + void build(@Nonnull Set perFileNodeSet, @Nonnull org.w3c.dom.Document document, String pathFile) { this.perFileNodeSet = perFileNodeSet; DocumentTraversal traversal = (DocumentTraversal) document; PackageNode packageNode = createPackageNodeFromPath(pathFile); @@ -124,6 +127,151 @@ private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isF walker.setCurrentNode(currentNode); } + //for mapper file + void build(@Nonnull Set perFileNodeSet, @Nonnull org.w3c.dom.Document document, String pathFile, Map mapXMlDependency) { + this.perFileNodeSet = perFileNodeSet; + + DocumentTraversal traversal = (DocumentTraversal) document; + PackageNode packageNode = createPackageNodeFromPath(pathFile); + + TreeWalker walker = traversal.createTreeWalker(document.getDocumentElement(), + NodeFilter.SHOW_ELEMENT, null, true); + + XMLNode rootNode = packageNode.createChildXMlNode(document.getDocumentElement().getNodeName(), document.getDocumentElement().getTextContent(), document.getDocumentElement().getChildNodes(), + document.getDocumentElement().getAttributes()); + + String namespace = document.getDocumentElement().getAttribute("namespace"); + if (namespace.contains(".")) { + mapXMlDependency.put(namespace, rootNode); + traverseLevel(walker, rootNode, false, mapXMlDependency); + } else { + traverseLevel(walker, rootNode, false, mapXMlDependency, namespace); + } + + dependencies.createDependencyToNode(packageNode, rootNode, JavaDependency.MEMBER); + perFileNodeSet.add(rootNode); + + dependencies.createDependencyToNode(mapXMlDependency.get(pathFile), rootNode, JavaDependency.USE); + this.perFileNodeSet = null; + } + + private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, Map mapXMlDependency) { + Node currentNode = walker.getCurrentNode(); + if (!isFirstChild) { + for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { + traverseLevel(walker, parent, true, mapXMlDependency); + } + } else { + XMLNode xmlNode = parent.createChildXMlNode(currentNode.getNodeName(), currentNode.getTextContent(), currentNode.getChildNodes(), currentNode.getAttributes()); + NamedNodeMap listAttributes = xmlNode.getAttributes(); + for (int i = 0; i < listAttributes.getLength(); i++) { + if (listAttributes.item(i).getNodeName().equals("parameterType") || listAttributes.item(i).getNodeName().equals("resultType")) { + if (mapXMlDependency.containsKey(listAttributes.item(i).getNodeValue())) { + dependencies.createDependencyToNode(xmlNode, mapXMlDependency.get(listAttributes.item(i).getNodeValue()), JavaDependency.USE); + } + } + } + for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { + traverseLevel(walker, xmlNode, true, mapXMlDependency); + } + } + walker.setCurrentNode(currentNode); + } + + private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, Map mapXMlDependency, String namespace) { + Node currentNode = walker.getCurrentNode(); + if (!isFirstChild) { + for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { + traverseLevel(walker, parent, true, mapXMlDependency, namespace); + } + } else { + XMLNode xmlNode = parent.createChildXMlNode(currentNode.getNodeName(), currentNode.getTextContent(), currentNode.getChildNodes(), currentNode.getAttributes()); + NamedNodeMap listAttributes = xmlNode.getAttributes(); + for (int i = 0; i < listAttributes.getLength(); i++) { + if (listAttributes.item(i).getNodeName().equals("parameterType") || listAttributes.item(i).getNodeName().equals("resultType")) { + if (mapXMlDependency.containsKey(listAttributes.item(i).getNodeValue())) { + dependencies.createDependencyToNode(xmlNode, mapXMlDependency.get(listAttributes.item(i).getNodeValue()), JavaDependency.USE); + } + } else if (listAttributes.item(i).getNodeName().equals("id")) { + mapXMlDependency.put(namespace + "." + listAttributes.item(i).getNodeValue(), xmlNode); + } + } + for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { + traverseLevel(walker, xmlNode, true, mapXMlDependency, namespace); + } + } + walker.setCurrentNode(currentNode); + } + + //for configuration is not in src + void build(org.w3c.dom.Document document, @Nonnull String[] sourcePathArray, Map mapXMLDependency, Path sourcePath) { + XMLNode rootXMLNode = rootNode.createChildXMlNode(document.getDocumentElement().getNodeName(), document.getDocumentElement().getTextContent(), + document.getDocumentElement().getChildNodes(), document.getDocumentElement().getAttributes()); + mapXMLDependency.put(String.valueOf(sourcePath.getFileName()), rootXMLNode); + + DocumentTraversal traversal = (DocumentTraversal) document; + TreeWalker walker = traversal.createTreeWalker(document.getDocumentElement(), + NodeFilter.SHOW_ELEMENT, null, true); + traverseLevel(walker, rootXMLNode, false, sourcePathArray, mapXMLDependency); + dependencies.createDependencyToNode(rootNode, rootXMLNode, JavaDependency.MEMBER); + } + + private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, String[] sourcePathArray, Map mapXMLDependency) { + Node currentNode = walker.getCurrentNode(); + if (!isFirstChild) { + for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { + traverseLevel(walker, parent, true, sourcePathArray, mapXMLDependency); + } + } else { + XMLNode xmlNode = parent.createChildXMlNode(currentNode.getNodeName(), currentNode.getTextContent(), currentNode.getChildNodes(), currentNode.getAttributes()); + if (xmlNode.getNodeName().equals("typeAlias")) { + NamedNodeMap listAttributes = xmlNode.getAttributes(); + for (int i = 0; i < listAttributes.getLength(); i++) { + if (listAttributes.item(i).getNodeName().equals("alias")) { + mapXMLDependency.putIfAbsent(listAttributes.item(i).getNodeValue(), xmlNode); + } else if (listAttributes.item(i).getNodeName().equals("type")) { + mapXMLDependency.putIfAbsent(listAttributes.item(i).getNodeValue(), xmlNode); + } + } + } else if (xmlNode.getNodeName().equals("mapper")) { + NamedNodeMap listAttributes = xmlNode.getAttributes(); + for (int i = 0; i < listAttributes.getLength(); i++) { + if (listAttributes.item(i).getNodeName().equals("resource")) { + String value = listAttributes.item(i).getNodeValue(); + String path = convertResourceToPath(sourcePathArray, value); + mapXMLDependency.putIfAbsent(path, xmlNode); + } + } + } + for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { + traverseLevel(walker, xmlNode, true, sourcePathArray, mapXMLDependency); + } + } + walker.setCurrentNode(currentNode); + } + + + public static String convertResourceToPath(@Nonnull String[] sourcePathArray, String resource) { + String fullPath = ""; + for (String sourcePath : sourcePathArray) { + String[] temp = resource.split("/"); + boolean sign = true; + for (String s : temp) { + if (!sourcePath.contains(s)) { + sign = false; + } + } + if (sign) { + fullPath = sourcePath; + } + } + return fullPath; + } + + public RootNode getRootNode() { + return rootNode; + } + @Nonnull RootNode postprocessing() throws JavaCiaException { // delay dependency walkers @@ -388,6 +536,10 @@ private void parseClassTypeDeclaration(@Nonnull AbstractNode parentNode, final ClassNode classNode = parentNode.createChildClass(typeBinding.getName(), typeBinding.getBinaryName()); dependencies.createDependencyToNode(parentNode, classNode, JavaDependency.MEMBER); + if (mapXMlDependency.containsKey(classNode.getBinaryName())) { + dependencies.createDependencyToNode(mapXMlDependency.get(classNode.getBinaryName()), classNode, JavaDependency.USE); + } + // add to node set assert perFileNodeSet != null; perFileNodeSet.add(classNode); @@ -395,6 +547,7 @@ private void parseClassTypeDeclaration(@Nonnull AbstractNode parentNode, internalParseClassTypeBinding(classNode, typeBinding, typeDeclaration.bodyDeclarations()); } + private void internalParseClassTypeBinding(@Nonnull ClassNode classNode, @Nonnull ITypeBinding typeBinding, @Nonnull List bodyDeclarations) throws JavaCiaException { // put binding map @@ -442,6 +595,10 @@ private void parseInterfaceTypeDeclaration(@Nonnull AbstractNode parentNode, @No .createChildInterface(typeBinding.getName(), typeBinding.getBinaryName()); dependencies.createDependencyToNode(parentNode, interfaceNode, JavaDependency.MEMBER); + if (mapXMlDependency.containsKey(interfaceNode.getBinaryName())) { + dependencies.createDependencyToNode(mapXMlDependency.get(interfaceNode.getBinaryName()), interfaceNode, JavaDependency.USE); + } + // add to node set assert perFileNodeSet != null; perFileNodeSet.add(interfaceNode); @@ -814,6 +971,12 @@ private void parseMethodDeclaration(@Nonnull AbstractNode parentNode, if (methodDeclarationBody != null) { methodNode.setBodyBlock( format(methodDeclarationBody.toString(), CodeFormatter.K_STATEMENTS)); + for (String key : mapXMlDependency.keySet()) { + if (key.contains(".") && methodNode.getBodyBlock().contains(key)) { + System.out.println("key: " + key); + dependencies.createDependencyToNode(methodNode, mapXMlDependency.get(key), JavaDependency.USE); + } + } walkDeclaration(methodDeclarationBody, methodNode, methodNode); } } diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotBuilder.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotBuilder.java index 89645bd..d95a841 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotBuilder.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotBuilder.java @@ -27,7 +27,10 @@ import mrmathami.cia.java.tree.node.JavaNode; import mrmathami.cia.java.tree.node.JavaRootNode; import mrmathami.utils.Pair; +import org.xml.sax.SAXException; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; import java.nio.file.Path; import java.util.List; import java.util.Map; @@ -41,9 +44,9 @@ private JavaSnapshotBuilder() { @Nonnull public static ProjectSnapshot build(@Nonnull String snapshotName, @Nonnull Map>> javaSources, @Nonnull List classPaths, - @Nonnull JavaDependencyWeightTable dependencyWeightMap, boolean enableRecovery) throws JavaCiaException { + @Nonnull JavaDependencyWeightTable dependencyWeightMap, boolean enableRecovery, Path configurationPath) throws JavaCiaException, IOException, SAXException, ParserConfigurationException { - final JavaRootNode rootNode = JavaSnapshotParser.build(javaSources, classPaths, enableRecovery); + final JavaRootNode rootNode = JavaSnapshotParser.build(javaSources, classPaths, enableRecovery, configurationPath); final double[] dependencyWeights = new double[JavaDependency.valueList.size()]; for (final JavaDependency type : JavaDependency.valueList) { diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java index f3c51a7..d83cdc5 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java @@ -23,6 +23,7 @@ import mrmathami.cia.java.JavaCiaException; import mrmathami.cia.java.jdt.tree.node.AbstractNode; import mrmathami.cia.java.jdt.tree.node.RootNode; +import mrmathami.cia.java.jdt.tree.node.XMLNode; import mrmathami.cia.java.tree.node.JavaRootNode; import mrmathami.utils.Pair; import org.eclipse.jdt.core.JavaCore; @@ -40,7 +41,6 @@ import java.nio.charset.StandardCharsets; import java.nio.file.LinkOption; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -63,6 +63,8 @@ final class JavaSnapshotParser extends FileASTRequestor { @Nonnull private final Map> sourceNodeMap = new HashMap<>(); + private static Map mapXMlDependency = new HashMap<>(); + @Nullable private JavaCiaException exception; @@ -72,10 +74,9 @@ private JavaSnapshotParser(@Nonnull Map sourceNameMap, @Nonnull this.nodes = new JavaNodes(codeFormatter, enableRecovery); } - @Nonnull static JavaRootNode build(@Nonnull Map>> javaSources, @Nonnull List classPaths, - boolean enableRecovery) throws JavaCiaException { + boolean enableRecovery, Path configurationPath) throws JavaCiaException { final List classPathList = new ArrayList<>(classPaths.size() + javaSources.size()); final List projectFileList = new ArrayList<>(); @@ -104,12 +105,12 @@ static JavaRootNode build(@Nonnull Map>> javaSourc final String[] classPathArray = classPathList.toArray(EMPTY); - return parse(sourcePathArray, sourceEncodingArray, classPathArray, sourceNameMap, enableRecovery); + return parse(sourcePathArray, sourceEncodingArray, classPathArray, sourceNameMap, enableRecovery, configurationPath); } @Nonnull private static JavaRootNode parse(@Nonnull String[] sourcePathArray, @Nonnull String[] sourceEncodingArray, - @Nonnull String[] classPathArray, @Nonnull Map sourceNameMap, boolean enableRecovery) + @Nonnull String[] classPathArray, @Nonnull Map sourceNameMap, boolean enableRecovery, Path configuration) throws JavaCiaException { final ASTParser astParser = ASTParser.newParser(AST.JLS14); @@ -125,12 +126,54 @@ private static JavaRootNode parse(@Nonnull String[] sourcePathArray, @Nonnull St final CodeFormatter codeFormatter = ToolFactory.createCodeFormatter(options, ToolFactory.M_FORMAT_EXISTING); final JavaSnapshotParser parser = new JavaSnapshotParser(sourceNameMap, codeFormatter, enableRecovery); + + parser.acceptXMlConfig(configuration, sourcePathArray, mapXMlDependency); + parser.acceptXMlMapper(mapXMlDependency); + astParser.createASTs(sourcePathArray, sourceEncodingArray, EMPTY, parser, null); // TODO: add source name info to tree return parser.postProcessing(); } + public void acceptXMlConfig(@Nonnull Path sourcePath, @Nonnull String[] sourcePathArray, Map mapXMlDependency) { + if (exception != null) return; + try { + Document doc = parseXML(sourcePath); + nodes.build(doc, sourcePathArray, mapXMlDependency, sourcePath); + } catch (ParserConfigurationException | IOException | SAXException e) { + e.printStackTrace(); + } + } + + public void acceptXMlMapper(Map mapXMlDependency) { + List listMapperPaths = new ArrayList<>(); + for (String path : mapXMlDependency.keySet()) { + if (path.endsWith(".xml") && path.contains("\\")) { + System.out.println("mapper file path: " + path); + listMapperPaths.add(path); + } + } + for (String path : listMapperPaths) { + if (exception != null) return; + try { + final String sourceName = sourceNameMap.get(path); + if (sourceName == null) throw new JavaCiaException("Unknown source path!"); + final Set perFileNodeSet + = sourceNodeMap.computeIfAbsent(sourceName, JavaSnapshotParser::createLinkedHashSet); + + Document doc = parseXML(Path.of(path)); + nodes.build(perFileNodeSet, doc, path, mapXMlDependency); + + } catch (JavaCiaException javaCiaException) { + exception = javaCiaException; + } catch (ParserConfigurationException | IOException | SAXException e) { + e.printStackTrace(); + } + } + } + + @Override public void acceptAST(@Nonnull String sourcePath, @Nonnull CompilationUnit compilationUnit) { if (exception != null) return; @@ -139,29 +182,32 @@ public void acceptAST(@Nonnull String sourcePath, @Nonnull CompilationUnit compi if (sourceName == null) throw new JavaCiaException("Unknown source path!"); final Set perFileNodeSet = sourceNodeMap.computeIfAbsent(sourceName, JavaSnapshotParser::createLinkedHashSet); + //for xml file - if (sourcePath.endsWith(".xml")) { - Document doc = parseXML(sourcePath); + if (sourcePath.endsWith(".xml") && !mapXMlDependency.containsKey(sourcePath)) { + Document doc = parseXML(Path.of(sourcePath)); nodes.build(perFileNodeSet, doc, sourcePath); + //for java file } else { - nodes.build(perFileNodeSet, compilationUnit); + nodes.build(perFileNodeSet, compilationUnit, mapXMlDependency); } } catch (JavaCiaException exception) { this.exception = exception; - } catch (SAXException | IOException | ParserConfigurationException e) { + } catch (ParserConfigurationException | IOException | SAXException e) { e.printStackTrace(); } } - private static Document parseXML(String sourcePath) throws ParserConfigurationException, IOException, SAXException { + + private static Document parseXML(Path sourcePath) throws ParserConfigurationException, IOException, SAXException { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); dbf.setIgnoringComments(true); dbf.setCoalescing(true); dbf.setIgnoringElementContentWhitespace(true); DocumentBuilder db = dbf.newDocumentBuilder(); - Document doc = db.parse(Paths.get(sourcePath).toFile()); + Document doc = db.parse(sourcePath.toFile()); doc.normalizeDocument(); return doc; } @@ -172,6 +218,7 @@ private RootNode postProcessing() throws JavaCiaException { return nodes.postprocessing(); } + //region Misc @Nonnull diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/RootNode.java b/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/RootNode.java index fac35d7..7d14c6e 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/RootNode.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/RootNode.java @@ -108,6 +108,7 @@ public List getAllNodes() { return isFrozen() ? allNodes : Collections.unmodifiableList(allNodes); } + // void setAllNodes(@Nonnull List allNodes) { // checkFrozen(); // this.allNodes = allNodes; diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/XMLNode.java b/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/XMLNode.java index 1595d55..9cb2f76 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/XMLNode.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/XMLNode.java @@ -103,5 +103,6 @@ private static String internalToReferenceJson(NamedNodeMap namedNodeMap) { return listAttributes; } + //endregion Jsonify } diff --git a/jdt/src/test/java/mrmathami/cia/java/jdt/X.java b/jdt/src/test/java/mrmathami/cia/java/jdt/X.java index 35c73a3..ad26386 100644 --- a/jdt/src/test/java/mrmathami/cia/java/jdt/X.java +++ b/jdt/src/test/java/mrmathami/cia/java/jdt/X.java @@ -7,7 +7,9 @@ import mrmathami.cia.java.tree.dependency.JavaDependency; import mrmathami.cia.java.tree.dependency.JavaDependencyWeightTable; import mrmathami.utils.Pair; +import org.xml.sax.SAXException; +import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.ObjectOutputStream; import java.nio.charset.StandardCharsets; @@ -34,7 +36,7 @@ public class X { JavaDependency.OVERRIDE, 0.3 )); - public static void main(String[] args) throws JavaCiaException, IOException { + public static void main(String[] args) throws JavaCiaException, IOException, ParserConfigurationException, SAXException { // System.in.read(); // // for (int i = 0; i < 10; i++) { @@ -44,13 +46,15 @@ public static void main(String[] args) throws JavaCiaException, IOException { final Path javaSourcePathB = Path.of("D:\\test-weight-1806\\test1\\new\\src\\src"); final List fileNamesA = getFileList(new ArrayList<>(), javaSourcePathA); final List fileNamesB = getFileList(new ArrayList<>(), javaSourcePathB); + final Path configurationPathA = Path.of(""); + final Path configurationPathB = Path.of(""); final long timeStart = System.nanoTime(); final JavaProjectSnapshot projectSnapshotA = ProjectBuilders.createProjectSnapshot("JSON-java-before", - Map.of("main", Pair.immutableOf(javaSourcePathA, fileNamesA)), List.of(), DEPENDENCY_WEIGHT_TABLE, true); + Map.of("main", Pair.immutableOf(javaSourcePathA, fileNamesA)), List.of(), DEPENDENCY_WEIGHT_TABLE, true, configurationPathA); final long timeParseA = System.nanoTime(); final JavaProjectSnapshot projectSnapshotB = ProjectBuilders.createProjectSnapshot("JSON-java-after", - Map.of("main", Pair.immutableOf(javaSourcePathB, fileNamesB)), List.of(), DEPENDENCY_WEIGHT_TABLE, true); + Map.of("main", Pair.immutableOf(javaSourcePathB, fileNamesB)), List.of(), DEPENDENCY_WEIGHT_TABLE, true, configurationPathB); final long timeParseB = System.nanoTime(); final String jsonA = projectSnapshotA.getRootNode().toJson(); diff --git a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java index b832be2..4e99588 100644 --- a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java +++ b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java @@ -5,7 +5,9 @@ import mrmathami.cia.java.tree.dependency.JavaDependency; import mrmathami.cia.java.tree.dependency.JavaDependencyWeightTable; import mrmathami.utils.Pair; +import org.xml.sax.SAXException; +import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.DirectoryStream; @@ -23,11 +25,10 @@ public class Y { JavaDependency.INVOCATION, 4.0, JavaDependency.OVERRIDE, 1.0 )); + private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); + //private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML+interface\\mybatis-example-2\\resources\\SqlMapConfig.xml"); - public static void main(String[] args) throws JavaCiaException, IOException { -// System.in.read(); - -// CodeFormatter + public static void main(String[] args) throws JavaCiaException, IOException, ParserConfigurationException, SAXException { // final Path corePath = Path.of("D:\\project\\JavaCIA\\core\\src\\main\\java"); // final List coreFiles = getFileList(new ArrayList<>(), corePath); @@ -38,8 +39,8 @@ public static void main(String[] args) throws JavaCiaException, IOException { // "jdt", Pair.immutableOf(jdtPath, jdtFiles) // ); - //final Path corePath = Path.of("D:\\project\\LearningStruts\\src\\mrmathami\\struts2\\model"); - final Path corePath = Path.of("D:\\project\\MyBatis Collection\\LearningStruts\\src"); + final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); + //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML+interface\\mybatis-example-2\\src"); final List coreFiles = getFileList(new ArrayList<>(), corePath); final Map>> javaSources = Map.of( "core", Pair.immutableOf(corePath, coreFiles) @@ -61,7 +62,7 @@ public static void main(String[] args) throws JavaCiaException, IOException { long timeStart = System.nanoTime(); final JavaProjectSnapshot projectSnapshot = ProjectBuilders.createProjectSnapshot("before", - javaSources, List.of(), DEPENDENCY_WEIGHT_TABLE, true); + javaSources, List.of(), DEPENDENCY_WEIGHT_TABLE, true, configurationPath); long timeParseA = System.nanoTime(); final String jsonA = projectSnapshot.getRootNode().toJson(); diff --git a/jdt/src/test/java/mrmathami/cia/java/jdt/Z.java b/jdt/src/test/java/mrmathami/cia/java/jdt/Z.java index 456983d..daa809e 100644 --- a/jdt/src/test/java/mrmathami/cia/java/jdt/Z.java +++ b/jdt/src/test/java/mrmathami/cia/java/jdt/Z.java @@ -5,7 +5,9 @@ import mrmathami.cia.java.tree.dependency.JavaDependency; import mrmathami.cia.java.tree.dependency.JavaDependencyWeightTable; import mrmathami.utils.Pair; +import org.xml.sax.SAXException; +import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.DirectoryStream; @@ -23,8 +25,9 @@ public class Z { JavaDependency.INVOCATION, 4.0, JavaDependency.OVERRIDE, 1.0 )); + private static final Path configurationPath = Path.of(""); - public static void main(String[] args) throws JavaCiaException, IOException { + public static void main(String[] args) throws JavaCiaException, IOException, ParserConfigurationException, SAXException { // System.in.read(); // CodeFormatter @@ -43,7 +46,7 @@ public static void main(String[] args) throws JavaCiaException, IOException { long timeStart = System.nanoTime(); final JavaProjectSnapshot projectSnapshot = ProjectBuilders.createProjectSnapshot("before", - javaSources, classPaths, DEPENDENCY_WEIGHT_TABLE, true); + javaSources, classPaths, DEPENDENCY_WEIGHT_TABLE, true, configurationPath); long timeParseA = System.nanoTime(); final String jsonA = projectSnapshot.getRootNode().toJson(); From 7136779910b64f8a0e385c3a392474da20c7b21f Mon Sep 17 00:00:00 2001 From: quynh921999 <37545540+quynh921999@users.noreply.github.com> Date: Fri, 26 Mar 2021 14:03:23 +0700 Subject: [PATCH 2/6] finish parse 1 version --- .../java/jdt/project/builder/JavaNodes.java | 116 ++++++++++++++---- .../project/builder/JavaSnapshotParser.java | 62 ++++++++-- .../test/java/mrmathami/cia/java/jdt/Y.java | 6 +- 3 files changed, 147 insertions(+), 37 deletions(-) diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java index 71d1ab5..88532aa 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java @@ -32,6 +32,7 @@ import java.nio.file.Path; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.LinkedList; @@ -60,7 +61,7 @@ final class JavaNodes { @Nonnull private final List> delayedDependencyWalkers = new LinkedList<>(); @Nullable private Set perFileNodeSet; - private Map mapXMlDependency; + private Map> mapXMlDependency; JavaNodes(@Nonnull CodeFormatter formatter, boolean enableRecovery) { @@ -68,7 +69,7 @@ final class JavaNodes { this.enableRecovery = enableRecovery; } - void build(@Nonnull Set perFileNodeSet, @Nonnull CompilationUnit compilationUnit, Map mapXMlDependency) + void build(@Nonnull Set perFileNodeSet, @Nonnull CompilationUnit compilationUnit, Map> mapXMlDependency) throws JavaCiaException { this.perFileNodeSet = perFileNodeSet; this.mapXMlDependency = mapXMlDependency; @@ -128,7 +129,7 @@ private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isF } //for mapper file - void build(@Nonnull Set perFileNodeSet, @Nonnull org.w3c.dom.Document document, String pathFile, Map mapXMlDependency) { + void build(@Nonnull Set perFileNodeSet, @Nonnull org.w3c.dom.Document document, String pathFile, Map> mapXMlDependency) { this.perFileNodeSet = perFileNodeSet; DocumentTraversal traversal = (DocumentTraversal) document; @@ -142,7 +143,7 @@ void build(@Nonnull Set perFileNodeSet, @Nonnull org.w3c.dom.Docum String namespace = document.getDocumentElement().getAttribute("namespace"); if (namespace.contains(".")) { - mapXMlDependency.put(namespace, rootNode); + putInMap(mapXMlDependency, namespace, rootNode); traverseLevel(walker, rootNode, false, mapXMlDependency); } else { traverseLevel(walker, rootNode, false, mapXMlDependency, namespace); @@ -151,11 +152,15 @@ void build(@Nonnull Set perFileNodeSet, @Nonnull org.w3c.dom.Docum dependencies.createDependencyToNode(packageNode, rootNode, JavaDependency.MEMBER); perFileNodeSet.add(rootNode); - dependencies.createDependencyToNode(mapXMlDependency.get(pathFile), rootNode, JavaDependency.USE); + if (mapXMlDependency.containsKey(pathFile)) { + for (int i = 0; i < mapXMlDependency.get(pathFile).size(); i++) { + dependencies.createDependencyToNode(mapXMlDependency.get(pathFile).get(i), rootNode, JavaDependency.USE); + } + } this.perFileNodeSet = null; } - private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, Map mapXMlDependency) { + private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, Map> mapXMlDependency) { Node currentNode = walker.getCurrentNode(); if (!isFirstChild) { for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { @@ -164,10 +169,32 @@ private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChi } else { XMLNode xmlNode = parent.createChildXMlNode(currentNode.getNodeName(), currentNode.getTextContent(), currentNode.getChildNodes(), currentNode.getAttributes()); NamedNodeMap listAttributes = xmlNode.getAttributes(); + if (xmlNode.getNodeName().equals("select")) { + for (int i = 0; i < listAttributes.getLength(); i++) { + if (listAttributes.item(i).getNodeName().equals("resultMap")) { + putInMap(mapXMlDependency, listAttributes.item(i).getNodeValue(), xmlNode); + } + } + } + if (xmlNode.getNodeName().equals("resultMap")) { + for (int i = 0; i < listAttributes.getLength(); i++) { + if (listAttributes.item(i).getNodeName().equals("id")) { + String key = listAttributes.item(i).getNodeValue(); + if (mapXMlDependency.containsKey(key)) { + for (int j = 0; j < mapXMlDependency.get(key).size(); j++) { + dependencies.createDependencyToNode(mapXMlDependency.get(key).get(j), xmlNode, JavaDependency.USE); + } + } + } + } + } for (int i = 0; i < listAttributes.getLength(); i++) { if (listAttributes.item(i).getNodeName().equals("parameterType") || listAttributes.item(i).getNodeName().equals("resultType")) { - if (mapXMlDependency.containsKey(listAttributes.item(i).getNodeValue())) { - dependencies.createDependencyToNode(xmlNode, mapXMlDependency.get(listAttributes.item(i).getNodeValue()), JavaDependency.USE); + String key = listAttributes.item(i).getNodeValue(); + if (mapXMlDependency.containsKey(key)) { + for (int j = 0; j < mapXMlDependency.get(key).size(); j++) { + dependencies.createDependencyToNode(xmlNode, mapXMlDependency.get(key).get(j), JavaDependency.USE); + } } } } @@ -178,7 +205,7 @@ private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChi walker.setCurrentNode(currentNode); } - private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, Map mapXMlDependency, String namespace) { + private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, Map> mapXMlDependency, String namespace) { Node currentNode = walker.getCurrentNode(); if (!isFirstChild) { for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { @@ -187,13 +214,39 @@ private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChi } else { XMLNode xmlNode = parent.createChildXMlNode(currentNode.getNodeName(), currentNode.getTextContent(), currentNode.getChildNodes(), currentNode.getAttributes()); NamedNodeMap listAttributes = xmlNode.getAttributes(); + if (xmlNode.getNodeName().equals("select")) { + for (int i = 0; i < listAttributes.getLength(); i++) { + if (listAttributes.item(i).getNodeName().equals("resultMap")) { + putInMap(mapXMlDependency, listAttributes.item(i).getNodeValue(), xmlNode); + } + } + } + if (xmlNode.getNodeName().equals("resultMap")) { + for (int i = 0; i < listAttributes.getLength(); i++) { + if (listAttributes.item(i).getNodeName().equals("id")) { + String key = listAttributes.item(i).getNodeValue(); + if (mapXMlDependency.containsKey(key)) { + for (int j = 0; j < mapXMlDependency.get(key).size(); j++) { + dependencies.createDependencyToNode(mapXMlDependency.get(key).get(j), xmlNode, JavaDependency.USE); + } + } + } + } + } for (int i = 0; i < listAttributes.getLength(); i++) { - if (listAttributes.item(i).getNodeName().equals("parameterType") || listAttributes.item(i).getNodeName().equals("resultType")) { - if (mapXMlDependency.containsKey(listAttributes.item(i).getNodeValue())) { - dependencies.createDependencyToNode(xmlNode, mapXMlDependency.get(listAttributes.item(i).getNodeValue()), JavaDependency.USE); + if (listAttributes.item(i).getNodeName().equals("parameterType") || listAttributes.item(i).getNodeName().equals("resultType") || listAttributes.item(i).getNodeName().equals("type")) { + String value = listAttributes.item(i).getNodeValue(); + if (value.contains(".")) { + putInMap(mapXMlDependency, value, xmlNode); + } + if (mapXMlDependency.containsKey(value) && !value.contains(".")) { + for (int j = 0; j < mapXMlDependency.get(value).size(); j++) { + dependencies.createDependencyToNode(xmlNode, mapXMlDependency.get(value).get(j), JavaDependency.USE); + } } - } else if (listAttributes.item(i).getNodeName().equals("id")) { - mapXMlDependency.put(namespace + "." + listAttributes.item(i).getNodeValue(), xmlNode); + } else if (listAttributes.item(i).getNodeName().equals("id") && !xmlNode.getNodeName().equals("resultMap")) { + String value = listAttributes.item(i).getNodeValue(); + putInMap(mapXMlDependency, "\"" + namespace + "." + value + "\"", xmlNode); } } for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { @@ -203,11 +256,13 @@ private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChi walker.setCurrentNode(currentNode); } + //for configuration is not in src - void build(org.w3c.dom.Document document, @Nonnull String[] sourcePathArray, Map mapXMLDependency, Path sourcePath) { + void build(org.w3c.dom.Document document, @Nonnull String[] sourcePathArray, Map> mapXMLDependency, Path sourcePath) { XMLNode rootXMLNode = rootNode.createChildXMlNode(document.getDocumentElement().getNodeName(), document.getDocumentElement().getTextContent(), document.getDocumentElement().getChildNodes(), document.getDocumentElement().getAttributes()); - mapXMLDependency.put(String.valueOf(sourcePath.getFileName()), rootXMLNode); + String key = String.valueOf(sourcePath.getFileName()); + putInMap(mapXMLDependency, key, rootXMLNode); DocumentTraversal traversal = (DocumentTraversal) document; TreeWalker walker = traversal.createTreeWalker(document.getDocumentElement(), @@ -216,7 +271,7 @@ void build(org.w3c.dom.Document document, @Nonnull String[] sourcePathArray, Map dependencies.createDependencyToNode(rootNode, rootXMLNode, JavaDependency.MEMBER); } - private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, String[] sourcePathArray, Map mapXMLDependency) { + private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, String[] sourcePathArray, Map> mapXMLDependency) { Node currentNode = walker.getCurrentNode(); if (!isFirstChild) { for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { @@ -228,9 +283,9 @@ private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isF NamedNodeMap listAttributes = xmlNode.getAttributes(); for (int i = 0; i < listAttributes.getLength(); i++) { if (listAttributes.item(i).getNodeName().equals("alias")) { - mapXMLDependency.putIfAbsent(listAttributes.item(i).getNodeValue(), xmlNode); + putInMap(mapXMLDependency, listAttributes.item(i).getNodeValue(), xmlNode); } else if (listAttributes.item(i).getNodeName().equals("type")) { - mapXMLDependency.putIfAbsent(listAttributes.item(i).getNodeValue(), xmlNode); + putInMap(mapXMLDependency, listAttributes.item(i).getNodeValue(), xmlNode); } } } else if (xmlNode.getNodeName().equals("mapper")) { @@ -239,7 +294,7 @@ private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isF if (listAttributes.item(i).getNodeName().equals("resource")) { String value = listAttributes.item(i).getNodeValue(); String path = convertResourceToPath(sourcePathArray, value); - mapXMLDependency.putIfAbsent(path, xmlNode); + putInMap(mapXMLDependency, path, xmlNode); } } } @@ -250,6 +305,15 @@ private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isF walker.setCurrentNode(currentNode); } + public static void putInMap(Map> mapXMLDependency, String key, XMLNode xmlNode) { + if (mapXMLDependency.containsKey(key)) { + if (!mapXMLDependency.get(key).contains(xmlNode)) { + mapXMLDependency.get(key).add(xmlNode); + } + } else { + mapXMLDependency.put(key, new ArrayList<>(Arrays.asList(xmlNode))); + } + } public static String convertResourceToPath(@Nonnull String[] sourcePathArray, String resource) { String fullPath = ""; @@ -537,7 +601,9 @@ private void parseClassTypeDeclaration(@Nonnull AbstractNode parentNode, dependencies.createDependencyToNode(parentNode, classNode, JavaDependency.MEMBER); if (mapXMlDependency.containsKey(classNode.getBinaryName())) { - dependencies.createDependencyToNode(mapXMlDependency.get(classNode.getBinaryName()), classNode, JavaDependency.USE); + for (int i = 0; i < mapXMlDependency.get(classNode.getBinaryName()).size(); i++) { + dependencies.createDependencyToNode(mapXMlDependency.get(classNode.getBinaryName()).get(i), classNode, JavaDependency.USE); + } } // add to node set @@ -596,7 +662,9 @@ private void parseInterfaceTypeDeclaration(@Nonnull AbstractNode parentNode, @No dependencies.createDependencyToNode(parentNode, interfaceNode, JavaDependency.MEMBER); if (mapXMlDependency.containsKey(interfaceNode.getBinaryName())) { - dependencies.createDependencyToNode(mapXMlDependency.get(interfaceNode.getBinaryName()), interfaceNode, JavaDependency.USE); + for (int i = 0; i < mapXMlDependency.get(interfaceNode.getBinaryName()).size(); i++) { + dependencies.createDependencyToNode(mapXMlDependency.get(interfaceNode.getBinaryName()).get(i), interfaceNode, JavaDependency.USE); + } } // add to node set @@ -974,7 +1042,9 @@ private void parseMethodDeclaration(@Nonnull AbstractNode parentNode, for (String key : mapXMlDependency.keySet()) { if (key.contains(".") && methodNode.getBodyBlock().contains(key)) { System.out.println("key: " + key); - dependencies.createDependencyToNode(methodNode, mapXMlDependency.get(key), JavaDependency.USE); + for (int i = 0; i < mapXMlDependency.get(key).size(); i++) { + dependencies.createDependencyToNode(methodNode, mapXMlDependency.get(key).get(i), JavaDependency.USE); + } } } walkDeclaration(methodDeclarationBody, methodNode, methodNode); diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java index d83cdc5..66eee1e 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java @@ -34,6 +34,7 @@ import org.w3c.dom.Document; import org.xml.sax.SAXException; +import javax.print.Doc; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -63,7 +64,7 @@ final class JavaSnapshotParser extends FileASTRequestor { @Nonnull private final Map> sourceNodeMap = new HashMap<>(); - private static Map mapXMlDependency = new HashMap<>(); + private static Map> mapXMlDependency = new HashMap<>(); @Nullable private JavaCiaException exception; @@ -76,7 +77,7 @@ private JavaSnapshotParser(@Nonnull Map sourceNameMap, @Nonnull @Nonnull static JavaRootNode build(@Nonnull Map>> javaSources, @Nonnull List classPaths, - boolean enableRecovery, Path configurationPath) throws JavaCiaException { + boolean enableRecovery, Path configurationPath) throws JavaCiaException, IOException, SAXException, ParserConfigurationException { final List classPathList = new ArrayList<>(classPaths.size() + javaSources.size()); final List projectFileList = new ArrayList<>(); @@ -111,7 +112,7 @@ static JavaRootNode build(@Nonnull Map>> javaSourc @Nonnull private static JavaRootNode parse(@Nonnull String[] sourcePathArray, @Nonnull String[] sourceEncodingArray, @Nonnull String[] classPathArray, @Nonnull Map sourceNameMap, boolean enableRecovery, Path configuration) - throws JavaCiaException { + throws JavaCiaException, ParserConfigurationException, SAXException, IOException { final ASTParser astParser = ASTParser.newParser(AST.JLS14); final Map options = JavaCore.getOptions(); @@ -127,8 +128,14 @@ private static JavaRootNode parse(@Nonnull String[] sourcePathArray, @Nonnull St final CodeFormatter codeFormatter = ToolFactory.createCodeFormatter(options, ToolFactory.M_FORMAT_EXISTING); final JavaSnapshotParser parser = new JavaSnapshotParser(sourceNameMap, codeFormatter, enableRecovery); - parser.acceptXMlConfig(configuration, sourcePathArray, mapXMlDependency); - parser.acceptXMlMapper(mapXMlDependency); + if (configuration.toString().equals("")) { + List listMapperPaths = parser.filterMapFiles(sourcePathArray); + parser.acceptXMLMapper(listMapperPaths, mapXMlDependency); + } else { + parser.acceptXMlConfig(configuration, sourcePathArray, mapXMlDependency); + parser.acceptXMlMapper(mapXMlDependency); + } + mapXMlDependency.size(); astParser.createASTs(sourcePathArray, sourceEncodingArray, EMPTY, parser, null); @@ -136,7 +143,21 @@ private static JavaRootNode parse(@Nonnull String[] sourcePathArray, @Nonnull St return parser.postProcessing(); } - public void acceptXMlConfig(@Nonnull Path sourcePath, @Nonnull String[] sourcePathArray, Map mapXMlDependency) { + public List filterMapFiles(@Nonnull String[] sourcePathArray) throws IOException, SAXException, ParserConfigurationException { + List list = new ArrayList<>(); + for (String sourcePath : sourcePathArray) { + if (sourcePath.endsWith(".xml")) { + Document document = parseXML(Path.of(sourcePath)); + String type = document.getDocumentElement().getNodeName(); + if (type.equals("mapper")) { + list.add(sourcePath); + } + } + } + return list; + } + + public void acceptXMlConfig(@Nonnull Path sourcePath, @Nonnull String[] sourcePathArray, Map> mapXMlDependency) { if (exception != null) return; try { Document doc = parseXML(sourcePath); @@ -146,7 +167,26 @@ public void acceptXMlConfig(@Nonnull Path sourcePath, @Nonnull String[] sourcePa } } - public void acceptXMlMapper(Map mapXMlDependency) { + public void acceptXMLMapper(List listMapperPaths, Map> mapXMlDependency) { + for (String path : listMapperPaths) { + if (exception != null) return; + try { + final String sourceName = sourceNameMap.get(path); + if (sourceName == null) throw new JavaCiaException("Unknown source path!"); + final Set perFileNodeSet + = sourceNodeMap.computeIfAbsent(sourceName, JavaSnapshotParser::createLinkedHashSet); + + Document doc = parseXML(Path.of(path)); + nodes.build(perFileNodeSet, doc, path, mapXMlDependency); + + } catch (JavaCiaException javaCiaException) { + exception = javaCiaException; + } catch (ParserConfigurationException | IOException | SAXException e) { + e.printStackTrace(); + } + } + } + public void acceptXMlMapper(Map> mapXMlDependency) { List listMapperPaths = new ArrayList<>(); for (String path : mapXMlDependency.keySet()) { if (path.endsWith(".xml") && path.contains("\\")) { @@ -183,10 +223,10 @@ public void acceptAST(@Nonnull String sourcePath, @Nonnull CompilationUnit compi final Set perFileNodeSet = sourceNodeMap.computeIfAbsent(sourceName, JavaSnapshotParser::createLinkedHashSet); - //for xml file + //for xml file is not a mapper file if (sourcePath.endsWith(".xml") && !mapXMlDependency.containsKey(sourcePath)) { - Document doc = parseXML(Path.of(sourcePath)); - nodes.build(perFileNodeSet, doc, sourcePath); + /*Document doc = parseXML(Path.of(sourcePath)); + nodes.build(perFileNodeSet, doc, sourcePath);*/ //for java file } else { nodes.build(perFileNodeSet, compilationUnit, mapXMlDependency); @@ -194,8 +234,6 @@ public void acceptAST(@Nonnull String sourcePath, @Nonnull CompilationUnit compi } catch (JavaCiaException exception) { this.exception = exception; - } catch (ParserConfigurationException | IOException | SAXException e) { - e.printStackTrace(); } } diff --git a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java index 4e99588..3e474fa 100644 --- a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java +++ b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java @@ -25,7 +25,8 @@ public class Y { JavaDependency.INVOCATION, 4.0, JavaDependency.OVERRIDE, 1.0 )); - private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); + private static final Path configurationPath = Path.of(""); + //private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); //private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML+interface\\mybatis-example-2\\resources\\SqlMapConfig.xml"); public static void main(String[] args) throws JavaCiaException, IOException, ParserConfigurationException, SAXException { @@ -39,7 +40,8 @@ public static void main(String[] args) throws JavaCiaException, IOException, Par // "jdt", Pair.immutableOf(jdtPath, jdtFiles) // ); - final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); + final Path corePath = Path.of("D:\\project\\MyBatis Collection\\LearningStruts\\src"); + //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML+interface\\mybatis-example-2\\src"); final List coreFiles = getFileList(new ArrayList<>(), corePath); final Map>> javaSources = Map.of( From 46710757d886a67899e733f490b860699789edf3 Mon Sep 17 00:00:00 2001 From: quynh921999 <37545540+quynh921999@users.noreply.github.com> Date: Thu, 1 Apr 2021 13:16:40 +0700 Subject: [PATCH 3/6] fix methodInvocation for configuration and mapper file --- .../java/jdt/project/builder/JavaNodes.java | 136 +++++++----------- .../project/builder/JavaSnapshotParser.java | 13 +- .../test/java/mrmathami/cia/java/jdt/Y.java | 37 +---- 3 files changed, 68 insertions(+), 118 deletions(-) diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java index 88532aa..a647191 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java @@ -25,7 +25,6 @@ import org.eclipse.text.edits.TextEdit; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import org.w3c.dom.NodeList; import org.w3c.dom.traversal.DocumentTraversal; import org.w3c.dom.traversal.NodeFilter; import org.w3c.dom.traversal.TreeWalker; @@ -246,7 +245,7 @@ private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChi } } else if (listAttributes.item(i).getNodeName().equals("id") && !xmlNode.getNodeName().equals("resultMap")) { String value = listAttributes.item(i).getNodeValue(); - putInMap(mapXMlDependency, "\"" + namespace + "." + value + "\"", xmlNode); + putInMap(mapXMlDependency, namespace + "." + value, xmlNode); } } for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { @@ -323,6 +322,7 @@ public static String convertResourceToPath(@Nonnull String[] sourcePathArray, St for (String s : temp) { if (!sourcePath.contains(s)) { sign = false; + break; } } if (sign) { @@ -470,12 +470,6 @@ private PackageNode createPackageNodeFromPath(@Nonnull String path) { ? oldPair : internalCreatePackagePairFromNameComponents(nameComponent); PackageNode packageNode = pair.getA(); - /*IPackageBinding packageBinding = createPackageBinding(nameComponent); - if (pair.getB() == null) { - pair.setB(packageBinding); - packageNode.setAnnotates(annotates.createAnnotatesFromAnnotationBindings(packageBinding.getAnnotations(), - packageNode, JavaDependency.USE)); - }*/ System.out.println("packageNode " + packageNode); assert perFileNodeSet != null; for (AbstractNode node = packageNode; !node.isRoot(); node = node.getParent()) { @@ -484,70 +478,6 @@ private PackageNode createPackageNodeFromPath(@Nonnull String path) { return packageNode; } - private IPackageBinding createPackageBinding(String[] nameComponent) { - IPackageBinding packageBinding = new IPackageBinding() { - @Override - public String getName() { - return nameComponent[nameComponent.length - 1]; - } - - @Override - public boolean isUnnamed() { - return false; - } - - @Override - public String[] getNameComponents() { - return nameComponent; - } - - @Override - public IAnnotationBinding[] getAnnotations() { - return new IAnnotationBinding[0]; - } - - @Override - public int getKind() { - return 0; - } - - @Override - public int getModifiers() { - return 0; - } - - @Override - public boolean isDeprecated() { - return false; - } - - @Override - public boolean isRecovered() { - return false; - } - - @Override - public boolean isSynthetic() { - return false; - } - - @Override - public IJavaElement getJavaElement() { - return null; - } - - @Override - public String getKey() { - return null; - } - - @Override - public boolean isEqualTo(IBinding iBinding) { - return false; - } - }; - return packageBinding; - } //endregion Package //region Parser @@ -1039,14 +969,6 @@ private void parseMethodDeclaration(@Nonnull AbstractNode parentNode, if (methodDeclarationBody != null) { methodNode.setBodyBlock( format(methodDeclarationBody.toString(), CodeFormatter.K_STATEMENTS)); - for (String key : mapXMlDependency.keySet()) { - if (key.contains(".") && methodNode.getBodyBlock().contains(key)) { - System.out.println("key: " + key); - for (int i = 0; i < mapXMlDependency.get(key).size(); i++) { - dependencies.createDependencyToNode(methodNode, mapXMlDependency.get(key).get(i), JavaDependency.USE); - } - } - } walkDeclaration(methodDeclarationBody, methodNode, methodNode); } } @@ -1135,6 +1057,21 @@ public boolean visit(@Nonnull SuperMethodInvocation node) { @Override public boolean visit(@Nonnull MethodInvocation node) { + Expression expression = node.getExpression(); + if (expression instanceof SimpleName) { + IVariableBinding iVariableBinding = (IVariableBinding) visitFromSimpleName((SimpleName) expression); + if (iVariableBinding != null) { + ITypeBinding iTypeBinding = iVariableBinding.getType(); + String binaryName = iTypeBinding.getBinaryName(); + if (binaryName.equals("SqlSession")) { + createDependencyFromInvocation(node); + } + } else { + if (((SimpleName) expression).getIdentifier().equals("Resources")) { + createDependencyFromInvocation(node); + } + } + } final IMethodBinding binding = node.resolveMethodBinding(); if (binding != null) { createDependencyFromInvocation(binding, node.typeArguments(), node.arguments()); @@ -1144,6 +1081,44 @@ public boolean visit(@Nonnull MethodInvocation node) { return false; } + private void createDependencyFromInvocation(@Nonnull MethodInvocation node) { + List listArgument = node.arguments(); + String argumentValue = null; + for (Object argument : listArgument) { + if (argument instanceof StringLiteral) { + argumentValue = ((StringLiteral) argument).getLiteralValue(); + } else if (argument instanceof QualifiedName) { + IVariableBinding iBinding = (IVariableBinding) ((QualifiedName) argument).getName().resolveBinding(); + IVariableBinding variableBinding = iBinding.getVariableDeclaration(); + argumentValue = (String) variableBinding.getConstantValue(); + } + } + if (argumentValue != null && mapXMlDependency.containsKey(argumentValue)) { + for (int i = 0; i < mapXMlDependency.get(argumentValue).size(); i++) { + dependencies.createDependencyToNode(javaNode, mapXMlDependency.get(argumentValue).get(i), JavaDependency.USE); + } + } + } + + private IBinding visitFromSimpleName(SimpleName simpleName) { + final IBinding binding = simpleName.resolveBinding(); + if (binding == null && !enableRecovery) { + exceptionProxy[0] = new JavaCiaException("Cannot resolve binding on simple name!"); + } + final IBinding originalBinding = binding instanceof ITypeBinding + ? JavaDependencies.getOriginTypeBinding((ITypeBinding) binding) + : binding instanceof IMethodBinding + ? JavaDependencies.getOriginMethodBinding((IMethodBinding) binding) + : binding instanceof IVariableBinding + ? JavaDependencies.getOriginVariableBinding((IVariableBinding) binding) + : null; + + if (originalBinding != null) { + dependencies.createDelayDependency(javaNode, originalBinding, JavaDependency.USE); + } + return originalBinding; + } + private void createDependencyFromInvocation(@Nonnull IMethodBinding binding, @Nonnull List typeArguments, @Nonnull List arguments) { dependencies.createDelayDependency(javaNode, @@ -1185,7 +1160,6 @@ public boolean visit(@Nonnull TypeDeclaration node) { public boolean visit(@Nonnull AnonymousClassDeclaration node) { return false; } - }); if (exceptionProxy[0] != null) throw exceptionProxy[0]; } diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java index 66eee1e..7c5d2f1 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java @@ -34,7 +34,6 @@ import org.w3c.dom.Document; import org.xml.sax.SAXException; -import javax.print.Doc; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -64,7 +63,7 @@ final class JavaSnapshotParser extends FileASTRequestor { @Nonnull private final Map> sourceNodeMap = new HashMap<>(); - private static Map> mapXMlDependency = new HashMap<>(); + private static final Map> mapXMlDependency = new HashMap<>(); @Nullable private JavaCiaException exception; @@ -135,7 +134,6 @@ private static JavaRootNode parse(@Nonnull String[] sourcePathArray, @Nonnull St parser.acceptXMlConfig(configuration, sourcePathArray, mapXMlDependency); parser.acceptXMlMapper(mapXMlDependency); } - mapXMlDependency.size(); astParser.createASTs(sourcePathArray, sourceEncodingArray, EMPTY, parser, null); @@ -186,6 +184,7 @@ public void acceptXMLMapper(List listMapperPaths, Map> mapXMlDependency) { List listMapperPaths = new ArrayList<>(); for (String path : mapXMlDependency.keySet()) { @@ -223,10 +222,10 @@ public void acceptAST(@Nonnull String sourcePath, @Nonnull CompilationUnit compi final Set perFileNodeSet = sourceNodeMap.computeIfAbsent(sourceName, JavaSnapshotParser::createLinkedHashSet); - //for xml file is not a mapper file + //for xml file except mapper file and configuration file if (sourcePath.endsWith(".xml") && !mapXMlDependency.containsKey(sourcePath)) { - /*Document doc = parseXML(Path.of(sourcePath)); - nodes.build(perFileNodeSet, doc, sourcePath);*/ + Document doc = parseXML(Path.of(sourcePath)); + nodes.build(perFileNodeSet, doc, sourcePath); //for java file } else { nodes.build(perFileNodeSet, compilationUnit, mapXMlDependency); @@ -234,6 +233,8 @@ public void acceptAST(@Nonnull String sourcePath, @Nonnull CompilationUnit compi } catch (JavaCiaException exception) { this.exception = exception; + } catch (ParserConfigurationException | SAXException | IOException e) { + e.printStackTrace(); } } diff --git a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java index 3e474fa..7b938b1 100644 --- a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java +++ b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java @@ -25,52 +25,27 @@ public class Y { JavaDependency.INVOCATION, 4.0, JavaDependency.OVERRIDE, 1.0 )); - private static final Path configurationPath = Path.of(""); - //private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); - //private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML+interface\\mybatis-example-2\\resources\\SqlMapConfig.xml"); + private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); public static void main(String[] args) throws JavaCiaException, IOException, ParserConfigurationException, SAXException { - -// final Path corePath = Path.of("D:\\project\\JavaCIA\\core\\src\\main\\java"); -// final List coreFiles = getFileList(new ArrayList<>(), corePath); -// final Path jdtPath = Path.of("D:\\project\\JavaCIA\\jdt\\src\\main\\java"); -// final List jdtFiles = getFileList(new ArrayList<>(), jdtPath); -// final Map>> javaSources = Map.of( -// "core", Pair.immutableOf(corePath, coreFiles), -// "jdt", Pair.immutableOf(jdtPath, jdtFiles) -// ); - - final Path corePath = Path.of("D:\\project\\MyBatis Collection\\LearningStruts\\src"); - //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); - //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML+interface\\mybatis-example-2\\src"); + final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); final List coreFiles = getFileList(new ArrayList<>(), corePath); final Map>> javaSources = Map.of( "core", Pair.immutableOf(corePath, coreFiles) ); + final List classPaths = List.of( + //List classPaths in here + ); -// final Path calculatorPath = Path.of("D:\\project\\calculator\\src\\main\\java"); -// final List calculatorFiles = getFileList(new ArrayList<>(), calculatorPath); -// final Map>> javaSources = Map.of("calculator", Pair.immutableOf(calculatorPath, calculatorFiles)); -// -// final List classPaths = List.of( -//// Path.of("C:\\Users\\Meo\\.m2\\repository\\org\\eclipse\\jdt\\org.eclipse.jdt.core\\3.22.0\\org.eclipse.jdt.core-3.22.0.jar"), -//// Path.of("C:\\Users\\Meo\\.m2\\repository\\org\\eclipse\\platform\\org.eclipse.text\\3.10.200\\org.eclipse.text-3.10.200.jar"), -//// Path.of("C:\\Users\\Meo\\.m2\\repository\\mrmathami\\utils\\1.0.0\\utils-1.0.0.jar") -// Path.of("C:\\Users\\S14\\.m2\\repository\\junit\\junit\\4.12\\junit-4.12.jar"), -// Path.of("C:\\Users\\S14\\.m2\\repository\\log4j\\log4j\\1.2.17\\log4j-1.2.17.jar"), -// Path.of("C:\\Users\\S14\\.m2\\repository\\org\\hamcrest\\hamcrest-core\\1.3\\hamcrest-core-1.3.jar") -// ); - long timeStart = System.nanoTime(); final JavaProjectSnapshot projectSnapshot = ProjectBuilders.createProjectSnapshot("before", - javaSources, List.of(), DEPENDENCY_WEIGHT_TABLE, true, configurationPath); + javaSources, classPaths, DEPENDENCY_WEIGHT_TABLE, true, configurationPath); long timeParseA = System.nanoTime(); final String jsonA = projectSnapshot.getRootNode().toJson(); Files.write(corePath.resolve("output.txt"), jsonA.getBytes(StandardCharsets.UTF_8)); - //Files.write(calculatorPath.resolve("output.txt"), jsonA.getBytes(StandardCharsets.UTF_8)); System.out.printf("Parse A time: %s\n", (timeParseA - timeStart) / 1000000.0); } From 6902a2fbaa7641f42afae8fd2a96c754d2a6467a Mon Sep 17 00:00:00 2001 From: quynh921999 <37545540+quynh921999@users.noreply.github.com> Date: Mon, 12 Apr 2021 14:29:02 +0700 Subject: [PATCH 4/6] fix --- .../cia/java/tree/node/JavaXMLNode.java | 1 + jdt/pom.xml | 25 ++++++ .../main/java/mrmathami/cia/java/jdt/Run.java | 78 ++++++++++++++++++ .../mrmathami/cia/java/jdt/gephi/Printer.java | 59 +++++++++++++ .../cia/java/jdt/gephi/model/EdgeGephi.java | 22 +++++ .../cia/java/jdt/gephi/model/NodeGephi.java | 50 +++++++++++ .../java/jdt/project/builder/JavaNodes.java | 34 +++++--- .../project/builder/JavaSnapshotParser.java | 2 +- .../jdt/project/differ/EntityMatcher.java | 44 ++++++++++ .../project/differ/EntityPartialMatcher.java | 59 +++++++++++++ .../differ/JavaSnapshotComparator.java | 4 +- .../cia/java/jdt/tree/node/XMLNode.java | 11 +-- .../node/attribute/AbstractNonRootNode.java | 1 - jdt/src/test/JSON-java.proj | Bin 90437 -> 143 bytes .../test/java/mrmathami/cia/java/jdt/X.java | 15 ++-- .../test/java/mrmathami/cia/java/jdt/Y.java | 10 ++- 16 files changed, 386 insertions(+), 29 deletions(-) create mode 100644 jdt/src/main/java/mrmathami/cia/java/jdt/Run.java create mode 100644 jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java create mode 100644 jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java create mode 100644 jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java diff --git a/core/src/main/java/mrmathami/cia/java/tree/node/JavaXMLNode.java b/core/src/main/java/mrmathami/cia/java/tree/node/JavaXMLNode.java index f2a5b05..56c6dea 100644 --- a/core/src/main/java/mrmathami/cia/java/tree/node/JavaXMLNode.java +++ b/core/src/main/java/mrmathami/cia/java/tree/node/JavaXMLNode.java @@ -22,6 +22,7 @@ default JavaXMLNode asXMLNode() { return this; } + @Nonnull String getTextContent(); diff --git a/jdt/pom.xml b/jdt/pom.xml index e5d0570..5b16d7c 100644 --- a/jdt/pom.xml +++ b/jdt/pom.xml @@ -135,6 +135,31 @@ + + + org.apache.maven.plugins + maven-assembly-plugin + 3.2.0 + + + + mrmathami.cia.java.jdt.Run + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/Run.java b/jdt/src/main/java/mrmathami/cia/java/jdt/Run.java new file mode 100644 index 0000000..47028dd --- /dev/null +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/Run.java @@ -0,0 +1,78 @@ +package mrmathami.cia.java.jdt; + +import mrmathami.cia.java.JavaCiaException; +import mrmathami.cia.java.project.JavaProjectSnapshot; +import mrmathami.cia.java.tree.dependency.JavaDependency; +import mrmathami.cia.java.tree.dependency.JavaDependencyWeightTable; +import mrmathami.utils.Pair; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class Run { + public static final JavaDependencyWeightTable DEPENDENCY_WEIGHT_TABLE = JavaDependencyWeightTable.of(Map.of( + JavaDependency.USE, 1.0, + JavaDependency.MEMBER, 1.0, + JavaDependency.INHERITANCE, 4.0, + JavaDependency.INVOCATION, 4.0, + JavaDependency.OVERRIDE, 1.0 + )); + //private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); + private static Path configurationPath = null; + + public static void main(String[] args) throws JavaCiaException, IOException, ParserConfigurationException, SAXException { + Path corePath = null; + String output = ""; + if (args.length < 3) { + configurationPath = Path.of(""); + corePath = Path.of(args[0]); + output = args[1]; + } else if (args.length == 3) { + configurationPath = Path.of(args[0]); + corePath = Path.of(args[1]); + output = args[2]; + } + final List coreFiles = getFileList(new ArrayList<>(), corePath); + final Map>> javaSources = Map.of( + "core", Pair.immutableOf(corePath, coreFiles) + ); + final List classPaths = List.of( + //List classPaths in here + ); + + + long timeStart = System.nanoTime(); + final JavaProjectSnapshot projectSnapshot = ProjectBuilders.createProjectSnapshot("before", + javaSources, classPaths, DEPENDENCY_WEIGHT_TABLE, true, configurationPath); + long timeParseA = System.nanoTime(); + + final String jsonA = projectSnapshot.getRootNode().toJson(); + + Files.write(Path.of(output + "output.txt"), jsonA.getBytes(StandardCharsets.UTF_8)); + + System.out.printf("Parse A time: %s\n", (timeParseA - timeStart) / 1000000.0); + } + + private static List getFileList(List fileList, Path dir) { + try (DirectoryStream stream = Files.newDirectoryStream(dir)) { + for (Path path : stream) { + if (path.toFile().isDirectory()) { + getFileList(fileList, path); + } else { + fileList.add(path); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return fileList; + } +} diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java new file mode 100644 index 0000000..ccf49ca --- /dev/null +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java @@ -0,0 +1,59 @@ +package mrmathami.cia.java.jdt.gephi; + +import mrmathami.cia.java.jdt.gephi.model.EdgeGephi; +import mrmathami.cia.java.jdt.gephi.model.NodeGephi; +import mrmathami.cia.java.project.JavaProjectSnapshot; +import mrmathami.cia.java.tree.node.JavaNode; +import mrmathami.cia.java.tree.node.JavaRootNode; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Printer { + public String writeGephi(JavaProjectSnapshot projectSnapshot) { + JavaRootNode rootNode = projectSnapshot.getRootNode(); + List nodeList = rootNode.getAllNodes(); + List nodeGephiList = new ArrayList<>(); + for (JavaNode node : nodeList) { + NodeGephi nodeGephi = new NodeGephi(node.getId(), node.getNodeName(), NodeGephi.Type.UNCHANGE); + nodeGephiList.add(nodeGephi); + } + final String open = "\n" + + "" + + "\n\n"; + NodeGephi nodeGephi1 = new NodeGephi(0, "classA", NodeGephi.Type.UNCHANGE); + NodeGephi nodeGephi2 = new NodeGephi(1, "classB", NodeGephi.Type.UNCHANGE); + NodeGephi nodeGephi3 = new NodeGephi(2, "classC", NodeGephi.Type.UNCHANGE); + + EdgeGephi edgeGephi1 = new EdgeGephi("0", "0", "1"); + EdgeGephi edgeGephi2 = new EdgeGephi("1", "1", "2"); + + String listNode = writeListNodes(Arrays.asList(nodeGephi1, nodeGephi2, nodeGephi3)); + String listEdge = writeListEdges(Arrays.asList(edgeGephi1, edgeGephi2)); + + return open + listNode + listEdge + "\n\n" + ""; + } + public String writeListNodes(List nodeGephiList) { + StringBuilder result = new StringBuilder("\t"); + for (NodeGephi node : nodeGephiList) { + result.append("\n\t\t").append(node.toString()); + } + result.append("\n\t"); + return result.toString(); + } + + public String writeListEdges(List edgeGephiList) { + StringBuilder result = new StringBuilder("\n\t"); + for (EdgeGephi node : edgeGephiList) { + result.append("\n\t\t").append(node.toString()); + } + result.append("\n\t"); + return result.toString(); + } + + public static void main(String[] args) { + Printer printer = new Printer(); + //System.out.println(printer.writeGephi()); + } +} diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java new file mode 100644 index 0000000..1e27652 --- /dev/null +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java @@ -0,0 +1,22 @@ +package mrmathami.cia.java.jdt.gephi.model; + +public class EdgeGephi { + private String id; + private String source; + private String target; + + public EdgeGephi(String id, String source, String target) { + this.id = id; + this.source = source; + this.target = target; + } + + @Override + public String toString() { + return ""; + } +} diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java new file mode 100644 index 0000000..19e8a1c --- /dev/null +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java @@ -0,0 +1,50 @@ +package mrmathami.cia.java.jdt.gephi.model; + +import org.eclipse.text.edits.DeleteEdit; + +public class NodeGephi { + public enum Type { + UNCHANGE(0, 153, 153), + DELETE(255, 0 , 0), + CHANGE(255, 255, 0), + ADD(0, 255, 153); + + private int r; + private int g; + private int b; + + Type(int r, int g, int b) { + this.r = r; + this.g = g; + this.b = b; + } + } + private final int id; + private final String label; + private final String size = ""; + private final Type type; + public NodeGephi(int id, String label, Type type) { + this.id = id; + this.label = label; + this.type = type; + } + + @Override + public String toString() { + return "' + + "\n\t\t\t" + size + + toStringType(type) + + "\n\t\t"; + } + + private String toStringType(Type type) { + return "\n\t\t\t"; + } +} diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java index a647191..5ac117c 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaNodes.java @@ -15,7 +15,6 @@ import mrmathami.cia.java.tree.node.container.JavaInterfaceContainer; import mrmathami.cia.java.tree.node.container.JavaMethodContainer; import mrmathami.utils.Pair; -import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.dom.*; import org.eclipse.jdt.core.formatter.CodeFormatter; import org.eclipse.jface.text.BadLocationException; @@ -29,6 +28,7 @@ import org.w3c.dom.traversal.NodeFilter; import org.w3c.dom.traversal.TreeWalker; +import java.io.File; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -38,6 +38,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; final class JavaNodes { @@ -112,7 +113,7 @@ void build(@Nonnull Set perFileNodeSet, @Nonnull org.w3c.dom.Docum this.perFileNodeSet = null; } - private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild) { + private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild) { Node currentNode = walker.getCurrentNode(); if (!isFirstChild) { for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { @@ -120,6 +121,7 @@ private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isF } } else { XMLNode xmlNode = parent.createChildXMlNode(currentNode.getNodeName(), currentNode.getTextContent(), currentNode.getChildNodes(), currentNode.getAttributes()); + dependencies.createDependencyToNode(parent, xmlNode, JavaDependency.MEMBER); for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { traverseLevel(walker, xmlNode, true); } @@ -167,6 +169,7 @@ private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChi } } else { XMLNode xmlNode = parent.createChildXMlNode(currentNode.getNodeName(), currentNode.getTextContent(), currentNode.getChildNodes(), currentNode.getAttributes()); + dependencies.createDependencyToNode(parent, xmlNode, JavaDependency.MEMBER); NamedNodeMap listAttributes = xmlNode.getAttributes(); if (xmlNode.getNodeName().equals("select")) { for (int i = 0; i < listAttributes.getLength(); i++) { @@ -212,6 +215,7 @@ private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChi } } else { XMLNode xmlNode = parent.createChildXMlNode(currentNode.getNodeName(), currentNode.getTextContent(), currentNode.getChildNodes(), currentNode.getAttributes()); + dependencies.createDependencyToNode(parent, xmlNode, JavaDependency.MEMBER); NamedNodeMap listAttributes = xmlNode.getAttributes(); if (xmlNode.getNodeName().equals("select")) { for (int i = 0; i < listAttributes.getLength(); i++) { @@ -270,7 +274,7 @@ void build(org.w3c.dom.Document document, @Nonnull String[] sourcePathArray, Map dependencies.createDependencyToNode(rootNode, rootXMLNode, JavaDependency.MEMBER); } - private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, String[] sourcePathArray, Map> mapXMLDependency) { + private void traverseLevel(TreeWalker walker, XMLNode parent, boolean isFirstChild, String[] sourcePathArray, Map> mapXMLDependency) { Node currentNode = walker.getCurrentNode(); if (!isFirstChild) { for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { @@ -278,6 +282,7 @@ private static void traverseLevel(TreeWalker walker, XMLNode parent, boolean isF } } else { XMLNode xmlNode = parent.createChildXMlNode(currentNode.getNodeName(), currentNode.getTextContent(), currentNode.getChildNodes(), currentNode.getAttributes()); + dependencies.createDependencyToNode(parent, xmlNode, JavaDependency.MEMBER); if (xmlNode.getNodeName().equals("typeAlias")) { NamedNodeMap listAttributes = xmlNode.getAttributes(); for (int i = 0; i < listAttributes.getLength(); i++) { @@ -362,6 +367,7 @@ RootNode postprocessing() throws JavaCiaException { // freeze root node rootNode.freeze(); + mapXMlDependency.clear(); return rootNode; } @@ -458,9 +464,10 @@ private PackageNode createPackageNodeFromPackageDeclaration(@Nonnull PackageDecl @Nonnull private PackageNode createPackageNodeFromPath(@Nonnull String path) { - int startPackageIndex = path.indexOf("src\\"); + int startPackageIndex = path.indexOf("src" + File.separator); String simplePath = path.substring(startPackageIndex); - String[] pathComponent = simplePath.split("\\\\"); + String pattern = Pattern.quote(System.getProperty("file.separator")); + String[] pathComponent = simplePath.split(pattern); // remove name of file // remove src component String[] nameComponent = new String[pathComponent.length - 2]; @@ -1059,14 +1066,17 @@ public boolean visit(@Nonnull SuperMethodInvocation node) { public boolean visit(@Nonnull MethodInvocation node) { Expression expression = node.getExpression(); if (expression instanceof SimpleName) { - IVariableBinding iVariableBinding = (IVariableBinding) visitFromSimpleName((SimpleName) expression); - if (iVariableBinding != null) { - ITypeBinding iTypeBinding = iVariableBinding.getType(); - String binaryName = iTypeBinding.getBinaryName(); - if (binaryName.equals("SqlSession")) { - createDependencyFromInvocation(node); + IBinding expressionBinding = visitFromSimpleName((SimpleName) expression); + if (expressionBinding instanceof IVariableBinding) { + IVariableBinding iVariableBinding = (IVariableBinding) visitFromSimpleName((SimpleName) expression); + if (iVariableBinding != null) { + ITypeBinding iTypeBinding = iVariableBinding.getType(); + String binaryName = iTypeBinding.getBinaryName(); + if (binaryName.equals("SqlSession")) { + createDependencyFromInvocation(node); + } } - } else { + } else if (expressionBinding == null) { if (((SimpleName) expression).getIdentifier().equals("Resources")) { createDependencyFromInvocation(node); } diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java index 7c5d2f1..a8ee8bf 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/builder/JavaSnapshotParser.java @@ -226,8 +226,8 @@ public void acceptAST(@Nonnull String sourcePath, @Nonnull CompilationUnit compi if (sourcePath.endsWith(".xml") && !mapXMlDependency.containsKey(sourcePath)) { Document doc = parseXML(Path.of(sourcePath)); nodes.build(perFileNodeSet, doc, sourcePath); - //for java file } else { + //for java file nodes.build(perFileNodeSet, compilationUnit, mapXMlDependency); } diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityMatcher.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityMatcher.java index b45407f..9e61038 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityMatcher.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityMatcher.java @@ -22,11 +22,15 @@ import mrmathami.annotations.Nullable; import mrmathami.cia.java.tree.JavaIdentifiedEntity; import mrmathami.utils.Pair; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; final class EntityMatcher { @@ -91,6 +95,46 @@ boolean matchNonOrdered(@Nonnull Collection coll return true; } + boolean matchNonOrderedNameNodeMap(NamedNodeMap namedNodeMapA, NamedNodeMap namedNodeMapB) { + if (namedNodeMapA.getLength() != namedNodeMapB.getLength()) return false; +// List listA = getListNode(namedNodeMapA); +// List listB = getListNode(namedNodeMapB); +// for (Node node : listA) { +// if (!listB.contains(node)) { +// return false; +// } +// } + + HashMap hashNodeA = getHash(namedNodeMapA); + HashMap hashNodeB = getHash(namedNodeMapB); + for (String key : hashNodeA.keySet()) { + if (hashNodeB.containsKey(key)) { + if (!hashNodeA.get(key).equals(hashNodeB.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + + private HashMap getHash(NamedNodeMap namedNodeMap) { + HashMap hashMap = new HashMap<>(); + for (int i = 0; i < namedNodeMap.getLength(); i++) { + hashMap.put(namedNodeMap.item(i).getNodeName(), namedNodeMap.item(i).getNodeValue()); + } + return hashMap; + } + + private List getListNode(NamedNodeMap namedNodeMap) { + List list = new ArrayList<>(); + for (int i = 0; i < namedNodeMap.getLength(); i++) { + list.add(namedNodeMap.item(i)); + } + return list; + } + @Nonnull EntityWrapper wrap(@Nonnull JavaIdentifiedEntity entity, boolean identicalMatch) { return identicalMatch diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityPartialMatcher.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityPartialMatcher.java index 2b6cf2a..4316da3 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityPartialMatcher.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityPartialMatcher.java @@ -20,8 +20,10 @@ import mrmathami.annotations.Nonnull; import mrmathami.annotations.Nullable; +import mrmathami.cia.java.jdt.tree.dependency.DependencyCountTable; import mrmathami.cia.java.tree.JavaIdentifiedEntity; import mrmathami.cia.java.tree.annotate.JavaAnnotate; +import mrmathami.cia.java.tree.dependency.JavaDependency; import mrmathami.cia.java.tree.dependency.JavaDependencyCountTable; import mrmathami.cia.java.tree.node.JavaClassNode; import mrmathami.cia.java.tree.node.JavaEnumNode; @@ -30,6 +32,7 @@ import mrmathami.cia.java.tree.node.JavaInterfaceNode; import mrmathami.cia.java.tree.node.JavaMethodNode; import mrmathami.cia.java.tree.node.JavaNode; +import mrmathami.cia.java.tree.node.JavaXMLNode; import mrmathami.cia.java.tree.node.attribute.JavaAnnotatedNode; import mrmathami.cia.java.tree.node.attribute.JavaModifiedNode; import mrmathami.cia.java.tree.node.attribute.JavaParameterizedNode; @@ -39,6 +42,7 @@ import mrmathami.cia.java.tree.type.JavaSyntheticType; import mrmathami.cia.java.tree.type.JavaType; import mrmathami.utils.Pair; +import org.w3c.dom.NamedNodeMap; import java.util.HashMap; import java.util.Iterator; @@ -97,6 +101,56 @@ protected boolean partialMatch(@Nonnull JavaIdentifiedEntity entityA, @Nonnull J return true; } }, + XML_NODE(JavaXMLNode.class) { + @Override + protected int partialMatchCode(JavaIdentifiedEntity entity, boolean identicalMatch) { + + assert entity instanceof JavaXMLNode; + final JavaXMLNode node = (JavaXMLNode) entity; +// System.out.println("-----------"+ node.getNodeName() +"-------------"); +// int matchCode = identicalMatch ? node.getNodeName() != null ? 1 : 0 : -1; +// System.out.println(matchCode); +// matchCode = matchCode * 31 + node.getAttributes().hashCode(); +// System.out.println("attribute hashcode " + node.getAttributes().hashCode()); +// System.out.println(matchCode); +// matchCode = matchCode * 31 + node.getTextContent().hashCode(); +// System.out.println(matchCode); +// System.out.println(matchCode * 31 + (node.getChildNodes() != null ? 1 : 0)); +// return matchCode * 31 + (node.getChildNodes() != null ? 1 : 0); + + int matchCode = node.getEntityClass().hashCode(); + matchCode = matchCode * 31 + node.getNodeName().hashCode(); + matchCode = matchCode * 31 + (identicalMatch ? node.getDependencyToNodes().size() : -1); + return matchCode * 31 + ( identicalMatch ? node.getAttributes().getLength() : -1 ); + } + + @Override + protected boolean partialMatch(JavaIdentifiedEntity entityA, JavaIdentifiedEntity entityB, EntityMatcher matcher, boolean identicalMatch) { + assert entityA instanceof JavaXMLNode && entityB instanceof JavaXMLNode; + final JavaXMLNode nodeA = (JavaXMLNode) entityA, nodeB = (JavaXMLNode) entityB; + boolean compareName = (nodeA.getNodeName().equals(nodeB.getNodeName())); + boolean compareTextContent = true; + if (permissionCheckTextContent(nodeA) && permissionCheckTextContent(nodeB)) { + compareTextContent = (nodeA.getTextContent().equals(nodeB.getTextContent())); + } + boolean compareAttributes = (matcher.matchNonOrderedNameNodeMap(nodeA.getAttributes(), nodeB.getAttributes())); + boolean returnBool = !identicalMatch || ((nodeA.getNodeName().equals(nodeB.getNodeName())) + && compareTextContent + && (matcher.matchNonOrderedNameNodeMap(nodeA.getAttributes(), nodeB.getAttributes()))); + return returnBool; + } + + private boolean permissionCheckTextContent(JavaXMLNode javaXMLNode) { + for (Map.Entry entry : javaXMLNode.getDependencyTo().entrySet()) { + if ((entry.getKey() instanceof JavaXMLNode) && + (entry.getValue() instanceof DependencyCountTable) && + (entry.getValue().getCount(JavaDependency.MEMBER) > 0)) { + return false; + } + } + return true; + } + }, ANNOTATED_NODE(JavaAnnotatedNode.class) { @Override @@ -493,6 +547,11 @@ private boolean internalMismatchValue(@Nullable JavaAnnotate.Value valueA, @Null } }; + void printAttributes(NamedNodeMap namedNodeMap) { + for (int i = 0; i < namedNodeMap.getLength(); i++) { + System.out.println(namedNodeMap.item(i).getNodeName() + " : " + namedNodeMap.item(i).getNodeValue()); + } + } @Nonnull private static final EntityPartialMatcher[] PARTIAL_MATCHERS = values(); diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/JavaSnapshotComparator.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/JavaSnapshotComparator.java index 0a49484..88c1677 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/JavaSnapshotComparator.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/JavaSnapshotComparator.java @@ -80,7 +80,6 @@ private static void compareRootNodes(@Nonnull JavaRootNode previousRootNode, @No final Map previousNodeMap = new HashMap<>(); final Map currentNodeMap = new HashMap<>(); - for (final JavaNode node : previousRootNode.getAllNodes()) { previousNodeMap.put(matcher.wrap(node, false), node); } @@ -92,6 +91,7 @@ private static void compareRootNodes(@Nonnull JavaRootNode previousRootNode, @No final EntityWrapper previousWrapper = previousEntry.getKey(); final JavaNode previousNode = previousEntry.getValue(); final JavaNode currentNode = currentNodeMap.get(previousWrapper); + if (currentNode != null) { if (matcher.match(previousNode, currentNode, true)) { unchangedNodes.add(Pair.immutableOf(previousNode, currentNode)); @@ -102,6 +102,8 @@ private static void compareRootNodes(@Nonnull JavaRootNode previousRootNode, @No removedNodes.add(previousNode); } } + + for (final Map.Entry currentEntry : currentNodeMap.entrySet()) { final EntityWrapper currentWrapper = currentEntry.getKey(); final JavaNode currentNode = currentEntry.getValue(); diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/XMLNode.java b/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/XMLNode.java index 9cb2f76..17c3aa2 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/XMLNode.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/XMLNode.java @@ -1,6 +1,7 @@ package mrmathami.cia.java.jdt.tree.node; import mrmathami.annotations.Nonnull; +import mrmathami.cia.java.jdt.tree.AbstractEntity; import mrmathami.cia.java.tree.node.JavaXMLNode; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NodeList; @@ -53,21 +54,20 @@ public AbstractNode getParent() { return parent; } - @Override public String getTextContent() { return textContent; } - @Override public NodeList getChildNodes() { return children; } - @Override public NamedNodeMap getAttributes() { return listAttributes; } + + public void setTextContent(String textContent) { this.textContent = textContent; } @@ -84,8 +84,9 @@ public void setListAttributes(NamedNodeMap listAttributes) { protected void internalToReferenceJsonStart(@Nonnull StringBuilder builder) { builder.append(", \"nodeName\": \"").append(nodeName) - .append("\", \"textContent\": \"").append(textContent) - .append("\", \"listAttributes\": ").append(internalToReferenceJson(listAttributes)); + .append("\", \"textContent\": \""); + AbstractEntity.internalEscapeString(builder, textContent); + builder.append("\", \"listAttributes\": ").append(internalToReferenceJson(listAttributes)); } private static String internalToReferenceJson(NamedNodeMap namedNodeMap) { diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/attribute/AbstractNonRootNode.java b/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/attribute/AbstractNonRootNode.java index 865704e..7c05f60 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/attribute/AbstractNonRootNode.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/tree/node/attribute/AbstractNonRootNode.java @@ -108,7 +108,6 @@ public final AbstractNode getParent() { } @Nonnull - @Override public final String getNodeName() { return simpleName; } diff --git a/jdt/src/test/JSON-java.proj b/jdt/src/test/JSON-java.proj index ec59ccf28b5e3ee29a09e1f5fd7ecc18cf4f86d9..69ae0416a6edd1a37e5a5e5332c0f427b85d8a5a 100644 GIT binary patch delta 7 OcmX?lh_#<_LO%cv{R2Dz literal 90437 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 QTa?KzFCoh|!>P{yA7e(KVE_OC diff --git a/jdt/src/test/java/mrmathami/cia/java/jdt/X.java b/jdt/src/test/java/mrmathami/cia/java/jdt/X.java index ad26386..9d2d917 100644 --- a/jdt/src/test/java/mrmathami/cia/java/jdt/X.java +++ b/jdt/src/test/java/mrmathami/cia/java/jdt/X.java @@ -40,14 +40,16 @@ public static void main(String[] args) throws JavaCiaException, IOException, Par // System.in.read(); // // for (int i = 0; i < 10; i++) { -// final Path javaSourcePathA = Path.of("..\\test\\JSON-java-before\\src\\main\\java"); -// final Path javaSourcePathB = Path.of("..\\test\\JSON-java\\src\\main\\java"); - final Path javaSourcePathA = Path.of("D:\\test-weight-1806\\test1\\src\\src"); - final Path javaSourcePathB = Path.of("D:\\test-weight-1806\\test1\\new\\src\\src"); + //final Path javaSourcePathA = Path.of("D:\\test-weight-1806\\test1\\src\\src"); + //final Path javaSourcePathB = Path.of("D:\\test-weight-1806\\test1\\new\\src\\src"); + final Path javaSourcePathA = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); + final Path javaSourcePathB = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\new\\mybatis-example-1\\src"); final List fileNamesA = getFileList(new ArrayList<>(), javaSourcePathA); final List fileNamesB = getFileList(new ArrayList<>(), javaSourcePathB); - final Path configurationPathA = Path.of(""); - final Path configurationPathB = Path.of(""); + final Path configurationPathA = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); + //final Path configurationPathA = Path.of(""); + final Path configurationPathB = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\new\\mybatis-example-1\\resources\\SqlMapConfig.xml"); + //final Path configurationPathB = Path.of(""); final long timeStart = System.nanoTime(); final JavaProjectSnapshot projectSnapshotA = ProjectBuilders.createProjectSnapshot("JSON-java-before", @@ -76,6 +78,7 @@ public static void main(String[] args) throws JavaCiaException, IOException, Par javaProject.addSnapshot(projectSnapshotB); javaProject.addSnapshotComparison(snapshotComparison); + try (final ObjectOutputStream objectOutputStream = new ObjectOutputStream(Files.newOutputStream(Path.of("jdt\\src\\test\\JSON-java.proj")))) { objectOutputStream.writeObject(javaProject); diff --git a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java index 7b938b1..9136801 100644 --- a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java +++ b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java @@ -25,10 +25,12 @@ public class Y { JavaDependency.INVOCATION, 4.0, JavaDependency.OVERRIDE, 1.0 )); - private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); - + //private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); + private static final Path configurationPath = Path.of(""); public static void main(String[] args) throws JavaCiaException, IOException, ParserConfigurationException, SAXException { - final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); + //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); + //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\myBatisExample\\src"); + final Path corePath = Path.of("D:\\project\\MyBatis Collection\\myBatisExample\\src"); final List coreFiles = getFileList(new ArrayList<>(), corePath); final Map>> javaSources = Map.of( "core", Pair.immutableOf(corePath, coreFiles) @@ -47,6 +49,8 @@ public static void main(String[] args) throws JavaCiaException, IOException, Par Files.write(corePath.resolve("output.txt"), jsonA.getBytes(StandardCharsets.UTF_8)); + //Files.write(corePath.resolve("gephi.gexf"), open.getBytes(StandardCharsets.UTF_8));*/ + System.out.printf("Parse A time: %s\n", (timeParseA - timeStart) / 1000000.0); } From 9f716156b933c73317b378f0076256623ca52a87 Mon Sep 17 00:00:00 2001 From: quynh921999 <37545540+quynh921999@users.noreply.github.com> Date: Mon, 12 Apr 2021 17:02:24 +0700 Subject: [PATCH 5/6] update write gephi --- .../mrmathami/cia/java/jdt/gephi/Printer.java | 41 +++++++++++-------- .../cia/java/jdt/gephi/model/EdgeGephi.java | 8 ++-- .../cia/java/jdt/gephi/model/NodeGephi.java | 4 +- .../test/java/mrmathami/cia/java/jdt/Y.java | 5 ++- 4 files changed, 34 insertions(+), 24 deletions(-) diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java index ccf49ca..f7742a2 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java @@ -4,36 +4,45 @@ import mrmathami.cia.java.jdt.gephi.model.NodeGephi; import mrmathami.cia.java.project.JavaProjectSnapshot; import mrmathami.cia.java.tree.node.JavaNode; -import mrmathami.cia.java.tree.node.JavaRootNode; import java.util.ArrayList; -import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; public class Printer { public String writeGephi(JavaProjectSnapshot projectSnapshot) { - JavaRootNode rootNode = projectSnapshot.getRootNode(); - List nodeList = rootNode.getAllNodes(); - List nodeGephiList = new ArrayList<>(); + List nodeList = projectSnapshot.getRootNode().getAllNodes(); + HashMap> dependencyToMap = new HashMap<>(); for (JavaNode node : nodeList) { - NodeGephi nodeGephi = new NodeGephi(node.getId(), node.getNodeName(), NodeGephi.Type.UNCHANGE); + Set dependencyToNodes = node.getDependencyToNodes(); + dependencyToMap.put(node, dependencyToNodes); + } + List nodeGephiList = new ArrayList<>(); + List edgeGephiList = new ArrayList<>(); + int count = 0; + for (Map.Entry> entry : dependencyToMap.entrySet()) { + NodeGephi nodeGephi = new NodeGephi(entry.getKey().getId(), entry.getKey().getNodeName(), NodeGephi.Type.UNCHANGE); nodeGephiList.add(nodeGephi); + Set value = entry.getValue(); + for (JavaNode javaNode : value) { + EdgeGephi edgeGephi = new EdgeGephi(count, entry.getKey().getId(), javaNode.getId()); + count++; + edgeGephiList.add(edgeGephi); + } } + final String open = "\n" + "" + "\n\n"; - NodeGephi nodeGephi1 = new NodeGephi(0, "classA", NodeGephi.Type.UNCHANGE); - NodeGephi nodeGephi2 = new NodeGephi(1, "classB", NodeGephi.Type.UNCHANGE); - NodeGephi nodeGephi3 = new NodeGephi(2, "classC", NodeGephi.Type.UNCHANGE); - EdgeGephi edgeGephi1 = new EdgeGephi("0", "0", "1"); - EdgeGephi edgeGephi2 = new EdgeGephi("1", "1", "2"); - - String listNode = writeListNodes(Arrays.asList(nodeGephi1, nodeGephi2, nodeGephi3)); - String listEdge = writeListEdges(Arrays.asList(edgeGephi1, edgeGephi2)); + String listNode = writeListNodes(nodeGephiList); + String listEdge = writeListEdges(edgeGephiList); return open + listNode + listEdge + "\n\n" + ""; } + public String writeListNodes(List nodeGephiList) { StringBuilder result = new StringBuilder("\t"); for (NodeGephi node : nodeGephiList) { @@ -52,8 +61,4 @@ public String writeListEdges(List edgeGephiList) { return result.toString(); } - public static void main(String[] args) { - Printer printer = new Printer(); - //System.out.println(printer.writeGephi()); - } } diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java index 1e27652..f203e56 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java @@ -1,11 +1,11 @@ package mrmathami.cia.java.jdt.gephi.model; public class EdgeGephi { - private String id; - private String source; - private String target; + private int id; + private int source; + private int target; - public EdgeGephi(String id, String source, String target) { + public EdgeGephi(int id, int source, int target) { this.id = id; this.source = source; this.target = target; diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java index 19e8a1c..3609e3d 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java @@ -5,7 +5,7 @@ public class NodeGephi { public enum Type { UNCHANGE(0, 153, 153), - DELETE(255, 0 , 0), + DELETE(255, 0, 0), CHANGE(255, 255, 0), ADD(0, 255, 153); @@ -19,10 +19,12 @@ public enum Type { this.b = b; } } + private final int id; private final String label; private final String size = ""; private final Type type; + public NodeGephi(int id, String label, Type type) { this.id = id; this.label = label; diff --git a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java index 9136801..b0625e3 100644 --- a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java +++ b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java @@ -1,6 +1,7 @@ package mrmathami.cia.java.jdt; import mrmathami.cia.java.JavaCiaException; +import mrmathami.cia.java.jdt.gephi.Printer; import mrmathami.cia.java.project.JavaProjectSnapshot; import mrmathami.cia.java.tree.dependency.JavaDependency; import mrmathami.cia.java.tree.dependency.JavaDependencyWeightTable; @@ -27,6 +28,7 @@ public class Y { )); //private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); private static final Path configurationPath = Path.of(""); + public static void main(String[] args) throws JavaCiaException, IOException, ParserConfigurationException, SAXException { //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\myBatisExample\\src"); @@ -49,7 +51,8 @@ public static void main(String[] args) throws JavaCiaException, IOException, Par Files.write(corePath.resolve("output.txt"), jsonA.getBytes(StandardCharsets.UTF_8)); - //Files.write(corePath.resolve("gephi.gexf"), open.getBytes(StandardCharsets.UTF_8));*/ + Printer printer = new Printer(); + Files.write(corePath.resolve("gephi.gexf"), printer.writeGephi(projectSnapshot).getBytes(StandardCharsets.UTF_8)); System.out.printf("Parse A time: %s\n", (timeParseA - timeStart) / 1000000.0); } From 4261c1c77995f14b255ebc072a2775bdac36e919 Mon Sep 17 00:00:00 2001 From: quynh921999 <37545540+quynh921999@users.noreply.github.com> Date: Wed, 14 Apr 2021 13:45:22 +0700 Subject: [PATCH 6/6] finish write gephi file --- .../mrmathami/cia/java/jdt/gephi/Printer.java | 69 ++++++++++++++++++ .../cia/java/jdt/gephi/model/EdgeGephi.java | 4 +- .../cia/java/jdt/gephi/model/NodeGephi.java | 18 ++--- .../project/ProjectSnapshotComparison.java | 3 +- .../project/differ/EntityPartialMatcher.java | 10 +++ .../differ/JavaSnapshotComparator.java | 2 +- jdt/src/test/JSON-java.proj | Bin 143 -> 47852 bytes .../test/java/mrmathami/cia/java/jdt/X.java | 3 + .../test/java/mrmathami/cia/java/jdt/Y.java | 8 +- 9 files changed, 100 insertions(+), 17 deletions(-) diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java index f7742a2..a7da0f9 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/Printer.java @@ -2,8 +2,13 @@ import mrmathami.cia.java.jdt.gephi.model.EdgeGephi; import mrmathami.cia.java.jdt.gephi.model.NodeGephi; +import mrmathami.cia.java.project.JavaNodeWeightTable; +import mrmathami.cia.java.project.JavaProject; import mrmathami.cia.java.project.JavaProjectSnapshot; +import mrmathami.cia.java.project.JavaProjectSnapshotComparison; import mrmathami.cia.java.tree.node.JavaNode; +import mrmathami.utils.Pair; +import org.w3c.dom.Node; import java.util.ArrayList; import java.util.HashMap; @@ -42,6 +47,70 @@ public String writeGephi(JavaProjectSnapshot projectSnapshot) { return open + listNode + listEdge + "\n\n" + ""; } + public String writeGephiComparison(JavaProjectSnapshotComparison comparison) { + final Set addedNodes = comparison.getAddedNodes(); + final Set> changedNodes = comparison.getChangedNodes(); + final Set removedNodes = comparison.getRemovedNodes(); + final Set> unchangedNodes = comparison.getUnchangedNodes(); + + HashMap> dependencyToMap = new HashMap<>(); + final List allNodes = comparison.getCurrentSnapshot().getRootNode().getAllNodes(); + final JavaNodeWeightTable nodeImpactTable = comparison.getNodeImpactTable(); + + for (JavaNode node : allNodes) { + final Set dependencyToNodes = node.getDependencyToNodes(); + dependencyToMap.put(node, dependencyToNodes); + } + List nodeGephiList = new ArrayList<>(); + List edgeGephiList = new ArrayList<>(); + int count = 0; + for (Map.Entry> entry : dependencyToMap.entrySet()) { + NodeGephi nodeGephi = null; + if (addedNodes.contains(entry.getKey())) { + nodeGephi = new NodeGephi(entry.getKey().getId(), entry.getKey().getNodeName() + " weight: " + nodeImpactTable.getWeight(entry.getKey()), NodeGephi.Type.ADD); + } + + for (Pair pair : changedNodes) { + final JavaNode pairB = pair.getB(); + if (entry.getKey() == pairB) { + nodeGephi = new NodeGephi(pairB.getId(), pairB.getNodeName() + " weight: " + nodeImpactTable.getWeight(pairB), NodeGephi.Type.CHANGE); + } + } + for (Pair pair : unchangedNodes) { + final JavaNode pairB = pair.getB(); + if (entry.getKey() == pairB) { + nodeGephi = new NodeGephi(pairB.getId(), pairB.getNodeName() + " weight: " + nodeImpactTable.getWeight(pairB), NodeGephi.Type.UNCHANGE); + } + } + nodeGephiList.add(nodeGephi); + final Set value = entry.getValue(); + for (JavaNode javaNode : value) { + EdgeGephi edgeGephi = new EdgeGephi(count, entry.getKey().getId(), javaNode.getId()); + count++; + edgeGephiList.add(edgeGephi); + } + } + + for (JavaNode node : removedNodes) { + NodeGephi nodeGephi = new NodeGephi(node.getId() + nodeGephiList.size(), node.getNodeName(), NodeGephi.Type.DELETE); + final Set dependencyToNodes = node.getDependencyToNodes(); + for (JavaNode javaNode : dependencyToNodes) { + EdgeGephi edgeGephi = new EdgeGephi(count, node.getId() + nodeGephiList.size(), javaNode.getId()); + count++; + edgeGephiList.add(edgeGephi); + } + nodeGephiList.add(nodeGephi); + } + + final String open = "\n" + + "" + + "\n\n"; + + String listNode = writeListNodes(nodeGephiList); + String listEdge = writeListEdges(edgeGephiList); + + return open + listNode + listEdge + "\n\n" + ""; + } public String writeListNodes(List nodeGephiList) { StringBuilder result = new StringBuilder("\t"); diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java index f203e56..7f9ce14 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/EdgeGephi.java @@ -17,6 +17,8 @@ public String toString() { "id='" + id + '\'' + " source='" + source + '\'' + " target='" + target + '\'' + - ">"; + ">" + + "\n\t\t\t" + "" + + "\n\t\t"; } } diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java index 3609e3d..cf7b73e 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/gephi/model/NodeGephi.java @@ -1,17 +1,15 @@ package mrmathami.cia.java.jdt.gephi.model; -import org.eclipse.text.edits.DeleteEdit; - public class NodeGephi { public enum Type { - UNCHANGE(0, 153, 153), - DELETE(255, 0, 0), - CHANGE(255, 255, 0), - ADD(0, 255, 153); + UNCHANGE(115, 115, 115),//charcoal blue + DELETE(255, 0, 0),//red + CHANGE(255, 255, 0),//yellow + ADD(0, 255, 153);//light green - private int r; - private int g; - private int b; + private final int r; + private final int g; + private final int b; Type(int r, int g, int b) { this.r = r; @@ -22,7 +20,7 @@ public enum Type { private final int id; private final String label; - private final String size = ""; + private final String size = ""; private final Type type; public NodeGephi(int id, String label, Type type) { diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/ProjectSnapshotComparison.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/ProjectSnapshotComparison.java index 96d7aff..f232909 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/ProjectSnapshotComparison.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/ProjectSnapshotComparison.java @@ -50,7 +50,8 @@ public final class ProjectSnapshotComparison implements JavaProjectSnapshotCompa public ProjectSnapshotComparison(@Nonnull String name, @Nonnull JavaProjectSnapshot previousSnapshot, @Nonnull JavaProjectSnapshot currentSnapshot, - @Nonnull Set removedNodes, @Nonnull Set addedNodes, + @Nonnull Set removedNodes, + @Nonnull Set addedNodes, @Nonnull Set> changedNodes, @Nonnull Set> unchangedNodes, @Nonnull double[] dependencyImpacts, @Nonnull double[] nodeImpacts) { diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityPartialMatcher.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityPartialMatcher.java index 4316da3..4c87d09 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityPartialMatcher.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/EntityPartialMatcher.java @@ -121,8 +121,18 @@ protected int partialMatchCode(JavaIdentifiedEntity entity, boolean identicalMat int matchCode = node.getEntityClass().hashCode(); matchCode = matchCode * 31 + node.getNodeName().hashCode(); matchCode = matchCode * 31 + (identicalMatch ? node.getDependencyToNodes().size() : -1); + matchCode = matchCode * 31 + (identicalMatch ? node.getTextContent().hashCode() : -1); + matchCode = matchCode * 31 + attributeHasCode(node); return matchCode * 31 + ( identicalMatch ? node.getAttributes().getLength() : -1 ); } + private int attributeHasCode(JavaXMLNode node) { + NamedNodeMap listAttribute = node.getAttributes(); + int hashCode = listAttribute.getLength(); + for (int i = 0; i < listAttribute.getLength(); i++) { + hashCode = hashCode * 31 + listAttribute.item(i).getNodeName().hashCode() + listAttribute.item(i).getNodeValue().hashCode(); + } + return hashCode; + } @Override protected boolean partialMatch(JavaIdentifiedEntity entityA, JavaIdentifiedEntity entityB, EntityMatcher matcher, boolean identicalMatch) { diff --git a/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/JavaSnapshotComparator.java b/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/JavaSnapshotComparator.java index 88c1677..8b25785 100644 --- a/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/JavaSnapshotComparator.java +++ b/jdt/src/main/java/mrmathami/cia/java/jdt/project/differ/JavaSnapshotComparator.java @@ -73,7 +73,7 @@ public static ProjectSnapshotComparison compare(@Nonnull String comparisonName, private static void compareRootNodes(@Nonnull JavaRootNode previousRootNode, @Nonnull JavaRootNode currentRootNode, - @Nonnull Set addedNodes, @Nonnull Set removedNodes, + @Nonnull Set removedNodes, @Nonnull Set addedNodes, @Nonnull Set> changedNodes, @Nonnull Set> unchangedNodes) { final EntityMatcher matcher = new EntityMatcher(); diff --git a/jdt/src/test/JSON-java.proj b/jdt/src/test/JSON-java.proj index 69ae0416a6edd1a37e5a5e5332c0f427b85d8a5a..855c58b29817d801098ca58ae8835c61a89c9288 100644 GIT binary patch literal 47852 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

3`L5Zs~MLDWwIbV}oZ zIspi#l|(@Jprb*I)&fv(H9&B0Z4l6T0CaIRK#0H6ARz1x?z$Ktk**0lgZD$K8QvL8 zow-!vVbAdXA0;igy!GD36GSF&87(dJRH0o2?^wKv?&e}@+zcfgFv59JcJW}#0hwHE z?;OZN`0@MWNErRDJQ_M8p=M*>mcQ@4Z_5!5P~F<_Zzlx7C2EI~(V-`* z$Nr<4^HZFm`SI#*xq;w^MhxhTF5PiX1Ag5-6hII4Aow~NK@m$+19=|XTTa^MMaPGpsL zH5uWQ=QX`-IV(s6)5_(?MYgScaE;FNl+=xL-hw^8KO6QV3a*uPjjY zoub?%vZRGDmMcaU#`mJd<49Ok^L^xBQMT$fa#RcWoJC=DY6tN$R#-x;WjQ6Wdz9ME zF*w88JO?}oSFQkJlgzu5aZ#${O8|!(d^JQSLi1S1ttqHj#XqO1-^;A<%JG;5-o%*i zLSnWcId0;ec@mCexpmunQBJZY1pY9wk%Bm~zs@MMWfR7Poh#q1QBLaYcEo0C2Lr1GfUPyN^YTquZ*yh!dR#JKn>@OxE>mfK2=K(O{m$J9{OGgvt}dA)>&*u zTvzGT$ty)SSpB2?|ul$D6MBt_CKa&B5Ljsu2 zk2s%G7xC{eBh|wMO4O1?`GgQ;DHB#0c_IHIzI_|;(M25cAbv0YH2(%*l_2u}YT{4V zkq*Q%YA>m`0rT1709fogG{TjJ%QyYlah*C}&q(+Pky2y>AQY z(HxFJhgFat32}acIc62;_bJv`%ETHQ3IF2Zc&T`R%r~hW@^`S1887cI`sTMmy*(BM z4WJ)~7|j+&4quVY?c2}4EN0CL|1$O-YZiVYHCj9azhH%*_4KXfNk1v-m$KP3nx!wx z9Lxm2xVVv`q?IgZ&z6htx$XEbkL*5!Zj~m-N#eJ3{hU(z7yR7>3qAb{{s!-T>$uAX zw-2nuuRW~H?Deyy38FcD{jvJHNxCy*QTgD#{yReog8WqR z+0?G!1T<6Q4aQyVZ=?MM?T=M`!QRY$qy0>^9x;sl0*C8kzG>XeuCBjPf4|eo z|GHv-$*MxJEypvZtZCfab<@PxbM2qq)OE)nKeBH6cZ0DUwZB~tb>04tm%Mys*AKoj zWA&1sOm-ca*!KQw{_N4NdviCx|H_9}b$$E(m2)rm+Tz4GY6$$60qXkdiJgz$c!kyV zfu##SyWnrFt{d}*w`OME)b)37{OI`uAN#zfbG*Dx9;!skUM;Me5P0*9z#Gm|toN)2 z@~)G3n-sHD{rjH8i!3M2OtIbXXul`k^RCv)tizwL;gIFL#5$?-k6O5Zv+os&Xm953UktO4Usmr=p*XNUn{2HBOy{b)GMq?Jt@< zu0QOBI?vb0_P2DNPbiN3QZ4jVvD+Qe<>E!rWAZS_+3XO;`0-_w{eUTd4(047BIQp~ z-r-*;KOX%?O5a^*&oz-_Ij{h*Ll9fve}nS=!pwO`yo?~%P;$MlfRYnmild@78W5eB)5zs*+2RJ E0c@L|H~;_u delta 7 OcmaF!m8qX`LO%cyF$0qT diff --git a/jdt/src/test/java/mrmathami/cia/java/jdt/X.java b/jdt/src/test/java/mrmathami/cia/java/jdt/X.java index 9d2d917..2f04414 100644 --- a/jdt/src/test/java/mrmathami/cia/java/jdt/X.java +++ b/jdt/src/test/java/mrmathami/cia/java/jdt/X.java @@ -1,6 +1,7 @@ package mrmathami.cia.java.jdt; import mrmathami.cia.java.JavaCiaException; +import mrmathami.cia.java.jdt.gephi.Printer; import mrmathami.cia.java.project.JavaProject; import mrmathami.cia.java.project.JavaProjectSnapshot; import mrmathami.cia.java.project.JavaProjectSnapshotComparison; @@ -83,6 +84,8 @@ public static void main(String[] args) throws JavaCiaException, IOException, Par = new ObjectOutputStream(Files.newOutputStream(Path.of("jdt\\src\\test\\JSON-java.proj")))) { objectOutputStream.writeObject(javaProject); } + Printer printer = new Printer(); + Files.write(javaSourcePathB.resolve("gephi.gexf"), printer.writeGephiComparison(snapshotComparison).getBytes(StandardCharsets.UTF_8)); System.out.printf("Compare time: %s\n", (timeCompareFinish - timeCompareStart) / 1000000.0); diff --git a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java index b0625e3..4e9de79 100644 --- a/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java +++ b/jdt/src/test/java/mrmathami/cia/java/jdt/Y.java @@ -26,13 +26,13 @@ public class Y { JavaDependency.INVOCATION, 4.0, JavaDependency.OVERRIDE, 1.0 )); - //private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); - private static final Path configurationPath = Path.of(""); + private static final Path configurationPath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\resources\\SqlMapConfig.xml"); + //private static final Path configurationPath = Path.of(""); public static void main(String[] args) throws JavaCiaException, IOException, ParserConfigurationException, SAXException { - //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); + final Path corePath = Path.of("D:\\project\\MyBatis Collection\\mybatis-XML\\mybatis-example-1\\src"); + //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\myBatisExample\\src"); //final Path corePath = Path.of("D:\\project\\MyBatis Collection\\myBatisExample\\src"); - final Path corePath = Path.of("D:\\project\\MyBatis Collection\\myBatisExample\\src"); final List coreFiles = getFileList(new ArrayList<>(), corePath); final Map>> javaSources = Map.of( "core", Pair.immutableOf(corePath, coreFiles)