|
24 | 24 | import java.lang.reflect.Field;
|
25 | 25 | import java.lang.reflect.Member;
|
26 | 26 | import java.lang.reflect.Method;
|
27 |
| -import java.util.ArrayList; |
28 |
| -import java.util.Collection; |
29 |
| -import java.util.HashMap; |
30 |
| -import java.util.List; |
31 |
| -import java.util.Map; |
| 27 | +import java.util.*; |
32 | 28 | import java.util.concurrent.atomic.AtomicInteger;
|
33 | 29 | import java.util.stream.Collectors;
|
34 | 30 | import java.util.stream.Stream;
|
35 | 31 |
|
36 | 32 | import javax.persistence.EntityManager;
|
| 33 | +import javax.persistence.Transient; |
37 | 34 | import javax.persistence.metamodel.Attribute;
|
38 | 35 | import javax.persistence.metamodel.EmbeddableType;
|
39 | 36 | import javax.persistence.metamodel.EntityType;
|
@@ -469,13 +466,77 @@ private GraphQLObjectType getObjectType(EntityType<?> entityType) {
|
469 | 466 | .map(this::getObjectField)
|
470 | 467 | .collect(Collectors.toList())
|
471 | 468 | )
|
| 469 | + .fields(getObjectCalcFields(entityType.getJavaType())) |
| 470 | + .fields(getObjectCalcMethods(entityType.getJavaType())) |
472 | 471 | .build();
|
473 | 472 |
|
474 | 473 | entityCache.putIfAbsent(entityType, objectType);
|
475 | 474 |
|
476 | 475 | return objectType;
|
477 | 476 | }
|
478 | 477 |
|
| 478 | + private List<GraphQLFieldDefinition> getObjectCalcFields(Class cls) { |
| 479 | + return |
| 480 | + Arrays.stream(cls.getDeclaredFields()) |
| 481 | + .filter( |
| 482 | + f -> |
| 483 | + f instanceof Member && |
| 484 | + f.isAnnotationPresent(Transient.class) && |
| 485 | + isNotIgnored((Member) f) && |
| 486 | + isNotIgnored(f.getType()) |
| 487 | + ) |
| 488 | + .map(f -> getObjectCalcField(f)) |
| 489 | + .collect(Collectors.toList()); |
| 490 | + } |
| 491 | + |
| 492 | + private List<GraphQLFieldDefinition> getObjectCalcMethods(Class cls) { |
| 493 | + return |
| 494 | + Arrays.stream(cls.getDeclaredMethods()) |
| 495 | + .filter( |
| 496 | + m -> |
| 497 | + m instanceof Member && |
| 498 | + m.isAnnotationPresent(Transient.class) && |
| 499 | + isNotIgnored((Member) m) && |
| 500 | + isNotIgnored(m.getReturnType()) |
| 501 | + ) |
| 502 | + .map(m -> getObjectCalcMethtod(m)) |
| 503 | + .collect(Collectors.toList()); |
| 504 | + } |
| 505 | + |
| 506 | + @SuppressWarnings( { "rawtypes", "unchecked" } ) |
| 507 | + private GraphQLFieldDefinition getObjectCalcField(Field field) { |
| 508 | + GraphQLType type = getGraphQLTypeFromJavaType(field.getType()); |
| 509 | + DataFetcher dataFetcher = PropertyDataFetcher.fetching(field.getName()); |
| 510 | + |
| 511 | + return GraphQLFieldDefinition.newFieldDefinition() |
| 512 | + .name(field.getName()) |
| 513 | + .description(getSchemaDescription((AnnotatedElement) field)) |
| 514 | + .type((GraphQLOutputType) type) |
| 515 | + .dataFetcher(dataFetcher) |
| 516 | + .build(); |
| 517 | + } |
| 518 | + |
| 519 | + @SuppressWarnings( { "rawtypes", "unchecked" } ) |
| 520 | + private GraphQLFieldDefinition getObjectCalcMethtod(Method method) { |
| 521 | + String nm = method.getName(); |
| 522 | + if (nm.startsWith("is")) { |
| 523 | + nm = Introspector.decapitalize(nm.substring(2)); |
| 524 | + } |
| 525 | + if (nm.startsWith("get")) { |
| 526 | + nm = Introspector.decapitalize(nm.substring(3)); |
| 527 | + } |
| 528 | + |
| 529 | + GraphQLType type = getGraphQLTypeFromJavaType(method.getReturnType()); |
| 530 | + DataFetcher dataFetcher = PropertyDataFetcher.fetching(nm); |
| 531 | + |
| 532 | + return GraphQLFieldDefinition.newFieldDefinition() |
| 533 | + .name(nm) |
| 534 | + .description(getSchemaDescription((AnnotatedElement) method)) |
| 535 | + .type((GraphQLOutputType) type) |
| 536 | + .dataFetcher(dataFetcher) |
| 537 | + .build(); |
| 538 | + } |
| 539 | + |
479 | 540 | @SuppressWarnings( { "rawtypes", "unchecked" } )
|
480 | 541 | private GraphQLFieldDefinition getObjectField(Attribute attribute) {
|
481 | 542 | GraphQLOutputType type = getAttributeOutputType(attribute);
|
|
0 commit comments