This repository has been archived by the owner on May 7, 2020. It is now read-only.
/
SitemapProviderImpl.java
132 lines (113 loc) · 4.63 KB
/
SitemapProviderImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
* Copyright (c) 2014,2018 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.smarthome.model.sitemap.internal;
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;
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.Sitemap;
import org.eclipse.smarthome.model.sitemap.SitemapProvider;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class provides access to the sitemap model files.
*
* @author Kai Kreuzer - Initial contribution and API
*
*/
@Component(service = SitemapProvider.class)
public class SitemapProviderImpl implements SitemapProvider, ModelRepositoryChangeListener {
private static final String SITEMAP_MODEL_NAME = "sitemap";
protected static final String SITEMAP_FILEEXT = "." + SITEMAP_MODEL_NAME;
private final Logger logger = LoggerFactory.getLogger(SitemapProviderImpl.class);
private ModelRepository modelRepo = null;
private final Map<String, Sitemap> sitemapModelCache = new ConcurrentHashMap<>();
private final Set<ModelRepositoryChangeListener> modelChangeListeners = new CopyOnWriteArraySet<>();
@Reference
public void setModelRepository(ModelRepository modelRepo) {
this.modelRepo = modelRepo;
}
public void unsetModelRepository(ModelRepository modelRepo) {
this.modelRepo = null;
}
@Activate
protected void activate() {
refreshSitemapModels();
modelRepo.addModelRepositoryChangeListener(this);
}
@Deactivate
protected void deactivate() {
if (modelRepo != null) {
modelRepo.removeModelRepositoryChangeListener(this);
}
sitemapModelCache.clear();
}
@Override
public Sitemap getSitemap(String sitemapName) {
String filename = sitemapName + SITEMAP_FILEEXT;
Sitemap sitemap = sitemapModelCache.get(filename);
if (sitemap != null) {
if (!sitemap.getName().equals(sitemapName)) {
logger.warn(
"Filename `{}` does not match the name `{}` of the sitemap - please fix this as you might see unexpected behavior otherwise.",
filename, sitemap.getName());
}
return sitemap;
} else {
logger.trace("Sitemap {} cannot be found", sitemapName);
return null;
}
}
@Override
public Set<String> getSitemapNames() {
return sitemapModelCache.keySet().stream().map(name -> StringUtils.removeEnd(name, SITEMAP_FILEEXT))
.collect(Collectors.toSet());
}
@Override
public void modelChanged(String modelName, EventType type) {
if (modelName.endsWith(SITEMAP_FILEEXT)) {
if (type == EventType.REMOVED) {
sitemapModelCache.remove(modelName);
} else {
sitemapModelCache.put(modelName, (Sitemap) modelRepo.getModel(modelName));
}
}
for (ModelRepositoryChangeListener listener : modelChangeListeners) {
listener.modelChanged(modelName, type);
}
}
private void refreshSitemapModels() {
sitemapModelCache.clear();
Iterable<String> sitemapNames = modelRepo.getAllModelNamesOfType(SITEMAP_MODEL_NAME);
for (String sitemapName : sitemapNames) {
sitemapModelCache.put(sitemapName, (Sitemap) modelRepo.getModel(sitemapName));
}
}
@Override
public void addModelChangeListener(ModelRepositoryChangeListener listener) {
modelChangeListeners.add(listener);
}
@Override
public void removeModelChangeListener(ModelRepositoryChangeListener listener) {
modelChangeListeners.remove(listener);
}
}