Antwrap 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README ADDED
@@ -0,0 +1,13 @@
1
+ # antwrap
2
+ #
3
+ # Copyright Caleb Powell 2007
4
+ #
5
+ # Licensed under the LGPL, see the file COPYING in the distribution
6
+ #
7
+
8
+ https://rubyforge.org/projects/antwrap/
9
+
10
+ Questions?
11
+ Contact: caleb.powell@gmail.com
12
+
13
+ More documentation to come.
data/lib/antwrap.rb ADDED
@@ -0,0 +1,183 @@
1
+ # antwrap
2
+ #
3
+ # Copyright Caleb Powell 2007
4
+ #
5
+ # Licensed under the LGPL, see the file COPYING in the distribution
6
+ #
7
+ require 'fileutils'
8
+ require 'logger'
9
+ require 'java'
10
+
11
+ module ApacheAnt
12
+ include_class "org.apache.tools.ant.UnknownElement"
13
+ include_class "org.apache.tools.ant.RuntimeConfigurable"
14
+ include_class "org.apache.tools.ant.Project"
15
+ include_class "org.apache.tools.ant.DefaultLogger"
16
+ end
17
+
18
+ module JavaLang
19
+ include_class "java.lang.System"
20
+ end
21
+
22
+ @@log = Logger.new(STDOUT)
23
+ @@log.level = Logger::DEBUG
24
+
25
+ class AntTask
26
+ private
27
+ @@task_stack = Array.new
28
+ attr_reader :unknown_element, :project, :taskname
29
+
30
+ public
31
+ def initialize(taskname, project, attributes, proc)
32
+ @taskname = taskname
33
+ @project = project
34
+ @unknown_element = ApacheAnt::UnknownElement.new(taskname)
35
+ @unknown_element.project= project
36
+ @unknown_element.namespace= ''
37
+ @unknown_element.QName= taskname
38
+ @unknown_element.taskType= taskname
39
+ @unknown_element.taskName= taskname
40
+
41
+ wrapper = ApacheAnt::RuntimeConfigurable.new(@unknown_element, @unknown_element.getTaskName());
42
+ attributes.each do |key, val|
43
+ if(key.to_s != 'pcdata')
44
+ wrapper.setAttribute(key.to_s, val)
45
+ else
46
+ wrapper.addText(val)
47
+ end
48
+ end unless attributes == nil
49
+
50
+ if proc
51
+ @@log.debug("task_stack.push #{taskname} >> #{@@task_stack}")
52
+ @@task_stack.push self
53
+
54
+ singleton_class = class << proc; self; end
55
+ singleton_class.module_eval{
56
+ def method_missing(m, *a, &proc)
57
+ @@task_stack.last().send(m, *a, &proc)
58
+ end
59
+ }
60
+ proc.instance_eval &proc
61
+ @@task_stack.pop
62
+ end
63
+ end
64
+
65
+ def method_missing(sym, *args)
66
+ @@log.debug("AntTask.method_missing sym[#{sym.to_s}]")
67
+ begin
68
+ proc = block_given? ? Proc.new : nil
69
+ self.add(AntTask.new(sym.to_s, project, args[0], proc))
70
+ rescue StandardError
71
+ @@log.error("AntTask.method_missing error:" + $!)
72
+ end
73
+ end
74
+
75
+ def add(child)
76
+ @@log.debug("adding child[#{child.unknown_element().getTaskName()}] to [#{@unknown_element.getTaskName()}]")
77
+ @unknown_element.addChild(child.unknown_element())
78
+ @unknown_element.getRuntimeConfigurableWrapper().addChild(child.unknown_element().getRuntimeConfigurableWrapper())
79
+ end
80
+
81
+ def execute
82
+ @unknown_element.maybeConfigure
83
+ @unknown_element.execute
84
+ @executed = true
85
+ end
86
+
87
+ def was_executed?
88
+ @executed
89
+ end
90
+ end
91
+
92
+ class AntProject
93
+
94
+ attr :project, false
95
+ attr :declarative, true
96
+
97
+ def initialize(name='', default='', basedir='',declarative=true)
98
+ @project= ApacheAnt::Project.new
99
+ @project.name= name
100
+ @project.default= default
101
+ @project.basedir= basedir
102
+ @project.init
103
+ self.declarative= declarative
104
+ default_logger = ApacheAnt::DefaultLogger.new
105
+ default_logger.messageOutputLevel= 2
106
+ default_logger.outputPrintStream= JavaLang::System.out
107
+ default_logger.errorPrintStream= JavaLang::System.err
108
+ default_logger.emacsMode= false
109
+ @project.addBuildListener default_logger
110
+ end
111
+
112
+ def create_task(taskname, attributes, proc)
113
+ task = AntTask.new(taskname, project(), attributes, proc)
114
+ task.execute if declarative
115
+ if taskname == 'macrodef'
116
+ @@log.debug("Pushing #{attributes[:name]} to tasks")
117
+ @@tasks.push(attributes[:name])
118
+ end
119
+ task
120
+ end
121
+
122
+ def method_missing(sym, *args)
123
+ if(@@tasks.include?(sym.to_s) || @@types.include?(sym.to_s))
124
+ begin
125
+ @@log.info("AntProject.method_missing sym[#{sym.to_s}]")
126
+ proc = block_given? ? Proc.new : nil
127
+ return create_task(sym.to_s, args[0], proc)
128
+ rescue
129
+ @@log.error("Error instantiating task[#{sym.to_s}]" + $!)
130
+ end
131
+ else
132
+ @@log.error("Not an Ant Task[#{sym.to_s}]")
133
+ end
134
+ end
135
+
136
+ #overridden. 'mkdir' conflicts wth the rake library.
137
+ def mkdir(attributes)
138
+ create_task('mkdir', attributes, (block_given? ? Proc.new : nil))
139
+ end
140
+
141
+ #overridden. 'copy' conflicts wth the rake library.
142
+ def copy(attributes)
143
+ create_task('copy', attributes, (block_given? ? Proc.new : nil))
144
+ end
145
+
146
+ #overridden. 'java' conflicts wth the JRuby library.
147
+ def jvm(attributes)
148
+ create_task('java', attributes, (block_given? ? Proc.new : nil))
149
+ end
150
+
151
+ @@tasks = [
152
+ # standard ant tasks
153
+ 'mkdir', 'javac', 'chmod', 'delete', 'copy', 'move', 'jar', 'rmic', 'cvs', 'get', 'unzip',
154
+ 'unjar', 'unwar', 'echo', 'javadoc', 'zip', 'gzip', 'gunzip', 'replace', 'java', 'tstamp', 'property',
155
+ 'xmlproperty', 'taskdef', 'ant', 'exec', 'tar', 'untar', 'available', 'filter', 'fixcrlf', 'patch',
156
+ 'style', 'xslt', 'touch', 'signjar', 'genkey', 'antstructure', 'execon', 'antcall', 'sql', 'mail',
157
+ 'fail', 'war', 'uptodate', 'apply', 'record', 'cvspass', 'typedef', 'sleep', 'pathconvert', 'ear',
158
+ 'parallel', 'sequential', 'condition', 'dependset', 'bzip2', 'bunzip2', 'checksum', 'waitfor', 'input',
159
+ 'loadfile', 'manifest', 'loadproperties', 'basename', 'dirname', 'cvschangelog', 'cvsversion', 'buildnumber',
160
+ 'concat', 'cvstagdiff', 'tempfile', 'import', 'whichresource', 'subant', 'sync', 'defaultexcludes', 'presetdef',
161
+ 'macrodef', 'nice', 'length',
162
+ # optional tasks
163
+ 'image', 'script', 'netrexxc', 'renameext', 'ejbc', 'ddcreator', 'wlrun', 'wlstop', 'vssadd', 'vsscheckin', 'vsscheckout',
164
+ 'vsscp', 'vsscreate', 'vssget', 'vsshistory', 'vsslabel', 'ejbjar', 'mparse', 'mmetrics', 'maudit', 'junit', 'cab',
165
+ 'ftp', 'icontract', 'javacc', 'jjdoc', 'jjtree', 'stcheckout', 'stcheckin', 'stlabel', 'stlist', 'wljspc', 'jlink',
166
+ 'native2ascii', 'propertyfile', 'depend', 'antlr', 'vajload', 'vajexport', 'vajimport', 'telnet', 'csc', 'ilasm',
167
+ 'WsdlToDotnet', 'wsdltodotnet', 'importtypelib', 'stylebook', 'test', 'pvcs', 'p4change', 'p4delete', 'p4label', 'p4labelsync',
168
+ 'p4have', 'p4sync', 'p4edit', 'p4integrate', 'p4resolve', 'p4submit', 'p4counter', 'p4revert', 'p4reopen', 'p4fstat', 'javah',
169
+ 'ccupdate', 'cccheckout', 'cccheckin', 'ccuncheckout', 'ccmklbtype', 'ccmklabel', 'ccrmtype', 'cclock', 'ccunlock', 'ccmkbl',
170
+ 'ccmkattr', 'ccmkelem', 'ccmkdir', 'sound', 'junitreport', 'blgenclient', 'rpm', 'xmlvalidate', 'iplanet-ejbc', 'jdepend',
171
+ 'mimemail', 'ccmcheckin', 'ccmcheckout', 'ccmcheckintask', 'ccmreconfigure', 'ccmcreatetask', 'jpcoverage', 'jpcovmerge',
172
+ 'jpcovreport', 'p4add', 'jspc', 'replaceregexp', 'translate', 'sosget', 'soscheckin','soscheckout','soslabel', 'echoproperties',
173
+ 'splash', 'serverdeploy', 'jarlib-display', 'jarlib-manifest', 'jarlib-available', 'jarlib-resolve', 'setproxy', 'vbc', 'symlink',
174
+ 'chgrp', 'chown', 'attrib', 'scp', 'sshexec', 'jsharpc', 'rexec', 'scriptdef', 'ildasm',
175
+ # deprecated ant tasks (kept for back compatibility)
176
+ 'starteam', 'javadoc2', 'copydir', 'copyfile', 'deltree', 'rename']
177
+
178
+ @@types = [ 'classfileset', 'description', 'dirset', 'filelist', 'fileset', 'filterchain', 'filterreader', 'filterset', 'mapper', 'redirector',
179
+ 'identitymapper', 'flattenmapper', 'globmapper', 'mergemapper', 'regexpmapper', 'packagemapper', 'unpackagemapper', 'compositemapper',
180
+ 'chainedmapper', 'filtermapper', 'path', 'patternset', 'regexp', 'substitution', 'xmlcatalog', 'extensionSet', 'extension', 'libfileset',
181
+ 'selector', 'zipfileset', 'scriptfilter', 'propertyset', 'assertions', 'concatfilter', 'isfileselected' ]
182
+
183
+ end
data/lib/convert.rb ADDED
@@ -0,0 +1,84 @@
1
+ # antwrap
2
+ #
3
+ # Copyright Caleb Powell 2007
4
+ #
5
+ # Licensed under the LGPL, see the file COPYING in the distribution
6
+ #
7
+ require 'rexml/document'
8
+ @outfile = File.new('/Users/caleb/projects/antwrap/test/output/Rakefile.rb', 'w+')
9
+ xml = REXML::Document.new(File.open('/Users/caleb/projects/antwrap/test/test-resources/build.xml'))
10
+
11
+
12
+ def create_symbol(str)
13
+ str = rubyize(str)
14
+ return str.gsub(/(\w*[^,\s])/, ':\1')
15
+ end
16
+ def rubyize(str)
17
+ if (str == nil)
18
+ str = ''
19
+ else
20
+ str = str.gsub(/(\w*)[\-|\.](\w*)/, '\1_\2')
21
+ end
22
+ return str
23
+ end
24
+
25
+
26
+ @outfile.print "require_gem 'Antwrap'\n"
27
+ @outfile.print "@ant = AntProject.new()\n"
28
+ @one_tab= ' '
29
+ def print_task(task, tab=@one_tab, prefix='')
30
+ task_name = rubyize(task.name)
31
+ @outfile.print "#{tab}#{prefix}#{task_name}("
32
+
33
+ if(task_name == 'macrodef')
34
+ task.attributes['name'] = rubyize(task.attributes['name'])
35
+ end
36
+ isFirst = true;
37
+ task.attributes.each do |key, value|
38
+ if !isFirst
39
+ @outfile.print(",\n#{tab+@one_tab}")
40
+ end
41
+ @outfile.print ":#{key} => \"#{value}\""
42
+ isFirst = false;
43
+ end
44
+
45
+ if task.has_text?
46
+ pcdata = task.texts().join
47
+ if(pcdata.strip() != '')
48
+ @outfile.print ":pcdata => \"#{pcdata}\""
49
+ end
50
+ end
51
+ @outfile.print ")"
52
+
53
+
54
+ if task.elements.size > 0
55
+ @outfile.print "{"
56
+ task.elements.each do |child|
57
+ @outfile.print "\n"
58
+ print_task(child, (tab+@one_tab), '')
59
+ end
60
+ @outfile.print "\n#{tab}}"
61
+ end
62
+ end
63
+
64
+ xml.elements.each("/project/*") do |node|
65
+ if node.name != 'target'
66
+ print_task(node, '', '@ant.')
67
+ @outfile.print "\n\n"
68
+ end
69
+ end
70
+
71
+ xml.elements.each("/project/target") do |node|
72
+
73
+ task = "\ntask " + create_symbol(node.attributes['name']) +
74
+ " => [" + create_symbol(node.attributes['depends']) + "] do\n"
75
+
76
+ @outfile.print task
77
+
78
+ node.elements.each do |child|
79
+ print_task(child, @one_tab, '@ant.')
80
+ @outfile.print "\n"
81
+ end
82
+ @outfile.print "end\n"
83
+ end
84
+
@@ -0,0 +1,3 @@
1
+ Manifest-Version: 1.0
2
+ Created-By: 1.5.0_06 (Apple Computer, Inc.)
3
+
@@ -0,0 +1,208 @@
1
+ # antwrap
2
+ #
3
+ # Copyright Caleb Powell 2007
4
+ #
5
+ # Licensed under the LGPL, see the file COPYING in the distribution
6
+ #
7
+ require 'test/unit'
8
+ require 'fileutils'
9
+ require '../lib/antwrap.rb'
10
+
11
+ class TestAntwrap < Test::Unit::TestCase
12
+
13
+ def setup
14
+ # ENV is broken as of JRuby 0.9.2 but patched in 0.9.3 (see: http://jira.codehaus.org/browse/JRUBY-349)
15
+ # @output_dir = ENV['PWD'] + '/output'
16
+ # @resource_dir = ENV['PWD'] + '/test-resources'
17
+ # The following is a workaround
18
+ current_dir = Java::java.lang.System.getProperty("user.dir")
19
+ @ant = AntProject.new("testProject", "", current_dir, true)
20
+ @output_dir = current_dir + '/test/output'
21
+ @resource_dir = current_dir + '/test/test-resources'
22
+
23
+ if File.exists?(@output_dir)
24
+ FileUtils.remove_dir(@output_dir)
25
+ end
26
+ FileUtils.mkdir(@output_dir, :mode => 0775)
27
+ end
28
+
29
+ def teardown
30
+
31
+ end
32
+
33
+ def test_unzip_task
34
+ assert_absent @output_dir + '/parent/FooBarParent.class'
35
+ task = @ant.unzip(:src => @resource_dir + '/parent.jar',
36
+ :dest => @output_dir)
37
+
38
+ assert_exists @output_dir + '/parent/FooBarParent.class'
39
+ end
40
+
41
+ def test_copyanddelete_task
42
+ file = @output_dir + '/foo.txt'
43
+ assert_absent file
44
+ @ant.copy(:file => @resource_dir + '/foo.txt',
45
+ :todir => @output_dir)
46
+ assert_exists file
47
+
48
+ @ant.delete(:file => file)
49
+ assert_absent file
50
+ end
51
+
52
+ # <javac srcdir='${src}'
53
+ # destdir='${build}'
54
+ # classpath='xyz.jar'
55
+ # debug='on'
56
+ # source='1.4'/>
57
+ def test_javac_task
58
+ FileUtils.mkdir(@output_dir + '/classes', :mode => 0775)
59
+
60
+ assert_absent @output_dir + '/classes/foo/bar/FooBar.class'
61
+
62
+ @ant.javac(:srcdir => @resource_dir + '/src',
63
+ :destdir => @output_dir + '/classes',
64
+ :debug => 'on',
65
+ :verbose => 'no',
66
+ :fork => 'no',
67
+ :failonerror => 'yes',
68
+ :includes => 'foo/bar/**',
69
+ :excludes => 'foo/bar/baz/**',
70
+ :classpath => @resource_dir + '/parent.jar')
71
+
72
+ assert_exists @output_dir + '/classes/foo/bar/FooBar.class'
73
+ assert_absent @output_dir + '/classes/foo/bar/baz/FooBarBaz.class'
74
+ end
75
+
76
+ def test_javac_task_with_property
77
+ FileUtils.mkdir(@output_dir + '/classes', :mode => 0775)
78
+
79
+ assert_absent @output_dir + '/classes/foo/bar/FooBar.class'
80
+ # <path id="common.class.path">
81
+ # <fileset dir="${common.dir}/lib">
82
+ # <include name="**/*.jar"/>
83
+ # </fileset>
84
+ # <pathelement location="${common.classes}"/>
85
+ # </path>
86
+ @ant.property(:name => 'pattern', :value => '**/*.jar')
87
+ @ant.property(:name => 'resource_dir', :value => @resource_dir)
88
+ @ant.path(:id => 'common.class.path'){
89
+ fileset(:dir => '${resource_dir}'){
90
+ include(:name => '${pattern}')
91
+ }
92
+ }
93
+
94
+ @ant.javac(:srcdir => @resource_dir + '/src',
95
+ :destdir => @output_dir + '/classes',
96
+ :debug => 'on',
97
+ :verbose => 'no',
98
+ :fork => 'no',
99
+ :failonerror => 'yes',
100
+ :includes => 'foo/bar/**',
101
+ :excludes => 'foo/bar/baz/**',
102
+ :classpathref => 'common.class.path')
103
+
104
+ assert_exists @output_dir + '/classes/foo/bar/FooBar.class'
105
+ assert_absent @output_dir + '/classes/foo/bar/baz/FooBarBaz.class'
106
+ end
107
+
108
+ # <jar destfile='${dist}/lib/app.jar' basedir='${build}/classes'/>
109
+ def test_jar_task
110
+ assert_absent @output_dir + '/Foo.jar'
111
+ @ant.property(:name => 'outputdir', :value => @output_dir)
112
+ @ant.property(:name => 'destfile', :value => '${outputdir}/Foo.jar')
113
+ @ant.jar( :destfile => "${destfile}",
114
+ :basedir => @resource_dir + '/src',
115
+ :level => '9',
116
+ :duplicate => 'preserve')
117
+
118
+ assert_exists @output_dir + '/Foo.jar'
119
+ end
120
+
121
+ # <java classname="test.Main">
122
+ # <arg value="-h"/>
123
+ # <classpath>
124
+ # <pathelement location="dist/test.jar"/>
125
+ # <pathelement path="${java.class.path}"/>
126
+ # </classpath>
127
+ # </java>
128
+ def test_java_task
129
+ FileUtils.mkdir(@output_dir + '/classes', :mode => 0775)
130
+ @ant.javac(:srcdir => @resource_dir + '/src',
131
+ :destdir => @output_dir + '/classes',
132
+ :debug => 'on',
133
+ :verbose => 'no',
134
+ :fork => 'no',
135
+ :failonerror => 'yes',
136
+ :includes => 'foo/bar/**',
137
+ :excludes => 'foo/bar/baz/**',
138
+ :classpath => @resource_dir + '/parent.jar')
139
+
140
+ @ant.property(:name => 'output_dir', :value => @output_dir)
141
+ @ant.property(:name => 'resource_dir', :value =>@resource_dir)
142
+ @ant.jvm(:classname => 'foo.bar.FooBar', :fork => 'no') {
143
+ arg(:value => 'argOne')
144
+ classpath(){
145
+ pathelement(:location => '${output_dir}/classes')
146
+ pathelement(:location => '${resource_dir}/parent.jar')
147
+ }
148
+ arg(:value => 'argTwo')
149
+ jvmarg(:value => 'server')
150
+ sysproperty(:key=> 'antwrap', :value => 'coolio')
151
+ }
152
+ end
153
+
154
+ def test_echo_task
155
+ @ant.echo(:message => "Antwrap is running an Echo task", :level => 'info')
156
+ end
157
+
158
+ def test_mkdir_task
159
+ dir = @output_dir + '/foo'
160
+
161
+ assert_absent dir
162
+
163
+ @ant.mkdir(:dir => dir)
164
+
165
+ assert_exists dir
166
+ end
167
+
168
+ def test_mkdir_task_with_property
169
+ dir = @output_dir + '/foo'
170
+
171
+ assert_absent dir
172
+
173
+ @ant.property(:name => 'outputProperty', :value => dir)
174
+ @ant.mkdir(:dir => "${outputProperty}")
175
+
176
+ assert_exists dir
177
+ end
178
+
179
+ def test_macrodef_task
180
+ dir = @output_dir + '/foo'
181
+
182
+ assert_absent dir
183
+
184
+ @ant.macrodef(:name => 'testmacrodef'){
185
+ attribute(:name => 'destination')
186
+ sequential(){
187
+ echo(:message => "Creating @{destination}")
188
+ mkdir(:dir => "@{destination}")
189
+ }
190
+ }
191
+ @ant.testmacrodef(:destination => dir)
192
+ assert_exists dir
193
+
194
+ end
195
+
196
+ def test_cdata
197
+ @ant.echo(:pcdata => "Foobar &amp; <><><>")
198
+ end
199
+
200
+ private
201
+ def assert_exists(file_path)
202
+ assert(File.exists?(file_path), "Does not exist[#{file_path}]")
203
+ end
204
+
205
+ def assert_absent(file_path)
206
+ assert(!File.exists?(file_path), "Should not exist[#{file_path}]")
207
+ end
208
+ end