Skip to content

Commit 9ce4569

Browse files
Support message for deprecated directive (#471)
1 parent 4917c4b commit 9ce4569

File tree

62 files changed

+626
-120
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+626
-120
lines changed

src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java

+28
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.kobylynskyi.graphql.codegen.java;
22

3+
import com.kobylynskyi.graphql.codegen.mapper.DataModelMapper;
34
import com.kobylynskyi.graphql.codegen.mapper.GraphQLTypeMapper;
45
import com.kobylynskyi.graphql.codegen.mapper.ValueMapper;
56
import com.kobylynskyi.graphql.codegen.model.MappingContext;
@@ -9,6 +10,7 @@
910
import graphql.language.Argument;
1011

1112
import java.util.HashSet;
13+
import java.util.Map;
1214
import java.util.Set;
1315

1416
import static java.util.Arrays.asList;
@@ -87,4 +89,30 @@ public String mapDirectiveArgumentValue(MappingContext mappingContext, Argument
8789
return valueMapper.map(mappingContext, dirArg.getValue(), null, argumentValueFormatter);
8890
}
8991

92+
@Override
93+
public NamedDefinition getLanguageType(MappingContext mappingContext, String graphQLType, String name,
94+
String parentTypeName, boolean mandatory, boolean collection) {
95+
Map<String, String> customTypesMapping = mappingContext.getCustomTypesMapping();
96+
Set<String> serializeFieldsUsingObjectMapper = mappingContext.getUseObjectMapperForRequestSerialization();
97+
String langTypeName;
98+
boolean primitiveCanBeUsed = !collection;
99+
boolean serializeUsingObjectMapper = false;
100+
if (name != null && parentTypeName != null && customTypesMapping.containsKey(parentTypeName + "." + name)) {
101+
langTypeName = customTypesMapping.get(parentTypeName + "." + name);
102+
primitiveCanBeUsed = false;
103+
} else if (customTypesMapping.containsKey(graphQLType)) {
104+
langTypeName = customTypesMapping.get(graphQLType);
105+
} else {
106+
langTypeName = DataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, graphQLType);
107+
}
108+
if (serializeFieldsUsingObjectMapper.contains(graphQLType) ||
109+
(name != null && parentTypeName != null &&
110+
serializeFieldsUsingObjectMapper.contains(parentTypeName + "." + name))) {
111+
serializeUsingObjectMapper = true;
112+
}
113+
114+
return new NamedDefinition(langTypeName, graphQLType, mappingContext.getInterfacesName().contains(graphQLType),
115+
mandatory, primitiveCanBeUsed, serializeUsingObjectMapper);
116+
}
117+
90118
}

src/main/java/com/kobylynskyi/graphql/codegen/mapper/EnumDefinitionToDataModelMapper.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.kobylynskyi.graphql.codegen.mapper;
22

3+
import com.kobylynskyi.graphql.codegen.model.DeprecatedDefinition;
34
import com.kobylynskyi.graphql.codegen.model.EnumValueDefinition;
45
import com.kobylynskyi.graphql.codegen.model.MappingContext;
56
import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedEnumTypeDefinition;
67
import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedUnionTypeDefinition;
78
import com.kobylynskyi.graphql.codegen.utils.Utils;
89
import graphql.language.Comment;
9-
import graphql.language.Directive;
1010
import graphql.language.DirectivesContainer;
1111

1212
import java.util.Collections;
@@ -50,10 +50,8 @@ private static Set<String> getUnionInterfaces(MappingContext mappingContext,
5050
.collect(Collectors.toSet());
5151
}
5252

