diff --git a/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/SitemapSubscriptionService.java b/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/SitemapSubscriptionService.java index 15ca9483b53..b94be283ba8 100644 --- a/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/SitemapSubscriptionService.java +++ b/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/SitemapSubscriptionService.java @@ -25,7 +25,6 @@ import org.eclipse.smarthome.io.rest.sitemap.internal.PageChangeListener; import org.eclipse.smarthome.io.rest.sitemap.internal.SitemapEvent; import org.eclipse.smarthome.model.core.EventType; -import org.eclipse.smarthome.model.core.ModelRepository; import org.eclipse.smarthome.model.core.ModelRepositoryChangeListener; import org.eclipse.smarthome.model.sitemap.LinkableWidget; import org.eclipse.smarthome.model.sitemap.Sitemap; @@ -105,19 +104,13 @@ protected void unsetItemUIRegistry(ItemUIRegistry itemUIRegistry) { @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC) protected void addSitemapProvider(SitemapProvider provider) { sitemapProviders.add(provider); + provider.addModelChangeListener(this); + } protected void removeSitemapProvider(SitemapProvider provider) { sitemapProviders.remove(provider); - } - - @Reference - protected void setModelRepository(ModelRepository modelRepo) { - modelRepo.addModelRepositoryChangeListener(this); - } - - protected void unsetModelRepository(ModelRepository modelRepo) { - modelRepo.removeModelRepositoryChangeListener(this); + provider.removeModelChangeListener(this); } /** @@ -281,9 +274,11 @@ public void modelChanged(String modelName, EventType type) { for (Entry listenerEntry : pageChangeListeners.entrySet()) { String sitemapWithPage = listenerEntry.getKey(); String sitemapName = extractSitemapName(sitemapWithPage); + String pageId = extractPageId(sitemapWithPage); if (sitemapName.equals(changedSitemapName)) { - listenerEntry.getValue().sitemapContentChanged(); + EList widgets = collectWidgets(sitemapName, pageId); + listenerEntry.getValue().sitemapContentChanged(widgets); } } } diff --git a/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/PageChangeListener.java b/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/PageChangeListener.java index 1a873657819..3848cba841f 100644 --- a/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/PageChangeListener.java +++ b/bundles/io/org.eclipse.smarthome.io.rest.sitemap/src/main/java/org/eclipse/smarthome/io/rest/sitemap/internal/PageChangeListener.java @@ -257,7 +257,9 @@ private boolean definesVisibilityOrColor(Widget w, String name) { return false; } - public void sitemapContentChanged() { + public void sitemapContentChanged(EList widgets) { + updateItemsAndWidgets(widgets); + SitemapChangedEvent changeEvent = new SitemapChangedEvent(); changeEvent.pageId = pageId; changeEvent.sitemapName = sitemapName; diff --git a/bundles/model/org.eclipse.smarthome.model.sitemap/src/org/eclipse/smarthome/model/sitemap/SitemapProvider.java b/bundles/model/org.eclipse.smarthome.model.sitemap/src/org/eclipse/smarthome/model/sitemap/SitemapProvider.java index e2ac79f00c0..2596e7db00e 100644 --- a/bundles/model/org.eclipse.smarthome.model.sitemap/src/org/eclipse/smarthome/model/sitemap/SitemapProvider.java +++ b/bundles/model/org.eclipse.smarthome.model.sitemap/src/org/eclipse/smarthome/model/sitemap/SitemapProvider.java @@ -14,21 +14,37 @@ import java.util.Set; +import org.eclipse.smarthome.model.core.ModelRepositoryChangeListener; public interface SitemapProvider { /** * This method provides access to sitemap model files, loads them and returns the object model tree. - * + * * @param sitemapName the name of the sitemap to load * @return the object model tree, null if it is not found */ - public Sitemap getSitemap(String sitemapName); + Sitemap getSitemap(String sitemapName); /** * Returns the names of all available sitemaps - * + * * @return names of provided sitemaps */ - public Set getSitemapNames(); + Set getSitemapNames(); + + /** + * Add a listener which will be informed subsequently once a model has changed + * + * @param listener + */ + void addModelChangeListener(ModelRepositoryChangeListener listener); + + /** + * Remove a model change listener again + * + * @param listener + */ + void removeModelChangeListener(ModelRepositoryChangeListener listener); + } diff --git a/bundles/model/org.eclipse.smarthome.model.sitemap/src/org/eclipse/smarthome/model/sitemap/internal/SitemapProviderImpl.java b/bundles/model/org.eclipse.smarthome.model.sitemap/src/org/eclipse/smarthome/model/sitemap/internal/SitemapProviderImpl.java index e5211117b4c..57e20c2719e 100644 --- a/bundles/model/org.eclipse.smarthome.model.sitemap/src/org/eclipse/smarthome/model/sitemap/internal/SitemapProviderImpl.java +++ b/bundles/model/org.eclipse.smarthome.model.sitemap/src/org/eclipse/smarthome/model/sitemap/internal/SitemapProviderImpl.java @@ -15,6 +15,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.stream.Collectors; import org.apache.commons.lang.StringUtils; @@ -48,6 +49,8 @@ public class SitemapProviderImpl implements SitemapProvider, ModelRepositoryChan private final Map sitemapModelCache = new ConcurrentHashMap<>(); + private final Set modelChangeListeners = new CopyOnWriteArraySet<>(); + @Reference public void setModelRepository(ModelRepository modelRepo) { this.modelRepo = modelRepo; @@ -103,6 +106,9 @@ public void modelChanged(String modelName, EventType type) { sitemapModelCache.put(modelName, (Sitemap) modelRepo.getModel(modelName)); } } + for (ModelRepositoryChangeListener listener : modelChangeListeners) { + listener.modelChanged(modelName, type); + } } private void refreshSitemapModels() { @@ -113,4 +119,14 @@ private void refreshSitemapModels() { } } + @Override + public void addModelChangeListener(ModelRepositoryChangeListener listener) { + modelChangeListeners.add(listener); + } + + @Override + public void removeModelChangeListener(ModelRepositoryChangeListener listener) { + modelChangeListeners.remove(listener); + } + }