@@ -5,19 +5,22 @@ package software.aws.toolkits.jetbrains.core.notifications
55
66import com.fasterxml.jackson.databind.DeserializationFeature
77import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
8+ import com.fasterxml.jackson.module.kotlin.readValue
89import com.intellij.openapi.Disposable
910import com.intellij.openapi.application.ApplicationManager
1011import com.intellij.openapi.components.PersistentStateComponent
1112import com.intellij.openapi.components.Service
1213import com.intellij.util.Alarm
1314import com.intellij.util.AlarmFactory
1415import com.intellij.util.io.HttpRequests
16+ import software.aws.toolkits.core.utils.RemoteResolveParser
1517import software.aws.toolkits.core.utils.RemoteResource
1618import software.aws.toolkits.core.utils.debug
1719import software.aws.toolkits.core.utils.error
1820import software.aws.toolkits.core.utils.getLogger
1921import software.aws.toolkits.jetbrains.core.DefaultRemoteResourceResolverProvider
2022import software.aws.toolkits.jetbrains.core.RemoteResourceResolverProvider
23+ import java.io.InputStream
2124import java.time.Duration
2225
2326private const val NOTIFICATION_ENDPOINT = " https://idetoolkits-hostedfiles.amazonaws.com/Notifications/JetBrains/1.json" // TODO: Replace with actual endpoint
@@ -30,24 +33,35 @@ interface NotificationPollingService {
3033 fun dispose ()
3134}
3235
36+ object NotificationFileValidator : RemoteResolveParser {
37+ private val mapper = jacksonObjectMapper().configure(DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES , false )
38+ override fun canBeParsed (data : InputStream ): Boolean {
39+ return try {
40+ mapper.readValue<NotificationsList >(data)
41+ true
42+ } catch (e: Exception ) {
43+ false
44+ }
45+ }
46+ }
47+
3348@Service(Service .Level .APP )
3449class NotificationPollingServiceImpl :
3550 NotificationPollingService ,
3651 PersistentStateComponent <NotificationPollingServiceImpl .State >,
3752 Disposable {
3853
3954 private var state = State ()
40- private val mapper = jacksonObjectMapper().configure(DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES , false )
41- private var currentETag: String? = null // todo Persistant state? add an init possibly
55+ private var currentETag: String? = null
4256 private val alarm = AlarmFactory .getInstance().create(Alarm .ThreadToUse .POOLED_THREAD , this )
4357 private val pollingIntervalMs = Duration .ofMinutes(10 ).toMillis()
4458 private val resourceResolver: RemoteResourceResolverProvider = DefaultRemoteResourceResolverProvider ()
4559 private val notificationsResource = object : RemoteResource {
4660 override val name: String = NOTIFICATIONS_RESOURCE_PATH
4761 override val urls: List <String > = listOf (NOTIFICATION_ENDPOINT )
62+ override val remoteResolveParser: RemoteResolveParser = NotificationFileValidator
4863 }
4964
50- // PersistentStateComponent implementation
5165 data class State (
5266 var currentETag : String? = null ,
5367 )
@@ -64,7 +78,7 @@ class NotificationPollingServiceImpl :
6478
6579 override fun startPolling () {
6680 pollForNotifications()
67-
81+ // todo notify observers
6882 alarm.addRequest(
6983 { startPolling() },
7084 pollingIntervalMs
0 commit comments