# Copyright (C) 2013 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Rule definitions loaded by default into every BUCK file.

def genantlr(
    name,
    srcs,
    out):
  tmp = name + '.src.zip'
  genrule(
    name = name,
    srcs = srcs,
    cmd = '$(exe //lib/antlr:antlr-tool) -o $TMP $SRCS;' +
      'cd $TMP;' +
      'zip -qr $OUT .',
    deps = ['//lib/antlr:antlr-tool'],
    out = out,
  )

def gwt_module(
    name,
    srcs,
    gwtxml = None,
    resources = [],
    deps = [],
    visibility = []):
  if gwtxml:
    resources = resources + [gwtxml]
  resources = resources + srcs
  java_library(
    name = name,
    srcs = srcs,
    deps = deps,
    resources = resources,
    visibility = visibility,
  )

def gwt_application(
    name,
    module_target,
    compiler_opts = [],
    compiler_jvm_flags = [],
    deps = [],
    visibility = []):
  cmd = ['$(exe //lib/gwt:compiler)', module_target, '$TMP', '$OUT']
  cmd += compiler_opts + ['--', '$DEPS']
  genrule(
    name = name,
    cmd = ' '.join(cmd),
    deps = [
      '//lib/gwt:compiler',
      '//lib/gwt:dev',
    ] + deps,
    out = '%s.zip' % name,
    visibility = visibility,
  )

# Compiles a Java library with additional compile-time dependencies
# that do not show up as transitive dependencies to java_library()
# or java_binary() rule that depends on this library.
def java_library2(
    name,
    srcs = [],
    resources = [],
    deps = [],
    compile_deps = [],
    visibility = []):
  c = name + '__compile'
  t = name + '__link'
  j = 'lib__%s__output/%s.jar' % (c, c)
  o = 'lib__%s__output/%s.jar' % (name, name)
  java_library(
    name = c,
    srcs = srcs,
    resources = resources,
    deps = deps + compile_deps,
    visibility = ['//tools/eclipse:classpath'],
  )
  # Break the dependency chain by passing the newly built
  # JAR to consumers through a prebuilt_jar().
  genrule(
    name = t,
    cmd = 'mkdir -p $(dirname $OUT);ln -s $SRCS $OUT',
    srcs = [genfile(j)],
    deps = [':' + c],
    out = o,
  )
  prebuilt_jar(
    name = name,
    binary_jar = genfile(o),
    deps = deps + [':' + t],
    visibility = visibility,
  )

def gerrit_extension(
    name,
    deps = [],
    srcs = [],
    resources = [],
    manifest_file = None,
    manifest_entries = [],
    visibility = ['PUBLIC']):
  gerrit_plugin(
    name = name,
    deps = deps,
    srcs = srcs,
    resources = resources,
    manifest_file = manifest_file,
    manifest_entries = manifest_entries,
    type = 'extension',
    visibility = visibility,
  )

def gerrit_plugin(
    name,
    deps = [],
    srcs = [],
    resources = [],
    manifest_file = None,
    manifest_entries = [],
    type = 'plugin',
    visibility = ['PUBLIC']):
  mf_cmd = 'v=$(git describe HEAD);'
  if manifest_file:
    mf_src = [manifest_file]
    mf_cmd += 'sed "s:@VERSION@:$v:g" $SRCS >$OUT'
  else:
    mf_src = []
    mf_cmd += 'echo "Manifest-Version: 1.0" >$OUT;'
    mf_cmd += 'echo "Gerrit-ApiType: %s" >>$OUT;' % type
    mf_cmd += 'echo "Implementation-Version: $v" >>$OUT;'
    mf_cmd += 'echo "Implementation-Vendor: Gerrit Code Review" >>$OUT'
    for line in manifest_entries:
      line = line.replace('$', '\$')
      mf_cmd += ';echo "%s" >> $OUT' % line
  genrule(
    name = name + '__manifest',
    cmd = mf_cmd,
    srcs = mf_src,
    out = 'MANIFEST.MF',
  )
  java_library2(
    name = name + '__plugin',
    srcs = srcs,
    resources = resources,
    deps = deps,
    compile_deps = ['//:%s-lib' % type],
  )
  java_binary(
    name = name,
    manifest_file = genfile('MANIFEST.MF'),
    deps = [
      ':%s__plugin' % name,
      ':%s__manifest' % name,
    ],
    visibility = visibility,
  )

def java_sources(
    name,
    srcs,
    visibility = []
  ):
  java_library(
    name = name,
    resources = srcs,
    visibility = visibility,
  )
