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/AbstractNeoPhaseProcessor.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.apache.log4j.Logger;
15  import org.eclipse.emf.common.util.TreeIterator;
16  import org.eclipse.emf.ecore.EAnnotation;
17  import org.eclipse.emf.ecore.EAttribute;
18  import org.eclipse.emf.ecore.EClass;
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.ETypeParameter;
29  import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
30  import org.eclipse.emf.ecore.resource.Resource;
31  import org.neo4j.api.core.NeoService;
32  import org.neo4j.api.core.Node;
33  
34  import de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor;
35  import de.uni_leipzig.wifa.iwi.mr3.dao.neo4j.EcoreRelationshipType;
36  
37  /**
38   * Abstract save phase processor for neo4j storage.
39   * <p>
40   * This class contains all the methods all neo4j specific implementations need.
41   */
42  public abstract class AbstractNeoSaveProcessor implements SaveProcessor
43  {
44    /** Logger. */
45    private static final Logger LOG = Logger.getLogger(AbstractNeoSaveProcessor.class);
46  
47    /** Neo4j helper. */
48    private NeoHelper helper;
49  
50    /** Neo4j service. */
51    private NeoService neo;
52  
53    /**
54     * Setter.
55     *
56     * @param neoHelper
57     *          the helper to set
58     */
59    public void setHelper(final NeoHelper neoHelper)
60    {
61      helper = neoHelper;
62      neo = neoHelper.getNeo();
63    }
64  
65    /**
66     * Getter.
67     * 
68     * @return the helper
69     */
70    public NeoHelper getHelper()
71    {
72      return helper;
73    }
74  
75    /**
76     * Process.
77     * 
78     * @param resource
79     *          Resource
80     * @param registry
81     *          Node cache
82     * @see de.uni_leipzig.wifa.iwi.mr3.dao.SaveProcessor#process(org.eclipse.emf.ecore.resource.Resource,
83     *      java.util.Map)
84     */
85    @Override
86    public void process(final Resource resource, final Map<EObject, Object> registry)
87    {
88      // process its containment (the TreeIterator traverses the model tree in
89      // depth-first mode)
90      for (final TreeIterator<EObject> iter = resource.getAllContents(); iter.hasNext();)
91      {
92        dispatch(iter.next(), registry);
93      }
94    }
95  
96    /**
97     * Dispatch the current element to its handler.
98     * <p>
99     * The order of dispatch types dependends on type hierarchy. Special types
100    * <b>must</b> be checked earlier then generally types.
101    * <p>
102    * 
103    * @param element
104    *          Element to dispatch
105    * @param registry
106    *          Node cache
107    */
108   @Override
109   public void dispatch(final EObject element, final Map<EObject, Object> registry)
110   {
111     LOG.debug(element);
112 
113     if (element instanceof EPackage)
114     {
115       process((EPackage) element, registry);
116     }
117     else if (element instanceof EEnum)
118     {
119       process((EEnum) element, registry);
120     }
121     else if (element instanceof EEnumLiteral)
122     {
123       process((EEnumLiteral) element, registry);
124     }
125     else if (element instanceof EDataType)
126     {
127       process((EDataType) element, registry);
128     }
129     else if (element instanceof EClass)
130     {
131       process((EClass) element, registry);
132     }
133     else if (element instanceof EAnnotation)
134     {
135       process((EAnnotation) element, registry);
136     }
137     else if (element instanceof EOperation)
138     {
139       process((EOperation) element, registry);
140     }
141     else if (element instanceof EAttribute)
142     {
143       process((EAttribute) element, registry);
144     }
145     else if (element instanceof EReference)
146     {
147       process((EReference) element, registry);
148     }
149     else if (element instanceof EGenericType)
150     {
151       process((EGenericType) element, registry);
152     }
153     else if (element instanceof EParameter)
154     {
155       process((EParameter) element, registry);
156     }
157     else if (element instanceof ETypeParameter)
158     {
159       process((ETypeParameter) element, registry);
160     }
161     else if (element instanceof EStringToStringMapEntryImpl)
162     {
163       process((EStringToStringMapEntryImpl) element, registry);
164     }
165     else
166     {
167       process(element, registry);
168     }
169   }
170 
171   /**
172    * Determine a node from the registry.
173    *
174    * @param element
175    *          Element for what we need a node.
176    * @param registry
177    *          Node cache
178    * @return Node
179    */
180   protected Node getNodeFromRegistry(final EObject element, final Map<EObject, Object> registry)
181   {
182     return (Node) registry.get(element);
183   }
184 
185   /**
186    * Creates a node and binds it by a specified relationship to the given node.
187    *
188    * @param node
189    *          the node
190    * @param relType
191    *          the relationship type
192    * @param ordered
193    *          <code>true</code> if node will be created with ordering position
194    *          value
195    * @return the created and bound node
196    */
197   protected Node createNodeWithRelationship(final Node node, final EcoreRelationshipType relType, final boolean ordered)
198   {
199     final Node anotherNode = createNode();
200     node.createRelationshipTo(anotherNode, relType);
201     return anotherNode;
202   }
203 
204   /**
205    * Create a node. Optionally the node gets a position ordering value.
206    *
207    * @return Node
208    */
209   protected Node createNode()
210   {
211     return neo.createNode();
212   }
213 }