1// Protocol Buffers - Google's data interchange format 2// Copyright 2008 Google Inc. All rights reserved. 3// http://code.google.com/p/protobuf/ 4// 5// Redistribution and use in source and binary forms, with or without 6// modification, are permitted provided that the following conditions are 7// met: 8// 9// * Redistributions of source code must retain the above copyright 10// notice, this list of conditions and the following disclaimer. 11// * Redistributions in binary form must reproduce the above 12// copyright notice, this list of conditions and the following disclaimer 13// in the documentation and/or other materials provided with the 14// distribution. 15// * Neither the name of Google Inc. nor the names of its 16// contributors may be used to endorse or promote products derived from 17// this software without specific prior written permission. 18// 19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31// Author: kenton@google.com (Kenton Varda) 32// Based on original Protocol Buffers design by 33// Sanjay Ghemawat, Jeff Dean, and others. 34 35#include <google/protobuf/compiler/java/java_generator.h> 36#include <google/protobuf/compiler/java/java_file.h> 37#include <google/protobuf/compiler/java/java_helpers.h> 38#include <google/protobuf/io/printer.h> 39#include <google/protobuf/io/zero_copy_stream.h> 40#include <google/protobuf/descriptor.pb.h> 41#include <google/protobuf/stubs/strutil.h> 42 43namespace google { 44namespace protobuf { 45namespace compiler { 46namespace java { 47 48 49JavaGenerator::JavaGenerator() {} 50JavaGenerator::~JavaGenerator() {} 51 52bool JavaGenerator::Generate(const FileDescriptor* file, 53 const string& parameter, 54 OutputDirectory* output_directory, 55 string* error) const { 56 vector<pair<string, string> > options; 57 ParseGeneratorParameter(parameter, &options); 58 59 // ----------------------------------------------------------------- 60 // parse generator options 61 62 // Name a file where we will write a list of generated file names, one 63 // per line. 64 string output_list_file; 65 66 for (int i = 0; i < options.size(); i++) { 67 if (options[i].first == "output_list_file") { 68 output_list_file = options[i].second; 69 } else { 70 *error = "Unknown generator option: " + options[i].first; 71 return false; 72 } 73 } 74 75 76 // ----------------------------------------------------------------- 77 78 79 FileGenerator file_generator(file); 80 if (!file_generator.Validate(error)) { 81 return false; 82 } 83 84 string package_dir = 85 StringReplace(file_generator.java_package(), ".", "/", true); 86 if (!package_dir.empty()) package_dir += "/"; 87 88 vector<string> all_files; 89 90 string java_filename = package_dir; 91 java_filename += file_generator.classname(); 92 java_filename += ".java"; 93 all_files.push_back(java_filename); 94 95 // Generate main java file. 96 scoped_ptr<io::ZeroCopyOutputStream> output( 97 output_directory->Open(java_filename)); 98 io::Printer printer(output.get(), '$'); 99 file_generator.Generate(&printer); 100 101 // Generate sibling files. 102 file_generator.GenerateSiblings(package_dir, output_directory, &all_files); 103 104 // Generate output list if requested. 105 if (!output_list_file.empty()) { 106 // Generate output list. This is just a simple text file placed in a 107 // deterministic location which lists the .java files being generated. 108 scoped_ptr<io::ZeroCopyOutputStream> srclist_raw_output( 109 output_directory->Open(output_list_file)); 110 io::Printer srclist_printer(srclist_raw_output.get(), '$'); 111 for (int i = 0; i < all_files.size(); i++) { 112 srclist_printer.Print("$filename$\n", "filename", all_files[i]); 113 } 114 } 115 116 return true; 117} 118 119} // namespace java 120} // namespace compiler 121} // namespace protobuf 122} // namespace google 123