Search in sources :

Example 1 with ClassRef

use of io.sundr.model.ClassRef in project kubernetes-client by fabric8io.

the class AnnotatedPropertyPathDetector method visit.

@Override
public void visit(TypeDefBuilder builder) {
    TypeDef type = builder.build();
    final List<Property> properties = type.getProperties();
    for (Property p : properties) {
        if (parents.contains(p)) {
            continue;
        }
        List<Property> newParents = new ArrayList<>(parents);
        boolean match = p.getAnnotations().stream().anyMatch(a -> a.getClassRef().getName().equals(annotationName));
        if (match) {
            newParents.add(p);
            reference.set(Optional.of(newParents.stream().map(Property::getName).collect(Collectors.joining(DOT, prefix, ""))));
            return;
        }
    }
    properties.stream().filter(p -> p.getTypeRef() instanceof ClassRef).forEach(p -> {
        if (!parents.contains(p)) {
            ClassRef classRef = (ClassRef) p.getTypeRef();
            TypeDef propertyType = Types.typeDefFrom(classRef);
            if (!propertyType.isEnum()) {
                List<Property> newParents = new ArrayList<>(parents);
                newParents.add(p);
                new TypeDefBuilder(propertyType).accept(new AnnotatedPropertyPathDetector(prefix, annotationName, newParents, reference)).build();
            }
        }
    });
}
Also used : Types(io.fabric8.crd.generator.utils.Types) List(java.util.List) TypedVisitor(io.sundr.builder.TypedVisitor) TypeDef(io.sundr.model.TypeDef) Optional(java.util.Optional) TypeDefBuilder(io.sundr.model.TypeDefBuilder) Property(io.sundr.model.Property) AtomicReference(java.util.concurrent.atomic.AtomicReference) Collectors(java.util.stream.Collectors) ClassRef(io.sundr.model.ClassRef) ArrayList(java.util.ArrayList) TypeDef(io.sundr.model.TypeDef) ClassRef(io.sundr.model.ClassRef) ArrayList(java.util.ArrayList) Property(io.sundr.model.Property) TypeDefBuilder(io.sundr.model.TypeDefBuilder)

Example 2 with ClassRef

use of io.sundr.model.ClassRef in project kubernetes-client by fabric8io.

the class TypesTest method projectSuperClassesShouldProduceProperlyTypedClasses.

@Test
void projectSuperClassesShouldProduceProperlyTypedClasses() {
    List<ClassRef> superClasses = Types.typeDefFrom(Basic.class).getExtendsList();
    assertEquals(2, superClasses.size());
    Optional<ClassRef> crOpt = superClasses.stream().filter(c -> c.getName().contains("CustomResource")).findFirst();
    assertTrue(crOpt.isPresent());
    ClassRef crDef = crOpt.get();
    List<TypeRef> arguments = crDef.getArguments();
    assertEquals(2, arguments.size());
    assertTrue(arguments.get(0).toString().contains(BasicSpec.class.getSimpleName()));
    assertTrue(arguments.get(1).toString().contains(BasicStatus.class.getSimpleName()));
}
Also used : BasicSpec(io.fabric8.crd.example.basic.BasicSpec) SpecAndStatus(io.fabric8.crd.generator.utils.Types.SpecAndStatus) TypeRef(io.sundr.model.TypeRef) Property(io.sundr.model.Property) Joke(io.fabric8.crd.example.joke.Joke) Person(io.fabric8.crd.example.person.Person) ClassRef(io.sundr.model.ClassRef) Test(org.junit.jupiter.api.Test) List(java.util.List) Assertions.assertFalse(org.junit.jupiter.api.Assertions.assertFalse) BasicStatus(io.fabric8.crd.example.basic.BasicStatus) Assertions.assertTrue(org.junit.jupiter.api.Assertions.assertTrue) Basic(io.fabric8.crd.example.basic.Basic) TypeDef(io.sundr.model.TypeDef) Optional(java.util.Optional) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) WebServerWithStatusProperty(io.fabric8.crd.example.webserver.WebServerWithStatusProperty) Child(io.fabric8.crd.example.inherited.Child) Basic(io.fabric8.crd.example.basic.Basic) ClassRef(io.sundr.model.ClassRef) TypeRef(io.sundr.model.TypeRef) Test(org.junit.jupiter.api.Test)

Example 3 with ClassRef

use of io.sundr.model.ClassRef in project kubernetes-client by fabric8io.

the class TypesTest method shouldFindInheritedStatusProperty.

