From b7305692029dc964c7b3e65249945233fc772392 Mon Sep 17 00:00:00 2001 From: summerji Date: Thu, 1 Oct 2020 00:14:16 -0700 Subject: [PATCH 1/4] Add Equals method in ResourceName --- .../ResourceNameHelperClassComposer.java | 111 ++++++++++++++++++ .../gapic/composer/goldens/FoobarName.golden | 15 +++ 2 files changed, 126 insertions(+) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index f686469607..9fc5b701ad 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -17,6 +17,7 @@ import com.google.api.core.BetaApi; import com.google.api.generator.engine.ast.AnnotationNode; import com.google.api.generator.engine.ast.AssignmentExpr; +import com.google.api.generator.engine.ast.CastExpr; import com.google.api.generator.engine.ast.ClassDefinition; import com.google.api.generator.engine.ast.CommentStatement; import com.google.api.generator.engine.ast.ConcreteReference; @@ -30,7 +31,9 @@ import com.google.api.generator.engine.ast.MethodInvocationExpr; import com.google.api.generator.engine.ast.NewObjectExpr; import com.google.api.generator.engine.ast.NullObjectValue; +import com.google.api.generator.engine.ast.PrimitiveValue; import com.google.api.generator.engine.ast.Reference; +import com.google.api.generator.engine.ast.RelationalOperationExpr; import com.google.api.generator.engine.ast.ReturnExpr; import com.google.api.generator.engine.ast.ScopeNode; import com.google.api.generator.engine.ast.Statement; @@ -57,6 +60,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -269,6 +273,7 @@ private static List createClassMethods( createFieldValueGetterMethods(resourceName, patternTokenVarExprs, tokenHierarchies, types)); javaMethods.add( createToStringMethod(templateFinalVarExprs, patternTokenVarExprs, tokenHierarchies)); + javaMethods.add(createEqualsMethod(resourceName, tokenHierarchies, types)); return javaMethods; } @@ -1140,6 +1145,112 @@ private static MethodDefinition createToStringMethod( .build(); } + private static MethodDefinition createEqualsMethod( + ResourceName resourceName, List> tokenHierarchies, Map types) { + Variable oVariable = Variable.builder().setType(TypeNode.OBJECT).setName("o").build(); + VariableExpr argVarExprDecl = + VariableExpr.builder().setIsDecl(true).setVariable(oVariable).build(); + VariableExpr argVarExprNotDecl = + VariableExpr.builder().setIsDecl(false).setVariable(oVariable).build(); + TypeNode thisClassType = types.get(getThisClassName(resourceName)); + ValueExpr thisValueExpr = ValueExpr.withValue(ThisObjectValue.withType(thisClassType)); + ValueExpr trueValueExpr = + ValueExpr.withValue( + PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("true").build()); + ValueExpr falseValueExpr = + ValueExpr.withValue( + PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("false").build()); + + ReturnExpr returnTrueExpr = ReturnExpr.withExpr(trueValueExpr); + RelationalOperationExpr oEqualsThisExpr = + RelationalOperationExpr.equalToWithExprs(argVarExprNotDecl, thisValueExpr); + RelationalOperationExpr oNotEqualsNullExpr = + RelationalOperationExpr.notEqualToWithExprs( + argVarExprNotDecl, ValueExpr.withValue(NullObjectValue.create())); + MethodInvocationExpr getClassMethodInvocationExpr = + MethodInvocationExpr.builder().setMethodName("getClass").build(); + RelationalOperationExpr getClassEqualsExpr = + RelationalOperationExpr.equalToWithExprs( + getClassMethodInvocationExpr, + getClassMethodInvocationExpr + .toBuilder() + .setExprReferenceExpr(argVarExprNotDecl) + .build()); + LogicalOperationExpr orLogicalExpr = + LogicalOperationExpr.logicalOrWithExprs(oNotEqualsNullExpr, getClassEqualsExpr); + + Variable thatVariable = Variable.builder().setName("that").setType(thisClassType).build(); + VariableExpr thatVariableExpr = + VariableExpr.builder().setIsDecl(true).setVariable(thatVariable).build(); + CastExpr oCastExpr = + CastExpr.builder().setExpr(argVarExprNotDecl).setType(thisClassType).build(); + AssignmentExpr thatAssignmentExpr = + AssignmentExpr.builder().setVariableExpr(thatVariableExpr).setValueExpr(oCastExpr).build(); + + thatVariableExpr = thatVariableExpr.toBuilder().setIsDecl(false).build(); + Set tokenSet = getTokenSet(tokenHierarchies); + Iterator itToken = tokenSet.iterator(); + Expr curTokenExpr = + createObjectsEqualsForTokenMethodEpxr( + thisValueExpr, + thatVariableExpr, + Variable.builder() + .setType(TypeNode.STRING) + .setName(JavaStyle.toLowerCamelCase(itToken.next())) + .build()); + + while (itToken.hasNext()) { + Expr nextTokenExpr = + createObjectsEqualsForTokenMethodEpxr( + thisValueExpr, + thatVariableExpr, + Variable.builder() + .setType(TypeNode.STRING) + .setName(JavaStyle.toLowerCamelCase(itToken.next())) + .build()); + curTokenExpr = LogicalOperationExpr.logicalAndWithExprs(curTokenExpr, nextTokenExpr); + } + ReturnExpr secondIfReturnExpr = ReturnExpr.withExpr(curTokenExpr); + + IfStatement firstIfStatement = + IfStatement.builder() + .setConditionExpr(oEqualsThisExpr) + .setBody(Arrays.asList(ExprStatement.withExpr(returnTrueExpr))) + .build(); + IfStatement secondIfStatement = + IfStatement.builder() + .setConditionExpr(orLogicalExpr) + .setBody( + Arrays.asList( + ExprStatement.withExpr(thatAssignmentExpr), + ExprStatement.withExpr(secondIfReturnExpr))) + .build(); + + return MethodDefinition.builder() + .setIsOverride(true) + .setScope(ScopeNode.PUBLIC) + .setArguments(argVarExprDecl) + .setReturnType(TypeNode.BOOLEAN) + .setName("equals") + .setReturnExpr(falseValueExpr) + .setBody(Arrays.asList(firstIfStatement, secondIfStatement)) + .build(); + } + + private static MethodInvocationExpr createObjectsEqualsForTokenMethodEpxr( + Expr thisExpr, Expr thatExpr, Variable tokenVar) { + VariableExpr varThisExpr = + VariableExpr.builder().setVariable(tokenVar).setExprReferenceExpr(thisExpr).build(); + VariableExpr varThatExpr = + VariableExpr.builder().setVariable(tokenVar).setExprReferenceExpr(thatExpr).build(); + return MethodInvocationExpr.builder() + .setStaticReferenceType(STATIC_TYPES.get("Objects")) + .setMethodName("equals") + .setArguments(Arrays.asList(varThisExpr, varThatExpr)) + .setReturnType(TypeNode.BOOLEAN) + .build(); + } + private static List createNestedBuilderClasses( ResourceName resourceName, List> tokenHierarchies, diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden index 7676c60e08..e1ac6819c7 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden @@ -349,6 +349,21 @@ public class FoobarName implements ResourceName { } } + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o != null || getClass() == o.getClass()) { + FoobarName that = ((FoobarName) o); + return Objects.equals(this.project, that.project) + && Objects.equals(this.foobar, that.foobar) + && Objects.equals(this.variant, that.variant) + && Objects.equals(this.barFoo, that.barFoo); + } + return false; + } + /** Builder for bar_foos/{bar_foo}/foobars/{foobar}. */ @BetaApi("The per-pattern Builders are not stable yet and may be changed in the future.") public static class BarFooFoobarBuilder { From d82d56b797cec1131f74d8cfeb503a27fa4a7ab5 Mon Sep 17 00:00:00 2001 From: summerji Date: Thu, 1 Oct 2020 00:27:08 -0700 Subject: [PATCH 2/4] correct function position --- .../ResourceNameHelperClassComposer.java | 3 +- .../gapic/composer/goldens/FoobarName.golden | 30 +++++++++---------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index 9fc5b701ad..e4772a070d 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -1198,7 +1198,6 @@ private static MethodDefinition createEqualsMethod( .setType(TypeNode.STRING) .setName(JavaStyle.toLowerCamelCase(itToken.next())) .build()); - while (itToken.hasNext()) { Expr nextTokenExpr = createObjectsEqualsForTokenMethodEpxr( @@ -1212,11 +1211,13 @@ private static MethodDefinition createEqualsMethod( } ReturnExpr secondIfReturnExpr = ReturnExpr.withExpr(curTokenExpr); + // if (o == this) { return true;} IfStatement firstIfStatement = IfStatement.builder() .setConditionExpr(oEqualsThisExpr) .setBody(Arrays.asList(ExprStatement.withExpr(returnTrueExpr))) .build(); + // if (o != null || getClass() == o.getClass()) { FoobarName that = ((FoobarName) o); return ..} IfStatement secondIfStatement = IfStatement.builder() .setConditionExpr(orLogicalExpr) diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden index e1ac6819c7..ac8d8995d2 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden @@ -249,6 +249,21 @@ public class FoobarName implements ResourceName { return !Objects.isNull(fixedValue) ? fixedValue : pathTemplate.instantiate(getFieldValuesMap()); } + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o != null || getClass() == o.getClass()) { + FoobarName that = ((FoobarName) o); + return Objects.equals(this.project, that.project) + && Objects.equals(this.foobar, that.foobar) + && Objects.equals(this.variant, that.variant) + && Objects.equals(this.barFoo, that.barFoo); + } + return false; + } + /** Builder for projects/{project}/foobars/{foobar}. */ public static class Builder { private String project; @@ -349,21 +364,6 @@ public class FoobarName implements ResourceName { } } - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } - if (o != null || getClass() == o.getClass()) { - FoobarName that = ((FoobarName) o); - return Objects.equals(this.project, that.project) - && Objects.equals(this.foobar, that.foobar) - && Objects.equals(this.variant, that.variant) - && Objects.equals(this.barFoo, that.barFoo); - } - return false; - } - /** Builder for bar_foos/{bar_foo}/foobars/{foobar}. */ @BetaApi("The per-pattern Builders are not stable yet and may be changed in the future.") public static class BarFooFoobarBuilder { From 7859d17b9c0aa21a136a3bad8d8081cfe6ba1936 Mon Sep 17 00:00:00 2001 From: summerji Date: Thu, 1 Oct 2020 00:38:46 -0700 Subject: [PATCH 3/4] Add equals method in SessionName.golden --- .../gapic/composer/goldens/SessionName.golden | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden index 4dbe76e88e..58e15add60 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden @@ -101,6 +101,18 @@ public class SessionName implements ResourceName { return SESSION.instantiate("session", session); } + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o != null || getClass() == o.getClass()) { + SessionName that = ((SessionName) o); + return Objects.equals(this.session, that.session); + } + return false; + } + /** Builder for sessions/{session}. */ public static class Builder { private String session; From f15f2a12fc09fa46efe57701abe37077ed9e68e5 Mon Sep 17 00:00:00 2001 From: summerji Date: Fri, 2 Oct 2020 03:24:52 -0700 Subject: [PATCH 4/4] Add comments in method --- .../ResourceNameHelperClassComposer.java | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java index e4772a070d..2ae659617b 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java @@ -1147,47 +1147,46 @@ private static MethodDefinition createToStringMethod( private static MethodDefinition createEqualsMethod( ResourceName resourceName, List> tokenHierarchies, Map types) { + // Create method definition variables. Variable oVariable = Variable.builder().setType(TypeNode.OBJECT).setName("o").build(); - VariableExpr argVarExprDecl = - VariableExpr.builder().setIsDecl(true).setVariable(oVariable).build(); - VariableExpr argVarExprNotDecl = + VariableExpr argVarExpr = VariableExpr.builder().setIsDecl(false).setVariable(oVariable).build(); TypeNode thisClassType = types.get(getThisClassName(resourceName)); ValueExpr thisValueExpr = ValueExpr.withValue(ThisObjectValue.withType(thisClassType)); ValueExpr trueValueExpr = ValueExpr.withValue( PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("true").build()); - ValueExpr falseValueExpr = - ValueExpr.withValue( - PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("false").build()); + // Create first if statement's return expression ReturnExpr returnTrueExpr = ReturnExpr.withExpr(trueValueExpr); + + // Create second if statement's condition expression RelationalOperationExpr oEqualsThisExpr = - RelationalOperationExpr.equalToWithExprs(argVarExprNotDecl, thisValueExpr); + RelationalOperationExpr.equalToWithExprs(argVarExpr, thisValueExpr); RelationalOperationExpr oNotEqualsNullExpr = RelationalOperationExpr.notEqualToWithExprs( - argVarExprNotDecl, ValueExpr.withValue(NullObjectValue.create())); + argVarExpr, ValueExpr.withValue(NullObjectValue.create())); MethodInvocationExpr getClassMethodInvocationExpr = MethodInvocationExpr.builder().setMethodName("getClass").build(); RelationalOperationExpr getClassEqualsExpr = RelationalOperationExpr.equalToWithExprs( getClassMethodInvocationExpr, - getClassMethodInvocationExpr - .toBuilder() - .setExprReferenceExpr(argVarExprNotDecl) - .build()); + getClassMethodInvocationExpr.toBuilder().setExprReferenceExpr(argVarExpr).build()); LogicalOperationExpr orLogicalExpr = LogicalOperationExpr.logicalOrWithExprs(oNotEqualsNullExpr, getClassEqualsExpr); + // Create second if statement's body assignment expression. Variable thatVariable = Variable.builder().setName("that").setType(thisClassType).build(); VariableExpr thatVariableExpr = - VariableExpr.builder().setIsDecl(true).setVariable(thatVariable).build(); - CastExpr oCastExpr = - CastExpr.builder().setExpr(argVarExprNotDecl).setType(thisClassType).build(); + VariableExpr.builder().setIsDecl(false).setVariable(thatVariable).build(); + CastExpr oCastExpr = CastExpr.builder().setExpr(argVarExpr).setType(thisClassType).build(); AssignmentExpr thatAssignmentExpr = - AssignmentExpr.builder().setVariableExpr(thatVariableExpr).setValueExpr(oCastExpr).build(); + AssignmentExpr.builder() + .setVariableExpr(thatVariableExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(oCastExpr) + .build(); - thatVariableExpr = thatVariableExpr.toBuilder().setIsDecl(false).build(); + // Create return expression in the second if statement's body. Set tokenSet = getTokenSet(tokenHierarchies); Iterator itToken = tokenSet.iterator(); Expr curTokenExpr = @@ -1211,13 +1210,14 @@ private static MethodDefinition createEqualsMethod( } ReturnExpr secondIfReturnExpr = ReturnExpr.withExpr(curTokenExpr); - // if (o == this) { return true;} + // Code: if (o == this) { return true;} IfStatement firstIfStatement = IfStatement.builder() .setConditionExpr(oEqualsThisExpr) .setBody(Arrays.asList(ExprStatement.withExpr(returnTrueExpr))) .build(); - // if (o != null || getClass() == o.getClass()) { FoobarName that = ((FoobarName) o); return ..} + // Code: if (o != null || getClass() == o.getClass()) { FoobarName that = ((FoobarName) o); + // return ..} IfStatement secondIfStatement = IfStatement.builder() .setConditionExpr(orLogicalExpr) @@ -1227,10 +1227,15 @@ private static MethodDefinition createEqualsMethod( ExprStatement.withExpr(secondIfReturnExpr))) .build(); + // Create method's return expression. + ValueExpr falseValueExpr = + ValueExpr.withValue( + PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("false").build()); + return MethodDefinition.builder() .setIsOverride(true) .setScope(ScopeNode.PUBLIC) - .setArguments(argVarExprDecl) + .setArguments(argVarExpr.toBuilder().setIsDecl(true).build()) .setReturnType(TypeNode.BOOLEAN) .setName("equals") .setReturnExpr(falseValueExpr)