Skip to content

Commit 427b303

Browse files
committed
move to item registry
Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>
1 parent bc25258 commit 427b303

4 files changed

Lines changed: 64 additions & 64 deletions

File tree

bundles/org.openhab.core.model.item/pom.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,6 @@
3030
<artifactId>org.openhab.core.model.core</artifactId>
3131
<version>${project.version}</version>
3232
</dependency>
33-
<dependency>
34-
<groupId>org.openhab.core.bundles</groupId>
35-
<artifactId>org.openhab.core.thing</artifactId>
36-
<version>${project.version}</version>
37-
</dependency>
3833
</dependencies>
3934

4035
<build>

bundles/org.openhab.core.model.item/src/org/openhab/core/model/item/internal/GenericItemProvider.java

Lines changed: 3 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,6 @@
4949
import org.openhab.core.model.items.ModelGroupItem;
5050
import org.openhab.core.model.items.ModelItem;
5151
import org.openhab.core.model.items.ModelNormalItem;
52-
import org.openhab.core.thing.Channel;
53-
import org.openhab.core.thing.ChannelUID;
54-
import org.openhab.core.thing.Thing;
55-
import org.openhab.core.thing.ThingRegistry;
56-
import org.openhab.core.thing.link.ItemChannelLink;
57-
import org.openhab.core.thing.link.ItemChannelLinkRegistry;
5852
import org.openhab.core.types.StateDescriptionFragment;
5953
import org.openhab.core.types.StateDescriptionFragmentBuilder;
6054
import org.openhab.core.types.StateDescriptionFragmentProvider;
@@ -80,8 +74,6 @@
8074
public class GenericItemProvider extends AbstractProvider<Item>
8175
implements ModelRepositoryChangeListener, ItemProvider, StateDescriptionFragmentProvider {
8276

83-
public static final String USE_TAGS = "useTags";
84-
8577
private final Logger logger = LoggerFactory.getLogger(GenericItemProvider.class);
8678

8779
/** to keep track of all binding config readers */
@@ -97,20 +89,13 @@ public class GenericItemProvider extends AbstractProvider<Item>
9789

9890
private final Map<String, StateDescriptionFragment> stateDescriptionFragments = new ConcurrentHashMap<>();
9991

100-
private final ThingRegistry thingRegistry;
101-
private final ItemChannelLinkRegistry itemChannelLinkRegistry;
102-
10392
private Integer rank;
10493

10594
@Activate
10695
public GenericItemProvider(final @Reference ModelRepository modelRepository,
107-
final @Reference GenericMetadataProvider genericMetadataProvider,
108-
final @Reference ThingRegistry thingRegistry,
109-
final @Reference ItemChannelLinkRegistry itemChannelLinkRegistry, Map<String, Object> properties) {
96+
final @Reference GenericMetadataProvider genericMetadataProvider, Map<String, Object> properties) {
11097
this.modelRepository = modelRepository;
11198
this.genericMetaDataProvider = genericMetadataProvider;
112-
this.thingRegistry = thingRegistry;
113-
this.itemChannelLinkRegistry = itemChannelLinkRegistry;
11499

115100
Object serviceRanking = properties.get(Constants.SERVICE_RANKING);
116101
if (serviceRanking instanceof Integer integerValue) {
@@ -298,44 +283,7 @@ private void processBindingConfigsFromModel(String modelName, EventType type) {
298283
* Assign any tags that are defined directly in the item definition text
299284
*/
300285
private void assignTags(ModelItem modelItem, ActiveItem item) {
301-
Collection<String> newTags = modelItem.getTags();
302-
if (!newTags.isEmpty()) {
303-
item.addTags(newTags);
304-
logger.debug("Item '{}' tags '{}' assigned", item.getName(), newTags);
305-
}
306-
}
307-
308-
/**
309-
* Assign any tags that are defined in any linked channel's default tags
310-
*/
311-
private Item assignDefaultTags(Item baseItem) {
312-
if (baseItem instanceof ActiveItem item) {
313-
for (ItemChannelLink link : itemChannelLinkRegistry.getLinks(item.getName())) {
314-
Configuration config = link.getConfiguration();
315-
if (Boolean.TRUE.equals(config.get(USE_TAGS))) {
316-
ChannelUID channelUID = link.getLinkedUID();
317-
Thing thing = thingRegistry.get(channelUID.getThingUID());
318-
if (thing != null) {
319-
Channel channel = thing.getChannel(channelUID.getId());
320-
if (channel != null) {
321-
Collection<String> newTags = channel.getDefaultTags();
322-
if (!newTags.isEmpty()) {
323-
Collection<String> oldTags = item.getTags();
324-
if (oldTags.isEmpty()) {
325-
item.addTags(newTags);
326-
logger.debug("Item '{}' tags '{}' assigned from channel '{}'.", item.getName(),
327-
newTags, channel.getUID());
328-
} else if (!newTags.equals(oldTags)) {
329-
logger.warn("Item '{}' forbidden to assign tags from multiple sources.",
330-
item.getName());
331-
}
332-
}
333-
}
334-
}
335-
}
336-
}
337-
}
338-
return baseItem;
286+
item.addTags(modelItem.getTags());
339287
}
340288

341289
private GroupItem applyGroupFunction(Item baseItem, ModelGroupItem modelGroupItem, ModelGroupFunction function) {
@@ -455,8 +403,6 @@ public void modelChanged(String modelName, EventType type) {
455403
case MODIFIED:
456404
Map<String, Item> oldItems = toItemMap(itemsMap.get(modelName));
457405
Map<String, Item> newItems = toItemMap(getItemsFromModel(modelName));
458-
processBindingConfigsFromModel(modelName, type);
459-
itemsMap.put(modelName, newItems.values().stream().map(i -> assignDefaultTags(i)).toList());
460406
for (Item newItem : newItems.values()) {
461407
Item oldItem = oldItems.get(newItem.getName());
462408
if (oldItem != null) {
@@ -467,8 +413,7 @@ public void modelChanged(String modelName, EventType type) {
467413
notifyListenersAboutAddedElement(newItem);
468414
}
469415
}
470-
// TODO did moving the following line up to #458 cause unexpected effects?
471-
// processBindingConfigsFromModel(modelName, type);
416+
processBindingConfigsFromModel(modelName, type);
472417
for (Item oldItem : oldItems.values()) {
473418
if (!newItems.containsKey(oldItem.getName())) {
474419
notifyAndCleanup(oldItem);

bundles/org.openhab.core/src/main/java/org/openhab/core/internal/items/ItemRegistryImpl.java

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@
1515
import java.util.ArrayList;
1616
import java.util.Collection;
1717
import java.util.List;
18+
import java.util.Map;
1819

1920
import org.eclipse.jdt.annotation.NonNullByDefault;
2021
import org.eclipse.jdt.annotation.Nullable;
2122
import org.openhab.core.common.registry.AbstractRegistry;
2223
import org.openhab.core.common.registry.Provider;
2324
import org.openhab.core.common.registry.RegistryChangeListener;
2425
import org.openhab.core.events.EventPublisher;
26+
import org.openhab.core.items.ActiveItem;
2527
import org.openhab.core.items.GenericItem;
2628
import org.openhab.core.items.GroupItem;
2729
import org.openhab.core.items.Item;
@@ -48,6 +50,7 @@
4850
import org.osgi.service.component.annotations.ReferencePolicy;
4951
import org.slf4j.Logger;
5052
import org.slf4j.LoggerFactory;
53+
import org.yaml.snakeyaml.introspector.Property;
5154

5255
/**
5356
* This is the main implementing class of the {@link ItemRegistry} interface. It
@@ -64,21 +67,29 @@
6467
public class ItemRegistryImpl extends AbstractRegistry<Item, String, ItemProvider>
6568
implements ItemRegistry, RegistryChangeListener<Metadata> {
6669

70+
public static final String USE_TAGS = "useTags";
71+
6772
private final Logger logger = LoggerFactory.getLogger(ItemRegistryImpl.class);
6873

6974
private @Nullable StateDescriptionService stateDescriptionService;
7075
private @Nullable CommandDescriptionService commandDescriptionService;
7176
private final MetadataRegistry metadataRegistry;
7277
private final DefaultStateDescriptionFragmentProvider defaultStateDescriptionFragmentProvider;
78+
private final ThingRegistry thingRegistry;
79+
private final ItemChannelLinkRegistry itemChannelLinkRegistry;
7380

7481
private @Nullable ItemStateConverter itemStateConverter;
7582

7683
@Activate
7784
public ItemRegistryImpl(final @Reference MetadataRegistry metadataRegistry,
78-
final @Reference DefaultStateDescriptionFragmentProvider defaultStateDescriptionFragmentProvider) {
85+
final @Reference DefaultStateDescriptionFragmentProvider defaultStateDescriptionFragmentProvider,
86+
final @Reference ThingRegistry thingRegistry,
87+
final @Reference ItemChannelLinkRegistry itemChannelLinkRegistry, Map<String, Object> properties) {
7988
super(ItemProvider.class);
8089
this.metadataRegistry = metadataRegistry;
8190
this.defaultStateDescriptionFragmentProvider = defaultStateDescriptionFragmentProvider;
91+
this.thingRegistry = thingRegistry;
92+
this.itemChannelLinkRegistry = itemChannelLinkRegistry;
8293
}
8394

8495
@Activate
@@ -369,6 +380,7 @@ public Collection<Item> getItemsByTagAndType(String type, String... tags) {
369380

370381
@Override
371382
protected void notifyListenersAboutAddedElement(Item element) {
383+
element = assignDefaultTags(element);
372384
postEvent(ItemEventFactory.createAddedEvent(element));
373385
super.notifyListenersAboutAddedElement(element);
374386
}
@@ -381,6 +393,7 @@ protected void notifyListenersAboutRemovedElement(Item element) {
381393

382394
@Override
383395
protected void notifyListenersAboutUpdatedElement(Item oldElement, Item element) {
396+
element = assignDefaultTags(element);
384397
postEvent(ItemEventFactory.createUpdateEvent(element, oldElement));
385398
super.notifyListenersAboutUpdatedElement(oldElement, element);
386399
}
@@ -464,4 +477,46 @@ public void updated(Metadata oldElement, Metadata element) {
464477
metadataAwareItem.updatedMetadata(oldElement, element);
465478
}
466479
}
480+
481+
/**
482+
* Assign any tags that are defined in any linked channel's default tags
483+
*/
484+
private Item assignDefaultTags(Item item) {
485+
if (item instanceof ActiveItem activeItem) {
486+
boolean hasPointOrPropertyTag = false;
487+
for (String tag : activeItem.getTags()) {
488+
Class<? extends Tag> tagType = SemanticTags.getById(tag);
489+
if ((tagType != null)
490+
&& (Point.class.isAssignableFrom(tagType) || Property.class.isAssignableFrom(tagType))) {
491+
hasPointOrPropertyTag = true;
492+
break;
493+
}
494+
}
495+
for (ItemChannelLink link : itemChannelLinkRegistry.getLinks(activeItem.getName())) {
496+
Configuration configuration = link.getConfiguration();
497+
if (Boolean.TRUE.equals(configuration.get(USE_TAGS))) {
498+
ChannelUID channelUID = link.getLinkedUID();
499+
Thing thing = thingRegistry.get(channelUID.getThingUID());
500+
if (thing != null) {
501+
Channel channel = thing.getChannel(channelUID.getId());
502+
if (channel != null) {
503+
Collection<String> newTags = channel.getDefaultTags();
504+
if (!newTags.isEmpty()) {
505+
if (hasPointOrPropertyTag) {
506+
logger.warn("Item '{}' forbidden to assign tags from multiple sources.",
507+
activeItem.getName());
508+
} else {
509+
activeItem.addTags(newTags);
510+
hasPointOrPropertyTag = true;
511+
logger.debug("Item '{}' tags '{}' assigned from channel '{}'.",
512+
activeItem.getName(), newTags, channel.getUID());
513+
}
514+
}
515+
}
516+
}
517+
}
518+
}
519+
}
520+
return item;
521+
}
467522
}

test.bat

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
call mvn clean install -T 18 -DskipTests -DskipChecks
2+
echo on
3+
call mvn clean install -pl :org.openhab.core.model.item.tests
4+
echo on
5+
call mvn clean install -pl :org.openhab.core.model.thing.tests

0 commit comments

Comments
 (0)