IpAddonFinder: Skip installed addons (#4013)

Signed-off-by: Holger Friedrich <mail@holger-friedrich.de>
This commit is contained in:
Holger Friedrich
2024-01-04 22:27:18 +01:00
committed by GitHub
parent c757819a15
commit 7bac24e58f
@@ -36,6 +36,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -43,16 +44,21 @@ import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.addon.Addon;
import org.openhab.core.addon.AddonDiscoveryMethod;
import org.openhab.core.addon.AddonInfo;
import org.openhab.core.addon.AddonMatchProperty;
import org.openhab.core.addon.AddonParameter;
import org.openhab.core.addon.AddonService;
import org.openhab.core.common.ThreadPoolManager;
import org.openhab.core.config.discovery.addon.AddonFinder;
import org.openhab.core.config.discovery.addon.BaseAddonFinder;
import org.openhab.core.net.NetUtil;
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -148,6 +154,7 @@ public class IpAddonFinder extends BaseAddonFinder {
private final Logger logger = LoggerFactory.getLogger(IpAddonFinder.class);
private final ScheduledExecutorService scheduler = ThreadPoolManager
.getScheduledPool(ThreadPoolManager.THREAD_POOL_NAME_COMMON);
private final Set<AddonService> addonServices = new CopyOnWriteArraySet<>();
private @Nullable Future<?> scanJob = null;
Set<AddonInfo> suggestions = new HashSet<>();
@@ -169,6 +176,15 @@ public class IpAddonFinder extends BaseAddonFinder {
startScan();
}
@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
protected void addAddonService(AddonService featureService) {
this.addonServices.add(featureService);
}
protected void removeAddonService(AddonService featureService) {
this.addonServices.remove(featureService);
}
private void startScan() {
// The setAddonCandidates() method is called for each info provider.
// In order to do the scan only once, but on the full set of candidates, we have to delay the execution.
@@ -197,6 +213,12 @@ public class IpAddonFinder extends BaseAddonFinder {
logger.trace("Checking candidate: {}", candidate.getUID());
// skip scanning if already installed
if (isAddonInstalled(candidate.getUID())) {
logger.trace("Skipping {}, already installed", candidate.getUID());
continue;
}
Map<String, String> parameters = method.getParameters().stream()
.collect(Collectors.toMap(AddonParameter::getName, AddonParameter::getValue));
Map<String, String> matchProperties = method.getMatchProperties().stream()
@@ -342,4 +364,14 @@ public class IpAddonFinder extends BaseAddonFinder {
public String getServiceName() {
return SERVICE_NAME;
}
private boolean isAddonInstalled(String addonId) {
for (AddonService addonService : addonServices) {
Addon addon = addonService.getAddon(addonId, null);
if (addon != null && addon.isInstalled()) {
return true;
}
}
return false;
}
}