Skip to content

Commit 6de8d4e

Browse files
committed
cache state, only recreate when new resource is set (redhat-developer#613)
Signed-off-by: Andre Dietisheim <[email protected]>
1 parent 6437bb8 commit 6de8d4e

File tree

2 files changed

+38
-11
lines changed

2 files changed

+38
-11
lines changed

Diff for: src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/EditorResource.kt

+15-7
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ open class EditorResource(
6262
&& !areEqual(new, existing)) {
6363
this.resource = new
6464
}
65+
setState(null) // reset state
6566
}
6667
}
6768

@@ -94,13 +95,18 @@ open class EditorResource(
9495
*/
9596
fun getState(): EditorResourceState {
9697
return resourceChangeMutex.withLock {
97-
val state = getState(resource, state)
98-
this.state = state
99-
state
98+
val existingState = this.state
99+
if (existingState == null) {
100+
val newState = createState(resource, null)
101+
setState(newState)
102+
newState
103+
} else {
104+
existingState
105+
}
100106
}
101107
}
102108

103-
private fun getState(resource: HasMetadata, existingState: EditorResourceState?): EditorResourceState {
109+
private fun createState(resource: HasMetadata, existingState: EditorResourceState?): EditorResourceState {
104110
val isModified = isModified(resource)
105111
return when {
106112
!isConnected() ->
@@ -122,12 +128,14 @@ open class EditorResource(
122128
isOutdatedVersion()
123129
)
124130

131+
existingState is Error ->
132+
existingState
133+
125134
isOutdatedVersion() ->
126135
Outdated()
127136

128137
existingState is Pulled
129-
|| existingState is Pushed
130-
|| existingState is Error ->
138+
|| existingState is Pushed ->
131139
existingState
132140

133141
!existsOnCluster() ->
@@ -149,7 +157,7 @@ open class EditorResource(
149157
* Store resource that we tried to push but failed.
150158
* In this way this resource is not in modified state anymore
151159
* @see isModified
152-
* @see getState(resource: HasMetadata, existingState: EditorResourceState?)
160+
* @see createState(resource: HasMetadata, existingState: EditorResourceState?)
153161
*/
154162
setLastPushedPulled(resource)
155163
when {

Diff for: src/test/kotlin/com/redhat/devtools/intellij/kubernetes/editor/EditorResourceTest.kt

+23-4
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ class EditorResourceTest {
302302
val error = Error("oh my!")
303303
editorResource.setState(error)
304304
editorResource.setLastPushedPulled(POD3) // modified = (current resource != lastPushedPulled)
305+
editorResource.setResource(POD2) // cause state to be recreated
305306
// when
306307
val state = editorResource.getState()
307308
// then
@@ -403,6 +404,10 @@ class EditorResourceTest {
403404
@Test
404405
fun `#getState should return Modified if resource is modified when compared to last pulled pushed resource`() {
405406
// given
407+
doReturn(true)
408+
.whenever(clusterResource).isSupported()
409+
doReturn(true) // don't create modified state because it doesnt exist on cluster
410+
.whenever(clusterResource).exists()
406411
val editorResource = createEditorResource(POD2)
407412
val modified = PodBuilder(POD2)
408413
.editMetadata()
@@ -411,10 +416,6 @@ class EditorResourceTest {
411416
.build()
412417
editorResource.setResource(modified)
413418
editorResource.setLastPushedPulled(POD2)
414-
doReturn(true)
415-
.whenever(clusterResource).isSupported()
416-
doReturn(true) // don't create modified state because it doesnt exist on cluster
417-
.whenever(clusterResource).exists()
418419
// when
419420
val state = editorResource.getState()
420421
// then
@@ -438,6 +439,24 @@ class EditorResourceTest {
438439
assertThat(state).isInstanceOf(Outdated::class.java)
439440
}
440441

442+
@Test
443+
fun `#getState should return Error if resource is outdated but in error`() {
444+
// given
445+
val editorResource = createEditorResource(POD2)
446+
doReturn(true)
447+
.whenever(clusterResource).isSupported()
448+
doReturn(true)
449+
.whenever(clusterResource).isOutdatedVersion(any())
450+
doReturn(true) // don't return modified state because it doesnt exist
451+
.whenever(clusterResource).exists()
452+
editorResource.setLastPushedPulled(POD2) // don't return modified because last pulled pushed is different
453+
editorResource.setState(mock<Error>())
454+
// when
455+
val state = editorResource.getState()
456+
// then
457+
assertThat(state).isInstanceOf(Error::class.java)
458+
}
459+
441460
@Test
442461
fun `#dispose should close clusterResource that was created`() {
443462
// given

0 commit comments

Comments
 (0)