ParameterizedType parameterizedTypeArgument = (ParameterizedType) typeArgument;
elementType = (Class<?>) parameterizedTypeArgument.getRawType();
} else {
throw new XOException("Cannot determine argument type of collection property " + propertyMethod.getAnnotatedElement().toGenericString());
}
AnnotatedType annotatedTypeArgument = new AnnotatedType(elementType);
if (isEntityType(annotatedTypeArgument)) {
Direction relationDirection = getRelationDirection(propertyMethod, Direction.FROM);
com.buschmais.xo.spi.reflection.AnnotatedElement<?> relationElement = getRelationDefinitionElement(propertyMethod);
RelationTypeMetadata relationshipType = new RelationTypeMetadata<>(metadataFactory.createRelationMetadata(relationElement, metadataByType));
methodMetadata = new EntityCollectionPropertyMethodMetadata<>(propertyMethod, relationshipType, relationDirection,
metadataFactory.createCollectionPropertyMetadata(propertyMethod));
} else if (isRelationType(annotatedTypeArgument)) {
TypeMetadata relationTypeMetadata = getOrCreateTypeMetadata(elementType);
RelationTypeMetadata<RelationMetadata> relationMetadata = (RelationTypeMetadata) relationTypeMetadata;
Direction relationDirection = getRelationDirection(annotatedType, propertyMethod, relationTypeMetadata, relationMetadata);
methodMetadata = new RelationCollectionPropertyMethodMetadata<>(propertyMethod, relationMetadata, relationDirection,
metadataFactory.createCollectionPropertyMetadata(propertyMethod));
} else {
throw new XOException("Unsupported type argument '" + elementType.getName() + "' for collection property: " + propertyType.getName());
}
} else if (annotatedMethods.containsKey(propertyType)) {
AnnotatedType referencedType = new AnnotatedType(propertyType);
Direction relationDirection;
RelationTypeMetadata<RelationMetadata> relationMetadata;
if (isEntityType(referencedType)) {
relationDirection = getRelationDirection(propertyMethod, Direction.FROM);
com.buschmais.xo.spi.reflection.AnnotatedElement<?> relationElement = getRelationDefinitionElement(propertyMethod);