Skip to content

Commit f228417

Browse files
[ggj][codegen](1/2)feat: Add equals() method in ResourceName (#358)
* Add Equals method in ResourceName
1 parent 2cd9cf4 commit f228417

3 files changed

Lines changed: 144 additions & 0 deletions

File tree

src/main/java/com/google/api/generator/gapic/composer/ResourceNameHelperClassComposer.java

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.google.api.core.BetaApi;
1818
import com.google.api.generator.engine.ast.AnnotationNode;
1919
import com.google.api.generator.engine.ast.AssignmentExpr;
20+
import com.google.api.generator.engine.ast.CastExpr;
2021
import com.google.api.generator.engine.ast.ClassDefinition;
2122
import com.google.api.generator.engine.ast.CommentStatement;
2223
import com.google.api.generator.engine.ast.ConcreteReference;
@@ -30,7 +31,9 @@
3031
import com.google.api.generator.engine.ast.MethodInvocationExpr;
3132
import com.google.api.generator.engine.ast.NewObjectExpr;
3233
import com.google.api.generator.engine.ast.NullObjectValue;
34+
import com.google.api.generator.engine.ast.PrimitiveValue;
3335
import com.google.api.generator.engine.ast.Reference;
36+
import com.google.api.generator.engine.ast.RelationalOperationExpr;
3437
import com.google.api.generator.engine.ast.ReturnExpr;
3538
import com.google.api.generator.engine.ast.ScopeNode;
3639
import com.google.api.generator.engine.ast.Statement;
@@ -57,6 +60,7 @@
5760
import java.util.Arrays;
5861
import java.util.Collections;
5962
import java.util.HashMap;
63+
import java.util.Iterator;
6064
import java.util.LinkedHashSet;
6165
import java.util.List;
6266
import java.util.Map;
@@ -269,6 +273,7 @@ private static List<MethodDefinition> createClassMethods(
269273
createFieldValueGetterMethods(resourceName, patternTokenVarExprs, tokenHierarchies, types));
270274
javaMethods.add(
271275
createToStringMethod(templateFinalVarExprs, patternTokenVarExprs, tokenHierarchies));
276+
javaMethods.add(createEqualsMethod(resourceName, tokenHierarchies, types));
272277
return javaMethods;
273278
}
274279

@@ -1140,6 +1145,118 @@ private static MethodDefinition createToStringMethod(
11401145
.build();
11411146
}
11421147

