1
1
package io .javaoperatorsdk .operator .processing .dependent ;
2
2
3
- import java .util .ArrayList ;
4
- import java .util .List ;
5
3
import java .util .Optional ;
6
4
7
5
import org .slf4j .Logger ;
@@ -20,15 +18,15 @@ public abstract class AbstractDependentResource<R, P extends HasMetadata>
20
18
implements DependentResource <R , P > {
21
19
private static final Logger log = LoggerFactory .getLogger (AbstractDependentResource .class );
22
20
23
- protected final boolean creatable = this instanceof Creator ;
24
- protected final boolean updatable = this instanceof Updater ;
25
- protected final boolean bulk = this instanceof BulkDependentResource ;
21
+ private final boolean creatable = this instanceof Creator ;
22
+ private final boolean updatable = this instanceof Updater ;
23
+ private final boolean bulk = this instanceof BulkDependentResource ;
26
24
27
25
protected Creator <R , P > creator ;
28
26
protected Updater <R , P > updater ;
29
27
protected BulkDependentResource <R , P > bulkDependentResource ;
30
-
31
- protected List < ResourceDiscriminator < R , P >> resourceDiscriminator = new ArrayList <>( 1 ) ;
28
+ private ResourceDiscriminator < R , P > resourceDiscriminator ;
29
+ private int currentCount ;
32
30
33
31
@ SuppressWarnings ("unchecked" )
34
32
public AbstractDependentResource () {
@@ -42,48 +40,33 @@ public AbstractDependentResource() {
42
40
public ReconcileResult <R > reconcile (P primary , Context <P > context ) {
43
41
if (bulk ) {
44
42
final var count = bulkDependentResource .count (primary , context );
45
- deleteBulkResourcesIfRequired (count , lastKnownBulkSize (), primary , context );
46
- adjustDiscriminators (count );
43
+ deleteBulkResourcesIfRequired (count , primary , context );
47
44
@ SuppressWarnings ("unchecked" )
48
45
final ReconcileResult <R >[] results = new ReconcileResult [count ];
49
46
for (int i = 0 ; i < count ; i ++) {
50
47
results [i ] = reconcileIndexAware (primary , i , context );
51
48
}
49
+ currentCount = count ;
52
50
return ReconcileResult .aggregatedResult (results );
53
51
} else {
54
52
return reconcileIndexAware (primary , 0 , context );
55
53
}
56
54
}
57
55
58
- protected void deleteBulkResourcesIfRequired (int targetCount , int actualCount , P primary ,
59
- Context <P > context ) {
60
- if (targetCount >= actualCount ) {
56
+ protected void deleteBulkResourcesIfRequired (int targetCount , P primary , Context <P > context ) {
57
+ if (targetCount >= currentCount ) {
61
58
return ;
62
59
}
63
- for (int i = targetCount ; i < actualCount ; i ++) {
64
- var resource = getSecondaryResourceIndexAware (primary , i , context );
60
+ for (int i = targetCount ; i < currentCount ; i ++) {
61
+ var resource = bulkDependentResource . getSecondaryResource (primary , i , context );
65
62
var index = i ;
66
63
resource .ifPresent (
67
64
r -> bulkDependentResource .deleteBulkResourceWithIndex (primary , r , index , context ));
68
65
}
69
66
}
70
67
71
- private void adjustDiscriminators (int count ) {
72
- if (resourceDiscriminator .size () == count ) {
73
- return ;
74
- }
75
- if (resourceDiscriminator .size () < count ) {
76
- for (int i = resourceDiscriminator .size (); i < count ; i ++) {
77
- resourceDiscriminator .add (bulkDependentResource .getResourceDiscriminator (i ));
78
- }
79
- }
80
- if (resourceDiscriminator .size () > count ) {
81
- resourceDiscriminator .subList (count , resourceDiscriminator .size ()).clear ();
82
- }
83
- }
84
-
85
68
protected ReconcileResult <R > reconcileIndexAware (P primary , int i , Context <P > context ) {
86
- Optional <R > maybeActual = bulk ? getSecondaryResourceIndexAware (primary , i , context )
69
+ Optional <R > maybeActual = bulk ? bulkDependentResource . getSecondaryResource (primary , i , context )
87
70
: getSecondaryResource (primary , context );
88
71
if (creatable || updatable ) {
89
72
if (maybeActual .isEmpty ()) {
@@ -99,7 +82,7 @@ protected ReconcileResult<R> reconcileIndexAware(P primary, int i, Context<P> co
99
82
if (updatable ) {
100
83
final Matcher .Result <R > match ;
101
84
if (bulk ) {
102
- match = updater .match (actual , primary , i , context );
85
+ match = bulkDependentResource .match (actual , primary , i , context );
103
86
} else {
104
87
match = updater .match (actual , primary , context );
105
88
}
@@ -124,17 +107,12 @@ protected ReconcileResult<R> reconcileIndexAware(P primary, int i, Context<P> co
124
107
}
125
108
126
109
private R desiredIndexAware (P primary , int i , Context <P > context ) {
127
- return bulk ? desired (primary , i , context )
128
- : desired (primary , context );
110
+ return bulk ? desired (primary , i , context ) : desired (primary , context );
129
111
}
130
112
131
113
public Optional <R > getSecondaryResource (P primary , Context <P > context ) {
132
- return resourceDiscriminator .isEmpty () ? context .getSecondaryResource (resourceType ())
133
- : resourceDiscriminator .get (0 ).distinguish (resourceType (), primary , context );
134
- }
135
-
136
- protected Optional <R > getSecondaryResourceIndexAware (P primary , int index , Context <P > context ) {
137
- return context .getSecondaryResource (resourceType (), resourceDiscriminator .get (index ));
114
+ return resourceDiscriminator == null ? context .getSecondaryResource (resourceType ())
115
+ : resourceDiscriminator .distinguish (resourceType (), primary , context );
138
116
}
139
117
140
118
private void throwIfNull (R desired , P primary , String descriptor ) {
@@ -195,28 +173,35 @@ protected R desired(P primary, Context<P> context) {
195
173
}
196
174
197
175
protected R desired (P primary , int index , Context <P > context ) {
198
- throw new IllegalStateException (
199
- "Must be implemented for bulk DependentResource creation" );
176
+ throw new IllegalStateException ("Must be implemented for bulk DependentResource creation" );
200
177
}
201
178
202
- public AbstractDependentResource <R , P > setResourceDiscriminator (
203
- ResourceDiscriminator <R , P > resourceDiscriminator ) {
204
- if (resourceDiscriminator != null ) {
205
- this .resourceDiscriminator .add (resourceDiscriminator );
179
+ public void delete (P primary , Context <P > context ) {
180
+ if (bulk ) {
181
+ deleteBulkResourcesIfRequired (0 , primary , context );
182
+ } else {
183
+ handleDelete (primary , context );
206
184
}
207
- return this ;
208
185
}
209
186
210
- public ResourceDiscriminator <R , P > getResourceDiscriminator () {
211
- if (this .resourceDiscriminator .isEmpty ()) {
212
- return null ;
213
- } else {
214
- return this .resourceDiscriminator .get (0 );
215
- }
187
+ protected void handleDelete (P primary , Context <P > context ) {
188
+ throw new IllegalStateException ("delete method be implemented if Deleter trait is supported" );
216
189
}
217
190
218
- protected int lastKnownBulkSize () {
219
- return resourceDiscriminator .size ();
191
+ public void setResourceDiscriminator (
192
+ ResourceDiscriminator <R , P > resourceDiscriminator ) {
193
+ this .resourceDiscriminator = resourceDiscriminator ;
220
194
}
221
195
196
+ protected boolean isCreatable () {
197
+ return creatable ;
198
+ }
199
+
200
+ protected boolean isUpdatable () {
201
+ return updatable ;
202
+ }
203
+
204
+ protected boolean isBulk () {
205
+ return bulk ;
206
+ }
222
207
}
0 commit comments