Thanks much.  I think I get it.

But let me ask this:  in this HOWTO

https://cwiki.apache.org/confluence/display/BUILDR/How+to+generate+sources+before+compilation

what does the argument to file() actually do or mean?

file(_("target/generated-source") => sources)

I see it's a hash, but what does it actually say?  "path_to 'foo' is a key in a 
hash where 'sources' is the value".  Huh?



On Sep 7, 2010, at 8:22 AM, Rhett Sutphin wrote:

> Hi Mark,
> 
> On Sep 7, 2010, at 10:04 AM, Mark Petrovic wrote:
> 
>> I'm pretty new at this Ruby stuff, but between some experience and outright 
>> mimicry, I've managed to produce this JAXB XJC method, which is a candidate 
>> for inclusion in the Buildr trunk.  I think it's enough to be useful and to 
>> get people started with a canned JAXB compiler, despite the code being 
>> slightly self-conscious in a way only a neophyte can affect.
>> 
>> Question:  is the buried file() call in doWork() ultimately responsibile for 
>> adding a new directory element (e.g., 'target/generated-sources/xjc') to the 
>> list of compile sources?  I don't know how this thing actually works, but it 
>> does.  file(foo) returns foo, which I think is what compile.with sees when 
>> it adds to the compile sources list.
> 
> The file(path) call creates a FileTask in rake[1].  (#to_s on a rake task 
> returns its name; the name of a file task is the path; this is why puts 
> file("foo") prints foo.)   This is the code that rake will execute if it 
> determines that it needs an up to date version of that path.  
> 
> Your file task is what is returned by JAXB_XJC.doWork, and so is what is 
> returned by compile_jaxb.  In ruby if there's no explicit return, the result 
> of the last expression in a method is the return value.
> 
> When you call compile.from compile_jaxb(...), buildr adds the file task to 
> the set of dependencies for the compile task for the 'restapi' project.  
> Thus, when you do restapi:compile (or any task which depends on that task), 
> your file task is invoked if rake decides that its path is out of date.  If 
> you're curious about this, try running restapi:compile with --trace; you 
> should be able to see rake evaluating the dependency tree.
> 
> Welcome to ruby and rake and buildr,
> Rhett
> 
> [1]: which is the ruby build tool that buildr is built on top of
> 
>> 
>> Committers, feel free to make it more clueful and tasteful in whatever way 
>> you see fit.
>> 
>> 1) This code goes in a file named 'jaxb-xjc.rb':
>> 
>> require 'buildr/java'
>> require 'buildr/java/ant'
>> 
>> # Wrapped JAXB-XJC compiler
>> # https://jaxb.dev.java.net/nonav/2.2.1/docs/xjcTask.html
>> 
>> module Buildr
>> module JAXB_XJC
>> 
>>   VERSION = "2.2.1"
>> 
>>   REQUIRES = ["javax.xml.bind:jaxb-api:jar:#{VERSION}",
>>               "com.sun.xml.bind:jaxb-impl:jar:#{VERSION}",
>>               "com.sun.xml.bind:jaxb-xjc:jar:#{VERSION}"]
>> 
>>   class << self
>>     def doWork(options)
>>       outdir = options[:outdir]
>>       schemafile = options[:schemafile]
>>       package = options[:package]
>> 
>>       pkgdir = outdir + '/' + package.gsub('.', '/')
>>       mkdir_p pkgdir.to_s
>> 
>>       file(outdir) do |dir|
>>         mkdir_p dir.to_s
>>         Buildr.ant('xjc') do |ant|
>>           ant.taskdef :name=>"xjc", :classname=>"com.sun.tools.xjc.XJCTask", 
>> :classpath=>requires.join(File::PATH_SEPARATOR)
>>           ant.xjc :schema=>schemafile, :destdir=>dir, :package=>package, 
>> :removeOldOutput=>'yes' do
>>             ant.produces :dir => pkgdir, :includes => '**/*.java'
>>           end
>>         end
>>       end
>>     end
>> 
>>     def requires()
>>       @requires ||= Buildr.artifacts(REQUIRES).each { |artifact| 
>> artifact.invoke }.map(& :to_s)
>>     end
>>   end
>> 
>>   def compile_jaxb(options = nil)
>>     jaxb_opts = {}
>>     JAXB_XJC.doWork jaxb_opts.merge(options || {})
>>   end
>> 
>> end
>> 
>> class Project
>>   include JAXB_XJC
>> end
>> end
>> 
>> 
>> 
>> 2) Use it in a project as
>> 
>> 
>> require 'jaxb-xjc'
>> 
>> ...
>> 
>>   desc 'REST API'
>>   define 'restapi' do
>>     compile.from compile_jaxb :outdir => _('target/generated-sources/xjc'),
>>                         :schemafile => _("src/main/resources/api.xsd"),
>>                          :package => "org.foo.api"
>>     package :jar, :id => 'restapi'
>>   end
>> 
>> 
>> 
>> 
>> 
>> --
>> Mark Petrovic
>> 
>> 
> 


--
Mark Petrovic


Reply via email to