1 package org.simantics.district.route;
4 import java.util.Objects;
5 import java.util.concurrent.CompletableFuture;
7 import org.eclipse.core.runtime.IProgressMonitor;
8 import org.eclipse.core.runtime.IStatus;
9 import org.eclipse.core.runtime.Status;
10 import org.eclipse.core.runtime.jobs.Job;
11 import org.simantics.ObjectIdentitySchedulingRule;
12 import org.simantics.db.Resource;
13 import org.simantics.district.route.internal.Activator;
14 import org.simantics.district.route.internal.RoutePersistence;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
19 * @author Tuukka Lehtonen
22 public class RouteJob extends Job {
24 private static final Logger LOGGER = LoggerFactory.getLogger(RouteJob.class);
26 private RouterConfiguration config;
27 private List<Resource> waypoints;
28 private CompletableFuture<List<Resource>> callback;
30 public RouteJob(RouterConfiguration config, Route route, CompletableFuture<List<Resource>> callback) {
31 super("Compute route");
32 Objects.requireNonNull(callback, "Callback must be non-null");
34 setRule(new ObjectIdentitySchedulingRule(route));
36 this.waypoints = RoutePersistence.toResources(route.waypoints());
37 this.callback = callback;
41 protected IStatus run(IProgressMonitor monitor) {
42 List<Router> routers = Activator.getInstance().getRouteService().routers();
43 for (Router router : routers) {
45 List<Resource> path = router.findShortestPath(config, waypoints);
46 if (!path.isEmpty()) {
47 callback.complete(path);
48 return Status.OK_STATUS;
50 } catch (RoutingException e) {
51 LOGGER.error("Routing failed for waypoints {} and router {}", waypoints, router, e);
52 callback.completeExceptionally(e);
55 LOGGER.info("No router could calculate route between waypoints {}. Available routers: {}", waypoints, routers);
56 return Status.OK_STATUS;