View Javadoc

1   //
2   // $Revision: 5 $
3   // $LastChangedBy: mhanns $
4   // $Date: 2010-04-01 10:10:45 +0200 (Do, 01 Apr 2010) $
5   // $HeadURL:
6   // svn://localhost/winf-ps/trunk/repository/src/main/java/de/uni_leipzig/wifa/iwi/mr3/dao/impl/neo4j/PhaseOneSaveProcessor.java
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.EModelElement;
24  import org.eclipse.emf.ecore.EObject;
25  import org.eclipse.emf.ecore.EOperation;
26  import org.eclipse.emf.ecore.EPackage;
27  import org.eclipse.emf.ecore.EParameter;
28  import org.eclipse.emf.ecore.EReference;
29  import org.eclipse.emf.ecore.ETypeParameter;
30  import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
31  import org.neo4j.api.core.Node;
32  
33  import de.uni_leipzig.wifa.iwi.mr3.dao.Constants;
34  import de.uni_leipzig.wifa.iwi.mr3.dao.neo4j.EcoreRelationshipType;
35  
36  /**
37   * Implements the phase one: importing elements with its containment
38   * relationships into nodepsace.
39   */
40  public class PhaseOneSaveProcessor extends AbstractNeoSaveProcessor
41  {
42    /**
43     * Process an <code>EPackage</code>.
44     *
45     * @param element
46     *          <code>EPackage</code>
47     * @param registry
48     *          Node cache
49     * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EPackage,
50     *      java.util.Map)
51     */
52    @Override
53    public void process(final EPackage element, final Map<EObject, Object> registry)
54    {
55      // properties
56      final Node node = createNode();
57      node.setProperty(Constants.PROPERTY_NAME, element.getName());
58      node.setProperty(Constants.PROPERTY_NS_URI, element.getNsURI());
59  
60      final String nsPrefix = element.getNsPrefix();
61      node.setProperty(Constants.PROPERTY_NS_PREFIX, nsPrefix == null ? "" : nsPrefix);
62  
63      // relationships
64      final EPackage container = element.getESuperPackage();
65      if (null == container)
66      {
67        // model node
68        getHelper().getSubrefNode(EcoreRelationshipType.RESOURCES).createRelationshipTo(node,
69            EcoreRelationshipType.RESOURCE);
70      }
71      else
72      {
73        // sub package node
74        getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
75      }
76  
77      registry.put(element, node);
78    }
79  
80    /**
81     * Process an <code>EDataType</code>.
82     *
83     * @param element
84     *          <code>EDataType</code>
85     * @param registry
86     *          Node cache
87     * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EDataType,
88     *      java.util.Map)
89     */
90    @Override
91    public void process(final EDataType element, final Map<EObject, Object> registry)
92    {
93      final Node node = createNode();
94      node.setProperty(Constants.PROPERTY_NAME, element.getName());
95      node.setProperty(Constants.PROPERTY_SERIALIZABLE, element.isSerializable());
96  
97      final String instanceTypeName = element.getInstanceTypeName();
98      if (null != instanceTypeName)
99      {
100       node.setProperty(Constants.PROPERTY_INSTANCE_TYPE_NAME, instanceTypeName);
101     }
102 
103     final String instanceClassName = element.getInstanceClassName();
104     if (null != instanceClassName)
105     {
106       node.setProperty(Constants.PROPERTY_INSTANCE_CLASS_NAME, instanceClassName);
107     }
108 
109     final Object defaultValue = element.getDefaultValue();
110     if (null != defaultValue)
111     {
112       node.setProperty(Constants.PROPERTY_DEFAULT_VALUE, defaultValue);
113     }
114 
115     // relationships
116     final EPackage container = element.getEPackage();
117     getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
118 
119     registry.put(element, node);
120   }
121 
122   /**
123    * Process an <code>EClass</code>.
124    *
125    * @param element
126    *          <code>EClass</code>
127    * @param registry
128    *          Node cache
129    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EClass,
130    *      java.util.Map)
131    */
132   @Override
133   public void process(final EClass element, final Map<EObject, Object> registry)
134   {
135     final Node node = createNode();
136     node.setProperty(Constants.PROPERTY_NAME, element.getName());
137     node.setProperty(Constants.PROPERTY_ABSTRACT, element.isAbstract());
138     node.setProperty(Constants.PROPERTY_INTERFACE, element.isInterface());
139 
140     final String instanceTypeName = element.getInstanceTypeName();
141     if (null != instanceTypeName)
142     {
143       node.setProperty(Constants.PROPERTY_INSTANCE_TYPE_NAME, instanceTypeName);
144     }
145 
146     final Object defaultValue = element.getDefaultValue();
147     if (null != defaultValue)
148     {
149       node.setProperty(Constants.PROPERTY_DEFAULT_VALUE, defaultValue);
150     }
151 
152     // relationships
153     final EPackage container = element.getEPackage();
154     getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
155 
156     registry.put(element, node);
157   }
158 
159   /**
160    * Process an <code>EEnum</code>.
161    *
162    * @param element
163    *          <code>EEnum</code>
164    * @param registry
165    *          Node cache
166    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EEnum,
167    *      java.util.Map)
168    */
169   @Override
170   public void process(final EEnum element, final Map<EObject, Object> registry)
171   {
172     final Node node = createNode();
173     node.setProperty(Constants.PROPERTY_NAME, element.getName());
174     node.setProperty(Constants.PROPERTY_SERIALIZABLE, element.isSerializable());
175     final String instanceTypeName = element.getInstanceTypeName();
176     if (null != instanceTypeName)
177     {
178       node.setProperty(Constants.PROPERTY_INSTANCE_TYPE_NAME, instanceTypeName);
179     }
180 
181     // relationships
182     final EPackage container = element.getEPackage();
183     getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
184 
185     registry.put(element, node);
186   }
187 
188   /**
189    * Process an <code>EAnnotation</code>.
190    *
191    * @param element
192    *          <code>EAnnotation</code>
193    * @param registry
194    *          Node cache
195    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EAnnotation,
196    *      java.util.Map)
197    */
198   @Override
199   public void process(final EAnnotation element, final Map<EObject, Object> registry)
200   {
201     final Node node = createNode();
202 
203     final String source = element.getSource();
204     node.setProperty(Constants.PROPERTY_SOURCE, source == null ? "" : source);
205 
206     // relationships
207     final EModelElement container = element.getEModelElement();
208     getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
209 
210     registry.put(element, node);
211   }
212 
213   /**
214    * Process an <code>EStringToStringMapEntryImpl</code>.
215    *
216    * @param element
217    *          <code>EStringToStringMapEntryImpl</code>
218    * @param registry
219    *          Node cache
220    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl,
221    *      java.util.Map)
222    */
223   @Override
224   public void process(final EStringToStringMapEntryImpl element, final Map<EObject, Object> registry)
225   {
226     final Node node = createNode();
227 
228     final String key = element.getKey();
229     final String val = element.getValue();
230 
231     if (null == key)
232     {
233       node.setProperty(Constants.PROPERTY_KEY_IS_NULL, true);
234     }
235     else
236     {
237       node.setProperty(Constants.PROPERTY_KEY, element.getKey());
238     }
239 
240     if (null == val)
241     {
242       node.setProperty(Constants.PROPERTY_VALUE_IS_NULL, true);
243     }
244     else
245     {
246       node.setProperty(Constants.PROPERTY_VALUE, element.getValue());
247     }
248 
249     // relationships
250     final EObject container = element.eContainer();
251     getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
252 
253     registry.put(element, node);
254   }
255 
256   /**
257    * Process an <code>EOperation</code>.
258    *
259    * @param element
260    *          <code>EOperation</code>
261    * @param registry
262    *          Node cache
263    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EOperation,
264    *      java.util.Map)
265    */
266   @Override
267   public void process(final EOperation element, final Map<EObject, Object> registry)
268   {
269     final Node node = createNode();
270     node.setProperty(Constants.PROPERTY_NAME, element.getName());
271     node.setProperty(Constants.PROPERTY_ORDERED, element.isOrdered());
272     node.setProperty(Constants.PROPERTY_UNIQUE, element.isUnique());
273     node.setProperty(Constants.PROPERTY_LOWER_BOUND, element.getLowerBound());
274     node.setProperty(Constants.PROPERTY_UPPER_BOUND, element.getUpperBound());
275 
276     // relationships
277     final EClass container = element.getEContainingClass();
278     getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
279 
280     final EList<EClassifier> exceptions = element.getEExceptions();
281     for (final EClassifier exception : exceptions)
282     {
283       node.createRelationshipTo(getNodeFromRegistry(exception, registry), EcoreRelationshipType.EXCEPTION);
284     }
285 
286     registry.put(element, node);
287   }
288 
289   /**
290    * Process an <code>EAttribute</code>.
291    *
292    * @param element
293    *          <code>EAttribute</code>
294    * @param registry
295    *          Node cache
296    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EAttribute,
297    *      java.util.Map)
298    */
299   @Override
300   public void process(final EAttribute element, final Map<EObject, Object> registry)
301   {
302     final Node node = createNode();
303     node.setProperty(Constants.PROPERTY_CHANGEABLE, element.isChangeable());
304     node.setProperty(Constants.PROPERTY_DERIVED, element.isDerived());
305     node.setProperty(Constants.PROPERTY_ID, element.isID());
306     node.setProperty(Constants.PROPERTY_LOWER_BOUND, element.getLowerBound());
307     node.setProperty(Constants.PROPERTY_NAME, element.getName());
308     node.setProperty(Constants.PROPERTY_ORDERED, element.isOrdered());
309     node.setProperty(Constants.PROPERTY_TRANSIENT, element.isTransient());
310     node.setProperty(Constants.PROPERTY_UNIQUE, element.isUnique());
311     node.setProperty(Constants.PROPERTY_UNSETTABLE, element.isUnsettable());
312     node.setProperty(Constants.PROPERTY_UPPER_BOUND, element.getUpperBound());
313     node.setProperty(Constants.PROPERTY_VOLATILE, element.isVolatile());
314 
315     final String defaultValueLiteral = element.getDefaultValueLiteral();
316     if (null != defaultValueLiteral)
317     {
318       node.setProperty(Constants.PROPERTY_DEFAULT_VALUE_LITERAL, defaultValueLiteral);
319     }
320 
321     // relationships
322     final EClass container = element.getEContainingClass();
323     getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
324 
325     registry.put(element, node);
326   }
327 
328   /**
329    * Process an <code>EReference</code>.
330    *
331    * @param element
332    *          <code>EReference</code>
333    * @param registry
334    *          Node cache
335    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EReference,
336    *      java.util.Map)
337    */
338   @Override
339   public void process(final EReference element, final Map<EObject, Object> registry)
340   {
341     final Node node = createNode();
342     node.setProperty(Constants.PROPERTY_CHANGEABLE, element.isChangeable());
343     node.setProperty(Constants.PROPERTY_CONTAINER, element.isContainer());
344     node.setProperty(Constants.PROPERTY_CONTAINMENT, element.isContainment());
345     node.setProperty(Constants.PROPERTY_DERIVED, element.isDerived());
346     node.setProperty(Constants.PROPERTY_LOWER_BOUND, element.getLowerBound());
347     node.setProperty(Constants.PROPERTY_NAME, element.getName());
348     node.setProperty(Constants.PROPERTY_ORDERED, element.isOrdered());
349     node.setProperty(Constants.PROPERTY_RESOLVE_PROXIES, element.isResolveProxies());
350     node.setProperty(Constants.PROPERTY_TRANSIENT, element.isTransient());
351     node.setProperty(Constants.PROPERTY_UNIQUE, element.isUnique());
352     node.setProperty(Constants.PROPERTY_UNSETTABLE, element.isUnsettable());
353     node.setProperty(Constants.PROPERTY_UPPER_BOUND, element.getUpperBound());
354     node.setProperty(Constants.PROPERTY_VOLATILE, element.isVolatile());
355 
356     final String defaultValueLiteral = element.getDefaultValueLiteral();
357     if (null != defaultValueLiteral)
358     {
359       node.setProperty(Constants.PROPERTY_DEFAULT_VALUE_LITERAL, defaultValueLiteral);
360     }
361 
362     // relationships
363     final EClass container = element.getEContainingClass();
364     getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
365 
366     final EList<EAttribute> eKeys = element.getEKeys();
367     for (final EAttribute eKey : eKeys)
368     {
369       node.createRelationshipTo(getNodeFromRegistry(eKey, registry), EcoreRelationshipType.E_KEY);
370     }
371 
372     final EReference opposite = element.getEOpposite();
373     if (null != opposite && null != getNodeFromRegistry(opposite, registry))
374     {
375       node.createRelationshipTo(getNodeFromRegistry(opposite, registry), EcoreRelationshipType.OPPOSITE);
376     }
377 
378     registry.put(element, node);
379   }
380 
381   /**
382    * Process an <code>EEnumLiteral</code>.
383    *
384    * @param element
385    *          <code>EEnumLiteral</code>
386    * @param registry
387    *          Node cache
388    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EEnumLiteral,
389    *      java.util.Map)
390    */
391   @Override
392   public void process(final EEnumLiteral element, final Map<EObject, Object> registry)
393   {
394     final Node node = createNode();
395     node.setProperty(Constants.PROPERTY_NAME, element.getName());
396     node.setProperty(Constants.PROPERTY_VALUE, element.getValue());
397 
398     if (null != element.getLiteral())
399     {
400       node.setProperty(Constants.PROPERTY_LITERAL, element.getLiteral());
401     }
402 
403     // relationships
404     final EEnum container = element.getEEnum();
405     final Node containerNode = getNodeFromRegistry(container, registry);
406     containerNode.createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
407 
408     if (element.equals(container.getDefaultValue()))
409     {
410       node.createRelationshipTo(containerNode, EcoreRelationshipType.DEFAULT_VALUE);
411     }
412 
413     registry.put(element, node);
414   }
415 
416   /**
417    * Process an <code>EGenericType</code>.
418    * <p>
419    *
420    * @param element
421    *          <code>EGenericType</code>
422    * @param registry
423    *          Node cache
424    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EGenericType,
425    *      java.util.Map)
426    */
427   @Override
428   public void process(final EGenericType element, final Map<EObject, Object> registry)
429   {
430     final Node genericTypeNode = createNode();
431 
432     final EObject container = element.eContainer();
433     getNodeFromRegistry(container, registry).createRelationshipTo(genericTypeNode, EcoreRelationshipType.CONTAINS);
434     getNodeFromRegistry(container, registry).createRelationshipTo(genericTypeNode, EcoreRelationshipType.GENERIC_TYPE);
435 
436     registry.put(element, genericTypeNode);
437   }
438 
439   /**
440    * Process an <code>EParameter</code>.
441    * <p>
442    * {@link EParameter}s are ordered!
443    *
444    * @param element
445    *          <code>EParameter</code>
446    * @param registry
447    *          Node cache
448    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EParameter,
449    *      java.util.Map)
450    */
451   @Override
452   public void process(final EParameter element, final Map<EObject, Object> registry)
453   {
454     final Node node = createNode();
455     node.setProperty(Constants.PROPERTY_NAME, element.getName());
456     node.setProperty(Constants.PROPERTY_LOWER_BOUND, element.getLowerBound());
457     node.setProperty(Constants.PROPERTY_UPPER_BOUND, element.getUpperBound());
458     node.setProperty(Constants.PROPERTY_ORDERED, element.isOrdered());
459     node.setProperty(Constants.PROPERTY_REQUIRED, element.isRequired());
460     node.setProperty(Constants.PROPERTY_UNIQUE, element.isUnique());
461     node.setProperty(Constants.PROPERTY_MANY, element.isMany());
462 
463     // relationships
464     final EOperation container = element.getEOperation();
465     getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
466 
467     registry.put(element, node);
468   }
469 
470   /**
471    * Process an <code>ETypeParameter</code> (generic type parameters).
472    *
473    * @param element
474    *          <code>ETypeParameter</code>
475    * @param registry
476    *          Node cache
477    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.ETypeParameter,
478    *      java.util.Map)
479    */
480   @Override
481   public void process(final ETypeParameter element, final Map<EObject, Object> registry)
482   {
483     final Node node = createNode();
484     node.setProperty(Constants.PROPERTY_NAME, element.getName());
485 
486     // relationships
487     final EObject container = element.eContainer();
488     getNodeFromRegistry(container, registry).createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
489 
490     registry.put(element, node);
491   }
492 
493   /**
494    * Process an general element.
495    *
496    * @param element
497    *          General element
498    * @param registry
499    *          Node cache
500    * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.EObject,
501    *      java.util.Map)
502    */
503   @Override
504   public void process(final EObject element, final Map<EObject, Object> registry)
505   {
506     final Node node = createNode();
507 
508     // relationships
509     final EObject container = element.eContainer();
510     if (null == container)
511     {
512       final Node modelNode = createNode();
513 
514       // bind dummy node to MODELS subref node
515       final String metaNsUri = element.eClass().getEPackage().getNsURI();
516       modelNode.setProperty(Constants.PROPERTY_NS_URI, metaNsUri + " [" + element.eResource().getURI() + "]");
517       modelNode.setProperty(Constants.PROPERTY_URI, String.valueOf(element.eResource().getURI()));
518       getHelper().getSubrefNode(EcoreRelationshipType.RESOURCES)
519           .createRelationshipTo(modelNode,
520           EcoreRelationshipType.RESOURCE);
521 
522       // bind node to dummy container node
523       modelNode.createRelationshipTo(node, EcoreRelationshipType.CONTAINS);
524       // bind dummy container node to its meta model
525       EPackage topLevelPackage = element.eClass().getEPackage();
526       while (null != topLevelPackage.getESuperPackage())
527       {
528         topLevelPackage = topLevelPackage.getESuperPackage();
529       }
530       final Node metaPackageNode = getHelper().getModelNode(topLevelPackage.getNsURI());
531       metaPackageNode.createRelationshipTo(modelNode, EcoreRelationshipType.INSTANCE_MODEL);
532     }
533 
534     registry.put(element, node);
535   }
536 }