1
2
3
4
5
6
7
8
9
10 package de.uni_leipzig.wifa.iwi.mr3.dao.neo4j.impl;
11
12 import java.util.Map;
13
14 import org.eclipse.emf.common.util.EList;
15 import org.eclipse.emf.ecore.EAnnotation;
16 import org.eclipse.emf.ecore.EAttribute;
17 import org.eclipse.emf.ecore.EClass;
18 import org.eclipse.emf.ecore.EClassifier;
19 import org.eclipse.emf.ecore.EDataType;
20 import org.eclipse.emf.ecore.EEnum;
21 import org.eclipse.emf.ecore.EEnumLiteral;
22 import org.eclipse.emf.ecore.EGenericType;
23 import org.eclipse.emf.ecore.EObject;
24 import org.eclipse.emf.ecore.EOperation;
25 import org.eclipse.emf.ecore.EPackage;
26 import org.eclipse.emf.ecore.EParameter;
27 import org.eclipse.emf.ecore.EReference;
28 import org.eclipse.emf.ecore.EStructuralFeature;
29 import org.eclipse.emf.ecore.ETypeParameter;
30 import org.eclipse.emf.ecore.EcorePackage;
31 import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
32 import org.neo4j.api.core.Direction;
33 import org.neo4j.api.core.Node;
34 import org.neo4j.api.core.Relationship;
35 import org.neo4j.api.core.ReturnableEvaluator;
36 import org.neo4j.api.core.StopEvaluator;
37 import org.neo4j.api.core.Traverser.Order;
38
39 import de.uni_leipzig.wifa.iwi.mr3.dao.Constants;
40 import de.uni_leipzig.wifa.iwi.mr3.dao.neo4j.EcoreRelationshipType;
41
42
43
44
45
46
47
48
49 public class PhaseTwoSaveProcessor extends AbstractNeoSaveProcessor
50 {
51
52
53
54
55
56
57
58
59
60
61 @Override
62 public void process(final EPackage element, final Map<EObject, Object> registry)
63 {
64
65 final EPackage container = element.getESuperPackage();
66 if (null == container && !element.getNsURI().equals(EcorePackage.eNS_URI))
67 {
68 final Node metamodelNode = getHelper().getModelNode(EcorePackage.eNS_URI);
69 if (null == metamodelNode)
70 {
71 throw new IllegalStateException("First save the meta model with nsURI: " + EcorePackage.eNS_URI);
72 }
73 metamodelNode.createRelationshipTo(getNodeFromRegistry(element, registry), EcoreRelationshipType.INSTANCE_MODEL);
74 }
75
76
77 setMetaElement(element, EPackage.class, registry);
78 }
79
80
81
82
83
84
85
86
87
88
89
90 @Override
91 public void process(final EDataType element, final Map<EObject, Object> registry)
92 {
93
94 setMetaElement(element, EDataType.class, registry);
95 }
96
97
98
99
100
101
102
103
104
105
106
107 @Override
108 public void process(final EClass element, final Map<EObject, Object> registry)
109 {
110
111 setSuperElements(element, registry);
112
113
114 setMetaElement(element, EClass.class, registry);
115 }
116
117
118
119
120
121
122
123
124
125
126
127 @Override
128 public void process(final EEnum element, final Map<EObject, Object> registry)
129 {
130
131 setMetaElement(element, EEnum.class, registry);
132 }
133
134
135
136
137
138
139
140
141
142
143
144 @Override
145 public void process(final EAnnotation element, final Map<EObject, Object> registry)
146 {
147
148 setMetaElement(element, EAnnotation.class, registry);
149 }
150
151
152
153
154
155
156
157
158
159
160
161 @Override
162 public void process(final EOperation element, final Map<EObject, Object> registry)
163 {
164
165 setMetaElement(element, EOperation.class, registry);
166 }
167
168
169
170
171
172
173
174
175
176
177
178 @Override
179 public void process(final EAttribute element, final Map<EObject, Object> registry)
180 {
181
182 setMetaElement(element, EAttribute.class, registry);
183 }
184
185
186
187
188
189
190
191
192
193
194
195 @Override
196 public void process(final EReference element, final Map<EObject, Object> registry)
197 {
198
199 setMetaElement(element, EReference.class, registry);
200 }
201
202
203
204
205
206
207
208
209
210
211
212 @Override
213 public void process(final EEnumLiteral element, final Map<EObject, Object> registry)
214 {
215
216 setMetaElement(element, EEnumLiteral.class, registry);
217 }
218
219
220
221
222
223
224
225
226
227
228
229
230 @Override
231 public void process(final EGenericType element, final Map<EObject, Object> registry)
232 {
233 setMetaElement(element, EGenericType.class, registry);
234
235 for (final EGenericType typeArgument : element.getETypeArguments())
236 {
237 getNodeFromRegistry(element, registry).createRelationshipTo(getNodeFromRegistry(typeArgument, registry),
238 EcoreRelationshipType.GENERIC_TYPE_ARGUMENT);
239 }
240 setTypeElement(element, registry);
241 }
242
243
244
245
246
247
248
249
250
251
252
253
254
255 @Override
256 public void process(final EParameter element, final Map<EObject, Object> registry)
257 {
258
259 setMetaElement(element, EParameter.class, registry);
260 }
261
262
263
264
265
266
267
268
269
270
271
272 @Override
273 public void process(final ETypeParameter element, final Map<EObject, Object> registry)
274 {
275
276 setMetaElement(element, ETypeParameter.class, registry);
277 }
278
279
280
281
282
283
284
285
286
287
288
289 @Override
290 public void process(final EStringToStringMapEntryImpl element, final Map<EObject, Object> registry)
291 {
292 setMetaElement(element, EStringToStringMapEntryImpl.class, registry);
293 }
294
295
296
297
298
299
300
301
302
303
304
305 @Override
306 public void process(final EObject element, final Map<EObject, Object> registry)
307 {
308 final Node node = getNodeFromRegistry(element, registry);
309
310
311 final Node typeNode = determineNode(element.eClass(), registry);
312 typeNode.createRelationshipTo(node, EcoreRelationshipType.INSTANCE);
313
314
315 for (final EAttribute feature : element.eClass().getEAllAttributes())
316 {
317 final Object featureValue = element.eGet(feature);
318 if (featureValue != null)
319 {
320 if (featureValue instanceof EList<?>)
321 {
322 for (final Object singleFeatureValue : (EList<?>) featureValue)
323 {
324 final Node featureNode = createNodeWithRelationship(node, EcoreRelationshipType.CONTAINS, true);
325 featureNode.setProperty(Constants.PROPERTY_VALUE, singleFeatureValue);
326
327 final Node metaNode = determineNode(feature, registry);
328 metaNode.createRelationshipTo(featureNode, EcoreRelationshipType.INSTANCE);
329 }
330 }
331 else
332 {
333 final Node featureNode = createNodeWithRelationship(node, EcoreRelationshipType.CONTAINS, true);
334 featureNode.setProperty(Constants.PROPERTY_VALUE, featureValue);
335
336
337 final Node metaNode = determineNode(feature, registry);
338 metaNode.createRelationshipTo(featureNode, EcoreRelationshipType.INSTANCE);
339 }
340 }
341 }
342
343
344 for (final EReference feature : element.eClass().getEAllReferences())
345 {
346 final Object featureValue = element.eGet(feature);
347 if (featureValue != null)
348 {
349 if (featureValue instanceof EObject)
350 {
351 final Node featureNode = createNodeWithRelationship(node, EcoreRelationshipType.CONTAINS, true);
352 featureNode.createRelationshipTo(getNodeFromRegistry((EObject) featureValue, registry),
353 feature.isContainment() ? EcoreRelationshipType.REFERENCES_AS_CONTAINMENT : EcoreRelationshipType.REFERENCES);
354
355
356 final Node metaNode = determineNode(feature, registry);
357 metaNode.createRelationshipTo(featureNode, EcoreRelationshipType.INSTANCE);
358 }
359 else if (featureValue instanceof EList<?>)
360 {
361 for (final Object singleFeatureValue : (EList<?>) featureValue)
362 {
363 final Node featureNode = createNodeWithRelationship(node, EcoreRelationshipType.CONTAINS, true);
364 featureNode.createRelationshipTo(getNodeFromRegistry((EObject) singleFeatureValue, registry), feature
365 .isContainment() ? EcoreRelationshipType.REFERENCES_AS_CONTAINMENT : EcoreRelationshipType.REFERENCES);
366
367
368 final Node metaNode = determineNode(feature, registry);
369 metaNode.createRelationshipTo(featureNode, EcoreRelationshipType.INSTANCE);
370 }
371 }
372 }
373 }
374 }
375
376
377
378
379
380
381
382
383
384 private void setSuperElements(final EClass element, final Map<EObject, Object> registry)
385 {
386 final Node node = getNodeFromRegistry(element, registry);
387
388 final EList<EClass> supertypes = element.getESuperTypes();
389 for (final EClass supertype : supertypes)
390 {
391 node.createRelationshipTo(getNodeFromRegistry(supertype, registry), EcoreRelationshipType.SUPER);
392 }
393 }
394
395
396
397
398
399
400
401
402
403
404
405 private void setMetaElement(final EObject element, final Class<? extends EObject> clazz, final Map<EObject, Object> registry)
406 {
407 final String mapEntryName = EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY.getName();
408 final String className =
409 clazz.getSimpleName().contains(mapEntryName) ? mapEntryName : clazz.getSimpleName();
410
411 final Node node = getHelper().determineEcoreClassifierNode(className);
412 if (null == node)
413 {
414 throw new IllegalStateException("The meta element " + clazz.getSimpleName() + " could not be found!");
415 }
416
417
418 final Node target = getNodeFromRegistry(element, registry);
419 if (node.equals(target))
420 {
421 return;
422 }
423
424 node.createRelationshipTo(target, EcoreRelationshipType.INSTANCE);
425 }
426
427
428
429
430
431
432
433
434
435 private void setTypeElement(final EGenericType element, final Map<EObject, Object> registry)
436 {
437
438 final EClassifier eType = element.getEClassifier();
439 if (eType != null)
440 {
441 final Node eTypeNode = determineNode(eType, registry);
442 if (null == eTypeNode)
443 {
444 throw new IllegalStateException("The type element " + eType + " could not be found!");
445 }
446
447 Node container = getNodeFromRegistry(element, registry);
448 while (container.hasRelationship(EcoreRelationshipType.CONTAINS, Direction.INCOMING))
449 {
450 container = container.getSingleRelationship(EcoreRelationshipType.CONTAINS, Direction.INCOMING).getStartNode();
451 }
452
453 Node typeContainer = eTypeNode;
454 while (typeContainer.hasRelationship(EcoreRelationshipType.CONTAINS, Direction.INCOMING))
455 {
456 typeContainer =
457 typeContainer.getSingleRelationship(EcoreRelationshipType.CONTAINS, Direction.INCOMING).getStartNode();
458 }
459
460 if (!container.equals(typeContainer))
461 {
462 container.createRelationshipTo(typeContainer, EcoreRelationshipType.DEPENDS);
463 }
464
465 getNodeFromRegistry(element, registry).createRelationshipTo(eTypeNode, EcoreRelationshipType.TYPE);
466 }
467 }
468
469
470
471
472
473
474
475
476
477 private Node determineNode(final EPackage aPackage)
478 {
479 final Node ePackageNode = getHelper().determineEcoreClassifierNode(EcorePackage.Literals.EPACKAGE.getName());
480 for (final Node pkgNode : ePackageNode.traverse(Order.BREADTH_FIRST, StopEvaluator.DEPTH_ONE,
481 ReturnableEvaluator.ALL_BUT_START_NODE, EcoreRelationshipType.INSTANCE, Direction.OUTGOING))
482 {
483 if (aPackage.getNsURI().equals(pkgNode.getProperty(Constants.PROPERTY_NS_URI)))
484 {
485 return pkgNode;
486 }
487 }
488 return null;
489 }
490
491
492
493
494
495
496
497
498
499
500
501 private Node determineNode(final EClassifier element, final Map<EObject, Object> registry)
502 {
503 final Node node = getNodeFromRegistry(element, registry);
504 if (node != null)
505 {
506 return node;
507 }
508
509
510 final Node packageNode = determineNode(element.getEPackage());
511 if (null == packageNode)
512 {
513 throw new IllegalStateException("The package with namespace uri [" + element.getEPackage().getNsURI()
514 + "] could not be found!");
515 }
516
517 for (final Node aNode : packageNode.traverse(Order.BREADTH_FIRST, StopEvaluator.DEPTH_ONE,
518 ReturnableEvaluator.ALL_BUT_START_NODE, EcoreRelationshipType.CONTAINS, Direction.OUTGOING))
519 {
520 if (aNode.hasProperty(Constants.PROPERTY_NAME))
521 {
522 final String classifierName = (String) aNode.getProperty(Constants.PROPERTY_NAME);
523 if (classifierName.equals(element.getName()))
524 {
525
526 final Relationship metaRel = aNode.getSingleRelationship(EcoreRelationshipType.INSTANCE, Direction.INCOMING);
527 if (metaRel == null)
528 {
529
530 registry.put(element, aNode);
531 return aNode;
532 }
533 final Node metaNode = metaRel.getStartNode();
534 if (EcorePackage.Literals.ECLASS.getName().equals(metaNode.getProperty(Constants.PROPERTY_NAME))
535 || EcorePackage.Literals.EDATA_TYPE.getName().equals(metaNode.getProperty(Constants.PROPERTY_NAME))
536 || EcorePackage.Literals.EENUM.getName().equals(metaNode.getProperty(Constants.PROPERTY_NAME)))
537 {
538
539 registry.put(element, aNode);
540 return aNode;
541 }
542 }
543 }
544 }
545
546 return null;
547 }
548
549
550
551
552
553
554
555
556
557
558 private Node determineNode(final EStructuralFeature element, final Map<EObject, Object> registry)
559 {
560 final Node node = getNodeFromRegistry(element, registry);
561 if (node != null)
562 {
563 return node;
564 }
565
566
567 final Node classifierNode = determineNode(element.getEContainingClass(), registry);
568
569 for (final Node aNode : classifierNode.traverse(Order.BREADTH_FIRST, StopEvaluator.DEPTH_ONE,
570 ReturnableEvaluator.ALL_BUT_START_NODE, EcoreRelationshipType.CONTAINS, Direction.OUTGOING))
571 {
572 if (aNode.hasProperty(Constants.PROPERTY_NAME))
573 {
574 final String name = (String) aNode.getProperty(Constants.PROPERTY_NAME);
575 if (name.equals(element.getName()))
576 {
577
578 final Node metaNode = aNode.getSingleRelationship(EcoreRelationshipType.INSTANCE, Direction.INCOMING).getStartNode();
579 if (!EcorePackage.Literals.EOPERATION.getName().equals(metaNode.getProperty(Constants.PROPERTY_NAME)))
580 {
581
582 registry.put(element, aNode);
583 return aNode;
584 }
585 }
586 }
587 }
588 return null;
589 }
590 }