14
14
15
15
import java .util .ArrayList ;
16
16
import java .util .Arrays ;
17
+ import java .util .Collections ;
17
18
import java .util .LinkedHashSet ;
19
+ import java .util .List ;
18
20
import java .util .Objects ;
21
+ import java .util .Set ;
19
22
import java .util .stream .Collectors ;
20
23
21
- public class BaseFluent <F extends io . kubernetes . client . fluent . Fluent <F >>
22
- implements io .kubernetes .client .fluent .Fluent <F >, io . kubernetes . client . fluent . Visitable <F > {
23
- public static final java . lang . String VISIT = "visit" ;
24
- public final io . kubernetes . client . fluent . VisitableMap _visitables = new VisitableMap ();
24
+ public class BaseFluent <F extends Fluent <F >>
25
+ implements io .kubernetes .client .fluent .Fluent <F >, Visitable <F > {
26
+ public static final String VISIT = "visit" ;
27
+ public final VisitableMap _visitables = new VisitableMap ();
25
28
26
- public static <T > io . kubernetes . client . fluent . VisitableBuilder <T , ?> builderOf (T item ) {
29
+ public static <T > VisitableBuilder <T , ?> builderOf (T item ) {
27
30
if (item instanceof Editable ) {
28
31
Object editor = ((Editable ) item ).edit ();
29
32
if (editor instanceof VisitableBuilder ) {
30
33
return (VisitableBuilder <T , ?>) editor ;
31
34
}
32
35
}
36
+
33
37
try {
34
38
return (VisitableBuilder <T , ?>)
35
39
Class .forName (item .getClass ().getName () + "Builder" )
@@ -40,118 +44,91 @@ public class BaseFluent<F extends io.kubernetes.client.fluent.Fluent<F>>
40
44
}
41
45
}
42
46
43
- public static <T > java . util . List <T > build (
47
+ public static <T > List <T > build (
44
48
java .util .List <? extends io .kubernetes .client .fluent .Builder <? extends T >> list ) {
45
49
return list == null
46
50
? null
47
51
: new ArrayList <T >(list .stream ().map (Builder ::build ).collect (Collectors .toList ()));
48
52
}
49
53
50
- public static <T > java . util . List <T > build (
54
+ public static <T > Set <T > build (
51
55
java .util .Set <? extends io .kubernetes .client .fluent .Builder <? extends T >> set ) {
52
56
return set == null
53
57
? null
54
- : new ArrayList < >(set .stream ().map (Builder ::build ).collect (Collectors .toList ()));
58
+ : new LinkedHashSet < T >(set .stream ().map (Builder ::build ).collect (Collectors .toSet ()));
55
59
}
56
60
57
61
public static <T > java .util .List <T > aggregate (java .util .List <? extends T >... lists ) {
58
62
return new ArrayList (
59
63
Arrays .stream (lists ).filter (Objects ::nonNull ).collect (Collectors .toList ()));
60
64
}
61
65
62
- public static <T > java .util .Set <T > aggregate (java .util .Set <? extends T >[] sets ) {
66
+ public static <T > java .util .Set <T > aggregate (java .util .Set <? extends T >... sets ) {
63
67
return new LinkedHashSet (
64
68
Arrays .stream (sets ).filter (Objects ::nonNull ).collect (Collectors .toSet ()));
65
69
}
66
70
67
- public static <V extends io .kubernetes .client .fluent .Visitor <?>, F > java .lang .Boolean canVisit (
68
- V visitor , F fluent ) {
69
- if (visitor instanceof TypedVisitor ) {
70
- if (!((TypedVisitor ) visitor ).getType ().isAssignableFrom (fluent .getClass ())) {
71
- return false ;
72
- }
73
- }
74
- if (visitor instanceof PathAwareTypedVisitor ) {
75
- PathAwareTypedVisitor pathAwareTypedVisitor = (PathAwareTypedVisitor ) visitor ;
76
- Class parentType = pathAwareTypedVisitor .getParentType ();
77
- Class actaulParentType = pathAwareTypedVisitor .getActualParentType ();
78
- if (!parentType .isAssignableFrom (actaulParentType )) {
79
- return false ;
80
- }
81
- }
82
- return hasCompatibleVisitMethod (visitor , fluent );
83
- }
84
-
85
- public static <V , F > java .lang .Boolean hasCompatibleVisitMethod (V visitor , F fluent ) {
86
- for (java .lang .reflect .Method method : visitor .getClass ().getMethods ()) {
87
- if (!method .getName ().equals (VISIT ) || method .getParameterTypes ().length != 1 ) {
88
- continue ;
89
- }
90
- Class visitorType = method .getParameterTypes ()[0 ];
91
- if (visitorType .isAssignableFrom (fluent .getClass ())) {
92
- return true ;
93
- } else {
94
- return false ;
95
- }
96
- }
97
- return false ;
98
- }
99
-
100
- public F accept (io .kubernetes .client .fluent .Visitor ... visitors ) {
101
- return isPathAwareVisitorArray (visitors )
102
- ? acceptPathAware (asPathAwareVisitorArray (visitors ))
103
- : acceptInternal (visitors );
71
+ public F accept (Visitor ... visitors ) {
72
+ return accept (Collections .emptyList (), visitors );
104
73
}
105
74
106
- public <V > F accept (java . lang . Class <V > type , io .kubernetes .client .fluent .Visitor <V > visitor ) {
75
+ public <V > F accept (Class <V > type , io .kubernetes .client .fluent .Visitor <V > visitor ) {
107
76
return accept (
108
- new TypedVisitor <V >() {
77
+ Collections .emptyList (),
78
+ new Visitor <V >() {
109
79
@ Override
110
80
public Class <V > getType () {
111
81
return type ;
112
82
}
113
83
84
+ @ Override
85
+ public void visit (List <Object > path , V element ) {
86
+ visitor .visit (path , element );
87
+ }
88
+
114
89
@ Override
115
90
public void visit (V element ) {
116
91
visitor .visit (element );
117
92
}
118
93
});
119
94
}
120
95
121
- public F acceptInternal (io .kubernetes .client .fluent .Visitor <?>... visitors ) {
122
- for (Visitor visitor : visitors ) {
123
- for (Visitable visitable : _visitables ) {
124
- visitable .accept (visitor );
125
- }
126
-
127
- if (canVisit (visitor , this )) {
128
- visitor .visit (this );
129
- }
96
+ public F accept (java .util .List <Object > path , io .kubernetes .client .fluent .Visitor ... visitors ) {
97
+ Arrays .stream (visitors )
98
+ .map (v -> VisitorListener .wrap (v ))
99
+ .filter (v -> ((Visitor ) v ).canVisit (path , this ))
100
+ .sorted ((l , r ) -> ((Visitor ) r ).order () - ((Visitor ) l ).order ())
101
+ .forEach (
102
+ v -> {
103
+ ((Visitor ) v ).visit (path , this );
104
+ });
105
+
106
+ List <Object > copyOfPath = path != null ? new ArrayList (path ) : new ArrayList <>();
107
+ copyOfPath .add (this );
108
+ List <Object > newPath = Collections .unmodifiableList (copyOfPath );
109
+
110
+ for (Visitable visitable : _visitables ) {
111
+ Arrays .stream (visitors )
112
+ .filter (v -> v .getType () != null && v .getType ().isAssignableFrom (visitable .getClass ()))
113
+ .forEach (v -> visitable .accept (newPath , v ));
114
+ Arrays .stream (visitors )
115
+ .filter (v -> v .getType () == null || !v .getType ().isAssignableFrom (visitable .getClass ()))
116
+ .forEach (v -> visitable .accept (newPath , v ));
130
117
}
131
118
return (F ) this ;
132
119
}
133
120
134
- private F acceptPathAware (
135
- io .kubernetes .client .fluent .PathAwareTypedVisitor <?, ?>... pathAwareTypedVisitors ) {
136
- return acceptInternal (
137
- Arrays .stream (pathAwareTypedVisitors )
138
- .map (p -> p .next (this ))
139
- .toArray (size -> new PathAwareTypedVisitor [size ]));
140
- }
141
-
142
- private static boolean isPathAwareVisitorArray (
143
- io .kubernetes .client .fluent .Visitor <?>[] visitors ) {
144
- return !Arrays .stream (visitors )
145
- .filter (v -> !(v instanceof PathAwareTypedVisitor ))
146
- .findAny ()
147
- .isPresent ();
121
+ public int hashCode () {
122
+ final int prime = 31 ;
123
+ int result = 1 ;
124
+ result = prime * result + 0 ;
125
+ return result ;
148
126
}
149
127
150
- private static io .kubernetes .client .fluent .PathAwareTypedVisitor <?, ?>[] asPathAwareVisitorArray (
151
- io .kubernetes .client .fluent .Visitor <?>[] visitors ) {
152
- return Arrays .stream (visitors )
153
- .filter (v -> v instanceof PathAwareTypedVisitor )
154
- .map (v -> (PathAwareTypedVisitor ) v )
155
- .toArray (size -> new PathAwareTypedVisitor [size ]);
128
+ public boolean equals (java .lang .Object obj ) {
129
+ if (this == obj ) return true ;
130
+ if (obj == null ) return false ;
131
+ if (getClass () != obj .getClass ()) return false ;
132
+ return true ;
156
133
}
157
134
}
0 commit comments