buildr-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Petrovic <mspetro...@gmail.com>
Subject Re: JAXB XJC module
Date Tue, 07 Sep 2010 18:56:12 GMT
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



Mime
View raw message