143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// Protocol Buffers - Google's data interchange format
243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// Copyright 2008 Google Inc.  All rights reserved.
343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// http://code.google.com/p/protobuf/
443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci//
543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// Redistribution and use in source and binary forms, with or without
643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// modification, are permitted provided that the following conditions are
743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// met:
843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci//
943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci//     * Redistributions of source code must retain the above copyright
1043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// notice, this list of conditions and the following disclaimer.
1143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci//     * Redistributions in binary form must reproduce the above
1243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// copyright notice, this list of conditions and the following disclaimer
1343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// in the documentation and/or other materials provided with the
1443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// distribution.
1543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci//     * Neither the name of Google Inc. nor the names of its
1643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// contributors may be used to endorse or promote products derived from
1743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// this software without specific prior written permission.
1843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci//
1943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
3143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// Author: kenton@google.com (Kenton Varda)
3243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci//  Based on original Protocol Buffers design by
3343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci//  Sanjay Ghemawat, Jeff Dean, and others.
3443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
3543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <map>
3643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <string>
3743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
3843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <google/protobuf/compiler/javanano/javanano_message_field.h>
3943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <google/protobuf/compiler/javanano/javanano_helpers.h>
4043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <google/protobuf/io/printer.h>
4143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <google/protobuf/wire_format.h>
4243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci#include <google/protobuf/stubs/strutil.h>
4343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
4443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcinamespace google {
4543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcinamespace protobuf {
4643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcinamespace compiler {
4743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcinamespace javanano {
4843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
4943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazciusing internal::WireFormat;
5043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazciusing internal::WireFormatLite;
5143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
5243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcinamespace {
5343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
5443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// TODO(kenton):  Factor out a "SetCommonFieldVariables()" to get rid of
5543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci//   repeat code between this and the other field types.
5643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid SetMessageVariables(const Params& params,
5743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    const FieldDescriptor* descriptor, map<string, string>* variables) {
5843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  (*variables)["name"] =
5943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    UnderscoresToCamelCase(descriptor);
6043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  (*variables)["capitalized_name"] =
6143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    UnderscoresToCapitalizedCamelCase(descriptor);
6243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  (*variables)["number"] = SimpleItoa(descriptor->number());
6343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  (*variables)["type"] = ClassName(params, descriptor->message_type());
6443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  (*variables)["group_or_message"] =
6543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    (descriptor->type() == FieldDescriptor::TYPE_GROUP) ?
6643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "Group" : "Message";
6743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  (*variables)["message_name"] = descriptor->containing_type()->name();
6843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  //(*variables)["message_type"] = descriptor->message_type()->name();
6943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor));
7043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
7143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
7243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}  // namespace
7343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
7443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// ===================================================================
7543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
7643325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciMessageFieldGenerator::
7743325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciMessageFieldGenerator(const FieldDescriptor* descriptor, const Params& params)
7843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  : FieldGenerator(params), descriptor_(descriptor) {
7943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  SetMessageVariables(params, descriptor, &variables_);
8043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
8143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
8243325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciMessageFieldGenerator::~MessageFieldGenerator() {}
8343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
8443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid MessageFieldGenerator::
8543325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateMembers(io::Printer* printer) const {
8643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  printer->Print(variables_,
8743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "public $type$ $name$ = null;\n");
8843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
8943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
9043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid MessageFieldGenerator::
9143325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateParsingCode(io::Printer* printer) const {
9243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  printer->Print(variables_,
93fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "this.$name$ = new $type$();\n");
9443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
9543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) {
9643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    printer->Print(variables_,
97fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci      "input.readGroup(this.$name$, $number$);\n");
9843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  } else {
9943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    printer->Print(variables_,
100fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci      "input.readMessage(this.$name$);\n");
10143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  }
10243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
10343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
10443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid MessageFieldGenerator::
10543325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateSerializationCode(io::Printer* printer) const {
10643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  printer->Print(variables_,
107fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "if (this.$name$ != null) {\n"
108fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "  output.write$group_or_message$($number$, this.$name$);\n"
10943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "}\n");
11043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
11143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
11243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid MessageFieldGenerator::
11343325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateSerializedSizeCode(io::Printer* printer) const {
11443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  printer->Print(variables_,
115fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "if (this.$name$ != null) {\n"
11643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "  size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
117fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "    .compute$group_or_message$Size($number$, this.$name$);\n"
11843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "}\n");
11943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
12043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
12143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcistring MessageFieldGenerator::GetBoxedType() const {
12243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  return ClassName(params_, descriptor_->message_type());
12343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
12443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
12543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci// ===================================================================
12643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
12743325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciRepeatedMessageFieldGenerator::
12843325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciRepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, const Params& params)
12943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  : FieldGenerator(params), descriptor_(descriptor) {
13043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  SetMessageVariables(params, descriptor, &variables_);
13143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
13243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
13343325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciRepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}
13443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
13543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid RepeatedMessageFieldGenerator::
13643325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateMembers(io::Printer* printer) const {
13743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  printer->Print(variables_,
13843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "public $type$[] $name$ = $type$.EMPTY_ARRAY;\n");
13943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
14043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
14143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid RepeatedMessageFieldGenerator::
14243325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateParsingCode(io::Printer* printer) const {
14343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  // First, figure out the length of the array, then parse.
14443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  printer->Print(variables_,
14543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "int arrayLength = com.google.protobuf.nano.WireFormatNano.getRepeatedFieldArrayLength(input, $tag$);\n"
146fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "int i = this.$name$.length;\n"
147fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "this.$name$ = java.util.Arrays.copyOf(this.$name$, i + arrayLength);\n"
148fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "for (; i < this.$name$.length - 1; i++) {\n"
149fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "  this.$name$[i] = new $type$();\n");
15043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
15143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) {
15243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    printer->Print(variables_,
153fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci      "  input.readGroup(this.$name$[i], $number$);\n");
15443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  } else {
15543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    printer->Print(variables_,
156fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci      "  input.readMessage(this.$name$[i]);\n");
15743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  }
15843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
15943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  printer->Print(variables_,
16043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "  input.readTag();\n"
16143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "}\n"
16243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "// Last one without readTag.\n"
163fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "this.$name$[i] = new $type$();\n");
16443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
16543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) {
16643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    printer->Print(variables_,
167fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci      "input.readGroup(this.$name$[i], $number$);\n");
16843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  } else {
16943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    printer->Print(variables_,
170fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci      "input.readMessage(this.$name$[i]);\n");
17143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  }
17243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
17343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
17443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid RepeatedMessageFieldGenerator::
17543325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateSerializationCode(io::Printer* printer) const {
17643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  printer->Print(variables_,
177fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "for ($type$ element : this.$name$) {\n"
17843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "  output.write$group_or_message$($number$, element);\n"
17943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "}\n");
18043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
18143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
18243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcivoid RepeatedMessageFieldGenerator::
18343325653beb4e5b6923d0380a84bf7e204be5c22Ulas KirazciGenerateSerializedSizeCode(io::Printer* printer) const {
18443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  printer->Print(variables_,
185fb8f78fe6e2d757b813747d5d401a0eeb0cd478bUlas Kirazci    "for ($type$ element : this.$name$) {\n"
18643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "  size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
18743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "    .compute$group_or_message$Size($number$, element);\n"
18843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci    "}\n");
18943325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
19043325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
19143325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazcistring RepeatedMessageFieldGenerator::GetBoxedType() const {
19243325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci  return ClassName(params_, descriptor_->message_type());
19343325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}
19443325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci
19543325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}  // namespace javanano
19643325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}  // namespace compiler
19743325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}  // namespace protobuf
19843325653beb4e5b6923d0380a84bf7e204be5c22Ulas Kirazci}  // namespace google
199