1 /*******************************************************************************
2 * Copyright (c) 2017 Politecnico di Torino and others.
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Apache License, Version 2.0
6 * which accompanies this distribution, and is available at
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *******************************************************************************/
9 package it.polito.verigraph.grpc.server;
11 import java.io.IOException;
12 import java.util.HashMap;
14 import java.util.logging.FileHandler;
15 import java.util.logging.Level;
16 import java.util.logging.Logger;
17 import java.util.logging.SimpleFormatter;
18 import io.grpc.Server;
19 import io.grpc.ServerBuilder;
20 import io.grpc.stub.StreamObserver;
21 import it.polito.verigraph.grpc.ConfigurationGrpc;
22 import it.polito.verigraph.grpc.GetRequest;
23 import it.polito.verigraph.grpc.GraphGrpc;
24 import it.polito.verigraph.grpc.NeighbourGrpc;
25 import it.polito.verigraph.grpc.NewGraph;
26 import it.polito.verigraph.grpc.NewNeighbour;
27 import it.polito.verigraph.grpc.NewNode;
28 import it.polito.verigraph.grpc.NodeGrpc;
29 import it.polito.verigraph.grpc.Policy;
30 import it.polito.verigraph.grpc.RequestID;
31 import it.polito.verigraph.grpc.Status;
32 import it.polito.verigraph.grpc.VerificationGrpc;
33 import it.polito.verigraph.grpc.VerigraphGrpc;
34 import it.polito.verigraph.exception.BadRequestException;
35 import it.polito.verigraph.exception.DataNotFoundException;
36 import it.polito.verigraph.exception.ForbiddenException;
37 import it.polito.verigraph.model.Configuration;
38 import it.polito.verigraph.model.Graph;
39 import it.polito.verigraph.model.Neighbour;
40 import it.polito.verigraph.model.Node;
41 import it.polito.verigraph.model.Verification;
42 import it.polito.verigraph.resources.beans.VerificationBean;
43 import it.polito.verigraph.service.GraphService;
44 import it.polito.verigraph.service.NeighbourService;
45 import it.polito.verigraph.service.NodeService;
46 import it.polito.verigraph.service.VerificationService;
48 public class Service {
49 /** Port on which the server should run. */
50 private static final Logger logger = Logger.getLogger(Service.class.getName());
51 private static final int port = 50051;
52 private static final String internalError = "Internal Server Error";
53 private Server server;
54 private GraphService graphService= new GraphService();
55 private VerificationService verificationService = new VerificationService();
56 private NodeService nodeService = new NodeService();
57 private NeighbourService neighboursService = new NeighbourService();
59 public Service(int port) {
60 this(ServerBuilder.forPort(port), port);
63 /** Create a RouteGuide server using serverBuilder as a base and features as data. */
64 public Service(ServerBuilder<?> serverBuilder, int port) {
65 server = serverBuilder.addService(new VerigraphImpl())
69 public void start() throws IOException {
70 FileHandler fileTxt = new FileHandler("grpc_server_log.txt");
71 SimpleFormatter formatterTxt = new SimpleFormatter();
72 fileTxt.setFormatter(formatterTxt);
73 logger.addHandler(fileTxt);
75 logger.info("Server started, listening on "+ port);
76 Runtime.getRuntime().addShutdownHook(new Thread() {
79 logger.info("*** Shutting down gRPC server since JVM is shutting down");
81 logger.info("*** Server shut down");
92 private void blockUntilShutdown() throws InterruptedException {
94 server.awaitTermination();
98 /** Main function to launch server from cmd. */
99 public static void main(String[] args) throws IOException, InterruptedException {
101 Service server = new Service(port);
103 server.blockUntilShutdown();
106 logger.log(Level.WARNING, ex.getMessage());
110 /**Here start method of my implementation*/
111 private class VerigraphImpl extends VerigraphGrpc.VerigraphImplBase{
113 /** Here start methods of GraphResource*/
115 public void getGraphs(GetRequest request, StreamObserver<GraphGrpc> responseObserver) {
117 for(Graph item : graphService.getAllGraphs()) {
118 GraphGrpc gr = GrpcUtils.obtainGraph(item);
119 responseObserver.onNext(gr);
121 }catch(Exception ex){
122 GraphGrpc nr = GraphGrpc.newBuilder().setErrorMessage(internalError).build();
123 responseObserver.onNext(nr);
124 logger.log(Level.WARNING, ex.getMessage());
126 responseObserver.onCompleted();
130 public void createGraph(GraphGrpc request, StreamObserver<NewGraph> responseObserver) {
131 NewGraph.Builder response = NewGraph.newBuilder();
133 Graph graph = GrpcUtils.deriveGraph(request);
134 Graph newGraph = graphService.addGraph(graph);
135 response.setSuccess(true).setGraph(GrpcUtils.obtainGraph(newGraph));
136 }catch(BadRequestException ex){
137 response.setSuccess(false).setErrorMessage(ex.getMessage());
138 logger.log(Level.WARNING, ex.getClass().toString());
139 logger.log(Level.WARNING, ex.getMessage());
143 response.setSuccess(false).setErrorMessage(internalError);
144 logger.log(Level.WARNING, ex.getClass().toString());
145 logger.log(Level.WARNING, ex.getMessage());
147 responseObserver.onNext(response.build());
148 responseObserver.onCompleted();
152 public void deleteGraph(RequestID request, StreamObserver<Status> responseObserver) {
154 Status.Builder response = Status.newBuilder();
156 graphService.removeGraph(request.getIdGraph());
157 response.setSuccess(true);
158 }catch(ForbiddenException ex){
159 response.setSuccess(false).setErrorMessage(ex.getMessage());
160 logger.log(Level.WARNING, ex.getMessage());
161 }catch(Exception ex){
162 response.setSuccess(false).setErrorMessage(internalError);
163 logger.log(Level.WARNING, ex.getMessage());
165 responseObserver.onNext(response.build());
166 responseObserver.onCompleted();
170 public void getGraph(RequestID request, StreamObserver<GraphGrpc> responseObserver) {
172 Graph graph = graphService.getGraph(request.getIdGraph());
173 GraphGrpc gr = GrpcUtils.obtainGraph(graph);
174 responseObserver.onNext(gr);
175 }catch(ForbiddenException | DataNotFoundException ex){
176 GraphGrpc grError = GraphGrpc.newBuilder().setErrorMessage(ex.getMessage()).build();
177 responseObserver.onNext(grError);
178 logger.log(Level.WARNING, ex.getMessage());
179 }catch(Exception ex){
180 GraphGrpc grError = GraphGrpc.newBuilder().setErrorMessage(internalError).build();
181 responseObserver.onNext(grError);
182 logger.log(Level.WARNING, ex.getMessage());
184 responseObserver.onCompleted();
188 public void updateGraph(GraphGrpc request, StreamObserver<NewGraph> responseObserver) {
189 NewGraph.Builder response = NewGraph.newBuilder();
191 Graph graph = GrpcUtils.deriveGraph(request);
192 graph.setId(request.getId());
193 Graph newGraph = graphService.updateGraph(graph);
194 response.setSuccess(true).setGraph(GrpcUtils.obtainGraph(newGraph));
195 }catch(ForbiddenException | DataNotFoundException | BadRequestException ex){
196 response.setSuccess(false).setErrorMessage(ex.getMessage());
197 logger.log(Level.WARNING, ex.getMessage());
198 }catch(Exception ex){
199 response.setSuccess(false).setErrorMessage(internalError);
200 logger.log(Level.WARNING, ex.getMessage());
202 responseObserver.onNext(response.build());
203 responseObserver.onCompleted();
207 public void verifyPolicy(Policy request, StreamObserver<VerificationGrpc> responseObserver) {
209 VerificationGrpc.Builder verification;
212 VerificationBean verify = new VerificationBean();
213 verify.setDestination(request.getDestination());
214 verify.setSource(request.getSource());
215 verify.setType(request.getType().toString());
216 verify.setMiddlebox(request.getMiddlebox());
219 Verification ver = verificationService.verify(request.getIdGraph(), verify);
220 verification = VerificationGrpc.newBuilder(GrpcUtils.obtainVerification(ver))
221 .setSuccessOfOperation(true);
222 }catch(ForbiddenException | DataNotFoundException | BadRequestException ex){
223 verification = VerificationGrpc.newBuilder().setSuccessOfOperation(false)
224 .setErrorMessage(ex.getMessage());
225 logger.log(Level.WARNING, ex.getMessage());
226 }catch(Exception ex){
227 verification = VerificationGrpc.newBuilder().setSuccessOfOperation(false)
228 .setErrorMessage(internalError);
229 logger.log(Level.WARNING, ex.getMessage());
231 responseObserver.onNext(verification.build());
232 responseObserver.onCompleted();
235 /** Here start methods of NodeResource*/
238 public void getNodes(RequestID request, StreamObserver<NodeGrpc> responseObserver) {
240 for (Node item : nodeService.getAllNodes(request.getIdGraph())) {
241 NodeGrpc nr = GrpcUtils.obtainNode(item);
242 responseObserver.onNext(nr);
244 }catch(ForbiddenException | DataNotFoundException ex){
245 NodeGrpc nr = NodeGrpc.newBuilder().setErrorMessage(ex.getMessage()).build();
246 responseObserver.onNext(nr);
247 logger.log(Level.WARNING, ex.getMessage());
248 }catch(Exception ex){
249 NodeGrpc nr = NodeGrpc.newBuilder().setErrorMessage(internalError).build();
250 responseObserver.onNext(nr);
251 logger.log(Level.WARNING, ex.getMessage());
253 responseObserver.onCompleted();
257 public void createNode(NodeGrpc request, StreamObserver<NewNode> responseObserver) {
258 NewNode.Builder response = NewNode.newBuilder();
260 Node node = GrpcUtils.deriveNode(request);
261 Node newNode = nodeService.addNode(request.getIdGraph(), node);
262 response.setSuccess(true).setNode(GrpcUtils.obtainNode(newNode));
263 }catch(ForbiddenException | DataNotFoundException | BadRequestException ex){
264 response.setSuccess(false).setErrorMessage(ex.getMessage());
265 logger.log(Level.WARNING, ex.getMessage());
266 }catch(Exception ex){
267 response.setSuccess(false).setErrorMessage(internalError);
268 logger.log(Level.WARNING, ex.getMessage());
270 responseObserver.onNext(response.build());
271 responseObserver.onCompleted();
275 public void deleteNode(RequestID request, StreamObserver<Status> responseObserver) {
276 Status.Builder response = Status.newBuilder();
278 nodeService.removeNode(request.getIdGraph(), request.getIdNode());
279 response.setSuccess(true);
280 }catch(ForbiddenException | DataNotFoundException ex){
281 response.setSuccess(false).setErrorMessage(ex.getMessage());
282 logger.log(Level.WARNING, ex.getMessage());
283 }catch(Exception ex){
284 response.setSuccess(false).setErrorMessage(internalError);
285 logger.log(Level.WARNING, ex.getMessage());
287 responseObserver.onNext(response.build());
288 responseObserver.onCompleted();
292 public void getNode(RequestID request, StreamObserver<NodeGrpc> responseObserver) {
295 Node node = nodeService.getNode(request.getIdGraph(), request.getIdNode());
296 nr= GrpcUtils.obtainNode(node);
297 }catch(ForbiddenException | DataNotFoundException ex){
298 nr = NodeGrpc.newBuilder().setErrorMessage(ex.getMessage()).build();
299 logger.log(Level.WARNING, ex.getMessage());
300 }catch(Exception ex){
301 nr = NodeGrpc.newBuilder().setErrorMessage(internalError).build();
302 logger.log(Level.WARNING, ex.getMessage());
304 responseObserver.onNext(nr);
305 responseObserver.onCompleted();
309 public void updateNode(NodeGrpc request, StreamObserver<NewNode> responseObserver) {
310 NewNode.Builder response = NewNode.newBuilder();
312 Node node = GrpcUtils.deriveNode(request);
313 node.setId(request.getId());
314 Node newNode = nodeService.updateNode(request.getIdGraph(), node);
315 response.setSuccess(true).setNode(GrpcUtils.obtainNode(newNode));
316 }catch(ForbiddenException | DataNotFoundException | BadRequestException ex){
317 response.setSuccess(false).setErrorMessage(ex.getMessage());
318 logger.log(Level.WARNING, ex.getMessage());
319 }catch(Exception ex){
320 response.setSuccess(false).setErrorMessage(internalError);
321 logger.log(Level.WARNING, ex.getMessage());
323 responseObserver.onNext(response.build());
324 responseObserver.onCompleted();
328 public void configureNode(ConfigurationGrpc request, StreamObserver<Status> responseObserver) {
329 Status.Builder response = Status.newBuilder();
331 if (request.getIdGraph() <= 0) {
332 throw new ForbiddenException("Illegal graph id: " + request.getIdGraph());
334 if (request.getIdNode() <= 0) {
335 throw new ForbiddenException("Illegal node id: " + request.getIdNode());
337 Graph graph = new GraphService().getGraph(request.getIdGraph());
339 throw new BadRequestException("Graph with id " + request.getIdGraph() + " not found");
341 Node node = nodeService.getNode(request.getIdGraph(), request.getIdNode());
343 throw new BadRequestException("Node with id " + request.getIdNode() + " not found in graph with id " + request.getIdGraph());
345 Configuration nodeConfiguration = GrpcUtils.deriveConfiguration(request);
346 Node nodeCopy = new Node();
347 nodeCopy.setId(node.getId());
348 nodeCopy.setName(node.getName());
349 nodeCopy.setFunctional_type(node.getFunctional_type());
350 Map<Long,Neighbour> nodes = new HashMap<Long,Neighbour>();
351 nodes.putAll(node.getNeighbours());
352 nodeCopy.setNeighbours(nodes);
353 nodeConfiguration.setId(nodeCopy.getName());
354 nodeCopy.setConfiguration(nodeConfiguration);
355 Graph graphCopy = new Graph();
356 graphCopy.setId(graph.getId());
357 graphCopy.setNodes(new HashMap<Long, Node>(graph.getNodes()));
358 graphCopy.getNodes().remove(node.getId());
359 NodeService.validateNode(graphCopy, nodeCopy);
360 graph.getNodes().put(request.getIdNode(), nodeCopy);
361 response.setSuccess(true);
362 }catch(ForbiddenException | BadRequestException ex){
363 response.setSuccess(false).setErrorMessage(ex.getMessage());
364 logger.log(Level.WARNING, ex.getMessage());
365 }catch(Exception ex){
366 response.setSuccess(false).setErrorMessage(internalError);
367 logger.log(Level.WARNING, ex.getMessage());
369 responseObserver.onNext(response.build());
370 responseObserver.onCompleted();
373 /** Here start methods of NeighbourResource*/
375 public void getNeighbours(RequestID request, StreamObserver<NeighbourGrpc> responseObserver) {
377 for(Neighbour item : neighboursService.getAllNeighbours(request.getIdGraph(), request.getIdNode())) {
378 NeighbourGrpc nr = GrpcUtils.obtainNeighbour(item);
379 responseObserver.onNext(nr);
381 }catch(ForbiddenException | DataNotFoundException ex){
382 NeighbourGrpc nr = NeighbourGrpc.newBuilder().setErrorMessage(ex.getMessage()).build();
383 responseObserver.onNext(nr);
384 logger.log(Level.WARNING, ex.getMessage());
385 }catch(Exception ex){
386 NeighbourGrpc nr = NeighbourGrpc.newBuilder().setErrorMessage(internalError).build();
387 responseObserver.onNext(nr);
388 logger.log(Level.WARNING, ex.getMessage());
390 responseObserver.onCompleted();
394 public void createNeighbour(NeighbourGrpc request, StreamObserver<NewNeighbour> responseObserver) {
395 NewNeighbour.Builder response = NewNeighbour.newBuilder();
397 Neighbour neighbour = GrpcUtils.deriveNeighbour(request);
398 Neighbour newNeighbour = neighboursService.addNeighbour(request.getIdGraph(), request.getIdNode(), neighbour);
399 response.setSuccess(true).setNeighbour(GrpcUtils.obtainNeighbour(newNeighbour));
400 }catch(ForbiddenException | DataNotFoundException | BadRequestException ex){
401 response.setSuccess(false).setErrorMessage(ex.getMessage());
402 logger.log(Level.WARNING, ex.getMessage());
403 }catch(Exception ex){
404 response.setSuccess(false).setErrorMessage(ex.getMessage());
405 logger.log(Level.WARNING, ex.getMessage());
407 responseObserver.onNext(response.build());
408 responseObserver.onCompleted();
412 public void deleteNeighbour(RequestID request, StreamObserver<Status> responseObserver) {
413 Status.Builder response = Status.newBuilder();
415 neighboursService.removeNeighbour(request.getIdGraph(), request.getIdNode(), request.getIdNeighbour());
416 response.setSuccess(true);
417 }catch(ForbiddenException | DataNotFoundException ex){
418 response.setSuccess(false).setErrorMessage(ex.getMessage());
419 logger.log(Level.WARNING, ex.getMessage());
420 }catch(Exception ex){
421 response.setSuccess(false).setErrorMessage(ex.getMessage());
422 logger.log(Level.WARNING, ex.getMessage());
424 responseObserver.onNext(response.build());
425 responseObserver.onCompleted();
429 public void getNeighbour(RequestID request, StreamObserver<NeighbourGrpc> responseObserver) {
432 Neighbour neighbour = neighboursService.getNeighbour(request.getIdGraph(),
433 request.getIdNode(), request.getIdNeighbour());
434 nr = GrpcUtils.obtainNeighbour(neighbour);
436 }catch(ForbiddenException | DataNotFoundException ex){
437 nr = NeighbourGrpc.newBuilder().setErrorMessage(ex.getMessage()).build();
438 logger.log(Level.WARNING, ex.getMessage());
439 }catch(Exception ex){
440 nr = NeighbourGrpc.newBuilder().setErrorMessage(internalError).build();
441 logger.log(Level.WARNING, ex.getMessage());
443 responseObserver.onNext(nr);
444 responseObserver.onCompleted();
448 public void updateNeighbour(NeighbourGrpc request, StreamObserver<NewNeighbour> responseObserver) {
449 NewNeighbour.Builder response = NewNeighbour.newBuilder();
451 Neighbour neighbour = GrpcUtils.deriveNeighbour(request);
452 neighbour.setId(request.getId());
453 Neighbour newNeighbour = neighboursService.updateNeighbour(request.getIdGraph(), request.getIdNode(), neighbour);
454 response.setSuccess(true).setNeighbour(GrpcUtils.obtainNeighbour(newNeighbour));
455 }catch(ForbiddenException | DataNotFoundException | BadRequestException ex){
456 response.setSuccess(false).setErrorMessage(ex.getMessage());
457 logger.log(Level.WARNING, ex.getMessage());
458 }catch(Exception ex){
459 response.setSuccess(false).setErrorMessage(ex.getMessage());
460 logger.log(Level.WARNING, ex.getMessage());
462 responseObserver.onNext(response.build());
463 responseObserver.onCompleted();