@@ -47,6 +47,7 @@ import org.neo4j.graphdb.Node
4747import org.neo4j.graphdb.Label
4848import org.neo4j.graphdb.traversal.Evaluators
4949import org.neo4j.graphdb.Direction
50+ import org.neo4j.graphdb.traversal.Uniqueness
5051
5152class 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
0 commit comments