adapted AutoUpdateDelegate to the new ESH auto update infrastructure (#390)

* adapted AutoUpdateDelegate to the new ESH auto update infrastructure
Related to https://github.com/eclipse/smarthome/pull/5011

Signed-off-by: Kai Kreuzer <kai@openhab.org>
pull/391/head
Kai Kreuzer 2018-09-06 09:33:47 +02:00 committed by Martin van Wingerden
parent a59d5c4f11
commit 47c2e33624
16 changed files with 235 additions and 135 deletions

View File

@ -85,7 +85,6 @@ Import-Package:
org.eclipse.jdt.annotation;resolution:=optional,
org.eclipse.smarthome.config.core,
org.eclipse.smarthome.core.audio,
org.eclipse.smarthome.core.autoupdate,
org.eclipse.smarthome.core.common.registry,
org.eclipse.smarthome.core.events,
org.eclipse.smarthome.core.items,

View File

@ -0,0 +1 @@
/*.xml

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2015-2018 by the respective copyright holders.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
-->
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="org.openhab.core.compat1x.actionservicefactory">
<implementation class="org.openhab.core.scriptengine.action.internal.ActionServiceFactory"/>
<reference bind="addActionService" cardinality="0..n" interface="org.openhab.core.scriptengine.action.ActionService" name="ActionService" policy="dynamic" unbind="removeActionService"/>
</scr:component>

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2015-2018 by the respective copyright holders.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
-->
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.openhab.core.compat1x.autoupdateproviderdelegate">
<implementation class="org.openhab.core.autoupdate.internal.AutoUpdateProviderDelegate"/>
<reference bind="addAutoUpdateBindingProvider" cardinality="0..n" interface="org.openhab.core.autoupdate.AutoUpdateBindingProvider" name="AutoUpdateBindingProvider" policy="dynamic" unbind="removeAutoUpdateBindingProvider"/>
<service>
<provide interface="org.eclipse.smarthome.core.autoupdate.AutoUpdateBindingConfigProvider"/>
</service>
</scr:component>

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2015-2018 by the respective copyright holders.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
-->
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.openhab.core.compat1x.bindingconfigreaderfactory">
<implementation class="org.openhab.core.binding.internal.BindingConfigReaderFactory"/>
<reference bind="addBindingConfigReader" cardinality="0..n" interface="org.openhab.model.item.binding.BindingConfigReader" name="BindingConfigReader" policy="dynamic" unbind="removeBindingConfigReader"/>
</scr:component>

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2015-2018 by the respective copyright holders.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
-->
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="org.openhab.core.compat1x.chartproviderfactory" immediate="true" >
<implementation class="org.openhab.ui.chart.internal.ChartProviderFactory"/>
<reference bind="addChartProvider" cardinality="0..n" interface="org.openhab.ui.chart.ChartProvider" name="ChartProvider" policy="dynamic" unbind="removeChartProvider"/>
</scr:component>

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2015-2018 by the respective copyright holders.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
-->
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.openhab.core.compat1x.eventbridge">
<implementation class="org.openhab.core.events.internal.EventBridge"/>
<service>
<provide interface="org.osgi.service.event.EventHandler"/>
<provide interface="org.eclipse.smarthome.core.events.EventSubscriber"/>
</service>
<reference bind="setEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="dynamic" unbind="unsetEventAdmin"/>
<property name="event.topics" type="String" value="smarthome/*"/>
<reference bind="setEventPublisher" cardinality="1..1" interface="org.eclipse.smarthome.core.events.EventPublisher" name="EventPublisher" policy="static" unbind="unsetEventPublisher"/>
</scr:component>

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2015-2018 by the respective copyright holders.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
-->
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.openhab.core.compat1x.eventpublisherdelegate">
<implementation class="org.openhab.core.events.EventPublisherDelegate"/>
<service>
<provide interface="org.openhab.core.events.EventPublisher"/>
</service>
<reference bind="setEventPublisher" cardinality="1..1" interface="org.eclipse.smarthome.core.events.EventPublisher" name="EventPublisher" policy="dynamic" unbind="unsetEventPublisher"/>
</scr:component>

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2015-2018 by the respective copyright holders.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
-->
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.openhab.core.compat1x.itemuiregistry">
<implementation class="org.openhab.core.items.internal.ItemUIRegistryDelegate"/>
<service>
<provide interface="org.openhab.core.items.ItemRegistry"/>
<provide interface="org.openhab.ui.items.ItemUIRegistry"/>
</service>
<reference bind="setItemUIRegistry" cardinality="1..1" interface="org.eclipse.smarthome.ui.items.ItemUIRegistry" name="ItemUIRegistry" policy="static" unbind="unsetItemUIRegistry"/>
</scr:component>

View File

@ -8,10 +8,28 @@
*/
package org.openhab.core.autoupdate.internal;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import org.eclipse.smarthome.core.autoupdate.AutoUpdateBindingConfigProvider;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.smarthome.core.common.registry.ProviderChangeListener;
import org.eclipse.smarthome.core.common.registry.RegistryChangeListener;
import org.eclipse.smarthome.core.items.Item;
import org.eclipse.smarthome.core.items.ItemRegistry;
import org.eclipse.smarthome.core.items.Metadata;
import org.eclipse.smarthome.core.items.MetadataKey;
import org.eclipse.smarthome.core.items.MetadataProvider;
import org.openhab.core.autoupdate.AutoUpdateBindingProvider;
import org.openhab.core.binding.BindingChangeListener;
import org.openhab.core.binding.BindingProvider;
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.osgi.service.component.annotations.ReferenceCardinality;
/**
* This class serves as a mapping from the "old" org.openhab namespace to the new org.eclipse.smarthome
@ -20,26 +38,185 @@ import org.eclipse.smarthome.core.autoupdate.AutoUpdateBindingConfigProvider;
*
* @author Kai Kreuzer - Initial contribution and API
*/
public class AutoUpdateProviderDelegate implements AutoUpdateBindingConfigProvider {
@NonNullByDefault
@Component(service = MetadataProvider.class)
public class AutoUpdateProviderDelegate
implements MetadataProvider, RegistryChangeListener<Item>, BindingChangeListener {
private Set<org.openhab.core.autoupdate.AutoUpdateBindingProvider> providers = new CopyOnWriteArraySet<>();
private static final String AUTOUPDATE_KEY = "autoupdate";
public void addAutoUpdateBindingProvider(org.openhab.core.autoupdate.AutoUpdateBindingProvider provider) {
providers.add(provider);
private Set<AutoUpdateBindingProvider> providers = new CopyOnWriteArraySet<>();
private Set<ProviderChangeListener<Metadata>> listeners = new CopyOnWriteArraySet<>();
private Set<String> itemUpdateVetos = new HashSet<>();
private boolean started = false;
private @NonNullByDefault({}) ItemRegistry itemRegistry;
@Activate
protected void activate() {
refreshItemUpdateVetos();
started = true;
itemRegistry.addRegistryChangeListener(this);
for (AutoUpdateBindingProvider provider : providers) {
provider.addBindingChangeListener(this);
}
}
public void removeAutoUpdateBindingProvider(org.openhab.core.autoupdate.AutoUpdateBindingProvider provider) {
@Deactivate
protected void deactivate() {
for (AutoUpdateBindingProvider provider : providers) {
provider.removeBindingChangeListener(this);
}
itemRegistry.removeRegistryChangeListener(this);
started = false;
}
@Reference(cardinality = ReferenceCardinality.MULTIPLE)
public void addAutoUpdateBindingProvider(AutoUpdateBindingProvider provider) {
providers.add(provider);
if (started) {
refreshItemUpdateVetos();
provider.addBindingChangeListener(this);
}
}
public void removeAutoUpdateBindingProvider(AutoUpdateBindingProvider provider) {
providers.remove(provider);
if (started) {
refreshItemUpdateVetos();
provider.removeBindingChangeListener(this);
}
}
@Reference
protected void setItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = itemRegistry;
}
protected void unsetItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = null;
}
@Override
public Boolean autoUpdate(String itemName) {
for (org.openhab.core.autoupdate.AutoUpdateBindingProvider provider : providers) {
Boolean autoUpdate = provider.autoUpdate(itemName);
if (autoUpdate != null) {
return autoUpdate;
public void addProviderChangeListener(ProviderChangeListener<Metadata> listener) {
this.listeners.add(listener);
}
@Override
public Collection<Metadata> getAll() {
Set<Metadata> metadataSet = new HashSet<>();
for (Item item : itemRegistry.getAll()) {
synchronized (itemUpdateVetos) {
if (itemUpdateVetos.contains(item.getName())) {
Metadata metadata = getMetadata(item.getName());
metadataSet.add(metadata);
}
}
}
return null;
return metadataSet;
}
@Override
public void removeProviderChangeListener(ProviderChangeListener<Metadata> listener) {
this.listeners.remove(listener);
}
private void refreshItemUpdateVetos() {
Set<String> newVetos = new HashSet<>();
synchronized (itemUpdateVetos) {
itemUpdateVetos.clear();
for (Item item : itemRegistry.getAll()) {
for (AutoUpdateBindingProvider provider : providers) {
Boolean autoUpdate = provider.autoUpdate(item.getName());
if (Boolean.FALSE.equals(autoUpdate)) {
newVetos.add(item.getName());
}
}
}
// find the removed ones
Set<String> removedVetos = new HashSet<>(itemUpdateVetos);
removedVetos.removeAll(newVetos);
for (String itemName : removedVetos) {
if (itemUpdateVetos.contains(itemName)) {
Metadata md = getMetadata(itemName);
for (ProviderChangeListener<Metadata> listener : listeners) {
listener.removed(this, md);
}
}
}
// find the added ones
Set<String> addedVetos = new HashSet<>(newVetos);
addedVetos.removeAll(itemUpdateVetos);
for (String itemName : addedVetos) {
notifyAboutAddedMetadata(itemName);
}
itemUpdateVetos = newVetos;
}
}
private void notifyAboutAddedMetadata(String itemName) {
if (itemUpdateVetos.contains(itemName)) {
Metadata md = getMetadata(itemName);
for (ProviderChangeListener<Metadata> listener : listeners) {
listener.added(this, md);
}
}
}
private void notifyAboutRemovedMetadata(String itemName) {
for (ProviderChangeListener<Metadata> listener : listeners) {
listener.removed(this, getMetadata(itemName));
}
}
private Metadata getMetadata(String itemName) {
return new Metadata(new MetadataKey(AUTOUPDATE_KEY, itemName), "false", null);
}
@Override
public void added(Item element) {
String itemName = element.getName();
refreshVetoForItem(itemName);
}
private void refreshVetoForItem(String itemName) {
synchronized (itemUpdateVetos) {
boolean removed = itemUpdateVetos.remove(itemName);
for (AutoUpdateBindingProvider provider : providers) {
Boolean autoUpdate = provider.autoUpdate(itemName);
if (Boolean.FALSE.equals(autoUpdate)) {
itemUpdateVetos.add(itemName);
notifyAboutAddedMetadata(itemName);
return;
}
}
if (removed) {
notifyAboutRemovedMetadata(itemName);
}
}
}
@Override
public void removed(Item element) {
itemUpdateVetos.remove(element.getName());
}
@Override
public void updated(Item oldElement, Item element) {
refreshVetoForItem(element.getName());
}
@Override
public void bindingChanged(@Nullable BindingProvider provider, @Nullable String itemName) {
if (itemName != null) {
refreshVetoForItem(itemName);
}
}
@Override
public void allBindingsChanged(@Nullable BindingProvider provider) {
refreshItemUpdateVetos();
}
}

View File

@ -18,6 +18,12 @@ import java.util.Set;
import org.openhab.model.item.binding.BindingConfigReader;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
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.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
/**
* This class listens for services that implement the old binding config reader interface and registers
@ -25,6 +31,7 @@ import org.osgi.framework.ServiceRegistration;
*
* @author Kai Kreuzer - Initial contribution and API
*/
@Component
public class BindingConfigReaderFactory {
private Map<String, ServiceRegistration<org.eclipse.smarthome.model.item.BindingConfigReader>> delegates = new HashMap<>();
@ -32,6 +39,7 @@ public class BindingConfigReaderFactory {
private Set<BindingConfigReader> readers = new HashSet<>();
@Activate
public void activate(BundleContext context) {
this.context = context;
for (BindingConfigReader reader : readers) {
@ -39,6 +47,7 @@ public class BindingConfigReaderFactory {
}
}
@Deactivate
public void deactivate() {
for (ServiceRegistration<org.eclipse.smarthome.model.item.BindingConfigReader> serviceReg : delegates
.values()) {
@ -48,6 +57,7 @@ public class BindingConfigReaderFactory {
this.context = null;
}
@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
public void addBindingConfigReader(BindingConfigReader reader) {
if (context != null) {
registerDelegateService(reader);

View File

@ -15,6 +15,8 @@ import org.eclipse.smarthome.core.items.events.ItemStateEvent;
import org.openhab.core.compat1x.internal.TypeMapper;
import org.openhab.core.types.Command;
import org.openhab.core.types.State;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -22,12 +24,14 @@ import org.slf4j.LoggerFactory;
*
* @author Kai Kreuzer - Initial contribution
*/
@Component(immediate = true)
public class EventPublisherDelegate implements org.openhab.core.events.EventPublisher {
private static final Logger logger = LoggerFactory.getLogger(EventPublisherDelegate.class);
private EventPublisher eventPublisher;
@Reference
public void setEventPublisher(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}

View File

@ -24,6 +24,9 @@ import org.openhab.core.types.Command;
import org.openhab.core.types.EventType;
import org.openhab.core.types.State;
import org.openhab.core.types.Type;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.osgi.service.event.EventHandler;
@ -36,12 +39,14 @@ import org.osgi.service.event.EventHandler;
* @author Kai Kreuzer - Initial contribution and API
*
*/
@Component(immediate = true, property = "event.topics=smarthome/*")
public class EventBridge implements EventHandler, EventSubscriber {
private static final String BRIDGEMARKER = "bridgemarker";
private EventAdmin eventAdmin;
private EventPublisher eventPublisher;
@Reference(policy = ReferencePolicy.DYNAMIC)
public void setEventAdmin(EventAdmin eventAdmin) {
this.eventAdmin = eventAdmin;
}
@ -50,6 +55,7 @@ public class EventBridge implements EventHandler, EventSubscriber {
this.eventAdmin = null;
}
@Reference
public void setEventPublisher(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}

View File

@ -25,23 +25,27 @@ import org.openhab.model.sitemap.LinkableWidget;
import org.openhab.model.sitemap.Sitemap;
import org.openhab.model.sitemap.Widget;
import org.openhab.ui.items.ItemUIRegistry;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
*
* @author Kai Kreuzer - Initial contribution
*/
@Component(immediate = true)
public class ItemUIRegistryDelegate
implements ItemUIRegistry, RegistryChangeListener<org.eclipse.smarthome.core.items.Item> {
private org.eclipse.smarthome.ui.items.ItemUIRegistry itemUIRegistry;
private Set<ItemRegistryChangeListener> listeners = new HashSet<>();
@Reference
protected void setItemUIRegistry(org.eclipse.smarthome.ui.items.ItemUIRegistry itemUIRegistry) {
this.itemUIRegistry = itemUIRegistry;
itemUIRegistry.addRegistryChangeListener(this);
}
protected void unsetItemUIRegistry(org.eclipse.smarthome.core.items.ItemRegistry itemUIRegistry) {
protected void unsetItemUIRegistry(org.eclipse.smarthome.ui.items.ItemUIRegistry itemUIRegistry) {
this.itemUIRegistry = null;
}

View File

@ -18,6 +18,12 @@ import java.util.Set;
import org.openhab.core.scriptengine.action.ActionService;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
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.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
/**
* This class listens for services that implement the old action service interface and registers
@ -25,6 +31,7 @@ import org.osgi.framework.ServiceRegistration;
*
* @author Kai Kreuzer - Initial contribution and API
*/
@Component
public class ActionServiceFactory {
private Map<String, ServiceRegistration<org.eclipse.smarthome.model.script.engine.action.ActionService>> delegates = new HashMap<>();
@ -32,6 +39,7 @@ public class ActionServiceFactory {
private Set<ActionService> actionServices = new HashSet<>();
@Activate
public void activate(BundleContext context) {
this.context = context;
for (ActionService service : actionServices) {
@ -39,6 +47,7 @@ public class ActionServiceFactory {
}
}
@Deactivate
public void deactivate() {
for (ServiceRegistration<org.eclipse.smarthome.model.script.engine.action.ActionService> serviceReg : delegates
.values()) {
@ -48,6 +57,7 @@ public class ActionServiceFactory {
this.context = null;
}
@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
public void addActionService(ActionService service) {
if (context != null) {
registerDelegateService(service);

View File

@ -18,6 +18,12 @@ import java.util.Set;
import org.openhab.ui.chart.ChartProvider;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
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.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
/**
* This class listens for services that implement the old chart provider service interface and registers
@ -25,6 +31,7 @@ import org.osgi.framework.ServiceRegistration;
*
* @author Kai Kreuzer - Initial contribution and API
*/
@Component(immediate = true)
public class ChartProviderFactory {
private Map<String, ServiceRegistration<org.eclipse.smarthome.ui.chart.ChartProvider>> delegates = new HashMap<>();
@ -32,6 +39,7 @@ public class ChartProviderFactory {
private Set<ChartProvider> chartProviders = new HashSet<>();
@Activate
public void activate(BundleContext context) {
this.context = context;
for (ChartProvider provider : chartProviders) {
@ -39,6 +47,7 @@ public class ChartProviderFactory {
}
}
@Deactivate
public void deactivate() {
for (ServiceRegistration<org.eclipse.smarthome.ui.chart.ChartProvider> serviceReg : delegates.values()) {
serviceReg.unregister();
@ -47,6 +56,7 @@ public class ChartProviderFactory {
this.context = null;
}
@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
public void addChartProvider(ChartProvider provider) {
if (context != null) {
registerDelegateProvider(provider);