Skip to content

Commit b308998

Browse files
authored
Merge pull request #487 from RachelTucker/GOSDK-25-initialize-optional-enum
GOSDK-25: Unmarshaling optional enums in response payloads causes panic
2 parents f161b2d + 62a79cb commit b308998

File tree

7 files changed

+30
-8
lines changed

7 files changed

+30
-8
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
language: java
2+
dist: trusty
23
jdk:
34
- oraclejdk8
45
script: ./gradlew -S clean test

ds3-autogen-go/src/main/kotlin/com/spectralogic/ds3autogen/go/generators/parser/BaseTypeParserGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ open class BaseTypeParserGenerator : TypeParserModelGenerator<TypeParser>, TypeP
108108
// Handle case if the element is an enum
109109
if (isElementEnum(ds3Element.type!!, typeMap)) {
110110
if (ds3Element.nullable) {
111-
return ParseChildNodeAsNullableEnum(xmlTag, modelName, paramName)
111+
return ParseChildNodeAsNullableEnum(xmlTag, modelName, paramName, toGoType(ds3Element.type!!))
112112
}
113113
return ParseChildNodeAsEnum(xmlTag, modelName, paramName)
114114
}

ds3-autogen-go/src/main/kotlin/com/spectralogic/ds3autogen/go/models/parser/ParseChildNodeImpls.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,11 @@ data class ParseChildNodeAsEnum(
167167
data class ParseChildNodeAsNullableEnum(
168168
override val xmlTag: String,
169169
val modelName: String,
170-
val paramName: String) : ParseElement {
170+
val paramName: String,
171+
val paramType: String) : ParseElement {
171172

172173
override val parsingCode: String
173-
get() { return "parseNullableEnum(child.Content, $modelName.$paramName, aggErr)" }
174+
get() { return "$modelName.$paramName = new${paramType}FromContent(child.Content, aggErr)" }
174175
}
175176

176177
data class ParseChildNodeAsCommonPrefix(

ds3-autogen-go/src/main/resources/tmpls/go/type/checksum_type_enum.ftl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,13 @@ const (
88
)
99

1010
<#include "enum_unmarshal_to_string.ftl" />
11+
12+
func new${name}FromContent(content []byte, aggErr *AggregateError) *${name} {
13+
if len(content) == 0 {
14+
// no value
15+
return nil
16+
}
17+
result := new(${name})
18+
parseEnum(content, result, aggErr)
19+
return result
20+
}

ds3-autogen-go/src/main/resources/tmpls/go/type/enum_type.ftl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,13 @@ const (
77
)
88

99
<#include "enum_unmarshal_to_string.ftl" />
10+
11+
func new${name}FromContent(content []byte, aggErr *AggregateError) *${name} {
12+
if len(content) == 0 {
13+
// no value
14+
return nil
15+
}
16+
result := new(${name})
17+
parseEnum(content, result, aggErr)
18+
return result
19+
}

ds3-autogen-go/src/test/java/com/spectralogic/ds3autogen/go/generators/parser/BaseTypeParserGenerator_Test.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ public void toChildNodeTest() {
202202
new ParseChildNodeAsPrimitiveType(INT_ELEMENT.getName(), modelName, INT_ELEMENT.getName(), "Int"),
203203
new ParseChildNodeAddToSlice(LIST_ELEMENT.getName(), modelName, LIST_ELEMENT.getName(), removePath(LIST_ELEMENT.getComponentType())),
204204
new ParseChildNodeAsEnum(ENUM_ELEMENT.getName(), modelName, ENUM_ELEMENT.getName()),
205-
new ParseChildNodeAsNullableEnum(ENUM_PTR_ELEMENT.getName(), modelName, ENUM_PTR_ELEMENT.getName()),
205+
new ParseChildNodeAsNullableEnum(ENUM_PTR_ELEMENT.getName(), modelName, ENUM_PTR_ELEMENT.getName(), removePath(ENUM_PTR_ATTR.getType())),
206206
new ParseChildNodeAsSlice("TestCollectionValue", "CustomMarshaledName", modelName, LIST_WITH_ENCAPS_TAG_ELEMENT.getName(), removePath(LIST_WITH_ENCAPS_TAG_ELEMENT.getComponentType())),
207207
new ParseChildNodeAsDs3Type(DS3_TYPE_ELEMENT.getName(), modelName, DS3_TYPE_ELEMENT.getName()),
208208
new ParseChildNodeAddEnumToSlice(LIST_ENUM_ELEMENT.getName(), modelName, LIST_ENUM_ELEMENT.getName(), removePath(LIST_ENUM_ELEMENT.getComponentType())),
@@ -250,7 +250,7 @@ public void toChildNodeListTest() {
250250
new ParseChildNodeAsPrimitiveType(INT_ELEMENT.getName(), modelName, INT_ELEMENT.getName(), "Int"),
251251
new ParseChildNodeAddToSlice(LIST_ELEMENT.getName(), modelName, LIST_ELEMENT.getName(), removePath(LIST_ELEMENT.getComponentType())),
252252
new ParseChildNodeAsEnum(ENUM_ELEMENT.getName(), modelName, ENUM_ELEMENT.getName()),
253-
new ParseChildNodeAsNullableEnum(ENUM_PTR_ELEMENT.getName(), modelName, ENUM_PTR_ELEMENT.getName()),
253+
new ParseChildNodeAsNullableEnum(ENUM_PTR_ELEMENT.getName(), modelName, ENUM_PTR_ELEMENT.getName(), removePath(ENUM_PTR_ATTR.getType())),
254254
new ParseChildNodeAsSlice("TestCollectionValue", "CustomMarshaledName", modelName, LIST_WITH_ENCAPS_TAG_ELEMENT.getName(), removePath(LIST_WITH_ENCAPS_TAG_ELEMENT.getComponentType())),
255255
new ParseChildNodeAsDs3Type(DS3_TYPE_ELEMENT.getName(), modelName, DS3_TYPE_ELEMENT.getName()));
256256

ds3-autogen-go/src/test/java/com/spectralogic/ds3autogen/go/models/parser/ParseChildNodeImpls_Test.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@
1919

2020
import static org.hamcrest.CoreMatchers.is;
2121
import static org.junit.Assert.assertThat;
22-
import static org.junit.Assert.assertTrue;
2322

2423
public class ParseChildNodeImpls_Test {
2524

2625
private static final String XML_TAG = "XmlTag";
2726
private static final String MODEL_NAME = "modelName";
2827
private static final String PARAM_NAME = "ParamName";
28+
private static final String PARAM_TYPE = "ParamType";
2929
private static final String PARSER_NAMESPACE = "ParserNamespace";
3030
private static final String CHILD_TYPE = "ChildType";
3131

@@ -109,9 +109,9 @@ public void ParseChildNodeAsEnumTest() {
109109

110110
@Test
111111
public void ParseChildNodeAsNullableEnumTest() {
112-
final String expected = String.format("parseNullableEnum(child.Content, %s.%s, aggErr)", MODEL_NAME, PARAM_NAME);
112+
final String expected = String.format("%s.%s = new%sFromContent(child.Content, aggErr)", MODEL_NAME, PARAM_NAME, PARAM_TYPE);
113113

114-
final ParseElement parseElement = new ParseChildNodeAsNullableEnum(XML_TAG, MODEL_NAME, PARAM_NAME);
114+
final ParseElement parseElement = new ParseChildNodeAsNullableEnum(XML_TAG, MODEL_NAME, PARAM_NAME, PARAM_TYPE);
115115
assertThat(parseElement.getXmlTag(), is(XML_TAG));
116116
assertThat(parseElement.getParsingCode(), is(expected));
117117
}

0 commit comments

Comments
 (0)