| | |
| | | import java.time.Duration; |
| | | import java.time.Instant; |
| | | import java.time.ZoneId; |
| | | import java.util.LinkedHashSet; |
| | | import java.util.List; |
| | | import java.util.Locale; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | import org.springframework.dao.DuplicateKeyException; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.device.api.DeviceAdapterException; |
| | | import com.ruoyi.device.bts.BtsProtocolException; |
| | | import com.ruoyi.device.bts.BtsTransportException; |
| | | import com.ruoyi.device.model.AdapterCapabilities; |
| | | import com.ruoyi.device.model.ChannelIdentity; |
| | | import com.ruoyi.device.model.DetectedChannel; |
| | | import com.ruoyi.device.model.RealtimeSnapshot; |
| | | import com.ruoyi.device.registry.AdapterInstanceConfig; |
| | | import com.ruoyi.device.registry.AdapterRegistryException; |
| | | import com.ruoyi.device.registry.DeviceAdapterRegistry; |
| | |
| | | try |
| | | { |
| | | registry.synchronize(toRuntimeConfig(adapter)); |
| | | List<com.ruoyi.device.model.DetectedChannel> channels = registry.require(adapter.getAdapterCode()).discoverChannels(); |
| | | DiscoveryObservation observation = registry.execute(adapter.getAdapterCode(), runtime -> { |
| | | List<DetectedChannel> channels = runtime.discoverChannels(); |
| | | Set<ChannelIdentity> available = channels.stream() |
| | | .filter(DetectedChannel::available) |
| | | .map(DetectedChannel::identity) |
| | | .collect(Collectors.toCollection(LinkedHashSet::new)); |
| | | return new DiscoveryObservation(channels, runtime.inquire(available)); |
| | | }); |
| | | Instant observedAt = Instant.now(); |
| | | AdapterDiscoveryResult result = persistence.persist(adapter, channels, observedAt); |
| | | AdapterDiscoveryResult result = persistence.persist(adapter, observation.channels(), |
| | | observation.snapshots(), observedAt); |
| | | mapper.updateDiscoverySuccess(adapterId, observedAt); |
| | | return result; |
| | | } |
| | | catch (BtsTransportException exception) |
| | | catch (DeviceAdapterException exception) |
| | | { |
| | | return failDiscovery(adapterId, exception.reason().name(), exception); |
| | | return failDiscovery(adapterId, exception.failureCode(), exception); |
| | | } |
| | | catch (BtsProtocolException exception) |
| | | { |
| | | return failDiscovery(adapterId, exception.reason().name(), exception); |
| | | } |
| | | catch (DeviceAdapterException | AdapterRegistryException exception) |
| | | catch (AdapterRegistryException exception) |
| | | { |
| | | return failDiscovery(adapterId, "ADAPTER_FAILURE", exception); |
| | | } |
| | |
| | | } |
| | | |
| | | private ServiceException error(String message, int code) { return new ServiceException(message, code); } |
| | | |
| | | private record DiscoveryObservation(List<DetectedChannel> channels, |
| | | Map<ChannelIdentity, RealtimeSnapshot> snapshots) |
| | | { |
| | | } |
| | | } |