@Test
void shouldFindInheritedStatusProperty() {
    final TypeDef def = Types.typeDefFrom(Child.class);
    final Optional<Property> p = Types.findStatusProperty(def);
    assertTrue(p.isPresent());
    final Property property = p.get();
    final TypeRef typeRef = property.getTypeRef();
    assertTrue(typeRef instanceof ClassRef);
    final ClassRef classRef = (ClassRef) typeRef;
    final SpecAndStatus specAndStatus = Types.resolveSpecAndStatusTypes(def);
    assertEquals(specAndStatus.getStatusClassName(), classRef.getFullyQualifiedName());
}
Also used : TypeDef(io.sundr.model.TypeDef) ClassRef(io.sundr.model.ClassRef) TypeRef(io.sundr.model.TypeRef) SpecAndStatus(io.fabric8.crd.generator.utils.Types.SpecAndStatus) Property(io.sundr.model.Property) WebServerWithStatusProperty(io.fabric8.crd.example.webserver.WebServerWithStatusProperty) Test(org.junit.jupiter.api.Test)

Example 4 with ClassRef

use of io.sundr.model.ClassRef in project sundrio by sundrio.

the class GetDefinition method apply.

@Override
public TypeDef apply(ClassRef t) {
    String fullyQualifiedName = t.getFullyQualifiedName();
    TypeDef def = DefinitionRepository.getRepository().getDefinition(fullyQualifiedName);
    if (def != null) {
        return def;
    }
    Predicate<String> isLowerCase = w -> Character.isUpperCase(w.charAt(0));
    Predicate<String> inPackage = until(isLowerCase);
    Predicate<String> outOfPackage = after(isLowerCase);
    String packageName = Arrays.stream(fullyQualifiedName.split("\\.")).filter(inPackage).collect(Collectors.joining("."));
    String className = Arrays.stream(fullyQualifiedName.split("\\.")).filter(outOfPackage).collect(Collectors.joining("."));
    String ownerClassName = className.contains(".") ? className.substring(0, className.indexOf(".")) : null;
    if (ownerClassName != null) {
        className = className.substring(ownerClassName.length() + 1);
        return new TypeDefBuilder().withName(className).withPackageName(packageName).withOuterTypeName(packageName + "." + ownerClassName).build();
    }
    return new TypeDefBuilder().withName(className).withPackageName(packageName).build();
}
Also used : Predicates.until(io.sundr.utils.Predicates.until) Arrays(java.util.Arrays) Predicates.after(io.sundr.utils.Predicates.after) Predicate(java.util.function.Predicate) DefinitionRepository(io.sundr.model.repo.DefinitionRepository) TypeDef(io.sundr.model.TypeDef) TypeDefBuilder(io.sundr.model.TypeDefBuilder) Function(java.util.function.Function) Collectors(java.util.stream.Collectors) ClassRef(io.sundr.model.ClassRef) TypeDef(io.sundr.model.TypeDef) TypeDefBuilder(io.sundr.model.TypeDefBuilder)

Example 5 with ClassRef

use of io.sundr.model.ClassRef in project sundrio by sundrio.

the class ClassToTypeDef method apply.

