Antwrap 0.1

Sign up to get free protection for your applications and to get access to all the features.
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