Skip to content

Commit c82ee66

Browse files
committed
Validate file before saving
1 parent d2b7a6c commit c82ee66

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPollingService.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,22 @@ package software.aws.toolkits.jetbrains.core.notifications
55

66
import com.fasterxml.jackson.databind.DeserializationFeature
77
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
8+
import com.fasterxml.jackson.module.kotlin.readValue
89
import com.intellij.openapi.Disposable
910
import com.intellij.openapi.application.ApplicationManager
1011
import com.intellij.openapi.components.PersistentStateComponent
1112
import com.intellij.openapi.components.Service
1213
import com.intellij.util.Alarm
1314
import com.intellij.util.AlarmFactory
1415
import com.intellij.util.io.HttpRequests
16+
import software.aws.toolkits.core.utils.RemoteResolveParser
1517
import software.aws.toolkits.core.utils.RemoteResource
1618
import software.aws.toolkits.core.utils.debug
1719
import software.aws.toolkits.core.utils.error
1820
import software.aws.toolkits.core.utils.getLogger
1921
import software.aws.toolkits.jetbrains.core.DefaultRemoteResourceResolverProvider
2022
import software.aws.toolkits.jetbrains.core.RemoteResourceResolverProvider
23+
import java.io.InputStream
2124
import java.time.Duration
2225

2326
private 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)
3449
class 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

Comments
 (0)