Skip to content

Commit f5152b4

Browse files
committed
Load classes and namespace from db
1 parent e386026 commit f5152b4

3 files changed

Lines changed: 108 additions & 52 deletions

File tree

generator/org.svis.generator/src/org/svis/generator/famix/Famix2Famix.xtend

Lines changed: 87 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import org.neo4j.graphdb.Node
4747
import org.neo4j.graphdb.Label
4848
import org.neo4j.graphdb.traversal.Evaluators
4949
import org.neo4j.graphdb.Direction
50+
import org.neo4j.graphdb.traversal.Uniqueness
5051

5152
class Famix2Famix extends WorkflowComponentWithConfig {
5253
var GraphDatabaseService graph
@@ -75,70 +76,102 @@ class Famix2Famix extends WorkflowComponentWithConfig {
7576

7677
// Create Namespaces
7778
val packageLabel = Label.label("Package")
79+
val classLabel = Label.label("Class")
7880
val namespaces = newHashMap
79-
val parentNamespaces = newHashMap
81+
val classes = newHashMap
82+
val famixEvaluator = new FamixEvaluator()
8083
var tx = graph.beginTx
8184
try {
82-
val nodes = graph.findNodes(packageLabel)
83-
while (nodes.hasNext) {
84-
val node = nodes.next
85-
var namespace = createNamespace(node)
86-
famixDocument.elements += namespace
87-
namespaces.put(node.id, namespace)
88-
val td = graph.traversalDescription.breadthFirst.relationships(Rels.CONTAINS, Direction.INCOMING).
89-
evaluator(Evaluators.toDepth(1))
90-
for (parentNode : td.traverse(node).nodes) {
91-
if (parentNode.id != node.id && parentNode.hasLabel(packageLabel)) {
92-
parentNamespaces.put(node.id,parentNode.id)
85+
// get roots packages
86+
val result = graph.execute("MATCH (n:Package) WHERE NOT (n)<-[:CONTAINS]-(:Package)RETURN n")
87+
result.forEach[row|
88+
val rootnode = row.get("n") as Node
89+
// traverse though complete graph
90+
graph.traversalDescription
91+
.breadthFirst
92+
.relationships( Rels.CONTAINS, Direction.OUTGOING)
93+
.relationships(Rels.DECLARES, Direction.OUTGOING) // filters relevant relationships
94+
.uniqueness(Uniqueness.NONE)
95+
.evaluator(famixEvaluator) // filters relevant nodes
96+
.traverse(rootnode)
97+
.forEach[path|
98+
// this loop is executed for every path
99+
// for every end node an own path exists
100+
// therefore we are just interested in the end node, the other nodes have already been handled
101+
val node = path.endNode
102+
var Node parent
103+
if(path.length != 0) {
104+
parent = path.nodes.get(path.length-1)
93105
}
94-
}
95-
}
96-
parentNamespaces.forEach[childId , parentId |
97-
var ref = famixFactory.createIntegerReference
98-
ref.ref = namespaces.get(parentId)
99-
namespaces.get(childId).parentScope = ref
100-
]
101-
tx.success
102-
} catch (Exception e) {
103-
print(e)
104-
} finally {
105-
tx.close
106-
}
107-
108-
//Create Classes
109-
tx = graph.beginTx
110-
try {
111-
val classLabel = Label.label("Class")
112-
val containerLabel = Label.label("Container")
113-
val nodes = graph.findNodes(classLabel)
114-
val classes = newHashMap
115-
val containers = newHashMap
116-
while (nodes.hasNext) {
117-
val node = nodes.next
118-
val class = createClass(node)
119-
120-
classes.put(node.id,class)
121-
famixDocument.elements += class
122-
val td = graph.traversalDescription.breadthFirst.relationships(Rels.CONTAINS, Direction.INCOMING).
123-
evaluator(Evaluators.toDepth(1))
124-
for(parentNode : td.traverse(node).nodes) {
125-
if (parentNode.hasLabel(packageLabel)) {
126-
containers.put(node.id,parentNode.id)
106+
else {
107+
parent = null
127108
}
109+
var type = ""
110+
for(label : node.labels) {
111+
if(label.name == "Package") {
112+
type = "Package"
113+
} else if (label.name == "Class") {
114+
type = "Class"
115+
} else if (label.name == "Method") {
116+
type = "Method"
117+
}
128118
}
129-
}
130-
println(containers.size + " : " + classes.size)
131-
containers.forEach[classId, containerId |
132-
var ref = famixFactory.createIntegerReference
133-
ref.ref = namespaces.get(containerId)
134-
classes.get(classId).container = ref
119+
switch (type) {
120+
case "Package": {
121+
var namespace = createNamespace(node)
122+
namespaces.put(node.id, namespace)
123+
famixDocument.elements += namespace
124+
if(parent !== null) {
125+
val parentNamespace = namespaces.get(parent.id)
126+
var ref = famixFactory.createIntegerReference
127+
ref.ref = parentNamespace
128+
namespace.parentScope = ref
129+
}
130+
}
131+
case "Class": {
132+
val class = createClass(node)
133+
if(parent.hasLabel(packageLabel)) {
134+
val parentNamespace = namespaces.get(parent.id)
135+
println("parentID: " + parent.id)
136+
println("namespace: " + parentNamespace)
137+
println("nodeID: " + node.id)
138+
println("Elementliste: " + (classes.size + namespaces.size))
139+
println("FAMIXElemente: " + famixDocument.elements.size)
140+
var ref = famixFactory.createIntegerReference
141+
ref.ref = parentNamespace
142+
class.container = ref
143+
classes.put(node.id, class)
144+
famixDocument.elements += class
145+
}
146+
if(parent.hasLabel(classLabel)) {
147+
classes.put(node.id, class)
148+
val parentClass = classes.get(parent.id)
149+
var ref = famixFactory.createIntegerReference
150+
ref.ref = parentClass
151+
class.container = ref
152+
println("parentID: " + parent.id)
153+
println("parentClass: " + parentClass)
154+
println("nodeID: " + node.id)
155+
println("Elementliste: " + (classes.size + namespaces.size))
156+
println("FAMIXElemente: " + famixDocument.elements.size)
157+
famixDocument.elements += class
158+
}
159+
}
160+
case "Method": {
161+
// do method stuff
162+
}
163+
}
164+
]
135165
]
166+
println("finish")
136167
tx.success
137168
} catch (Exception e) {
138169
print(e)
139170
} finally {
140171
tx.close
141172
}
173+
println("Elementliste: " + (classes.size + namespaces.size))
174+
println("FAMIXElemente: " + famixDocument.elements.size)
142175
ctx.set("famix", famixRoot)
143176
val resource = new ResourceImpl()
144177
resource.contents += famixRoot
@@ -169,6 +202,7 @@ class Famix2Famix extends WorkflowComponentWithConfig {
169202
}
170203
}
171204

205+
172206
def private run(Root famixRoot) {
173207
val famixDocument = famixRoot.document
174208
famixDocument.elements.removeAll(Collections::singleton(null))
@@ -643,6 +677,8 @@ class Famix2Famix extends WorkflowComponentWithConfig {
643677
namespace.fqn = fqn
644678
namespace.name = id
645679
namespace.id = id
680+
print("ID von " + namespace.value + ": ")
681+
println(namespace.id)
646682
return namespace
647683
}
648684

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.svis.generator.famix
2+
3+
import org.neo4j.graphdb.Path
4+
import org.neo4j.graphdb.traversal.Evaluation
5+
import org.neo4j.graphdb.traversal.Evaluator
6+
7+
class FamixEvaluator implements Evaluator {
8+
9+
override evaluate(Path path) {
10+
var result = Evaluation.EXCLUDE_AND_PRUNE
11+
for(label : path.endNode.labels) {
12+
if(label.name == "Package" ||
13+
label.name == "Class" ||
14+
label.name == "Method") {
15+
result = Evaluation.INCLUDE_AND_CONTINUE
16+
}
17+
}
18+
return result
19+
}
20+
}

generator/org.svis.generator/src/org/svis/generator/famix/Rels.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
import org.neo4j.graphdb.RelationshipType;
44

55
public enum Rels implements RelationshipType {
6-
CONTAINS
6+
CONTAINS, DECLARES
77
}

0 commit comments

Comments
 (0)