Skip to content

Commit

Permalink
IpAddonFinder: Skip installed addons (openhab#4013)
Browse files Browse the repository at this point in the history
Signed-off-by: Holger Friedrich <[email protected]>
  • Loading branch information
holgerfriedrich authored Jan 4, 2024
1 parent c757819 commit 7bac24e
Showing 1 changed file with 32 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,23 +36,29 @@
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;
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;

Expand Down Expand Up @@ -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<>();

Expand All @@ -169,6 +176,15 @@ public void setAddonCandidates(List<AddonInfo> candidates) {
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.
Expand Down Expand Up @@ -197,6 +213,12 @@ private void scan() {

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()
Expand Down Expand Up @@ -342,4 +364,14 @@ public Set<AddonInfo> getSuggestedAddons() {
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;
}
}

0 comments on commit 7bac24e

Please sign in to comment.