require "java/java" module Buildr module Java module XMLBeans REQUIRES = [ "xmlbeans:xbean:jar:2.2.0", "stax:stax-api:jar:1.0" ] class << self def compile(*args) options = Hash === args.last ? args.pop : {} options[:verbose] ||= Rake.application.options.trace || false fu_check_options options, :verbose, :noop, :javasource, :jar, :compile, :output, :xsb # Options for SchemaCompiler. output = options[:output].to_s cmd_args = [ options[:verbose] ? "-verbose" : "-quiet" ] cmd_args << "-javasource" << options[:javasource].collect.join(File::PATH_SEPARATOR) if options[:javasource] cmd_args << "-out" << options[:jar] if options[:jar] cmd_args << "-d" << output cmd_args << "-srconly" unless options[:compile] cmd_args << "-src" << output cmd_args += args.flatten cmd_args << { :verbose=>options[:verbose] } unless options[:noop] puts "Running XMLBeans schema compiler" if verbose mkpath output, :verbose=>false rescue nil sh(Java.path_to_bin("java"), "-Xmx256m", "-cp", requires.join(File::PATH_SEPARATOR), "org.apache.xmlbeans.impl.tool.SchemaCompiler", *cmd_args) { |ok, res| fail "Failed to compile schemas, see errors above" unless ok } # Touch paths to let other tasks know there's an update. touch output, :verbose=>false end end private def requires() @requires ||= artifacts(REQUIRES).each { |artifact| artifact.invoke }.map(&:to_s) end end def compile_xml_beans(*args) # Generate sources and add them to the compile task. generated = file(path_to("target/generated/xmlbeans")=>FileList[args.flatten]) do |task| Java::XMLBeans.compile task.prerequisites, :output=>task.name, :javasource=>compile.options.source, :xsb=>compile.target end compile.from(generated).with(JAVAX.stream, XMLBEANS) # Once compiled, we need to copy the generated XSB/XSD and one (magical?) class file # into the target directory, or the rest is useless. compile do |task| verbose(false) do base = Pathname.new(generated.to_s) FileList["#{base}/**/*.{class,xsb,xsd}"].each do |file| target = File.join(compile.target.to_s, Pathname.new(file).relative_path_from(base)) mkpath File.dirname(target) ; cp file, target end end end end end end class Project include Java::XMLBeans end end