import org.simantics.db.ReadGraph;
import org.simantics.db.Resource;
import org.simantics.db.Session;
+import org.simantics.db.common.procedure.adapter.DisposableListener;
+import org.simantics.db.common.procedure.adapter.DisposableSyncListener;
import org.simantics.db.exception.DatabaseException;
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;
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) {
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);
});
}
+ @Override
+ public Route readRoute(Object backendRouteObject) {
+ if (!(backendRouteObject instanceof Resource))
+ return null;
+
+ try {
+ return Simantics.getSession().syncRequest(new RoutePersistence.RouteRequest((Resource)backendRouteObject));
+ } catch (DatabaseException e) {
+ LOGGER.error("Failed to read district route object for " + backendRouteObject, e);
+ return null;
+ }
+ }
+
}