53-
private static boolean isDeprecated(DirectivesContainer<?> directivesContainer) {
54-
return directivesContainer.getDirectives().stream()
55-
.map(Directive::getName)
56-
.anyMatch(Deprecated.class.getSimpleName()::equalsIgnoreCase);
53+
public DeprecatedDefinition getDeprecated(MappingContext mappingContext, DirectivesContainer<?> directivesContainer) {
54+
return graphQLTypeMapper.getDeprecated(mappingContext, directivesContainer);
5755
}
5856

5957
private static List<String> getJavaDoc(graphql.language.EnumValueDefinition def) {
@@ -101,7 +99,7 @@ private List<EnumValueDefinition> map(MappingContext mappingContext, List<graphq
10199
dataModelMapper.capitalizeIfRestricted(mappingContext, f.getName()),
102100
f.getName(),
103101
getJavaDoc(f),
104-
isDeprecated(f)))
102+
getDeprecated(mappingContext, f)))
105103
.collect(Collectors.toList());
106104
}
107105

src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ private ParameterDefinition mapField(MappingContext mappingContext, ExtendedFiel
120120
parameter.setType(graphQLTypeMapper.getTypeConsideringPrimitive(mappingContext, namedDefinition, namedDefinition.getJavaName()));
121121
parameter.setAnnotations(graphQLTypeMapper.getAnnotations(mappingContext, fieldDef.getType(), fieldDef, parentTypeName, false));
122122
parameter.setJavaDoc(fieldDef.getJavaDoc());
123-
parameter.setDeprecated(fieldDef.isDeprecated());
123+
parameter.setDeprecated(fieldDef.getDeprecated(mappingContext));
124124
parameter.setSerializeUsingObjectMapper(namedDefinition.isSerializeUsingObjectMapper());
125125
return parameter;
126126
}
@@ -147,7 +147,7 @@ private ProjectionParameterDefinition mapProjectionField(MappingContext mappingC
147147
parameter.setParametrizedInputClassName(
148148
DataModelMapper.getParametrizedInputClassName(mappingContext, fieldDef, parentTypeDef));
149149
}
150-
parameter.setDeprecated(fieldDef.isDeprecated());
150+
parameter.setDeprecated(fieldDef.getDeprecated(mappingContext));
151151
return parameter;
152152
}
153153

