Skip to content

Commit 0b89fbd

Browse files
authored
YAML Model Repository: Fix premature unknown element warning (#4755)
Signed-off-by: Jimmy Tanagra <jcode@tanagra.id.au>
1 parent c519ae1 commit 0b89fbd

File tree

1 file changed

+31
-16
lines changed

1 file changed

+31
-16
lines changed

bundles/org.openhab.core.model.yaml/src/main/java/org/openhab/core/model/yaml/internal/YamlModelRepositoryImpl.java

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.Map;
3131
import java.util.Objects;
3232
import java.util.Optional;
33+
import java.util.Set;
3334
import java.util.concurrent.ConcurrentHashMap;
3435
import java.util.concurrent.CopyOnWriteArrayList;
3536
import java.util.stream.Collectors;
@@ -40,6 +41,8 @@
4041
import org.openhab.core.model.yaml.YamlElementName;
4142
import org.openhab.core.model.yaml.YamlModelListener;
4243
import org.openhab.core.model.yaml.YamlModelRepository;
44+
import org.openhab.core.model.yaml.internal.semantics.YamlSemanticTagDTO;
45+
import org.openhab.core.model.yaml.internal.things.YamlThingDTO;
4346
import org.openhab.core.service.WatchService;
4447
import org.openhab.core.service.WatchService.Kind;
4548
import org.osgi.service.component.annotations.Activate;
@@ -83,6 +86,10 @@ public class YamlModelRepositoryImpl implements WatchService.WatchEventListener,
8386
private static final int DEFAULT_MODEL_VERSION = 2;
8487
private static final String VERSION = "version";
8588
private static final String READ_ONLY = "readOnly";
89+
private static final Set<String> KNOWN_ELEMENTS = Set.of( //
90+
getElementName(YamlSemanticTagDTO.class), // "tags"
91+
getElementName(YamlThingDTO.class) // "things"
92+
);
8693

8794
private final Logger logger = LoggerFactory.getLogger(YamlModelRepositoryImpl.class);
8895

@@ -130,7 +137,7 @@ public FileVisitResult visitFile(@NonNullByDefault({}) Path file,
130137
@Override
131138
public FileVisitResult visitFileFailed(@NonNullByDefault({}) Path file,
132139
@NonNullByDefault({}) IOException exc) throws IOException {
133-
logger.warn("Failed to process {}: {}", file.toAbsolutePath(), exc.getClass().getSimpleName());
140+
logger.warn("Failed to process {}: {}", file.toAbsolutePath(), exc.getMessage());
134141
return FileVisitResult.CONTINUE;
135142
}
136143
});
@@ -223,8 +230,7 @@ public synchronized void processWatchEvent(Kind kind, Path path) {
223230
List<JsonNode> oldNodeV1Elements = model.getNodesV1().getOrDefault(elementName, List.of());
224231
JsonNode oldNodeElements = model.getNodes().get(elementName);
225232

226-
List<YamlModelListener<?>> elementListeners = getElementListeners(elementName, modelVersion);
227-
for (YamlModelListener<?> elementListener : elementListeners) {
233+
for (YamlModelListener<?> elementListener : getElementListeners(elementName, modelVersion)) {
228234
Class<? extends YamlElement> elementClass = elementListener.getElementClass();
229235

230236
List<String> errors = new ArrayList<>();
@@ -274,10 +280,6 @@ public synchronized void processWatchEvent(Kind kind, Path path) {
274280
} else {
275281
model.getNodes().put(elementName, newNodeElements);
276282
}
277-
278-
if (elementListeners.isEmpty()) {
279-
logger.warn("Element '{}' in model {} is unknown.", elementName, modelName);
280-
}
281283
}
282284

283285
// remove removed elements
@@ -302,6 +304,8 @@ public synchronized void processWatchEvent(Kind kind, Path path) {
302304
});
303305
});
304306
}
307+
308+
checkElementNames(modelName, model);
305309
} else {
306310
logger.trace("Ignored {}", fullPath);
307311
}
@@ -347,21 +351,20 @@ public void addYamlModelListener(YamlModelListener<? extends YamlElement> listen
347351
elementListeners.computeIfAbsent(elementName, k -> new CopyOnWriteArrayList<>()).add(listener);
348352

349353
// iterate over all models and notify the new listener of already existing models with this type
350-
for (Map.Entry<String, YamlModelWrapper> model : modelCache.entrySet()) {
351-
String modelName = model.getKey();
352-
int modelVersion = model.getValue().getVersion();
354+
modelCache.forEach((modelName, model) -> {
355+
int modelVersion = model.getVersion();
353356
if (!listener.isVersionSupported(modelVersion)) {
354-
continue;
357+
return;
355358
}
356359
if (listener.isDeprecated()) {
357360
logger.warn(
358361
"Element {} in model {} version {} is still supported but deprecated, please consider migrating your model to a more recent version",
359362
elementName, modelName, modelVersion);
360363
}
361-
List<JsonNode> modelNodes = model.getValue().getNodesV1().getOrDefault(elementName, List.of());
362-
JsonNode modelMapNode = model.getValue().getNodes().get(elementName);
364+
List<JsonNode> modelNodes = model.getNodesV1().getOrDefault(elementName, List.of());
365+
JsonNode modelMapNode = model.getNodes().get(elementName);
363366
if (modelNodes.isEmpty() && modelMapNode == null) {
364-
continue;
367+
return;
365368
}
366369
List<String> errors = new ArrayList<>();
367370
List<String> warnings = new ArrayList<>();
@@ -373,7 +376,8 @@ public void addYamlModelListener(YamlModelListener<? extends YamlElement> listen
373376
logger.info("YAML model {}: {}", modelName, warning);
374377
});
375378
listener.addedModel(modelName, modelElements);
376-
}
379+
checkElementNames(modelName, model);
380+
});
377381
}
378382

379383
public void removeYamlModelListener(YamlModelListener<? extends YamlElement> listener) {
@@ -384,7 +388,18 @@ public void removeYamlModelListener(YamlModelListener<? extends YamlElement> lis
384388
});
385389
}
386390

387-
private String getElementName(Class<? extends YamlElement> elementClass) {
391+
private void checkElementNames(String modelName, YamlModelWrapper model) {
392+
Set<String> elementListenerNames = elementListeners.keySet();
393+
if (elementListenerNames.containsAll(KNOWN_ELEMENTS)) {
394+
Set<String> modelElementNames = model.getVersion() == 1 ? model.getNodesV1().keySet()
395+
: model.getNodes().keySet();
396+
modelElementNames.stream().filter(e -> !KNOWN_ELEMENTS.contains(e)).forEach(unknownElement -> {
397+
logger.warn("Element '{}' in model {} is unknown.", unknownElement, modelName);
398+
});
399+
}
400+
}
401+
402+
private static String getElementName(Class<? extends YamlElement> elementClass) {
388403
YamlElementName annotation = elementClass.getAnnotation(YamlElementName.class);
389404
if (annotation == null) {
390405
throw new IllegalStateException("Class " + elementClass.getName()

0 commit comments

Comments
 (0)