@Override
public TypeDef apply(Class item) {
    if (Object.class.equals(item)) {
        return TypeDef.OBJECT;
    }
    Kind kind = classToKind.apply(item);
    List<ClassRef> extendsList = new ArrayList<>();
    List<ClassRef> implementsList = new ArrayList<>();
    List<Property> properties = new ArrayList<>();
    List<Method> methods = new ArrayList<>();
    List<Method> constructors = new ArrayList<>();
    List<TypeParamDef> parameters = new ArrayList<>();
    if (item.getSuperclass() != null) {
        extendsList.add((ClassRef) typeToTypeRef.apply(item.getGenericSuperclass()));
        references.add(item.getSuperclass());
    }
    for (Class interfaceClass : item.getInterfaces()) {
        references.add(interfaceClass);
    }
    for (Type interfaceClass : item.getGenericInterfaces()) {
        TypeRef ref = typeToTypeRef.apply(interfaceClass);
        if (ref instanceof ClassRef) {
            implementsList.add((ClassRef) ref);
        }
    }
    constructors.addAll(getConstructors(item, references));
    methods.addAll(getMethods(item, references));
    properties.addAll(getProperties(item, references));
    for (TypeVariable typeVariable : item.getTypeParameters()) {
        List<ClassRef> bounds = new ArrayList<>();
        for (Type boundType : typeVariable.getBounds()) {
            TypeRef typeRef = typeToTypeRef.apply(boundType);
            if (typeRef instanceof ClassRef) {
                bounds.add((ClassRef) typeRef);
            }
        }
        parameters.add(new TypeParamDefBuilder().withName(typeVariable.getName()).withBounds(bounds).build());
    }
    String outerFQCN = item.getDeclaringClass() != null ? item.getDeclaringClass().getName() : null;
    TypeDef result = context.getDefinitionRepository().register(new TypeDefBuilder().withKind(kind).withOuterTypeName(outerFQCN).withName(item.getSimpleName()).withPackageName(item.getPackage() != null ? item.getPackage().getName() : null).withModifiers(item.getModifiers()).withParameters(parameters).withConstructors(constructors).withMethods(methods).withProperties(properties).withExtendsList(extendsList).withImplementsList(implementsList).build());
    Set<Class> copy = new HashSet<>(references);
    copy.stream().peek(c -> references.remove(c)).filter(c -> !c.equals(item)).filter(c -> !c.getName().startsWith("sun.") && !c.getName().toString().startsWith("com.sun.")).forEach(c -> {
        String referenceFQCN = c.getName().replaceAll(Pattern.quote("$"), ".");
        context.getDefinitionRepository().registerIfAbsent(referenceFQCN, () -> apply(c));
    });
    return result;
}
Also used : TypeParamDefBuilder(io.sundr.model.TypeParamDefBuilder) AnnotationRefBuilder(io.sundr.model.AnnotationRefBuilder) HashMap(java.util.HashMap) TypeDefBuilder(io.sundr.model.TypeDefBuilder) Function(java.util.function.Function) AdapterContext(io.sundr.adapter.api.AdapterContext) Attributeable(io.sundr.model.Attributeable) ArrayList(java.util.ArrayList) AttributeKey(io.sundr.model.AttributeKey) ClassRef(io.sundr.model.ClassRef) HashSet(java.util.HashSet) Map(java.util.Map) TypeVariable(java.lang.reflect.TypeVariable) Set(java.util.Set) Method(io.sundr.model.Method) TypeRef(io.sundr.model.TypeRef) Field(java.lang.reflect.Field) AnnotationRef(io.sundr.model.AnnotationRef) Kind(io.sundr.model.Kind) Collectors(java.util.stream.Collectors) Property(io.sundr.model.Property) InvocationTargetException(java.lang.reflect.InvocationTargetException) List(java.util.List) Stream(java.util.stream.Stream) MethodBuilder(io.sundr.model.MethodBuilder) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) Annotation(java.lang.annotation.Annotation) TypeDef(io.sundr.model.TypeDef) PropertyBuilder(io.sundr.model.PropertyBuilder) Pattern(java.util.regex.Pattern) TypeParamDef(io.sundr.model.TypeParamDef) AnnotatedElement(java.lang.reflect.AnnotatedElement) TypeParamDef(io.sundr.model.TypeParamDef) ClassRef(io.sundr.model.ClassRef) TypeRef(io.sundr.model.TypeRef) ArrayList(java.util.ArrayList) Method(io.sundr.model.Method) TypeDefBuilder(io.sundr.model.TypeDefBuilder) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) TypeDef(io.sundr.model.TypeDef) TypeVariable(java.lang.reflect.TypeVariable) Kind(io.sundr.model.Kind) TypeParamDefBuilder(io.sundr.model.TypeParamDefBuilder) Property(io.sundr.model.Property) HashSet(java.util.HashSet)

Aggregations

ClassRef (io.sundr.model.ClassRef)68 TypeDef (io.sundr.model.TypeDef)41 TypeRef (io.sundr.model.TypeRef)35 RichTypeDef (io.sundr.model.RichTypeDef)22 ClassRefBuilder (io.sundr.model.ClassRefBuilder)21 ArrayList (java.util.ArrayList)21 Property (io.sundr.model.Property)19 Method (io.sundr.model.Method)18 TypeDefBuilder (io.sundr.model.TypeDefBuilder)18 Test (org.junit.Test)17 List (java.util.List)12 AnnotationRef (io.sundr.model.AnnotationRef)11 MethodBuilder (io.sundr.model.MethodBuilder)11 Collectors (java.util.stream.Collectors)11 TypedVisitor (io.sundr.builder.TypedVisitor)10 TypeParamDef (io.sundr.model.TypeParamDef)10 LinkedHashSet (java.util.LinkedHashSet)10 PropertyBuilder (io.sundr.model.PropertyBuilder)9 Map (java.util.Map)9 AttributeKey (io.sundr.model.AttributeKey)8