Skip to content

Commit

Permalink
Update ServiceValidator.java
Browse files Browse the repository at this point in the history
Added compile-time validation in the GraphQL compiler plugin to ensure stub entities annotated with @subgraph:Entity`only contain key fields. Non-key fields are now identified and trigger a diagnostic error during validation. The implementation includes extracting key fields from the annotation and validating record fields against these keys.
  • Loading branch information
Codewithsumeet authored Nov 22, 2024
1 parent 866d2fa commit a131b8c
Showing 1 changed file with 53 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -185,27 +185,67 @@ private void validateEntities() {
}

private void validateEntityAnnotation(AnnotationNode entityAnnotation) {
if (entityAnnotation.annotValue().isEmpty()) {
return;

if (entityAnnotation.annotValue().isEmpty()) {
return;
}


List<String> keyFields = new ArrayList<>();
for (MappingFieldNode fieldNode : entityAnnotation.annotValue().get().fields()) {
if (fieldNode.kind() != SPECIFIC_FIELD) {

addDiagnostic(CompilationDiagnostic.PROVIDE_KEY_VALUE_PAIR_FOR_ENTITY_ANNOTATION, fieldNode.location());
continue;
}
for (MappingFieldNode fieldNode : entityAnnotation.annotValue().get().fields()) {
if (fieldNode.kind() != SPECIFIC_FIELD) {
addDiagnostic(CompilationDiagnostic.PROVIDE_KEY_VALUE_PAIR_FOR_ENTITY_ANNOTATION, fieldNode.location());
continue;
}
SpecificFieldNode specificFieldNode = (SpecificFieldNode) fieldNode;
Node fieldNameNode = specificFieldNode.fieldName();
if (fieldNameNode.kind() != SyntaxKind.IDENTIFIER_TOKEN) {
continue;
}
SpecificFieldNode specificFieldNode = (SpecificFieldNode) fieldNode;
Node fieldNameNode = specificFieldNode.fieldName();


if (fieldNameNode.kind() == SyntaxKind.IDENTIFIER_TOKEN) {
IdentifierToken fieldNameToken = (IdentifierToken) fieldNameNode;
String fieldName = fieldNameToken.text().trim();
if (KEY.equals(fieldName)) {
validateKeyField(specificFieldNode);

keyFields = extractKeyFields(specificFieldNode);
}
}
}


validateFieldsAgainstKeys(keyFields, entityAnnotation.location());
}

private void validateFieldsAgainstKeys(List<String> keyFields, Location entityLocation) {
for (RecordFieldSymbol recordField : getRecordFields()) {
String fieldName = recordField.getName().orElse("");

if (!keyFields.contains(fieldName)) {
addDiagnostic(CompilationDiagnostic.INVALID_ENTITY_FIELD, entityLocation, fieldName);
}
}
}

private List<String> extractKeyFields(SpecificFieldNode specificFieldNode) {
List<String> keyFields = new ArrayList<>();
if (specificFieldNode.valueExpr().isPresent()) {
ExpressionNode valueNode = specificFieldNode.valueExpr().get();

if (valueNode.kind() == SyntaxKind.LIST_CONSTRUCTOR) {
for (Node keyField : ((ListConstructorExpressionNode) valueNode).expressions()) {
if (keyField.kind() == SyntaxKind.STRING_LITERAL) {
keyFields.add(keyField.toString().replace("\"", "").trim());
}
}
} else if (valueNode.kind() == SyntaxKind.STRING_LITERAL) {

keyFields.add(valueNode.toString().replace("\"", "").trim());
}
}
return keyFields;
}


private void validateKeyField(SpecificFieldNode specificFieldNode) {
if (specificFieldNode.valueExpr().isEmpty()) {
addDiagnostic(CompilationDiagnostic.PROVIDE_A_STRING_LITERAL_OR_AN_ARRAY_OF_STRING_LITERALS_FOR_KEY_FIELD,
Expand Down

0 comments on commit a131b8c

Please sign in to comment.