Skip to content

Commit dfcd574

Browse files
author
jordanqin
committed
update qcloud sdk to 1.0.0
1 parent 3ae4f72 commit dfcd574

File tree

3 files changed

+109
-19
lines changed

3 files changed

+109
-19
lines changed

QCloudXml/xmlAnnoation/src/main/java/com/tencent/qcloud/qcloudxml/annoation/XmlElement.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,11 @@
122122
* @return 是否忽略0值
123123
*/
124124
boolean ignoreZero() default false;
125+
126+
/**
127+
* 是否解析为原始的xml字符串
128+
* 仅用于fromxml
129+
* @return 原始的xml字符串
130+
*/
131+
boolean originalXmlString() default false;
125132
}

QCloudXml/xmlCompiler/src/main/java/com/tencent/qcloud/qcloudxml/compiler/CodeCreator.java

Lines changed: 89 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -158,22 +158,37 @@ private static CodeBlock generateToXmlCodeBlock(TypeElement classElement) throws
158158
codeBlock.endControlFlow();
159159
}
160160
} else if (typeXmlKind == TypeXmlKind.LIST) {
161+
TypeMirror genericListType = Util.getGenericTypeFromList(element);
162+
TypeElement genericListElement = ElementUtil.typeMirrorToTypeElement(genericListType);
163+
164+
boolean genericTypeIsBaseType = false;
165+
if (genericListElement != null) {
166+
TypeXmlKind genericTypeXmlKind = ElementUtil.getXmlKind(genericListElement);
167+
if (genericTypeXmlKind.isBaseType()) {
168+
genericTypeIsBaseType = true;
169+
}
170+
}
171+
161172
if(!Util.ignoreListNote(element)){
162173
codeBlock.addStatement(String.format("xmlSerializer.startTag(\"\", \"%s\")", Util.getElementName(element)));
163174
}
164-
TypeMirror genericListType = Util.getGenericTypeFromList(element);
165-
TypeElement genericListElement = ElementUtil.typeMirrorToTypeElement(genericListType);
166175

167176
codeBlock.beginControlFlow(String.format("if (value.%s != null)", element.getSimpleName()))
168-
.beginControlFlow(String.format("for (int i =0; i<value.%s.size(); i++)", element.getSimpleName()))
169-
.addStatement(String.format("%s.toXml(xmlSerializer, value.%s.get(i), %s)",
170-
ClassName.bestGuess("com.tencent.qcloud.qcloudxml.core.QCloudXml"),
171-
element.getSimpleName(),
172-
genericListElement != null
173-
? String.format("\"%s\"", Util.initialsUpperCase(Util.getTypeElementName(genericListElement)))
174-
: null
175-
))
176-
.endControlFlow()
177+
.beginControlFlow(String.format("for (int i =0; i<value.%s.size(); i++)", element.getSimpleName()));
178+
if(genericTypeIsBaseType){
179+
codeBlock.addStatement(String.format("xmlSerializer.startTag(\"\", \"%s\")", Util.getElementName(element)))
180+
.addStatement(String.format("xmlSerializer.text(String.valueOf(value.%s.get(i)))", element.getSimpleName()))
181+
.addStatement(String.format("xmlSerializer.endTag(\"\", \"%s\")", Util.getElementName(element)));
182+
} else {
183+
codeBlock.addStatement(String.format("%s.toXml(xmlSerializer, value.%s.get(i), %s)",
184+
ClassName.bestGuess("com.tencent.qcloud.qcloudxml.core.QCloudXml"),
185+
element.getSimpleName(),
186+
genericListElement != null
187+
? String.format("\"%s\"", Util.initialsUpperCase(Util.getTypeElementName(genericListElement)))
188+
: null
189+
));
190+
}
191+
codeBlock.endControlFlow()
177192
.endControlFlow();
178193
if(!Util.ignoreListNote(element)){
179194
codeBlock.addStatement(String.format("xmlSerializer.endTag(\"\", \"%s\")", Util.getElementName((element))));
@@ -236,12 +251,20 @@ private static TypeSpec generateChildElementBinder(TypeElement classElement, Ele
236251
codeBlock.addStatement(String.format(generateBaseTypeAssignment(typeXmlKind), element.getSimpleName()));
237252
} else if (typeXmlKind == TypeXmlKind.LIST) {
238253
TypeMirror genericListType = Util.getGenericTypeFromList(element);
254+
TypeElement genericListElement = ElementUtil.typeMirrorToTypeElement(genericListType);
255+
256+
boolean genericTypeIsBaseType = false;
257+
if (genericListElement != null) {
258+
TypeXmlKind genericTypeXmlKind = ElementUtil.getXmlKind(genericListElement);
259+
if (genericTypeXmlKind.isBaseType()) {
260+
genericTypeIsBaseType = true;
261+
}
262+
}
239263

240264
ParameterizedTypeName valueTypeAsArrayList = ParameterizedTypeName.get(ClassName.get(ArrayList.class), ClassName.get(genericListType));
241265
//两种list解析
242266
if(!Util.flatListNote(element)){
243-
TypeElement genericListElement = ElementUtil.typeMirrorToTypeElement(genericListType);
244-
267+
// TODO: 2023/7/6 兼容响应中List的基础类型 比如string
245268
codeBlock.beginControlFlow(String.format("if (value.%s == null)", element.getSimpleName()))
246269
.addStatement(String.format("value.%s = new %s()", element.getSimpleName(), valueTypeAsArrayList))
247270
.endControlFlow()
@@ -274,12 +297,34 @@ private static TypeSpec generateChildElementBinder(TypeElement classElement, Ele
274297
} else {
275298
codeBlock.beginControlFlow(String.format("if (value.%s == null)", element.getSimpleName()))
276299
.addStatement(String.format("value.%s = new %s()", element.getSimpleName(), valueTypeAsArrayList))
277-
.endControlFlow()
278-
.addStatement(String.format("value.%s.add(%s.fromXml(xmlPullParser, %s.class, \"%s\"))",
279-
element.getSimpleName(),
280-
ClassName.bestGuess("com.tencent.qcloud.qcloudxml.core.QCloudXml"),
281-
ClassName.get(genericListType),
282-
Util.initialsUpperCase(Util.getElementName(element))));
300+
.endControlFlow();
301+
if(genericTypeIsBaseType){
302+
codeBlock.addStatement("int eventType = xmlPullParser.getEventType()")
303+
.beginControlFlow("while (eventType != XmlPullParser.END_DOCUMENT)")
304+
.beginControlFlow("switch (eventType)")
305+
306+
.beginControlFlow("case XmlPullParser.START_TAG:")
307+
.addStatement("xmlPullParser.next()")
308+
.addStatement(String.format(generateListBaseTypeAssignment(ElementUtil.getXmlKind(genericListElement)), element.getSimpleName()))
309+
.endControlFlow()
310+
.addStatement("break")
311+
312+
.beginControlFlow("case XmlPullParser.END_TAG:")
313+
.beginControlFlow(String.format("if(\"%s\".equalsIgnoreCase(xmlPullParser.getName()))", Util.getElementName(element)))
314+
.addStatement("return")
315+
.endControlFlow()
316+
.endControlFlow()
317+
318+
.endControlFlow()
319+
.addStatement("eventType = xmlPullParser.next()")
320+
.endControlFlow();
321+
} else {
322+
codeBlock.addStatement(String.format("value.%s.add(%s.fromXml(xmlPullParser, %s.class, \"%s\"))",
323+
element.getSimpleName(),
324+
ClassName.bestGuess("com.tencent.qcloud.qcloudxml.core.QCloudXml"),
325+
ClassName.get(genericListType),
326+
Util.initialsUpperCase(Util.getElementName(element))));
327+
}
283328
}
284329
} else if (typeXmlKind == TypeXmlKind.NORMAL_BEAN) {
285330
codeBlock.addStatement(String.format("value.%s = %s.fromXml(xmlPullParser, %s.class, \"%s\")",
@@ -311,6 +356,7 @@ private static TypeSpec generateChildElementBinder(TypeElement classElement, Ele
311356
/**
312357
* 生成基础类型赋值语句
313358
*/
359+
// TODO: 2023/7/6 支持originalXmlString
314360
private static String generateBaseTypeAssignment(TypeXmlKind typeXmlKind) {
315361
switch (typeXmlKind) {
316362
case STRING:
@@ -334,4 +380,28 @@ private static String generateBaseTypeAssignment(TypeXmlKind typeXmlKind) {
334380
return "";
335381
}
336382
}
383+
384+
private static String generateListBaseTypeAssignment(TypeXmlKind typeXmlKind) {
385+
switch (typeXmlKind) {
386+
case STRING:
387+
case CHAR:
388+
return "value.%s.add(xmlPullParser.getText())";
389+
case INT:
390+
return "value.%s.add(Integer.parseInt(xmlPullParser.getText()))";
391+
case BYTE:
392+
return "value.%s.add(Byte.parseByte(xmlPullParser.getText()))";
393+
case LONG:
394+
return "value.%s.add(Long.parseLong(xmlPullParser.getText()))";
395+
case FLOAT:
396+
return "value.%s.add(Float.parseFloat(xmlPullParser.getText()))";
397+
case SHORT:
398+
return "value.%s.add(Short.parseShort(xmlPullParser.getText()))";
399+
case DOUBLE:
400+
return "value.%s.add(Double.parseDouble(xmlPullParser.getText()))";
401+
case BOOLEAN:
402+
return "value.%s.add(Boolean.parseBoolean(xmlPullParser.getText()))";
403+
default:
404+
return "";
405+
}
406+
}
337407
}

QCloudXml/xmlCompiler/src/main/java/com/tencent/qcloud/qcloudxml/compiler/utils/Util.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,19 @@ public static boolean flatListNote(Element element) {
159159
}
160160
}
161161

162+
/**
163+
* 获取Element是否解析为原始的xml字符串
164+
* @param element Element节点
165+
* @return 是否解析为原始的xml字符串
166+
*/
167+
public static boolean originalXmlString(Element element) {
168+
if (element.getAnnotation(XmlElement.class) != null) {
169+
return element.getAnnotation(XmlElement.class).originalXmlString();
170+
} else {
171+
return false;
172+
}
173+
}
174+
162175
/**
163176
* 获取List泛型类型
164177
* @param listVariableElement List Element

0 commit comments

Comments
 (0)