034b0bf58736286270546acc197fbb67c47c8665
[aai/gizmo.git] / src / main / java / org / onap / crud / service / CrudGraphDataService.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * Copyright © 2017-2018 Amdocs
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21 package org.onap.crud.service;
22
23
24 import java.util.HashMap;
25 import java.util.List;
26 import javax.ws.rs.core.EntityTag;
27 import org.apache.commons.lang3.tuple.ImmutablePair;
28 import org.onap.aai.restclient.client.OperationResult;
29 import org.onap.crud.dao.GraphDao;
30 import org.onap.crud.entity.Edge;
31 import org.onap.crud.entity.Vertex;
32 import org.onap.crud.exception.CrudException;
33 import org.onap.crud.parser.CrudResponseBuilder;
34 import org.onap.crud.util.CrudServiceUtil;
35 import org.onap.schema.OxmModelValidator;
36 import org.onap.schema.RelationshipSchemaValidator;
37
38
39 public class CrudGraphDataService extends AbstractGraphDataService {
40
41
42   public CrudGraphDataService(GraphDao dao) throws CrudException {
43     super();
44     this.dao = dao;
45     this.daoForGet = dao;
46   }
47
48   public CrudGraphDataService(GraphDao dao, GraphDao daoForGet) throws CrudException {
49     super();
50     this.dao = dao;
51     this.daoForGet = daoForGet;
52   }
53
54   @Override
55   public ImmutablePair<EntityTag, String> addVertex(String version, String type, VertexPayload payload)
56             throws CrudException {
57     Vertex vertex = OxmModelValidator.validateIncomingUpsertPayload(null, version, type, payload.getProperties());
58     return addVertex(version, vertex);
59   }
60
61   private ImmutablePair<EntityTag, String> addVertex(String version, Vertex vertex) throws CrudException {
62     OperationResult addedVertexResult = dao.addVertex(vertex.getType(), vertex.getProperties(), version);
63     EntityTag entityTag = CrudServiceUtil.getETagFromHeader(addedVertexResult.getHeaders());
64     Vertex addedVertex = Vertex.fromJson(addedVertexResult.getResult(), version);
65     String payload = CrudResponseBuilder
66         .buildUpsertVertexResponse(OxmModelValidator.validateOutgoingPayload(version, addedVertex), version);
67
68     return new ImmutablePair<>(entityTag, payload);
69   }
70
71   @Override
72   public ImmutablePair<EntityTag, String> addEdge(String version, String type, EdgePayload payload)
73             throws CrudException {
74           
75         Edge edge = RelationshipSchemaValidator.validateIncomingAddPayload(version, type, payload);
76
77     return addEdge(version, edge);
78   }
79
80   private ImmutablePair<EntityTag, String> addEdge(String version, Edge edge) throws CrudException {
81     OperationResult addedEdgeResult = dao.addEdge(edge.getType(), edge.getSource(), edge.getTarget(), edge.getProperties(), version);
82     EntityTag entityTag = CrudServiceUtil.getETagFromHeader(addedEdgeResult.getHeaders());
83     Edge addedEdge = Edge.fromJson(addedEdgeResult.getResult());
84     String payload = CrudResponseBuilder
85       .buildUpsertEdgeResponse(RelationshipSchemaValidator.validateOutgoingPayload(version, addedEdge), version);
86
87     return new ImmutablePair<>(entityTag, payload);
88   }
89
90   @Override
91   public ImmutablePair<EntityTag, String> updateVertex(String version, String id, String type, VertexPayload payload)
92             throws CrudException {
93     Vertex vertex = OxmModelValidator.validateIncomingUpsertPayload(id, version, type, payload.getProperties());
94     return updateVertex(version, vertex);
95   }
96
97   private ImmutablePair<EntityTag, String> updateVertex(String version, Vertex vertex) throws CrudException {
98     OperationResult updatedVertexResult = dao.updateVertex(vertex.getId().get(), vertex.getType(), vertex.getProperties(), version);
99     String payload = getUpdatedVertexPayload(version, updatedVertexResult);
100     EntityTag entityTag = CrudServiceUtil.getETagFromHeader(updatedVertexResult.getHeaders());
101
102     return new ImmutablePair<>(entityTag, payload);
103   }
104
105   private String getUpdatedVertexPayload(String version, OperationResult updatedVertexResult) throws CrudException {
106     Vertex updatedVertex = Vertex.fromJson(updatedVertexResult.getResult(), version);
107
108     return CrudResponseBuilder
109       .buildUpsertVertexResponse(OxmModelValidator.validateOutgoingPayload(version, updatedVertex), version);
110   }
111
112   @Override
113   public ImmutablePair<EntityTag, String> patchVertex(String version, String id, String type, VertexPayload payload)
114             throws CrudException {
115     OperationResult existingVertexOpResult = dao.getVertex(id, OxmModelValidator.resolveCollectionType(version, type), version, new HashMap<String, String>());
116     Vertex existingVertex = Vertex.fromJson(existingVertexOpResult.getResult(), version);
117     Vertex vertex = OxmModelValidator.validateIncomingPatchPayload(id, version, type, payload.getProperties(),
118           existingVertex);
119     return updateVertex(version, vertex);
120   }
121
122   @Override
123   public String deleteVertex(String version, String id, String type) throws CrudException {
124     type = OxmModelValidator.resolveCollectionType(version, type);
125     dao.deleteVertex(id, type);
126     return "";
127   }
128
129   @Override
130   public String deleteEdge(String version, String id, String type) throws CrudException {
131     RelationshipSchemaValidator.validateType(version, type);
132     dao.deleteEdge(id);
133     return "";
134   }
135
136   @Override
137   public ImmutablePair<EntityTag, String> updateEdge(String version, String id, String type, EdgePayload payload)
138             throws CrudException {
139         Edge validatedEdge = getValidatedEdge(version, id, type, payload);
140
141     return updateEdge(version, validatedEdge);
142   }
143
144   private ImmutablePair<EntityTag, String> updateEdge(String version, Edge edge) throws CrudException {
145     OperationResult updatedEdgeResult = dao.updateEdge(edge);
146     String payload = getUpdatedEdgePayload(version, updatedEdgeResult);
147     EntityTag entityTag = CrudServiceUtil.getETagFromHeader(updatedEdgeResult.getHeaders());
148
149     return new ImmutablePair<>(entityTag, payload);
150   }
151
152   private String getUpdatedEdgePayload(String version, OperationResult updatedEdgeResult) throws CrudException {
153     Edge updatedEdge = Edge.fromJson(updatedEdgeResult.getResult());
154
155     return CrudResponseBuilder
156       .buildUpsertEdgeResponse(RelationshipSchemaValidator.validateOutgoingPayload(version, updatedEdge), version);
157   }
158
159   private Edge getValidatedEdge(String version, String id, String type, EdgePayload payload) throws CrudException {
160     OperationResult operationResult = dao.getEdge(id, type, new HashMap<String, String>());
161     return RelationshipSchemaValidator.validateIncomingUpdatePayload(Edge.fromJson(operationResult.getResult()), version, payload);
162   }
163   
164   @Override
165   public ImmutablePair<EntityTag, String> patchEdge(String version, String id, String type, EdgePayload payload)
166             throws CrudException {
167     OperationResult operationResult = dao.getEdge(id, type, new HashMap<String, String>());
168     Edge patchedEdge = RelationshipSchemaValidator.validateIncomingPatchPayload(Edge.fromJson(operationResult.getResult()), version, payload);
169     return updateEdge(version, patchedEdge);
170   }
171
172   @Override
173   protected Vertex addBulkVertex(Vertex vertex, String version, String dbTransId) throws CrudException {
174     return dao.addVertex(vertex.getType(), vertex.getProperties(), version, dbTransId);
175   }
176
177   @Override
178   protected Vertex updateBulkVertex(Vertex vertex, String id, String version, String dbTransId) throws CrudException {
179     return dao.updateVertex(id, vertex.getType(), vertex.getProperties(), version, dbTransId);
180   }
181
182   @Override
183   protected void deleteBulkVertex(String id, String version, String type, String dbTransId) throws CrudException {
184     dao.deleteVertex(id, type, dbTransId);
185   }
186
187   @Override
188   protected Edge addBulkEdge(Edge edge, String version, String dbTransId) throws CrudException {
189     return dao.addEdge(edge.getType(), edge.getSource(), edge.getTarget(), edge.getProperties(), version, dbTransId);
190   }
191
192   @Override
193   protected Edge updateBulkEdge(Edge edge, String version, String dbTransId) throws CrudException {
194     return dao.updateEdge(edge, dbTransId);
195   }
196
197   @Override
198   protected void deleteBulkEdge(String id, String version, String dbTransId) throws CrudException {
199     dao.deleteEdge(id, dbTransId);
200   }
201 }