44
44
@ SupportedAnnotationTypes (
45
45
value = { "com.redis.om.spring.annotations.Document" , "org.springframework.data.redis.core.RedisHash" }
46
46
)
47
- @ SupportedSourceVersion (SourceVersion .RELEASE_17 )
48
47
@ AutoService (Processor .class )
49
48
public final class MetamodelGenerator extends AbstractProcessor {
50
49
@@ -60,6 +59,11 @@ public final class MetamodelGenerator extends AbstractProcessor {
60
59
public MetamodelGenerator () {
61
60
}
62
61
62
+ @ Override
63
+ public SourceVersion getSupportedSourceVersion () {
64
+ return SourceVersion .latest ();
65
+ }
66
+
63
67
private static TypeSpec getTypeSpecForMetamodelClass (String genEntityName , List <FieldSpec > interceptors ,
64
68
List <ObjectGraphFieldSpec > fields , List <FieldSpec > nestedFieldsConstants , CodeBlock staticBlock ) {
65
69
return TypeSpec .classBuilder (genEntityName ) //
@@ -242,7 +246,7 @@ private List<Triple<ObjectGraphFieldSpec, FieldSpec, CodeBlock>> processFieldMet
242
246
TypeName entityField = TypeName .get (field .asType ());
243
247
244
248
TypeMirror fieldType = field .asType ();
245
- String fullTypeClassName = fieldType .toString ();
249
+ String fullTypeClassName = fieldType .toString (). replace ( "@lombok.NonNull " , "" ). trim () ;
246
250
String cls = ObjectUtils .getTargetClassName (fullTypeClassName );
247
251
248
252
if (field .asType ().getKind ().isPrimitive ()) {
@@ -575,20 +579,26 @@ private Map<? extends Element, String> getInstanceFields(Element element) {
575
579
// Only consider methods with no parameters
576
580
.filter (ee -> ee .getEnclosedElements ().stream ().noneMatch (eee -> eee .getKind () == ElementKind .PARAMETER ))
577
581
// Todo: Filter out methods that returns void or Void
578
- .collect (Collectors .toMap (e -> e .getSimpleName ().toString (), Function .identity ()));
582
+ .collect (Collectors .toMap (
583
+ e -> e .getSimpleName ().toString (),
584
+ Function .identity (),
585
+ (v1 , v2 ) -> v1 // Merge function to handle duplicate keys
586
+ ));
579
587
580
588
final Set <String > isGetters = getters .values ().stream ()
581
589
// todo: Filter out methods only returning boolean or Boolean
582
590
.map (Element ::getSimpleName ).map (Object ::toString ).filter (n -> n .startsWith (IS_PREFIX )).map (n -> n .substring (2 ))
583
591
.map (ObjectUtils ::toLowercaseFirstCharacter ).collect (Collectors .toSet ());
584
592
593
+ // Use a mutable map to collect the results
594
+ Map <Element , String > results = new HashMap <>();
595
+
585
596
// Retrieve all declared non-final instance fields of the annotated class
586
- Map <Element , String > results = element .getEnclosedElements ().stream ()
587
- .filter (ee -> ee .getKind ().isField () && !ee .getModifiers ().contains (Modifier .STATIC ) // Ignore static
588
- // fields
597
+ element .getEnclosedElements ().stream ()
598
+ .filter (ee -> ee .getKind ().isField () && !ee .getModifiers ().contains (Modifier .STATIC ) // Ignore static fields
589
599
&& !ee .getModifiers ().contains (Modifier .FINAL )) // Ignore final fields
590
- .collect ( Collectors . toMap ( Function . identity () ,
591
- ee -> findGetter (ee , getters , isGetters , element .toString (), lombokGetterAvailable (element , ee ))));
600
+ .forEach ( ee -> results . put ( ee ,
601
+ findGetter (ee , getters , isGetters , element .toString (), lombokGetterAvailable (element , ee ))));
592
602
593
603
Types types = processingEnvironment .getTypeUtils ();
594
604
List <? extends TypeMirror > superTypes = types .directSupertypes (element .asType ());
@@ -679,6 +689,23 @@ private String findGetter(final Element field, final Map<String, Element> getter
679
689
return lambdaName + " -> " + lambdaName + "." + fieldName ;
680
690
}
681
691
692
+ // Handle specific cases for java.lang.String, java.lang.Enum, and java.util.Date
693
+ if (field .getEnclosingElement ().toString ().equals ("java.lang.String" )) {
694
+ if (fieldName .equals ("hash" ) || fieldName .equals ("hashIsZero" )) {
695
+ return lambdaName + " -> 0" ; // Return a default value for hash and hashIsZero
696
+ }
697
+ } else if (field .getEnclosingElement ().toString ().equals ("java.lang.Enum" )) {
698
+ if (fieldName .equals ("hash" )) {
699
+ return lambdaName + " -> 0" ; // Return a default value for hash
700
+ }
701
+ } else if (field .getEnclosingElement ().toString ().equals ("java.util.Date" )) {
702
+ if (fieldName .equals ("fastTime" )) {
703
+ return lambdaName + " -> " + lambdaName + ".getTime()" ; // Use getTime() as a fallback for fastTime
704
+ } else if (fieldName .equals ("cdate" )) {
705
+ return lambdaName + " -> " + lambdaName + ".getTime()" ; // Use getTime() as a fallback for cdate
706
+ }
707
+ }
708
+
682
709
// default to thrower
683
710
messager .printMessage (Diagnostic .Kind .ERROR ,
684
711
"Class " + entityName + " is not a proper JavaBean because " + field .getSimpleName ()
0 commit comments