]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.route/src/org/simantics/district/route/internal/RouteServiceImpl.java
Improved Routes view functionality
[simantics/district.git] / org.simantics.district.route / src / org / simantics / district / route / internal / RouteServiceImpl.java
index e37a803b6fa76b96cb84cd8c48200b19d5b4f48b..6817ea3282843de3f70531c69d47889c71786bcc 100644 (file)
@@ -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<Router> routers = new ArrayList<>();
     private List<Router> unmodifiableRouters = Collections.unmodifiableList(routers);
 
-    private class StoreListener implements SyncListener<Resource> {
-        private boolean disposed = false;
-
+    private class StoreRoutesListener extends DisposableListener<List<RouteImpl>> {
         @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<RouteImpl> 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<Resource> {
+        @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<Route> persistRoute(Route route) {
         fireEvent(RouteEvent.TYPE_ROUTE_PERSISTING, route);