]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.route/src/org/simantics/district/route/internal/RoutePersistenceJob.java
Initial version of the district network Routes view.
[simantics/district.git] / org.simantics.district.route / src / org / simantics / district / route / internal / RoutePersistenceJob.java
1 package org.simantics.district.route.internal;
2
3 import java.util.concurrent.CompletableFuture;
4
5 import org.eclipse.core.runtime.IProgressMonitor;
6 import org.eclipse.core.runtime.IStatus;
7 import org.eclipse.core.runtime.Status;
8 import org.simantics.DatabaseJob;
9 import org.simantics.Simantics;
10 import org.simantics.db.Resource;
11 import org.simantics.db.WriteGraph;
12 import org.simantics.db.exception.DatabaseException;
13 import org.simantics.db.layer0.request.PossibleModel;
14 import org.simantics.db.request.Write;
15 import org.simantics.district.route.Route;
16 import org.simantics.district.route.RouteEvent;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
19
20 /**
21  * @author Tuukka Lehtonen
22  * @since 6.09
23  */
24 public class RoutePersistenceJob extends DatabaseJob {
25
26     private static final Logger LOGGER = LoggerFactory.getLogger(RoutePersistenceJob.class);
27
28     private RouteImpl route;
29     private int eventType;
30     private CompletableFuture<Route> future;
31
32     public RoutePersistenceJob(RouteImpl route, int eventType, CompletableFuture<Route> future) {
33         super("Route Persistence");
34         this.route = route;
35         this.eventType = eventType;
36         this.future = future;
37         setUser(false);
38         setSystem(true);
39     }
40
41     @Override
42     protected IStatus run(IProgressMonitor monitor) {
43         try {
44             Simantics.getSession().syncRequest((Write) graph -> persist(graph));
45             future.complete(route);
46         } catch (DatabaseException e) {
47             LOGGER.error("Failed to persist route {}", route, e);
48             future.completeExceptionally(e);
49         }
50         return Status.OK_STATUS;
51     }
52
53     private void persist(WriteGraph graph) throws DatabaseException {
54         switch (eventType) {
55             case RouteEvent.TYPE_ROUTE_DISCARDING:
56                 remove(graph);
57                 break;
58
59             case RouteEvent.TYPE_ROUTE_PERSISTING:
60                 write(graph);
61                 break;
62         }
63     }
64
65     private void write(WriteGraph graph) throws DatabaseException {
66         graph.markUndoPoint();
67         Resource r = route.backend();
68         Resource me = route.modelEntity();
69         if (r == null) {
70             Resource model = graph.sync(new PossibleModel(me));
71             route.backend(
72                     RoutePersistence.createRoute(graph,
73                             model,
74                             route.getName(),
75                             RoutePersistence.toResources(route.waypoints()))
76                     );
77         } else {
78             RoutePersistence.updateRoute(graph,
79                     r,
80                     route.getName(),
81                     RoutePersistence.toResources(route.waypoints())
82             );
83         }
84     }
85
86     private void remove(WriteGraph graph) throws DatabaseException {
87         graph.markUndoPoint();
88         Resource r = route.backend();
89         if (r != null) {
90             RoutePersistence.removeRoute(graph, r);
91         }
92     }
93
94 }