src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ private OperationDefinition map(MappingContext mappingContext, ExtendedFieldDefi
188188
operation.setAnnotations(annotations);
189189
operation.setParameters(parameters);
190190
operation.setJavaDoc(fieldDef.getJavaDoc());
191-
operation.setDeprecated(fieldDef.isDeprecated());
191+
operation.setDeprecated(fieldDef.getDeprecated(mappingContext));
192192
operation.setThrowsException(mappingContext.getGenerateApisWithThrowsException());
193193
return operation;
194194
}
@@ -202,7 +202,7 @@ private List<ParameterDefinition> getOperationParameters(MappingContext mappingC
202202
if (!Utils.isGraphqlOperation(parentTypeName)) {
203203
String parentObjectParamType = graphQLTypeMapper.getLanguageType(mappingContext, new TypeName(parentTypeName));
204204
String parentObjectParamName = dataModelMapper.capitalizeIfRestricted(mappingContext, Utils.uncapitalize(parentObjectParamType));
205-
parameters.add(new ParameterDefinition(parentObjectParamType, parentObjectParamName, parentObjectParamName, null, emptyList(), emptyList(), resolvedField.isDeprecated(), false));
205+
parameters.add(new ParameterDefinition(parentObjectParamType, parentObjectParamName, parentObjectParamName, null, emptyList(), emptyList(), resolvedField.getDeprecated(mappingContext), false));
206206
}
207207

208208
// 2. Next parameters are input values

src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java

+14-17
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
11
package com.kobylynskyi.graphql.codegen.mapper;
22

3-
import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage;
3+
import com.kobylynskyi.graphql.codegen.model.DeprecatedDefinition;
44
import com.kobylynskyi.graphql.codegen.model.MappingContext;
5+
import com.kobylynskyi.graphql.codegen.model.MultiLanguageDeprecated;
56
import com.kobylynskyi.graphql.codegen.model.NamedDefinition;
67
import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedDefinition;
78
import com.kobylynskyi.graphql.codegen.utils.Utils;
8-
import graphql.language.Argument;
9-
import graphql.language.Directive;
10-
import graphql.language.DirectivesContainer;
11-
import graphql.language.ListType;
12-
import graphql.language.NamedNode;
13-
import graphql.language.NonNullType;
14-
import graphql.language.Type;
15-
import graphql.language.TypeName;
9+
import graphql.language.*;
1610

17-
import java.util.ArrayList;
18-
import java.util.Collections;
19-
import java.util.List;
20-
import java.util.Map;
21-
import java.util.Set;
11+
import java.util.*;
2212

2313
/**
2414
* Map GraphQL type to language-specific type (java/scala/kotlin/etc)
@@ -213,9 +203,7 @@ default NamedDefinition getLanguageType(MappingContext mappingContext, String gr
213203
if (name != null && parentTypeName != null && customTypesMapping.containsKey(parentTypeName + "." + name)) {
214204
langTypeName = customTypesMapping.get(parentTypeName + "." + name);
215205
primitiveCanBeUsed = false;
216-
} else if (mandatory && customTypesMapping.containsKey(getMandatoryType(graphQLType)) &&
217-
!mappingContext.getGeneratedLanguage().equals(GeneratedLanguage.JAVA)){
218-
//Java primitive types can't be used as generic parameters this, but Scala/Kotlin can
206+
} else if (mandatory && customTypesMapping.containsKey(getMandatoryType(graphQLType))) {
219207
langTypeName = customTypesMapping.get(getMandatoryType(graphQLType));
220208
} else if (customTypesMapping.containsKey(graphQLType)) {
221209
langTypeName = customTypesMapping.get(graphQLType);
@@ -330,5 +318,14 @@ default String getTypeConsideringPrimitive(MappingContext mappingContext,
330318
return computedTypeName;
331319
}
332320

321+
default DeprecatedDefinition getDeprecated(MappingContext mappingContext, DirectivesContainer<?> directivesContainer) {
322+
return directivesContainer.getDirectives()
323+
.stream()
324+
.filter(d -> d.getName().equalsIgnoreCase(Deprecated.class.getSimpleName()))
325+
.findFirst()
326+
.map(directive -> MultiLanguageDeprecated.getLanguageDeprecated(mappingContext.getGeneratedLanguage(), directive))
327+
.orElse(null);
328+
}
329+
333330

334331
}

src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ private ParameterDefinition map(MappingContext mappingContext, InputValueDefinit
6767
parameter.setType(graphQLTypeMapper.getTypeConsideringPrimitive(mappingContext, namedDefinition, namedDefinition.getJavaName()));
6868
parameter.setDefaultValue(valueMapper.map(mappingContext, inputValueDefinition.getDefaultValue(), inputValueDefinition.getType()));
6969
parameter.setAnnotations(graphQLTypeMapper.getAnnotations(mappingContext, inputValueDefinition.getType(), inputValueDefinition, parentTypeName, false));
70-
parameter.setDeprecated(isDeprecated(inputValueDefinition));
70+
parameter.setDeprecated(graphQLTypeMapper.getDeprecated(mappingContext, inputValueDefinition));
7171
parameter.setSerializeUsingObjectMapper(namedDefinition.isSerializeUsingObjectMapper());
7272
return parameter;
7373
}

src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public Map<String, Object> mapResponse(MappingContext mappingContext,
191191
dataModel.put(ANNOTATIONS, graphQLTypeMapper.getAnnotations(mappingContext, className));
192192
dataModel.put(CLASS_NAME, className);
193193
dataModel.put(JAVA_DOC, operationDef.getJavaDoc());
194-
dataModel.put(DEPRECATED, operationDef.isDeprecated());
194+
dataModel.put(DEPRECATED, operationDef.getDeprecated(mappingContext));
195195
dataModel.put(OPERATION_NAME, operationDef.getName());
196196
dataModel.put(METHOD_NAME, dataModelMapper.capitalizeMethodNameIfRestricted(mappingContext, operationDef.getName()));
197197
dataModel.put(RETURN_TYPE_NAME, javaType);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.kobylynskyi.graphql.codegen.model;
2+
3+
/**
4+
* @author 梦境迷离
5+
* @version 1.0, 2020/12/28
6+
*/
7+
public class DeprecatedDefinition {
8+
9+
private final static String DEFAULT_MSG = "No longer supported";
10+
11+
// For different languages, real implementation.
12+
private final String annotation;
13+
private final String reason;
14+
15+
public DeprecatedDefinition(String annotation) {
16+
this.annotation = annotation;
17+
this.reason = DEFAULT_MSG;
18+
}
19+
20+
/**
21+
* field reason Only support in Scala/Kotlin.
22+
*
23+
* @param annotation Definitions in different languages
24+
* @param reason Description in graphql schema Directive
25+
*/
26+
public DeprecatedDefinition(String annotation, String reason) {
27+
this.annotation = annotation;
28+
this.reason = reason == null ? DEFAULT_MSG : reason;
29+
}
30+
31+
public String getAnnotation() {
32+
return annotation;
33+
}
34+
35+
public String getReason() {
36+
return reason;
37+
}
38+
39+
}

src/main/java/com/kobylynskyi/graphql/codegen/model/EnumValueDefinition.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ public class EnumValueDefinition {
1212
private final String javaName;
1313
private final String graphqlName;
1414
private final List<String> javaDoc;
15-
private final boolean deprecated;
15+
private final DeprecatedDefinition deprecated;
1616

17-
public EnumValueDefinition(String javaName, String graphqlName, List<String> javaDoc, boolean deprecated) {
17+
public EnumValueDefinition(String javaName, String graphqlName, List<String> javaDoc, DeprecatedDefinition deprecated) {
1818
this.javaName = javaName;
1919
this.graphqlName = graphqlName;
2020
this.javaDoc = javaDoc;
@@ -33,7 +33,7 @@ public List<String> getJavaDoc() {
3333
return javaDoc;
3434
}
3535

36-
public boolean isDeprecated() {
36+
public DeprecatedDefinition getDeprecated() {
3737
return deprecated;
3838
}
3939
}

src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ public GeneratedInformation getGeneratedInformation() {
282282
public Set<String> getEnumImportItSelfInScala() {
283283
// Only for scala
284284
if (GeneratedLanguage.SCALA.equals(this.config.getGeneratedLanguage()) && enumImportItSelfInScala == null) {
285-
enumImportItSelfInScala = this.document.getEnumDefinitions().parallelStream().map(this::getModelClassNameWithPrefixAndSuffix).collect(Collectors.toSet());
285+
enumImportItSelfInScala = this.document.getEnumDefinitions().stream().map(this::getModelClassNameWithPrefixAndSuffix).collect(Collectors.toSet());
286286
}
287287
return enumImportItSelfInScala;
288288
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.kobylynskyi.graphql.codegen.model;
2+
3+
import graphql.language.Directive;
4+
import graphql.language.StringValue;
5+
6+
/**
7+
8+
* @version 1.0, 2020/12/28
9+
*/
10+
public class MultiLanguageDeprecated {
11+
12+
private final static String REASON = "reason";
13+
private final static String SCALA_ANNOTATION = "deprecated";
14+
private final static String JAVA_ANNOTATION = "Deprecated";
15+
private final static String KOTLIN_ANNOTATION = "Deprecated";
16+
17+
public static DeprecatedDefinition getLanguageDeprecated(GeneratedLanguage generatedLanguage, Directive directive) {
18+
String msg = null;
19+
if (directive.getArguments().stream().anyMatch(argument -> argument.getName().equals(REASON))) {
20+
msg = ((StringValue) directive.getArgument(REASON).getValue()).getValue();
21+
}
22+
switch (generatedLanguage) {
23+
case KOTLIN:
24+
return new DeprecatedDefinition(KOTLIN_ANNOTATION, msg);
25+
case SCALA:
26+
return new DeprecatedDefinition(SCALA_ANNOTATION, msg);
27+
//ignore msg
28+
case JAVA:
29+
default:
30+
return new DeprecatedDefinition(JAVA_ANNOTATION);
31+
}
32+
}
33+
}

src/main/java/com/kobylynskyi/graphql/codegen/model/OperationDefinition.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class OperationDefinition {
2424
private List<String> annotations = new ArrayList<>();
2525
private List<ParameterDefinition> parameters = new ArrayList<>();
2626
private List<String> javaDoc = new ArrayList<>();
27-
private boolean deprecated;
27+
private DeprecatedDefinition deprecated;
2828
private boolean throwsException;
2929

3030
public String getName() {
@@ -75,11 +75,11 @@ public void setJavaDoc(List<String> javaDoc) {
7575
this.javaDoc = javaDoc;
7676
}
7777

78-
public boolean isDeprecated() {
78+
public DeprecatedDefinition getDeprecated() {
7979
return deprecated;
8080
}
8181

82-
public void setDeprecated(boolean deprecated) {
82+
public void setDeprecated(DeprecatedDefinition deprecated) {
8383
this.deprecated = deprecated;
8484
}
8585

src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
public class ParameterDefinition {
1717

1818
public static final ParameterDefinition DATA_FETCHING_ENVIRONMENT = new ParameterDefinition(
19-
DataFetchingEnvironment.class.getName(), "env", "env", null, emptyList(), emptyList(), false, false);
19+
DataFetchingEnvironment.class.getName(), "env", "env", null, emptyList(), emptyList(), null, false);
2020

2121
private String type;
2222
/**
@@ -30,15 +30,15 @@ public class ParameterDefinition {
3030
private String defaultValue;
3131
private List<String> annotations = new ArrayList<>();
3232
private List<String> javaDoc = new ArrayList<>();
33-
private boolean deprecated;
33+
private DeprecatedDefinition deprecated;
3434
private boolean serializeUsingObjectMapper;
3535

3636
public ParameterDefinition() {
3737
}
3838

3939
public ParameterDefinition(String type, String name, String originalName, String defaultValue,
4040
List<String> annotations, List<String> javaDoc,
41-
boolean deprecated, boolean serializeUsingObjectMapper) {
41+
DeprecatedDefinition deprecated, boolean serializeUsingObjectMapper) {
4242
this.type = type;
4343
this.name = name;
4444
this.originalName = originalName;
@@ -97,11 +97,11 @@ public void setJavaDoc(List<String> javaDoc) {
9797
this.javaDoc = javaDoc;
9898
}
9999

100-
public boolean isDeprecated() {
100+
public DeprecatedDefinition getDeprecated() {
101101
return deprecated;
102102
}
103103

104-
public void setDeprecated(boolean deprecated) {
104+
public void setDeprecated(DeprecatedDefinition deprecated) {
105105
this.deprecated = deprecated;
106106
}
107107

src/main/java/com/kobylynskyi/graphql/codegen/model/ProjectionParameterDefinition.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class ProjectionParameterDefinition {
1010
private String type;
1111
private String name;
1212
private String methodName;
13-
private boolean deprecated;
13+
private DeprecatedDefinition deprecated;
1414
private String parametrizedInputClassName;
1515

1616
public String getType() {
@@ -37,11 +37,11 @@ public void setMethodName(String methodName) {
3737
this.methodName = methodName;
3838
}
3939

40-
public boolean isDeprecated() {
40+
public DeprecatedDefinition getDeprecated() {
4141
return deprecated;
4242
}
4343

44-
public void setDeprecated(boolean deprecated) {
44+
public void setDeprecated(DeprecatedDefinition deprecated) {
4545
this.deprecated = deprecated;
4646
}
4747

0 commit comments

Comments
 (0)