1148+
private static MethodDefinition createEqualsMethod(
1149+
ResourceName resourceName, List<List<String>> tokenHierarchies, Map<String, TypeNode> types) {
1150+
// Create method definition variables.
1151+
Variable oVariable = Variable.builder().setType(TypeNode.OBJECT).setName("o").build();
1152+
VariableExpr argVarExpr =
1153+
VariableExpr.builder().setIsDecl(false).setVariable(oVariable).build();
1154+
TypeNode thisClassType = types.get(getThisClassName(resourceName));
1155+
ValueExpr thisValueExpr = ValueExpr.withValue(ThisObjectValue.withType(thisClassType));
1156+
ValueExpr trueValueExpr =
1157+
ValueExpr.withValue(
1158+
PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("true").build());
1159+
1160+
// Create first if statement's return expression
1161+
ReturnExpr returnTrueExpr = ReturnExpr.withExpr(trueValueExpr);
1162+
1163+
// Create second if statement's condition expression
1164+
RelationalOperationExpr oEqualsThisExpr =
1165+
RelationalOperationExpr.equalToWithExprs(argVarExpr, thisValueExpr);
1166+
RelationalOperationExpr oNotEqualsNullExpr =
1167+
RelationalOperationExpr.notEqualToWithExprs(
1168+
argVarExpr, ValueExpr.withValue(NullObjectValue.create()));
1169+
MethodInvocationExpr getClassMethodInvocationExpr =
1170+
MethodInvocationExpr.builder().setMethodName("getClass").build();
1171+
RelationalOperationExpr getClassEqualsExpr =
1172+
RelationalOperationExpr.equalToWithExprs(
1173+
getClassMethodInvocationExpr,
1174+
getClassMethodInvocationExpr.toBuilder().setExprReferenceExpr(argVarExpr).build());
1175+
LogicalOperationExpr orLogicalExpr =
1176+
LogicalOperationExpr.logicalOrWithExprs(oNotEqualsNullExpr, getClassEqualsExpr);
1177+
1178+
// Create second if statement's body assignment expression.
1179+
Variable thatVariable = Variable.builder().setName("that").setType(thisClassType).build();
1180+
VariableExpr thatVariableExpr =
1181+
VariableExpr.builder().setIsDecl(false).setVariable(thatVariable).build();
1182+
CastExpr oCastExpr = CastExpr.builder().setExpr(argVarExpr).setType(thisClassType).build();
1183+
AssignmentExpr thatAssignmentExpr =
1184+
AssignmentExpr.builder()
1185+
.setVariableExpr(thatVariableExpr.toBuilder().setIsDecl(true).build())
1186+
.setValueExpr(oCastExpr)
1187+
.build();
1188+
1189+
// Create return expression in the second if statement's body.
1190+
Set<String> tokenSet = getTokenSet(tokenHierarchies);
1191+
Iterator<String> itToken = tokenSet.iterator();
1192+
Expr curTokenExpr =
1193+
createObjectsEqualsForTokenMethodEpxr(
1194+
thisValueExpr,
1195+
thatVariableExpr,
1196+
Variable.builder()
1197+
.setType(TypeNode.STRING)
1198+
.setName(JavaStyle.toLowerCamelCase(itToken.next()))
1199+
.build());
1200+
while (itToken.hasNext()) {
1201+
Expr nextTokenExpr =
1202+
createObjectsEqualsForTokenMethodEpxr(
1203+
thisValueExpr,
1204+
thatVariableExpr,
1205+
Variable.builder()
1206+
.setType(TypeNode.STRING)
1207+
.setName(JavaStyle.toLowerCamelCase(itToken.next()))
1208+
.build());
1209+
curTokenExpr = LogicalOperationExpr.logicalAndWithExprs(curTokenExpr, nextTokenExpr);
1210+
}
1211+
ReturnExpr secondIfReturnExpr = ReturnExpr.withExpr(curTokenExpr);
1212+
1213+
// Code: if (o == this) { return true;}
1214+
IfStatement firstIfStatement =
1215+
IfStatement.builder()
1216+
.setConditionExpr(oEqualsThisExpr)
1217+
.setBody(Arrays.asList(ExprStatement.withExpr(returnTrueExpr)))
1218+
.build();
1219+
// Code: if (o != null || getClass() == o.getClass()) { FoobarName that = ((FoobarName) o);
1220+
// return ..}
1221+
IfStatement secondIfStatement =
1222+
IfStatement.builder()
1223+
.setConditionExpr(orLogicalExpr)
1224+
.setBody(
1225+
Arrays.asList(
1226+
ExprStatement.withExpr(thatAssignmentExpr),
1227+
ExprStatement.withExpr(secondIfReturnExpr)))
1228+
.build();
1229+
1230+
// Create method's return expression.
1231+
ValueExpr falseValueExpr =
1232+
ValueExpr.withValue(
1233+
PrimitiveValue.builder().setType(TypeNode.BOOLEAN).setValue("false").build());
1234+
1235+
return MethodDefinition.builder()
1236+
.setIsOverride(true)
1237+
.setScope(ScopeNode.PUBLIC)
1238+
.setArguments(argVarExpr.toBuilder().setIsDecl(true).build())
1239+
.setReturnType(TypeNode.BOOLEAN)
1240+
.setName("equals")
1241+
.setReturnExpr(falseValueExpr)
1242+
.setBody(Arrays.asList(firstIfStatement, secondIfStatement))
1243+
.build();
1244+
}
1245+
1246+
private static MethodInvocationExpr createObjectsEqualsForTokenMethodEpxr(
1247+
Expr thisExpr, Expr thatExpr, Variable tokenVar) {
1248+
VariableExpr varThisExpr =
1249+
VariableExpr.builder().setVariable(tokenVar).setExprReferenceExpr(thisExpr).build();
1250+
VariableExpr varThatExpr =
1251+
VariableExpr.builder().setVariable(tokenVar).setExprReferenceExpr(thatExpr).build();
1252+
return MethodInvocationExpr.builder()
1253+
.setStaticReferenceType(STATIC_TYPES.get("Objects"))
1254+
.setMethodName("equals")
1255+
.setArguments(Arrays.asList(varThisExpr, varThatExpr))
1256+
.setReturnType(TypeNode.BOOLEAN)
1257+
.build();
1258+
}
1259+
11431260
private static List<ClassDefinition> createNestedBuilderClasses(
11441261
ResourceName resourceName,
11451262
List<List<String>> tokenHierarchies,

src/test/java/com/google/api/generator/gapic/composer/goldens/FoobarName.golden

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,21 @@ public class FoobarName implements ResourceName {
249249
return !Objects.isNull(fixedValue) ? fixedValue : pathTemplate.instantiate(getFieldValuesMap());
250250
}
251251

252+
@Override
253+
public boolean equals(Object o) {
254+
if (o == this) {
255+
return true;
256+
}
257+
if (o != null || getClass() == o.getClass()) {
258+
FoobarName that = ((FoobarName) o);
259+
return Objects.equals(this.project, that.project)
260+
&& Objects.equals(this.foobar, that.foobar)
261+
&& Objects.equals(this.variant, that.variant)
262+
&& Objects.equals(this.barFoo, that.barFoo);
263+
}
264+
return false;
265+
}
266+
252267
/** Builder for projects/{project}/foobars/{foobar}. */
253268
public static class Builder {
254269
private String project;

src/test/java/com/google/api/generator/gapic/composer/goldens/SessionName.golden

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,18 @@ public class SessionName implements ResourceName {
101101
return SESSION.instantiate("session", session);
102102
}
103103

104+
@Override
105+
public boolean equals(Object o) {
106+
if (o == this) {
107+
return true;
108+
}
109+
if (o != null || getClass() == o.getClass()) {
110+
SessionName that = ((SessionName) o);
111+
return Objects.equals(this.session, that.session);
112+
}
113+
return false;
114+
}
115+
104116
/** Builder for sessions/{session}. */
105117
public static class Builder {
106118
private String session;

0 commit comments

Comments
 (0)