# Copyright 2010-2015, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Generates *.java files from *.proto files.
#
# Q : Why genproto.gypi cannot be used ?
# A : --java_out option of protoc command needs .proto file to have all type
# names and *file name* uniquely or add special description inside .proto file.
# For exmaple, 'Command' type inside 'Command.proto' is forbidden.
# Thus if genproto.gypi is modified to have --java_out option,
# *all* .proto files have to be changed its name
# or be added special description.
#
# Q : Why rule based description like genproto.gypi cannot be used ?
# A : protoc command outputs generated .java files into an appropriate path
# based on its package name.
# The destination path cannot be detected at 'rules' section
# because the package name is described only in the .proto file
# so that 'outputs' section cannot be filled.
#
# We can retrieve Java package names from .proto files and automate the code
# generation.  However, we need only a few proto files so far and it wouldn't
# be worth doing for now.
{
  'variables': {
    'relative_dir': 'android',
    # Android Development Tools
    'adt_gen_dir': 'gen_for_adt',
    'adt_protobuf_gen_dir': 'protobuf/gen_for_adt',
    # Android SDK
    'sdk_gen_dir': 'gen',
    'sdk_protobuf_gen_dir': 'protobuf/gen',
    'wrapper_path': '<(DEPTH)/build_tools/protoc_wrapper.py',
    'protoc_command': 'protoc<(EXECUTABLE_SUFFIX)',
    'additional_inputs': ['<(PRODUCT_DIR)/<(protoc_command)'],
    'genproto_java_common': [
      'python',
      '<(wrapper_path)',
      '--project_root=<(DEPTH)',
      '--protoc_command=<(protoc_command)',
      '--protoc_dir=<(PRODUCT_DIR)',
    ],
  },
  'targets': [
    {
      'target_name': 'sdk_genproto_java',
      'type': 'none',
      'dependencies': [
        'sdk_genproto_java_config',
        'sdk_genproto_java_descriptor',
        'sdk_genproto_java_user_dictionary_storage',
        'sdk_genproto_java_session',
      ],
    },
    {
      'target_name': 'adt_genproto_java',
      'type': 'none',
      'dependencies': [
        'adt_genproto_java_config',
        'adt_genproto_java_descriptor',
        'adt_genproto_java_user_dictionary_storage',
        'adt_genproto_java_session',
      ],
    },
    {
      'target_name': 'sdk_genproto_java_descriptor',
      'type': 'none',
      'copies': [{
        'destination': '<(sdk_protobuf_gen_dir)/com/google/protobuf/',
        'files': [
          '<(adt_protobuf_gen_dir)/com/google/protobuf/DescriptorProtos.java',
        ],
      }],
    },
    {
      'target_name': 'adt_genproto_java_descriptor',
      'type': 'none',
      'variables': {
        'proto_files': [
          '<(protobuf_root)/src/google/protobuf/descriptor.proto',
        ],
      },
      'actions': [
        {
          'action_name': 'genproto_descriptor',
          'inputs': [
            '<@(proto_files)',
            '<@(additional_inputs)',
          ],
          'outputs': [
            '<(adt_protobuf_gen_dir)/com/google/protobuf/DescriptorProtos.java',
          ],
          'action': [
            '<@(genproto_java_common)',
            '--proto=<(proto_files)',
            '--proto_path=<(protobuf_root)',
            '--java_out=<(DEPTH)/<(relative_dir)/<(adt_protobuf_gen_dir)',
          ],
        },
      ],
    },
    {
      'target_name': 'sdk_genproto_java_config',
      'type': 'none',
      'copies': [{
        'destination': '<(sdk_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/',
        'files': [
          '<(adt_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/ProtoConfig.java',
        ],
      }],
    },
    {
      'target_name': 'adt_genproto_java_config',
      'type': 'none',
      'variables': {
        'proto_files': [
          '../config/config.proto',
        ],
      },
      'actions': [
        {
          'action_name': 'genproto_config',
          'inputs': [
            '<@(proto_files)',
            '<@(additional_inputs)',
          ],
          'outputs': [
            '<(adt_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/ProtoConfig.java',
          ],
          'action': [
            '<@(genproto_java_common)',
            '--proto=<(proto_files)',
            '--java_out=<(DEPTH)/<(relative_dir)/<(adt_gen_dir)',
          ],
        },
      ],
    },
    {
      'target_name': 'sdk_genproto_java_user_dictionary_storage',
      'type': 'none',
      'copies': [{
        'destination': '<(sdk_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/',
        'files': [
          '<(adt_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/ProtoUserDictionaryStorage.java',
        ],
      }],
    },
    {
      'target_name': 'adt_genproto_java_user_dictionary_storage',
      'type': 'none',
      'variables': {
        'proto_files': [
          '../dictionary/user_dictionary_storage.proto',
        ],
      },
      'actions': [
        {
          'action_name': 'genproto_user_dictionary_storage',
          'inputs': [
            '<@(proto_files)',
            '<@(additional_inputs)',
          ],
          'outputs': [
            '<(adt_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/ProtoUserDictionaryStorage.java',
          ],
          'action': [
            '<@(genproto_java_common)',
            '--proto=<(proto_files)',
            '--java_out=<(DEPTH)/<(relative_dir)/<(adt_gen_dir)',
          ],
        },
      ],
    },
    {
      'target_name': 'sdk_genproto_java_session',
      'type': 'none',
      'copies': [{
        'destination': '<(sdk_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/',
        'files': [
          '<(adt_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/ProtoCandidates.java',
          '<(adt_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/ProtoCommands.java',
        ],
      }],
    },
    {
      'target_name': 'adt_genproto_java_session',
      'type': 'none',
      'variables': {
        'proto_files': [
          '../session/candidates.proto',
          '../session/commands.proto',
        ],
      },
      'actions': [
        {
          'action_name': 'genproto_session',
          'inputs': [
            '<@(proto_files)',
            '<@(additional_inputs)',
          ],
          'outputs': [
            '<(adt_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/ProtoCandidates.java',
            '<(adt_gen_dir)/org/mozc/android/inputmethod/japanese/protobuf/ProtoCommands.java',
          ],
          'action': [
            '<@(genproto_java_common)',
            '--proto=<(proto_files)',
            '--java_out=<(DEPTH)/<(relative_dir)/<(adt_gen_dir)',
          ],
        },
      ],
    },
  ],
}
