java_field.cc revision fbaaef999ba563838ebd00874ed8a1c01fbf286d
1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Protocol Buffers - Google's data interchange format
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright 2008 Google Inc.  All rights reserved.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// http://code.google.com/p/protobuf/
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Redistribution and use in source and binary forms, with or without
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// modification, are permitted provided that the following conditions are
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// met:
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     * Redistributions of source code must retain the above copyright
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// notice, this list of conditions and the following disclaimer.
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     * Redistributions in binary form must reproduce the above
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// copyright notice, this list of conditions and the following disclaimer
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// in the documentation and/or other materials provided with the
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// distribution.
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     * Neither the name of Google Inc. nor the names of its
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// contributors may be used to endorse or promote products derived from
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// this software without specific prior written permission.
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Author: kenton@google.com (Kenton Varda)
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//  Based on original Protocol Buffers design by
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//  Sanjay Ghemawat, Jeff Dean, and others.
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <google/protobuf/compiler/java/java_field.h>
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <google/protobuf/compiler/java/java_helpers.h>
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <google/protobuf/compiler/java/java_primitive_field.h>
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <google/protobuf/compiler/java/java_enum_field.h>
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <google/protobuf/compiler/java/java_message_field.h>
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <google/protobuf/stubs/common.h>
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace google {
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace protobuf {
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace compiler {
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace java {
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathFieldGenerator::~FieldGenerator() {}
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathFieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor)
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : descriptor_(descriptor),
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    field_generators_(
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      new scoped_ptr<FieldGenerator>[descriptor->field_count()]),
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    extension_generators_(
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      new scoped_ptr<FieldGenerator>[descriptor->extension_count()]) {
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // Construct all the FieldGenerators.
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for (int i = 0; i < descriptor->field_count(); i++) {
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    field_generators_[i].reset(MakeGenerator(descriptor->field(i)));
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  for (int i = 0; i < descriptor->extension_count(); i++) {
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    extension_generators_[i].reset(MakeGenerator(descriptor->extension(i)));
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathFieldGenerator* FieldGeneratorMap::MakeGenerator(const FieldDescriptor* field) {
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if (field->is_repeated()) {
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    switch (GetJavaType(field)) {
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case JAVATYPE_MESSAGE:
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return new RepeatedMessageFieldGenerator(field);
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case JAVATYPE_ENUM:
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return new RepeatedEnumFieldGenerator(field);
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      default:
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return new RepeatedPrimitiveFieldGenerator(field);
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  } else {
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    switch (GetJavaType(field)) {
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case JAVATYPE_MESSAGE:
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return new MessageFieldGenerator(field);
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case JAVATYPE_ENUM:
807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        return new EnumFieldGenerator(field);
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      default:
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return new PrimitiveFieldGenerator(field);
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathFieldGeneratorMap::~FieldGeneratorMap() {}
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst FieldGenerator& FieldGeneratorMap::get(
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const FieldDescriptor* field) const {
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  GOOGLE_CHECK_EQ(field->containing_type(), descriptor_);
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return *field_generators_[field->index()];
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst FieldGenerator& FieldGeneratorMap::get_extension(int index) const {
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return *extension_generators_[index];
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}  // namespace java
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}  // namespace compiler
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}  // namespace protobuf
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}  // namespace google
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath