package org.simantics.district.route; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.osgi.util.NLS; import org.simantics.ObjectIdentitySchedulingRule; import org.simantics.db.Resource; import org.simantics.district.route.internal.Activator; import org.simantics.district.route.internal.RoutePersistence; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Tuukka Lehtonen * @since 6.09 */ public class RouteJob extends Job { private static final Logger LOGGER = LoggerFactory.getLogger(RouteJob.class); private RouterConfiguration config; private List waypoints; private CompletableFuture> callback; public RouteJob(RouterConfiguration config, Route route, CompletableFuture> callback) { super("Compute route"); Objects.requireNonNull(callback, "Callback must be non-null"); setUser(true); setRule(new ObjectIdentitySchedulingRule(route)); this.config = config; this.waypoints = RoutePersistence.toResources(route.waypoints()); this.callback = callback; } @Override protected IStatus run(IProgressMonitor monitor) { List routers = Activator.getInstance().getRouteService().routers(); for (Router router : routers) { try { List path = router.findShortestPath(config, waypoints); if (!path.isEmpty()) { callback.complete(path); return Status.OK_STATUS; } } catch (RoutingException e) { LOGGER.error("Routing failed for waypoints {} and router '{}'", waypoints, router, e); callback.completeExceptionally(e); // This results in UI feedback of the error. // Perhaps later we get rid of this and let the UI code handle the notifications. return new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage()); } } LOGGER.info("No router could calculate route between waypoints {}. Available routers: {}", waypoints, routers); return new Status(IStatus.ERROR, Activator.PLUGIN_ID, NLS.bind("No router could calculate route between waypoints {0}. Available routers: {1}", waypoints, routers)); } }