2 * Copyright (c) 2010-2022 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.unifi.internal.api.cache;
15 import java.util.Collection;
16 import java.util.List;
18 import java.util.Objects;
19 import java.util.concurrent.ConcurrentHashMap;
20 import java.util.function.Function;
21 import java.util.stream.Collectors;
22 import java.util.stream.Stream;
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.eclipse.jdt.annotation.Nullable;
26 import org.openhab.binding.unifi.internal.api.dto.UniFiClient;
27 import org.openhab.binding.unifi.internal.api.dto.UniFiDevice;
28 import org.openhab.binding.unifi.internal.api.dto.UniFiPortTable;
29 import org.openhab.binding.unifi.internal.api.dto.UniFiSite;
30 import org.openhab.binding.unifi.internal.api.dto.UniFiWlan;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
35 * Class to manager cache for the controller keeping track of all specific cache objects.
37 * @author Matthew Bowman - Initial contribution
38 * @author Hilbrand Bouwkamp - Moved cache to this dedicated class.
41 public class UniFiControllerCache {
43 private final Logger logger = LoggerFactory.getLogger(UniFiControllerCache.class);
45 private final UniFiSiteCache sitesCache = new UniFiSiteCache();
46 private final UniFiWlanCache wlansCache = new UniFiWlanCache();
47 private final UniFiDeviceCache devicesCache = new UniFiDeviceCache();
48 private final UniFiClientCache clientsCache = new UniFiClientCache();
49 private final UniFiClientCache insightsCache = new UniFiClientCache();
50 private final Map<String, Map<Integer, UniFiPortTable>> devicesToPortTables = new ConcurrentHashMap<>();
57 insightsCache.clear();
62 public List<UniFiSite> setSites(final UniFiSite @Nullable [] sites) {
63 sitesCache.putAll(sites);
64 return List.of(sites);
67 public @Nullable UniFiSite getSite(final @Nullable String id) {
68 return sitesCache.get(id);
71 public Collection<UniFiSite> getSites() {
72 return sitesCache.values();
77 public void putWlans(final UniFiWlan @Nullable [] wlans) {
78 wlansCache.putAll(wlans);
81 public @Nullable UniFiWlan getWlan(@Nullable final String id) {
82 return wlansCache.get(id);
85 public Collection<UniFiWlan> getWlans() {
86 return wlansCache.values();
91 public void putDevices(final UniFiDevice @Nullable [] devices) {
92 devicesCache.putAll(devices);
93 if (devices != null) {
94 Stream.of(devices).filter(Objects::nonNull).forEach(d -> {
95 Stream.ofNullable(d.getPortTable()).filter(ptl -> ptl.length > 0 && ptl[0].isPortPoe()).forEach(pt -> {
96 Stream.of(pt).forEach(p -> p.setDevice(d));
97 devicesToPortTables.put(d.getMac(),
98 Stream.of(pt).collect(Collectors.toMap(UniFiPortTable::getPortIdx, Function.identity())));
104 public @Nullable UniFiDevice getDevice(@Nullable final String id) {
105 return devicesCache.get(id);
108 public Map<Integer, UniFiPortTable> getSwitchPorts(@Nullable final String deviceId) {
109 return deviceId == null ? Map.of() : devicesToPortTables.getOrDefault(deviceId, Map.of());
112 public Collection<Map<Integer, UniFiPortTable>> getSwitchPorts() {
113 return devicesToPortTables.values();
118 public void putClients(final UniFiClient @Nullable [] clients) {
119 clientsCache.putAll(clients);
122 public Collection<UniFiClient> getClients() {
123 return clientsCache.values();
126 public long countClients(final UniFiSite site, final Function<UniFiClient, Boolean> filter) {
127 return getClients().stream().filter(c -> site.isSite(c.getSite())).filter(filter::apply).count();
130 public @Nullable UniFiClient getClient(@Nullable final String cid) {
131 UniFiClient client = null;
132 if (cid != null && !cid.isBlank()) {
133 synchronized (this) {
134 // mgb: first check active clients and fallback to insights if not found
135 client = clientsCache.get(cid);
136 if (client == null) {
137 final String id = clientsCache.getId(cid);
139 client = insightsCache.get(id == null ? cid : id);
142 if (client == null) {
143 logger.debug("Could not find a matching client for cid = {}", cid);
149 public synchronized Stream<UniFiClient> getClientStreamForSite(final UniFiSite site) {
150 return clientsCache.values().stream().filter(client -> client.getSite().equals(site));
155 public void putInsights(final UniFiClient @Nullable [] insights) {
156 insightsCache.putAll(insights);