# 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.

include_defs('//tools/buck.defs')
include_defs('//tools/gwt-constants.defs')

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 = [],
    compile_deps = [],
    visibility = []):
  if gwtxml:
    resources = resources + [gwtxml]
  java_library(
    name = name,
    deps = deps + compile_deps,
    resources = srcs + resources,
    visibility = visibility,
  )
  java_library(
    name = name + '_lib',
    srcs = srcs,
    deps = [':' + name] + [d + '_lib' for d in deps] + compile_deps,
    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 = [],
    compile_deps = [],
    srcs = [],
    resources = [],
    manifest_file = None,
    manifest_entries = [],
    visibility = ['PUBLIC']):
  gerrit_plugin(
    name = name,
    deps = deps,
    compile_deps = compile_deps,
    srcs = srcs,
    resources = resources,
    manifest_file = manifest_file,
    manifest_entries = manifest_entries,
    type = 'extension',
    visibility = visibility,
  )

def gerrit_plugin(
    name,
    deps = [],
    compile_deps = [],
    srcs = [],
    resources = [],
    gwt_module = None,
    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',
  )
  gwt_deps = []
  static_jars = []
  if gwt_module:
    gwt_deps = GWT_PLUGIN_DEPS
    static_jars = [':%s-static-jar' % name]
  java_library2(
    name = name + '__plugin',
    srcs = srcs,
    resources = resources,
    deps = deps,
    compile_deps = ['//gerrit-%s-api:lib' % type] + compile_deps + gwt_deps,
  )
  if gwt_module:
    prebuilt_jar(
      name = '%s-static-jar' % name,
      binary_jar = genfile('%s-static.zip' % name),
      deps = [':%s-static' % name],
    )
    genrule(
      name = '%s-static' % name,
      cmd = 'mkdir -p $TMP/static' +
        ';unzip -qd $TMP/static $(location %s)' %
        ':%s__gwt_application' % name +
        ';cd $TMP' +
        ';zip -qr $OUT .',
      out = '%s-static.zip' % name,
      deps = [':%s__gwt_application' % name]
    )
    gwt_application(
      name = name + '__gwt_application',
      module_target = gwt_module,
      compiler_opts = GWT_COMPILER_OPTS,
      deps = [':%s__plugin' % name] + gwt_deps,
    )
  java_binary(
    name = name,
    manifest_file = genfile('MANIFEST.MF'),
    deps = [
      ':%s__plugin' % name,
      ':%s__manifest' % name,
    ] + static_jars,
    visibility = visibility,
  )

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

def java_doc(
    name,
    title,
    pkg,
    paths,
    srcs = [],
    deps = [],
    visibility = []
  ):
  genrule(
    name = name,
    cmd = ' '.join([
      'javadoc',
      '-quiet',
      '-protected',
      '-encoding UTF-8',
      '-charset UTF-8',
      '-notimestamp',
      '-windowtitle "' + title + '"',
      '-link http://docs.oracle.com/javase/7/docs/api',
      '-subpackages ' + pkg,
      '-sourcepath ',
      ':'.join([n for n in paths]),
      ' -classpath ',
      ':'.join(['$(location %s)' % n for n in deps]),
      '-d $TMP',
    ]) + ';jar cf $OUT -C $TMP .',
    srcs = srcs,
    deps = deps,
    out = name + '.jar',
    visibility = visibility,
)