use of io.sundr.model.TypeDef 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();
}
use of io.sundr.model.TypeDef 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;
}
use of io.sundr.model.TypeDef in project sundrio by sundrio.
the class AbstractAdapterTest method testWithSelfRefParam.
@Test
public void testWithSelfRefParam() {
T input = getInput(ClassWithSelfRefParam.class);
TypeDef typeDef = Adapters.adaptType(input, getContext());
assertNotNull(typeDef);
assertEquals("ClassWithSelfRefParam", typeDef.getName());
assertEquals(1, typeDef.getProperties().size());
assertEquals(1, typeDef.getParameters().size());
assertEquals("T", typeDef.getParameters().get(0).getName());
assertEquals(1, typeDef.getParameters().get(0).getBounds().size());
assertEquals(1, typeDef.getParameters().get(0).getBounds().get(0).getArguments().size());
}
use of io.sundr.model.TypeDef in project sundrio by sundrio.
the class AbstractAdapterTest method testWithParam.
@Test
public void testWithParam() {
T input = getInput(ClassWithParam.class);
TypeDef typeDef = Adapters.adaptType(input, getContext());
assertNotNull(typeDef);
assertEquals("ClassWithParam", typeDef.getName());
assertEquals(1, typeDef.getProperties().size());
assertEquals(1, typeDef.getParameters().size());
assertEquals("T", typeDef.getParameters().get(0).getName());
assertEquals(0, typeDef.getParameters().get(0).getBounds().size());
}
use of io.sundr.model.TypeDef in project sundrio by sundrio.
the class AbstractAdapterTest method testWithPrimitiveArray.
@Test
public void testWithPrimitiveArray() {
T input = getInput(ClassWithPrimitiveArray.class);
TypeDef typeDef = Adapters.adaptType(input, getContext());
assertNotNull(typeDef);
assertEquals("ClassWithPrimitiveArray", typeDef.getName());
assertEquals(1, typeDef.getProperties().size());
TypeRef typeRef = typeDef.getProperties().iterator().next().getTypeRef();
assertTrue(typeRef instanceof PrimitiveRef);
assertEquals(1, ((PrimitiveRef) typeRef).getDimensions());
}
Aggregations