def javadoc(*args)
options = Hash === args.last ? args.pop : {}
fail "No output defined for javadoc" if options[:output].nil?
options[:output] = File.expand_path(options[:output].to_s)
cmd_args = [ '-d', options[:output], trace?(:javadoc) ? '-verbose' : '-quiet' ]
options.reject { |key, value| [:output, :name, :sourcepath, :classpath].include?(key) }.
each { |key, value| value.invoke if value.respond_to?(:invoke) }.
each do |key, value|
case value
when true, nil
cmd_args << "-#{key}"
when false
cmd_args << "-no#{key}"
when Hash
value.each { |k,v| cmd_args << "-#{key}" << k.to_s << v.to_s }
else
cmd_args += Array(value).map { |item| ["-#{key}", item.to_s] }.flatten
end
end
[:sourcepath, :classpath].each do |option|
options[option].to_a.flatten.tap do |paths|
cmd_args << "-#{option}" << paths.flatten.map(&:to_s).join(File::PATH_SEPARATOR) unless paths.empty?
end
end
files = args.each {|arg| arg.invoke if arg.respond_to?(:invoke)}.collect {|arg| arg.is_a?(Project) ? arg.compile.sources.collect{|dir| Dir["#{File.expand_path(dir.to_s)}/**/*.java"]} : File.expand_path(arg.to_s) }
cmd_args += files.flatten.uniq.map(&:to_s)
name = options[:name] || Dir.pwd
unless Buildr.application.options.dryrun
info "Generating Javadoc for #{name}"
trace (['javadoc'] + cmd_args).join(' ')
Java.load
::Java::com.sun.tools.javadoc.Main.execute(cmd_args.to_java(::Java::java.lang.String)) == 0 or
fail 'Failed to generate Javadocs, see errors above'
end
end