# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with this
# work for additional information regarding copyright ownership. The ASF
# licenses this file to you 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.

module Buildr
  module JaxbXjc
    class << self

      def jaxb_version
        "2.2.1"
      end

      # The specs for requirements
      def dependencies
        [
          "javax.xml.bind:jaxb-api:jar:#{jaxb_version}",
          "com.sun.xml.bind:jaxb-impl:jar:#{jaxb_version}",
          "com.sun.xml.bind:jaxb-xjc:jar:#{jaxb_version}"
        ]
      end

      # Repositories containing the requirements
      def remote_repository
        "http://download.java.net/maven/2"
      end

      def xjc(*args)
        cp = Buildr.artifacts(self.dependencies).each(&:invoke).map(&:to_s)
        Java::Commands.java 'com.sun.tools.xjc.XJCFacade', *(args + [{ :classpath => cp }])
      end
    end

    def compile_jaxb(files, *args)
      options = Hash === args.last ? args.pop.dup : {}
      rake_check_options options, :directory, :keep_content, :package, :id
      args = args.dup
      files = Array === files ? files.flatten : [files]

      target_dir = File.expand_path(options[:directory] || _(:target, :generated, :jaxb, 'main/java'))
      timestamp_file = File.expand_path("#{target_dir}/jaxb-#{options[:id] || 1}.cache")

      project.iml.main_source_directories << target_dir if project.iml?

      file(target_dir => timestamp_file)

      file(timestamp_file => files.flatten) do |task|
        rm_rf target_dir unless options[:keep_content]
        mkdir_p target_dir
        args << "-d" << target_dir
        args << "-p" << options[:package] if options[:package]
        args += files.collect{|f| f.to_s}
        JaxbXjc.xjc args
        touch timestamp_file
      end

      target_dir
    end
  end
end

class Buildr::Project
  include Buildr::JaxbXjc
end
