// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.sdk.internal.protocolparser.dynamicimpl; import org.chromium.sdk.internal.protocolparser.JsonProtocolParseException; import org.chromium.sdk.internal.protocolparser.dynamicimpl.JavaCodeGenerator.ClassScope; import org.chromium.sdk.internal.protocolparser.dynamicimpl.JavaCodeGenerator.MethodScope; import org.chromium.sdk.internal.protocolparser.dynamicimpl.JavaCodeGenerator.Util; /** * This classs is responsible for parsing field values and saving them in {@link ObjectData} * for future use. */ class FieldLoader { private final String fieldName; private final int fieldPosInArray; private final SlowParser<?> slowParser; private final boolean isOptional; FieldLoader(int fieldPosInArray, String fieldName, SlowParser<?> slowParser, boolean isOptional) { this.fieldName = fieldName; this.fieldPosInArray = fieldPosInArray; this.slowParser = slowParser; this.isOptional = isOptional; } public String getFieldName() { return fieldName; } public void parse(boolean hasValue, Object value, ObjectData objectData) throws JsonProtocolParseException { if (hasValue) { try { objectData.getFieldArray()[fieldPosInArray] = slowParser.parseValue(value, objectData); } catch (JsonProtocolParseException e) { throw new JsonProtocolParseException("Failed to parse field " + getFieldName(), e); } } else { if (!isOptional) { throw new JsonProtocolParseException("Field is not optional: " + getFieldName()); } } } public void writeFieldDeclarationJava(ClassScope scope) { scope.startLine("private final "); slowParser.appendFinishedValueTypeNameJava(scope); scope.append(" field_" + fieldName + ";\n"); } public void writeFieldLoadJava(MethodScope scope, String valueRef, String hasValueRef) { scope.startLine("if (" + hasValueRef + ") {\n"); scope.indentRight(); if (slowParser.javaCodeThrowsException()) { scope.startLine("try {\n"); scope.indentRight(); String parsedValueRef = scope.newMethodScopedName("parsedValue"); slowParser.writeParseCode(scope, valueRef, "this", parsedValueRef); scope.startLine("this.field_" + fieldName + " = " + parsedValueRef + ";\n"); scope.indentLeft(); scope.startLine("} catch (" + Util.BASE_PACKAGE + ".JsonProtocolParseException e) {\n"); scope.startLine(" throw new " + Util.BASE_PACKAGE + ".JsonProtocolParseException(" + "\"Failed to parse field " + getFieldName() + "\", e);\n"); scope.startLine("}\n"); } else { String parsedValueRef = scope.newMethodScopedName("parsedValue"); slowParser.writeParseCode(scope, valueRef, "this", parsedValueRef); scope.startLine("this.field_" + fieldName + " = " + parsedValueRef + ";\n"); } scope.indentLeft(); scope.startLine("} else {\n"); if (isOptional) { scope.startLine(" this.field_" + fieldName + " = null;\n"); } else { scope.startLine(" throw new " + Util.BASE_PACKAGE + ".JsonProtocolParseException(" + "\"Field is not optional: " + getFieldName() + "\");\n"); } scope.startLine("}\n"); } }