下面列出了怎么用 com.sun.codemodel.JForLoop 的API类实例代码及写法,或者点击链接到github查看源代码。
private void processArrayElementLoop(final Schema arraySchema, final JClass arrayClass, JExpression arrayExpr, JBlock body, String getMethodName) {
final JForLoop forLoop = body._for();
final JVar counter = forLoop.init(codeModel.INT, getUniqueName("counter"), JExpr.lit(0));
forLoop.test(counter.lt(JExpr.invoke(arrayExpr, "size")));
forLoop.update(counter.incr());
final JBlock forBody = forLoop.body();
forBody.invoke(JExpr.direct(ENCODER), "startItem");
final Schema elementSchema = arraySchema.getElementType();
if (SchemaAssistant.isComplexType(elementSchema)) {
JVar containerVar = declareValueVar(elementSchema.getName(), elementSchema, forBody);
forBody.assign(containerVar, JExpr.invoke(JExpr.cast(arrayClass, arrayExpr), getMethodName).arg(counter));
processComplexType(elementSchema, containerVar, forBody);
} else {
processSimpleType(elementSchema, arrayExpr.invoke(getMethodName).arg(counter), forBody, false);
}
}
private void processArray(final Schema arraySchema, JExpression arrayExpr, JBlock body) {
final JClass arrayClass = schemaAssistant.classFromSchema(arraySchema);
body.invoke(JExpr.direct(ENCODER), "writeArrayStart");
final JExpression emptyArrayCondition = arrayExpr.eq(JExpr._null())
.cor(JExpr.invoke(arrayExpr, "isEmpty"));
final JConditional emptyArrayIf = body._if(emptyArrayCondition);
final JBlock emptyArrayBlock = emptyArrayIf._then();
emptyArrayBlock.invoke(JExpr.direct(ENCODER), "setItemCount").arg(JExpr.lit(0));
final JBlock nonEmptyArrayBlock = emptyArrayIf._else();
nonEmptyArrayBlock.invoke(JExpr.direct(ENCODER), "setItemCount")
.arg(JExpr.invoke(arrayExpr, "size"));
final JForLoop forLoop = nonEmptyArrayBlock._for();
final JVar counter = forLoop.init(codeModel.INT, getVariableName("counter"), JExpr.lit(0));
forLoop.test(counter.lt(JExpr.invoke(JExpr.cast(arrayClass, arrayExpr), "size")));
forLoop.update(counter.incr());
final JBlock forBody = forLoop.body();
forBody.invoke(JExpr.direct(ENCODER), "startItem");
final Schema elementSchema = arraySchema.getElementType();
if (SchemaAssistant.isComplexType(elementSchema)) {
JVar containerVar = declareValueVar(elementSchema.getName(), elementSchema, forBody);
forBody.assign(containerVar, JExpr.invoke(JExpr.cast(arrayClass, arrayExpr), "get").arg(counter));
processComplexType(elementSchema, containerVar, forBody);
} else {
processSimpleType(elementSchema, arrayExpr.invoke("get").arg(counter), forBody);
}
body.invoke(JExpr.direct(ENCODER), "writeArrayEnd");
}
private void processArray(JVar arraySchemaVar, final String name, final Schema arraySchema,
final Schema readerArraySchema, JBlock parentBody, FieldAction action,
BiConsumer<JBlock, JExpression> putArrayIntoParent) {
if (action.getShouldRead()) {
Symbol valuesActionSymbol = null;
for (Symbol symbol : action.getSymbol().production) {
if (Symbol.Kind.REPEATER.equals(symbol.kind)
&& "array-end".equals(getSymbolPrintName(((Symbol.Repeater) symbol).end))) {
valuesActionSymbol = symbol;
break;
}
}
if (valuesActionSymbol == null) {
throw new FastDeserializerGeneratorException("Unable to determine action for array: " + name);
}
action = FieldAction.fromValues(arraySchema.getElementType().getType(), action.getShouldRead(),
valuesActionSymbol);
} else {
action = FieldAction.fromValues(arraySchema.getElementType().getType(), false, EMPTY_SYMBOL);
}
final JVar arrayVar = action.getShouldRead() ? declareValueVar(name, readerArraySchema, parentBody) : null;
JVar chunkLen = parentBody.decl(codeModel.LONG, getVariableName("chunkLen"),
JExpr.direct(DECODER + ".readArrayStart()"));
JConditional conditional = parentBody._if(chunkLen.gt(JExpr.lit(0)));
JBlock ifBlock = conditional._then();
JClass arrayClass = schemaAssistant.classFromSchema(action.getShouldRead() ? readerArraySchema : arraySchema, false);
if (action.getShouldRead()) {
JInvocation newArrayExp = JExpr._new(arrayClass);
if (useGenericTypes) {
newArrayExp = newArrayExp.arg(JExpr.cast(codeModel.INT, chunkLen)).arg(getSchemaExpr(arraySchema));
}
ifBlock.assign(arrayVar, newArrayExp);
JBlock elseBlock = conditional._else();
if (useGenericTypes) {
elseBlock.assign(arrayVar, JExpr._new(arrayClass).arg(JExpr.lit(0)).arg(getSchemaExpr(arraySchema)));
} else {
elseBlock.assign(arrayVar, codeModel.ref(Collections.class).staticInvoke("emptyList"));
}
}
JDoLoop doLoop = ifBlock._do(chunkLen.gt(JExpr.lit(0)));
JForLoop forLoop = doLoop.body()._for();
JVar counter = forLoop.init(codeModel.INT, getVariableName("counter"), JExpr.lit(0));
forLoop.test(counter.lt(chunkLen));
forLoop.update(counter.incr());
JBlock forBody = forLoop.body();
JVar elementSchemaVar = null;
BiConsumer<JBlock, JExpression> putValueInArray = null;
if (action.getShouldRead()) {
putValueInArray = (block, expression) -> block.invoke(arrayVar, "add").arg(expression);
if (useGenericTypes) {
elementSchemaVar = declareSchemaVar(arraySchema.getElementType(), name + "ArrayElemSchema",
arraySchemaVar.invoke("getElementType"));
}
}
if (SchemaAssistant.isComplexType(arraySchema.getElementType())) {
String elemName = name + "Elem";
Schema readerArrayElementSchema = action.getShouldRead() ? readerArraySchema.getElementType() : null;
processComplexType(elementSchemaVar, elemName, arraySchema.getElementType(), readerArrayElementSchema,
forBody, action, putValueInArray);
} else {
// to preserve reader string specific options use reader array schema
if (action.getShouldRead() && Schema.Type.STRING.equals(arraySchema.getElementType().getType())) {
processSimpleType(readerArraySchema.getElementType(), forBody, action, putValueInArray);
} else {
processSimpleType(arraySchema.getElementType(), forBody, action, putValueInArray);
}
}
doLoop.body().assign(chunkLen, JExpr.direct(DECODER + ".arrayNext()"));
if (action.getShouldRead()) {
putArrayIntoParent.accept(parentBody, arrayVar);
}
}
private void processMap(JVar mapSchemaVar, final String name, final Schema mapSchema, final Schema readerMapSchema,
JBlock parentBody, FieldAction action, BiConsumer<JBlock, JExpression> putMapIntoParent) {
if (action.getShouldRead()) {
Symbol valuesActionSymbol = null;
for (Symbol symbol : action.getSymbol().production) {
if (Symbol.Kind.REPEATER.equals(symbol.kind)
&& "map-end".equals(getSymbolPrintName(((Symbol.Repeater) symbol).end))) {
valuesActionSymbol = symbol;
break;
}
}
if (valuesActionSymbol == null) {
throw new FastDeserializerGeneratorException("unable to determine action for map: " + name);
}
action = FieldAction.fromValues(mapSchema.getValueType().getType(), action.getShouldRead(),
valuesActionSymbol);
} else {
action = FieldAction.fromValues(mapSchema.getValueType().getType(), false, EMPTY_SYMBOL);
}
final JVar mapVar = action.getShouldRead() ? declareValueVar(name, readerMapSchema, parentBody) : null;
JVar chunkLen = parentBody.decl(codeModel.LONG, getVariableName("chunkLen"),
JExpr.direct(DECODER + ".readMapStart()"));
JConditional conditional = parentBody._if(chunkLen.gt(JExpr.lit(0)));
JBlock ifBlock = conditional._then();
if (action.getShouldRead()) {
ifBlock.assign(mapVar, JExpr._new(schemaAssistant.classFromSchema(readerMapSchema, false)));
JBlock elseBlock = conditional._else();
elseBlock.assign(mapVar, codeModel.ref(Collections.class).staticInvoke("emptyMap"));
}
JDoLoop doLoop = ifBlock._do(chunkLen.gt(JExpr.lit(0)));
JForLoop forLoop = doLoop.body()._for();
JVar counter = forLoop.init(codeModel.INT, getVariableName("counter"), JExpr.lit(0));
forLoop.test(counter.lt(chunkLen));
forLoop.update(counter.incr());
JBlock forBody = forLoop.body();
JClass keyClass = schemaAssistant.keyClassFromMapSchema(action.getShouldRead() ? readerMapSchema : mapSchema);
JExpression keyValueExpression = (string.equals(keyClass)) ?
JExpr.direct(DECODER + ".readString()")
: JExpr.direct(DECODER + ".readString(null)");
if (SchemaAssistant.hasStringableKey(mapSchema)) {
keyValueExpression = JExpr._new(keyClass).arg(keyValueExpression.invoke("toString"));
}
JVar key = forBody.decl(keyClass, getVariableName("key"), keyValueExpression);
JVar mapValueSchemaVar = null;
if (action.getShouldRead() && useGenericTypes) {
mapValueSchemaVar = declareSchemaVar(mapSchema.getValueType(), name + "MapValueSchema",
mapSchemaVar.invoke("getValueType"));
}
BiConsumer<JBlock, JExpression> putValueInMap = null;
if (action.getShouldRead()) {
putValueInMap = (block, expression) -> block.invoke(mapVar, "put").arg(key).arg(expression);
}
if (SchemaAssistant.isComplexType(mapSchema.getValueType())) {
String valueName = name + "Value";
Schema readerMapValueSchema = null;
if (action.getShouldRead()) {
readerMapValueSchema = readerMapSchema.getValueType();
}
processComplexType(mapValueSchemaVar, valueName, mapSchema.getValueType(), readerMapValueSchema, forBody,
action, putValueInMap);
} else {
// to preserve reader string specific options use reader map schema
if (action.getShouldRead() && Schema.Type.STRING.equals(mapSchema.getValueType().getType())) {
processSimpleType(readerMapSchema.getValueType(), forBody, action, putValueInMap);
} else {
processSimpleType(mapSchema.getValueType(), forBody, action, putValueInMap);
}
}
doLoop.body().assign(chunkLen, JExpr.direct(DECODER + ".mapNext()"));
if (action.getShouldRead()) {
putMapIntoParent.accept(parentBody, mapVar);
}
}