1414
1515import java .util .ArrayList ;
1616import java .util .Arrays ;
17+ import java .util .Collections ;
1718import java .util .LinkedHashSet ;
19+ import java .util .List ;
1820import java .util .Objects ;
21+ import java .util .Set ;
1922import java .util .stream .Collectors ;
2023
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 ();
2528
26- public static <T > io . kubernetes . client . fluent . VisitableBuilder <T , ?> builderOf (T item ) {
29+ public static <T > VisitableBuilder <T , ?> builderOf (T item ) {
2730 if (item instanceof Editable ) {
2831 Object editor = ((Editable ) item ).edit ();
2932 if (editor instanceof VisitableBuilder ) {
3033 return (VisitableBuilder <T , ?>) editor ;
3134 }
3235 }
36+
3337 try {
3438 return (VisitableBuilder <T , ?>)
3539 Class .forName (item .getClass ().getName () + "Builder" )
@@ -40,118 +44,91 @@ public class BaseFluent<F extends io.kubernetes.client.fluent.Fluent<F>>
4044 }
4145 }
4246
43- public static <T > java . util . List <T > build (
47+ public static <T > List <T > build (
4448 java .util .List <? extends io .kubernetes .client .fluent .Builder <? extends T >> list ) {
4549 return list == null
4650 ? null
4751 : new ArrayList <T >(list .stream ().map (Builder ::build ).collect (Collectors .toList ()));
4852 }
4953
50- public static <T > java . util . List <T > build (
54+ public static <T > Set <T > build (
5155 java .util .Set <? extends io .kubernetes .client .fluent .Builder <? extends T >> set ) {
5256 return set == null
5357 ? null
54- : new ArrayList < >(set .stream ().map (Builder ::build ).collect (Collectors .toList ()));
58+ : new LinkedHashSet < T >(set .stream ().map (Builder ::build ).collect (Collectors .toSet ()));
5559 }
5660
5761 public static <T > java .util .List <T > aggregate (java .util .List <? extends T >... lists ) {
5862 return new ArrayList (
5963 Arrays .stream (lists ).filter (Objects ::nonNull ).collect (Collectors .toList ()));
6064 }
6165
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 ) {
6367 return new LinkedHashSet (
6468 Arrays .stream (sets ).filter (Objects ::nonNull ).collect (Collectors .toSet ()));
6569 }
6670
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 );
10473 }
10574
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 ) {
10776 return accept (
108- new TypedVisitor <V >() {
77+ Collections .emptyList (),
78+ new Visitor <V >() {
10979 @ Override
11080 public Class <V > getType () {
11181 return type ;
11282 }
11383
84+ @ Override
85+ public void visit (List <Object > path , V element ) {
86+ visitor .visit (path , element );
87+ }
88+
11489 @ Override
11590 public void visit (V element ) {
11691 visitor .visit (element );
11792 }
11893 });
11994 }
12095
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 ));
130117 }
131118 return (F ) this ;
132119 }
133120
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 ;
148126 }
149127
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 ;
156133 }
157134}
0 commit comments