Skip to content
This repository has been archived by the owner on May 7, 2020. It is now read-only.

[Core] Fixed wrong order of widgets after sitemap changes #5523

Merged
merged 3 commits into from May 3, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

/**
Expand Down Expand Up @@ -281,9 +274,11 @@ public void modelChanged(String modelName, EventType type) {
for (Entry<String, PageChangeListener> listenerEntry : pageChangeListeners.entrySet()) {
String sitemapWithPage = listenerEntry.getKey();
String sitemapName = extractSitemapName(sitemapWithPage);
String pageId = extractPageId(sitemapWithPage);

if (sitemapName.equals(changedSitemapName)) {
listenerEntry.getValue().sitemapContentChanged();
EList<Widget> widgets = collectWidgets(sitemapName, pageId);
listenerEntry.getValue().sitemapContentChanged(widgets);
}
}
}
Expand Down
Expand Up @@ -257,7 +257,9 @@ private boolean definesVisibilityOrColor(Widget w, String name) {
return false;
}

public void sitemapContentChanged() {
public void sitemapContentChanged(EList<Widget> widgets) {
updateItemsAndWidgets(widgets);

SitemapChangedEvent changeEvent = new SitemapChangedEvent();
changeEvent.pageId = pageId;
changeEvent.sitemapName = sitemapName;
Expand Down
Expand Up @@ -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<String> getSitemapNames();
Set<String> 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);

}
Expand Up @@ -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;
Expand Down Expand Up @@ -48,6 +49,8 @@ public class SitemapProviderImpl implements SitemapProvider, ModelRepositoryChan

private final Map<String, Sitemap> sitemapModelCache = new ConcurrentHashMap<>();

private final Set<ModelRepositoryChangeListener> modelChangeListeners = new CopyOnWriteArraySet<>();

@Reference
public void setModelRepository(ModelRepository modelRepo) {
this.modelRepo = modelRepo;
Expand Down Expand Up @@ -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() {
Expand All @@ -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);
}

}