blob: c1e962f98598e8d12c3fafbe17c5ce91e41808f3 [file] [log] [blame]
package org.jetbrains.protocolReader;
import java.lang.reflect.Method;
import java.util.Collections;
/**
* Basic implementation of the method that parses value on demand and store it for a future use
*/
class LazyCachedMethodHandler extends MethodHandler {
private final ValueReader parser;
private final VolatileFieldBinding fieldBinding;
LazyCachedMethodHandler(ValueReader parser, VolatileFieldBinding fieldBinding) {
this.parser = parser;
this.fieldBinding = fieldBinding;
}
protected void writeReturnTypeJava(ClassScope scope, Method m, TextOutput out) {
ObjectValueReader<?> objectValueParser = parser.asJsonTypeParser();
if (objectValueParser == null) {
Util.writeJavaTypeName(m.getGenericReturnType(), out);
}
else {
out.append(scope.getTypeImplReference(objectValueParser.getType().get()));
}
}
@Override
void writeMethodImplementationJava(ClassScope classScope, Method m, TextOutput out) {
out.append("@Override").newLine().append("public ");
writeReturnTypeJava(classScope, m, out);
out.append(' ');
appendMethodSignatureJava(m, Collections.<String>emptyList(), out);
out.openBlock();
out.append("if (");
fieldBinding.writeGetExpression(out);
out.append(" == null)").openBlock();
{
if (parser.isThrowsIOException()) {
out.append("try").openBlock();
}
{
fieldBinding.writeGetExpression(out);
out.append(" = ");
parser.writeReadCode(classScope, true, null, classScope.getOutput());
out.semi();
}
if (parser.isThrowsIOException()) {
out.closeBlock();
out.newLine().append("catch (IOException e)").openBlock();
out.append("throw new com.google.gson.JsonParseException(e);").closeBlock();
}
out.newLine().append(Util.PENDING_INPUT_READER_NAME).append(" = null;");
}
out.closeBlock();
out.newLine().append("return ");
fieldBinding.writeGetExpression(out);
out.semi();
out.closeBlock();
}
}