module Buildr module XMLBeans REQUIRES = [ "xmlbeans:xbean:jar:2.2.0", "stax:stax-api:jar:1.0" ] def self.compile(*args) options = Hash === args.last ? args.pop : {} options[:verbose] ||= Rake.application.options.trace || false fu_check_options options, :verbose, :noop, :javasource, :jar, :classes, :output # Classpath for XMLBeans. cp = REQUIRES.map { |id| artifact(id) }.each(&:invoke).map(&:to_s).join(File::PATH_SEPARATOR) # Options for SchemaCompiler. 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" << options[:classes] if options[:classes] cmd_args << "-src" << options[:output] if options[:output] cmd_args += args cmd_args << { :verbose=>options[:verbose] } unless options[:noop] verbose { puts "Running XMLBeans schema compiler" } mkpath options[:classes], :verbose=>false rescue nil if options[:classes] mkpath options[:output], :verbose=>false rescue nil if options[:output] sh(Java.path_to_bin("java"), "-Xmx256m", "-cp", cp, "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 options[:classes], :verbose=>false if options[:classes] touch options[:output], :verbose=>false if options[:output] end end class CompileTask < Rake::FileTask def initialize(*args) super enhance do |task| XMLBeans.compile *task.prerequisites + [options.merge(:output=>task.name)] end end def options() @options ||= {} end def using(options) self.options.merge!(options) self end end def self.compile_task(args) output = args.keys.first files = args.values.first.collect { |f| File.directory?(f) ? FileList[f + "/**/*"] : f }.flatten CompileTask.define_task(output=>files) end end end