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