X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.route%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Froute%2Finternal%2FRouteServiceImpl.java;fp=org.simantics.district.route%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Froute%2Finternal%2FRouteServiceImpl.java;h=6817ea3282843de3f70531c69d47889c71786bcc;hb=92904091e630d96b15286d3ddca833289f0ba926;hp=e37a803b6fa76b96cb84cd8c48200b19d5b4f48b;hpb=0e8411115bcfa632f880953c7e49c5389de28a31;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.route/src/org/simantics/district/route/internal/RouteServiceImpl.java b/org.simantics.district.route/src/org/simantics/district/route/internal/RouteServiceImpl.java index e37a803b..6817ea32 100644 --- a/org.simantics.district.route/src/org/simantics/district/route/internal/RouteServiceImpl.java +++ b/org.simantics.district.route/src/org/simantics/district/route/internal/RouteServiceImpl.java @@ -11,12 +11,12 @@ import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Session; -import org.simantics.db.exception.DatabaseException; +import org.simantics.db.common.procedure.adapter.DisposableListener; +import org.simantics.db.common.procedure.adapter.DisposableSyncListener; import org.simantics.db.layer0.request.PossibleActiveModel; import org.simantics.db.management.ISessionContext; import org.simantics.db.management.ISessionContextChangedListener; import org.simantics.db.management.SessionContextChangedEvent; -import org.simantics.db.procedure.SyncListener; import org.simantics.district.route.Route; import org.simantics.district.route.RouteEvent; import org.simantics.district.route.RouteService; @@ -38,42 +38,46 @@ public class RouteServiceImpl implements RouteService, ISessionContextChangedLis private List routers = new ArrayList<>(); private List unmodifiableRouters = Collections.unmodifiableList(routers); - private class StoreListener implements SyncListener { - private boolean disposed = false; - + private class StoreRoutesListener extends DisposableListener> { @Override - public void execute(ReadGraph graph, Resource activeModel) { - try { - if (activeModel != null) { - resetRoutes(RoutePersistence.findRoutes(graph, activeModel)); - } else { - resetRoutes(Collections.emptyList()); - } - fireEvent(RouteEvent.TYPE_ROUTE_SOURCE_CHANGED, this); - } catch (DatabaseException e) { - LOGGER.error("Failed to read routes from model {}", activeModel, e); - } + public void execute(List result) { + resetRoutes(result); + fireEvent(RouteEvent.TYPE_ROUTE_SOURCE_CHANGED, RouteServiceImpl.this); } @Override - public void exception(ReadGraph graph, Throwable t) { - LOGGER.error("Failed to listen to current route service storage", t); + public void exception(Throwable t) { + LOGGER.error("Failed to listen to current route store routes", t); } + } - public void dispose() { - disposed = true; + private class StoreListener extends DisposableSyncListener { + @Override + public void execute(ReadGraph graph, Resource activeModel) { + if (activeModel != null) { + StoreRoutesListener srl = storeRoutesListener; + if (srl != null) + srl.dispose(); + Simantics.getSession().asyncRequest( + new RoutePersistence.ModelRoutesRequest(activeModel), + storeRoutesListener = new StoreRoutesListener()); + } else { + resetRoutes(Collections.emptyList()); + fireEvent(RouteEvent.TYPE_ROUTE_SOURCE_CHANGED, RouteServiceImpl.this); + } } @Override - public boolean isDisposed() { - return disposed; + public void exception(ReadGraph graph, Throwable t) { + LOGGER.error("Failed to listen to current route service storage", t); } } + private StoreRoutesListener storeRoutesListener; private StoreListener storeListener; private synchronized void listenToActiveModels(Session s) { - StoreListener sl = storeListener; + StoreListener sl = storeListener; if (sl != null) sl.dispose(); if (s != null) { @@ -133,6 +137,11 @@ public class RouteServiceImpl implements RouteService, ISessionContextChangedLis fireEvent(RouteEvent.TYPE_ROUTE_REGISTERED, route); } + @Override + public void refreshRoute(Route route) { + fireEvent(RouteEvent.TYPE_ROUTE_MODIFIED, route); + } + @Override public CompletableFuture persistRoute(Route route) { fireEvent(RouteEvent.TYPE_ROUTE_PERSISTING, route);