Skip to content

Commit

Permalink
scrooge: add validateInstanceValue api in Java generated code
Browse files Browse the repository at this point in the history
Problem/Solution
Add validateInstanceValue api in thrift struct, union, and exception
types. The new api can be used to validate a generated struct, union,
or exception against the annotations defined on the IDL.

JIRA Issues: CSL-11199

Differential Revision: https://phabricator.twitter.biz/D720300
  • Loading branch information
jyanJing authored and jenkins committed Aug 27, 2021
1 parent 8d4e60d commit 2c5f856
Showing 17 changed files with 294 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -8,6 +8,7 @@ import jakarta.validation.constraints._
import java.lang.annotation.Annotation
import org.hibernate.validator.constraints._
import scala.collection.mutable
import scala.jdk.CollectionConverters._

object ThriftValidator {

@@ -140,6 +141,9 @@ class ThriftValidator(
* @return A set of [[ThriftValidationViolation]]s for violated
* constraints. Return an empty set if all validations
* passed.
* @note See a Java-friendly version of [[validateField]] that takes
* fieldAnnotations as a [[java.util.Map]], and return a set of
* [[ThriftValidationViolation]]s as [[java.util.Set]].
*/
def validateField[T](
fieldName: String,
@@ -152,6 +156,19 @@ class ThriftValidator(
validateCustomConstraints[T](fieldName, fieldValue, customAnnotations)
}

/**
* A Java-friendly version of [[validateField]], that takes fieldAnnotations
* as a [[java.util.Map]], and return a set of [[ThriftValidationViolation]]s
* as [[java.util.Set]].
*/
def validateField[T](
fieldName: String,
fieldValue: T,
fieldAnnotations: java.util.Map[String, String]
): java.util.Set[ThriftValidationViolation] = {
validateField(fieldName, fieldValue, fieldAnnotations.asScala.toMap).asJava
}

// For default constraint validations, we invoke ScalaValidator.validateFieldValue
private def validateDefaultConstraints[T](
fieldName: String,
Original file line number Diff line number Diff line change
@@ -27,6 +27,8 @@
import com.twitter.finagle.AbstractFailureFlags;
import com.twitter.finagle.JavaFailureFlags;
import com.twitter.scrooge.ThriftStructIface;
import com.twitter.scrooge.ThriftValidator;
import com.twitter.scrooge.validation.ThriftValidationViolation;
import com.twitter.scrooge.TFieldBlob;
import com.twitter.scrooge.internal.TProtocols;

@@ -201,6 +203,13 @@ public static List<String> validateNewInstance(AnotherException item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(AnotherException item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();

return violations;
}

public AnotherException deepCopy() {
return new AnotherException(this);
}
Original file line number Diff line number Diff line change
@@ -25,6 +25,8 @@
import org.apache.thrift.protocol.*;

import com.twitter.scrooge.ThriftStructIface;
import com.twitter.scrooge.ThriftValidator;
import com.twitter.scrooge.validation.ThriftValidationViolation;
import com.twitter.scrooge.TFieldBlob;
import com.twitter.scrooge.internal.TProtocols;

@@ -188,6 +190,13 @@ public static List<String> validateNewInstance(CollectionId item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(CollectionId item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();

return violations;
}

public CollectionId deepCopy() {
return new CollectionId(this);
}
Original file line number Diff line number Diff line change
@@ -26,10 +26,12 @@

import com.twitter.scrooge.ThriftMethodIface;
import com.twitter.scrooge.ThriftStructIface;
import com.twitter.scrooge.ThriftValidator;
import com.twitter.scrooge.TReusableBuffer;
import com.twitter.scrooge.TReusableMemoryTransport;
import com.twitter.scrooge.TFieldBlob;
import com.twitter.scrooge.internal.TProtocols;
import com.twitter.scrooge.validation.ThriftValidationViolation;
import com.twitter.util.ConstFuture;
import com.twitter.util.Future;
import com.twitter.util.Function;
@@ -954,6 +956,14 @@ public static List<String> validateNewInstance(doGreatThings_args item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(doGreatThings_args item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.Request.validateInstanceValue(item.request));

return violations;
}

public doGreatThings_args deepCopy() {
return new doGreatThings_args(this);
}
@@ -1337,6 +1347,15 @@ public static List<String> validateNewInstance(doGreatThings_result item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(doGreatThings_result item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.Response.validateInstanceValue(item.success));
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.OverCapacityException.validateInstanceValue(item.ex));

return violations;
}

public doGreatThings_result deepCopy() {
return new doGreatThings_result(this);
}
@@ -1789,6 +1808,14 @@ public static List<String> validateNewInstance(noExceptionCall_args item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(noExceptionCall_args item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.Request.validateInstanceValue(item.request));

return violations;
}

public noExceptionCall_args deepCopy() {
return new noExceptionCall_args(this);
}
@@ -2155,6 +2182,14 @@ public static List<String> validateNewInstance(noExceptionCall_result item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(noExceptionCall_result item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.Response.validateInstanceValue(item.success));

return violations;
}

public noExceptionCall_result deepCopy() {
return new noExceptionCall_result(this);
}
Original file line number Diff line number Diff line change
@@ -27,6 +27,8 @@
import com.twitter.finagle.AbstractFailureFlags;
import com.twitter.finagle.JavaFailureFlags;
import com.twitter.scrooge.ThriftStructIface;
import com.twitter.scrooge.ThriftValidator;
import com.twitter.scrooge.validation.ThriftValidationViolation;
import com.twitter.scrooge.TFieldBlob;
import com.twitter.scrooge.internal.TProtocols;

@@ -209,6 +211,14 @@ public static List<String> validateNewInstance(OverCapacityException item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(OverCapacityException item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();
violations.addAll(thriftValidator.validateField("chillTimeSeconds", item.chillTimeSeconds, fieldAnnotations.get(_Fields.CHILL_TIME_SECONDS)));

return violations;
}

public OverCapacityException deepCopy() {
return new OverCapacityException(this);
}
Original file line number Diff line number Diff line change
@@ -26,10 +26,12 @@

import com.twitter.scrooge.ThriftMethodIface;
import com.twitter.scrooge.ThriftStructIface;
import com.twitter.scrooge.ThriftValidator;
import com.twitter.scrooge.TReusableBuffer;
import com.twitter.scrooge.TReusableMemoryTransport;
import com.twitter.scrooge.TFieldBlob;
import com.twitter.scrooge.internal.TProtocols;
import com.twitter.scrooge.validation.ThriftValidationViolation;
import com.twitter.util.ConstFuture;
import com.twitter.util.Future;
import com.twitter.util.Function;
@@ -718,6 +720,14 @@ public static List<String> validateNewInstance(moreCoolThings_args item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(moreCoolThings_args item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.Request.validateInstanceValue(item.request));

return violations;
}

public moreCoolThings_args deepCopy() {
return new moreCoolThings_args(this);
}
@@ -1116,6 +1126,15 @@ public static List<String> validateNewInstance(moreCoolThings_result item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(moreCoolThings_result item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.AnotherException.validateInstanceValue(item.ax));
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.OverCapacityException.validateInstanceValue(item.oce));

return violations;
}

public moreCoolThings_result deepCopy() {
return new moreCoolThings_result(this);
}
Original file line number Diff line number Diff line change
@@ -25,6 +25,8 @@
import org.apache.thrift.protocol.*;

import com.twitter.scrooge.ThriftStructIface;
import com.twitter.scrooge.ThriftValidator;
import com.twitter.scrooge.validation.ThriftValidationViolation;
import com.twitter.scrooge.TFieldBlob;
import com.twitter.scrooge.internal.TProtocols;

@@ -199,6 +201,14 @@ public static List<String> validateNewInstance(Recursive item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(Recursive item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.Request.validateInstanceValue(item.recRequest));

return violations;
}

public Recursive deepCopy() {
return new Recursive(this);
}
Original file line number Diff line number Diff line change
@@ -25,6 +25,8 @@
import org.apache.thrift.protocol.*;

import com.twitter.scrooge.ThriftStructIface;
import com.twitter.scrooge.ThriftValidator;
import com.twitter.scrooge.validation.ThriftValidationViolation;
import com.twitter.scrooge.TFieldBlob;
import com.twitter.scrooge.internal.TProtocols;

@@ -407,6 +409,18 @@ public static List<String> validateNewInstance(Request item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(Request item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.Request.validateInstanceValue(item.aRequest));
violations.addAll(thriftValidator.validateField("hashtagComment", item.hashtagComment, fieldAnnotations.get(_Fields.HASHTAG_COMMENT)));
violations.addAll(thriftValidator.validateField("singleAsteriskComment", item.singleAsteriskComment, fieldAnnotations.get(_Fields.SINGLE_ASTERISK_COMMENT)));
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.Recursive.validateInstanceValue(item.recRequest));
violations.addAll(thriftValidator.validateField("constructionRequiredField", item.constructionRequiredField, fieldAnnotations.get(_Fields.CONSTRUCTION_REQUIRED_FIELD)));

return violations;
}

public Request deepCopy() {
return new Request(this);
}
Original file line number Diff line number Diff line change
@@ -25,6 +25,8 @@
import org.apache.thrift.protocol.*;

import com.twitter.scrooge.ThriftStructIface;
import com.twitter.scrooge.ThriftValidator;
import com.twitter.scrooge.validation.ThriftValidationViolation;
import com.twitter.scrooge.TFieldBlob;
import com.twitter.scrooge.internal.TProtocols;

@@ -203,6 +205,14 @@ public static List<String> validateNewInstance(Response item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(Response item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();
violations.addAll(com.twitter.scrooge.test.gold.thriftjava.ResponseUnion.validateInstanceValue(item.responseUnion));

return violations;
}

public Response deepCopy() {
return new Response(this);
}
Original file line number Diff line number Diff line change
@@ -25,6 +25,8 @@
import org.apache.thrift.protocol.*;

import com.twitter.scrooge.ThriftStructIface;
import com.twitter.scrooge.ThriftValidator;
import com.twitter.scrooge.validation.ThriftValidationViolation;
import com.twitter.scrooge.TFieldBlob;
import com.twitter.scrooge.internal.TProtocols;

@@ -177,6 +179,19 @@ public static List<String> validateNewInstance(ResponseUnion item) {
return buf;
}

public static Set<ThriftValidationViolation> validateInstanceValue(ResponseUnion item) {
final ThriftValidator thriftValidator = ThriftValidator.newBuilder().build();
final Set<ThriftValidationViolation> violations = new HashSet<ThriftValidationViolation>();

_Fields field = item.getSetField();
Map<String, String> annotations = fieldAnnotations.get(field);
if (annotations != null) {
violations.addAll(thriftValidator.validateField(field.getFieldName(), item.getFieldValue(), annotations));
}

return violations;
}

public ResponseUnion deepCopy() {
return new ResponseUnion(this);
}
Loading

0 comments on commit 2c5f856

Please sign in to comment.