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

def maven_package(
    version,
    repository = None,
    url = None,
    jar = {},
    src = {},
    doc = {},
    war = {}):
  cmd = ['$(exe //tools/maven:mvn)', '-v', version, '-o', '$OUT']
  api_cmd = []
  api_deps = []
  for type,d in [('jar', jar), ('java-source', src), ('javadoc', doc)]:
    for a,t in d.iteritems():
      api_cmd.append('-s %s:%s:$(location %s)' % (a,type,t))
      api_deps.append(t)

  genrule(
    name = 'api_install',
    cmd = ' '.join(cmd + api_cmd + ['-a', 'install']),
    deps = api_deps + ['//tools/maven:mvn'],
    out = 'api_install.info',
  )

  if repository and url:
    genrule(
      name = 'api_deploy',
      cmd = ' '.join(cmd + api_cmd + [
        '-a', 'deploy',
        '--repository', repository,
        '--url', url]),
      deps = api_deps + ['//tools/maven:mvn'],
      out = 'api_deploy.info',
    )

  war_cmd = []
  war_deps = []
  for a,t in war.iteritems():
    war_cmd.append('-s %s:war:$(location %s)' % (a,t))
    war_deps.append(t)

  genrule(
    name = 'war_install',
    cmd = ' '.join(cmd + war_cmd + ['-a', 'install']),
    deps = war_deps + ['//tools/maven:mvn'],
    out = 'war_install.info',
  )

  if repository and url:
    genrule(
      name = 'war_deploy',
      cmd = ' '.join(cmd + war_cmd + [
        '-a', 'deploy',
        '--repository', repository,
        '--url', url]),
      deps = war_deps + ['//tools/maven:mvn'],
      out = 'war_deploy.info',
    )
