Skip to content

Commit 99fe348

Browse files
committed
Add generated builder code.
1 parent 65e94b3 commit 99fe348

File tree

1,919 files changed

+264878
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,919 files changed

+264878
-0
lines changed
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package io.kubernetes.client.fluent;
2+
3+
import java.util.LinkedHashSet;
4+
import java.util.stream.Collectors;
5+
import java.util.Set;
6+
import java.util.ArrayList;
7+
import java.lang.String;
8+
import java.util.Objects;
9+
import java.lang.Class;
10+
import java.util.List;
11+
import java.lang.Boolean;
12+
import java.util.Arrays;
13+
14+
public class BaseFluent<F extends io.kubernetes.client.fluent.Fluent<F>> implements io.kubernetes.client.fluent.Fluent<F>,io.kubernetes.client.fluent.Visitable<F> {
15+
16+
public static final java.lang.String VISIT = "visit";
17+
public final io.kubernetes.client.fluent.VisitableMap _visitables = new VisitableMap();
18+
19+
public static <T>io.kubernetes.client.fluent.VisitableBuilder<T,?> builderOf(T item) {
20+
if (item instanceof Editable) {
21+
Object editor = ((Editable) item).edit();
22+
if (editor instanceof VisitableBuilder) {
23+
return (VisitableBuilder<T, ?>) editor;
24+
}
25+
}
26+
try {
27+
return (VisitableBuilder<T, ?>) Class.forName(item.getClass().getName() + "Builder").getConstructor(item.getClass())
28+
.newInstance(item);
29+
} catch (Exception e) {
30+
throw new IllegalStateException("Failed to create builder for: " + item.getClass(), e);
31+
}
32+
}
33+
34+
public static <T>java.util.ArrayList<T> build(java.util.List<? extends io.kubernetes.client.fluent.Builder<? extends T>> list) {
35+
return list == null ? null : new ArrayList<T>(list.stream().map(Builder::build).collect(Collectors.toList()));
36+
}
37+
38+
public static <T>java.util.List<T> build(java.util.Set<? extends io.kubernetes.client.fluent.Builder<? extends T>> set) {
39+
return set == null ? null : set.stream().map(Builder::build).collect(Collectors.toList());
40+
}
41+
42+
public static <T>java.util.ArrayList<T> aggregate(java.util.List<? extends T>... lists) {
43+
return new ArrayList(Arrays.stream(lists).filter(Objects::nonNull).collect(Collectors.toList()));
44+
}
45+
46+
public static <T>java.util.LinkedHashSet<T> aggregate(java.util.Set<? extends T>[] sets) {
47+
return new LinkedHashSet(Arrays.stream(sets).filter(Objects::nonNull).collect(Collectors.toSet()));
48+
}
49+
50+
public static <V extends io.kubernetes.client.fluent.Visitor<?>,F>java.lang.Boolean canVisit(V visitor,F fluent) {
51+
if (visitor instanceof TypedVisitor) {
52+
if (!((TypedVisitor) visitor).getType().isAssignableFrom(fluent.getClass())) {
53+
return false;
54+
}
55+
}
56+
if (visitor instanceof PathAwareTypedVisitor) {
57+
PathAwareTypedVisitor pathAwareTypedVisitor = (PathAwareTypedVisitor) visitor;
58+
Class parentType = pathAwareTypedVisitor.getParentType();
59+
Class actaulParentType = pathAwareTypedVisitor.getActualParentType();
60+
if (!parentType.isAssignableFrom(actaulParentType)) {
61+
return false;
62+
}
63+
}
64+
return hasCompatibleVisitMethod(visitor, fluent);
65+
}
66+
67+
public static <V,F>java.lang.Boolean hasCompatibleVisitMethod(V visitor,F fluent) {
68+
for (java.lang.reflect.Method method : visitor.getClass().getMethods()) {
69+
if (!method.getName().equals(VISIT) || method.getParameterTypes().length != 1) {
70+
continue;
71+
}
72+
Class visitorType = method.getParameterTypes()[0];
73+
if (visitorType.isAssignableFrom(fluent.getClass())) {
74+
return true;
75+
} else {
76+
return false;
77+
}
78+
}
79+
return false;
80+
}
81+
82+
public F accept(io.kubernetes.client.fluent.Visitor... visitors) {
83+
return isPathAwareVisitorArray(visitors) ? acceptPathAware(asPathAwareVisitorArray(visitors)) : acceptInternal(visitors);
84+
}
85+
86+
public <V>F accept(java.lang.Class<V> type,io.kubernetes.client.fluent.Visitor<V> visitor) {
87+
return accept(new TypedVisitor<V>() {
88+
@Override
89+
public Class<V> getType() {
90+
return type;
91+
}
92+
@Override
93+
public void visit(V element) {
94+
visitor.visit(element);
95+
}
96+
});
97+
}
98+
99+
public F acceptInternal(io.kubernetes.client.fluent.Visitor<?>... visitors) {
100+
for (Visitor visitor : visitors) {
101+
for (Visitable visitable : _visitables) {
102+
visitable.accept(visitor);
103+
}
104+
105+
if (canVisit(visitor, this)) {
106+
visitor.visit(this);
107+
}
108+
}
109+
return (F) this;
110+
}
111+
112+
private F acceptPathAware(io.kubernetes.client.fluent.PathAwareTypedVisitor<?,?>... pathAwareTypedVisitors) {
113+
return acceptInternal(Arrays.stream(pathAwareTypedVisitors).map(p -> p.next(this)).toArray(size -> new PathAwareTypedVisitor[size]));
114+
}
115+
116+
private static boolean isPathAwareVisitorArray(io.kubernetes.client.fluent.Visitor<?>[] visitors) {
117+
return !Arrays.stream(visitors).filter(v -> !(v instanceof PathAwareTypedVisitor)).findAny().isPresent();
118+
}
119+
120+
private static io.kubernetes.client.fluent.PathAwareTypedVisitor<?,?>[] asPathAwareVisitorArray(io.kubernetes.client.fluent.Visitor<?>[] visitors) {
121+
return Arrays.stream(visitors).filter(v -> v instanceof PathAwareTypedVisitor).map(v -> (PathAwareTypedVisitor) v).toArray(size -> new PathAwareTypedVisitor[size]);
122+
}
123+
124+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.kubernetes.client.fluent;
2+
3+
4+
public interface Builder<T> {
5+
6+
7+
T build();
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.kubernetes.client.fluent;
2+
3+
4+
public interface Editable<T> {
5+
6+
7+
T edit();
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.kubernetes.client.fluent;
2+
3+
4+
public interface Fluent<F extends io.kubernetes.client.fluent.Fluent<F>> {
5+
6+
7+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.kubernetes.client.fluent;
2+
3+
4+
public interface Nested<F> {
5+
6+
7+
F and();
8+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package io.kubernetes.client.fluent;
2+
3+
import java.util.ArrayList;
4+
import java.lang.Class;
5+
import java.lang.Object;
6+
import java.util.List;
7+
8+
public class PathAwareTypedVisitor<V,P> extends io.kubernetes.client.fluent.TypedVisitor<V> {
9+
10+
java.util.List<java.lang.Object> path;
11+
io.kubernetes.client.fluent.PathAwareTypedVisitor<V,P> delegate;
12+
java.lang.Class<P> parentType;
13+
14+
PathAwareTypedVisitor(java.util.List<java.lang.Object> path) {
15+
this.path = path;
16+
this.delegate = this;
17+
this.parentType = (Class<P>) getTypeArguments(PathAwareTypedVisitor.class, getClass()).get(1);
18+
}
19+
20+
PathAwareTypedVisitor(java.util.List<java.lang.Object> path,io.kubernetes.client.fluent.PathAwareTypedVisitor<V,P> delegate) {
21+
this.path = path;
22+
this.delegate = this;
23+
this.parentType = (Class<P>) getTypeArguments(PathAwareTypedVisitor.class, delegate.getClass()).get(1);
24+
}
25+
26+
public void visit(V element) {
27+
delegate.path = path;
28+
delegate.visit(element);
29+
}
30+
31+
io.kubernetes.client.fluent.PathAwareTypedVisitor<V,P> next(java.lang.Object item) {
32+
List<Object> path = new ArrayList<Object>(this.path);
33+
path.add(item);
34+
return new PathAwareTypedVisitor<V, P>(path, this);
35+
}
36+
37+
P getParent() {
38+
return path.size() - 2 >= 0 ? (P) path.get(path.size() - 2) : null;
39+
}
40+
41+
java.lang.Class<P> getParentType() {
42+
return parentType != null ? parentType : delegate.getParentType();
43+
}
44+
45+
protected java.lang.Class<?> getActualParentType() {
46+
return path.size() - 2 >= 0 ? path.get(path.size() - 2).getClass() : Void.class;
47+
}
48+
49+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package io.kubernetes.client.fluent;
2+
3+
import java.lang.reflect.Array;
4+
import java.lang.reflect.ParameterizedType;
5+
import java.lang.reflect.Type;
6+
import java.lang.reflect.TypeVariable;
7+
import java.util.ArrayList;
8+
import java.lang.Class;
9+
import java.util.List;
10+
import java.lang.reflect.GenericArrayType;
11+
import java.util.Map;
12+
import java.util.LinkedHashMap;
13+
14+
public abstract class TypedVisitor<V> implements io.kubernetes.client.fluent.Visitor<V> {
15+
16+
17+
public java.lang.Class<V> getType() {
18+
return (Class<V>) getTypeArguments(TypedVisitor.class, getClass()).get(0);
19+
}
20+
21+
java.lang.Class<?> getClass(java.lang.reflect.Type type) {
22+
if (type instanceof Class) {return (Class) type;} else if (type instanceof ParameterizedType) {return getClass(((ParameterizedType) type).getRawType());} else if (type instanceof GenericArrayType) {Type componentType = ((GenericArrayType) type).getGenericComponentType(); Class<?> componentClass = getClass(componentType); if (componentClass != null) {return Array.newInstance(componentClass, 0).getClass();} else {return null;}} else {return null;}
23+
}
24+
25+
<T>java.util.List<java.lang.Class<?>> getTypeArguments(java.lang.Class<T> baseClass,java.lang.Class<? extends T> childClass) {
26+
Map<Type, Type> resolvedTypes = new LinkedHashMap<>();
27+
Type type = childClass;
28+
// start walking up the inheritance hierarchy until we hit baseClass
29+
while (!getClass(type).equals(baseClass)) {
30+
if (type instanceof Class) {
31+
// there is no useful information for us in raw types, so just keep going.
32+
type = ((Class) type).getGenericSuperclass();
33+
} else {
34+
ParameterizedType parameterizedType = (ParameterizedType) type;
35+
Class<?> rawType = (Class) parameterizedType.getRawType();
36+
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
37+
TypeVariable<?>[] typeParameters = rawType.getTypeParameters();
38+
for (int i = 0; i < actualTypeArguments.length; i++) {
39+
resolvedTypes.put(typeParameters[i], actualTypeArguments[i]);
40+
}
41+
if (!rawType.equals(baseClass)) {
42+
type = rawType.getGenericSuperclass();
43+
}
44+
}
45+
}
46+
// finally, for each actual type argument provided to baseClass, determine (if possible)
47+
// the raw class for that type argument.
48+
Type[] actualTypeArguments;
49+
if (type instanceof Class) {
50+
actualTypeArguments = ((Class) type).getTypeParameters();
51+
} else {
52+
actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();
53+
}
54+
List<Class<?>> typeArgumentsAsClasses = new ArrayList<>();
55+
// resolve types by chasing down type variables.
56+
for (Type baseType : actualTypeArguments) {
57+
while (resolvedTypes.containsKey(baseType)) {
58+
baseType = resolvedTypes.get(baseType);
59+
}
60+
typeArgumentsAsClasses.add(getClass(baseType));
61+
}
62+
return typeArgumentsAsClasses;
63+
}
64+
65+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.kubernetes.client.fluent;
2+
3+
import java.lang.Class;
4+
import java.lang.FunctionalInterface;
5+
6+
7+
@java.lang.FunctionalInterface
8+
public interface Visitable<T> {
9+
10+
11+
T accept(io.kubernetes.client.fluent.Visitor... visitor);
12+
default <V>T accept(java.lang.Class<V> type,io.kubernetes.client.fluent.Visitor<V> visitor) {
13+
return accept(new TypedVisitor<V>() {@Override public Class<V> getType() {return type;} @Override public void visit(V element) {visitor.visit(element);}});
14+
}
15+
16+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.kubernetes.client.fluent;
2+
3+
4+
public interface VisitableBuilder<T,V extends VisitableBuilder<T,V>> extends io.kubernetes.client.fluent.Builder<T>,io.kubernetes.client.fluent.Visitable<V> {
5+
6+
7+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.kubernetes.client.fluent;
2+
3+
import java.util.stream.Collectors;
4+
import java.lang.Iterable;
5+
import java.util.function.Consumer;
6+
import java.util.HashMap;
7+
import java.util.ArrayList;
8+
import java.util.Iterator;
9+
import java.lang.Object;
10+
import java.util.List;
11+
import java.lang.String;
12+
import java.util.Spliterator;
13+
14+
public class VisitableMap extends java.util.HashMap<java.lang.String,java.util.List<io.kubernetes.client.fluent.Visitable<?>>> implements java.lang.Iterable<io.kubernetes.client.fluent.Visitable<?>> {
15+
16+
17+
public java.util.List<io.kubernetes.client.fluent.Visitable<?>> get(java.lang.Object key) {
18+
if (!containsKey(key)) {put(String.valueOf(key), new ArrayList());}
19+
return super.get(key);
20+
}
21+
22+
public java.util.List<io.kubernetes.client.fluent.Visitable<?>> aggregate() {
23+
return values().stream().flatMap(l -> l.stream()).collect(Collectors.toList());
24+
}
25+
26+
public java.util.Iterator<io.kubernetes.client.fluent.Visitable<?>> iterator() {
27+
return aggregate().iterator();
28+
}
29+
30+
public void forEach(java.util.function.Consumer<? super io.kubernetes.client.fluent.Visitable<?>> action) {
31+
aggregate().forEach(action);
32+
}
33+
34+
public java.util.Spliterator spliterator() {
35+
return aggregate().spliterator();
36+
}
37+
38+
}

0 commit comments

Comments
 (0)