rubylet-tasks 0.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Common Ground Publishing
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/examples/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+ gem 'rubylet-tasks', :path => '../'
3
+ gem 'rubylet', :path => '../../rubylet'
4
+ gem 'rack'
@@ -0,0 +1,28 @@
1
+ PATH
2
+ remote: ../
3
+ specs:
4
+ rubylet-tasks (0.1.0-java)
5
+ builder
6
+ rake
7
+ zip
8
+
9
+ PATH
10
+ remote: ../../rubylet
11
+ specs:
12
+ rubylet (0.1-java)
13
+
14
+ GEM
15
+ remote: http://rubygems.org/
16
+ specs:
17
+ builder (3.1.4)
18
+ rack (1.4.1)
19
+ rake (10.0.2)
20
+ zip (2.0.2)
21
+
22
+ PLATFORMS
23
+ java
24
+
25
+ DEPENDENCIES
26
+ rack
27
+ rubylet!
28
+ rubylet-tasks!
data/examples/Gemfile~ ADDED
@@ -0,0 +1,2 @@
1
+ source 'http://rubygems.org'
2
+ gemspec
data/examples/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'rubylet/war_task'
2
+
3
+ Rubylet::WarTask.new do |w|
4
+ w.name = 'test_app'
5
+ w.external_jruby
6
+ w.rubylet do |r|
7
+ r.name = 'example'
8
+ # if you cannot add 'rubylet' to the Gemfile, list it here.
9
+ # r.gem 'rubylet', '>= 0'
10
+ end
11
+ end
@@ -0,0 +1 @@
1
+ require 'rubylet/war_task'
@@ -0,0 +1,3 @@
1
+ run proc {
2
+ [200, {'Content-Type' => 'text/plain'}, ['Hello, World']]
3
+ }
Binary file
File without changes
Binary file
@@ -0,0 +1,9 @@
1
+ module Rubylet
2
+ module BuilderAliasTag
3
+ def alias_tag(tag_name, method_name = tag_name.downcase.gsub('-', '_'))
4
+ define_method(method_name.to_sym) do |*args, &block|
5
+ tag!(tag_name, *args, &block)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ module Rubylet
2
+ module BuilderDefaults
3
+ def initialize(options = {})
4
+ super({ :indent => 2 }.merge(options))
5
+ instruct!
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,29 @@
1
+ require 'builder'
2
+ require 'rubylet/builder_alias_tag'
3
+ require 'rubylet/builder_defaults'
4
+
5
+ module Rubylet
6
+ class GlassfishDescriptorBuilder < ::Builder::XmlMarkup
7
+ extend BuilderAliasTag
8
+ include BuilderDefaults
9
+
10
+ alias_tag 'glassfish-web-app'
11
+ alias_tag 'resource-ref'
12
+ alias_tag 'res-ref-name'
13
+ alias_tag 'jndi-name'
14
+
15
+ def initialize(opts = {})
16
+ super(opts)
17
+ @alt_root_count = 0
18
+ declare!(:DOCTYPE, :'glassfish-web-app', :PUBLIC,
19
+ '-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN',
20
+ 'http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd')
21
+ end
22
+
23
+ def alternate_doc_root!(from, dir)
24
+ @alt_root_count += 1
25
+ property(:name => "alternatedocroot_#{@alt_root_count}",
26
+ :value => "from=#{from} dir=#{dir}")
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ require 'builder'
2
+ require 'rubylet/builder_alias_tag'
3
+ require 'rubylet/builder_defaults'
4
+
5
+ module Rubylet
6
+ class JettyDescriptorBuilder < ::Builder::XmlMarkup
7
+ extend BuilderAliasTag
8
+ include BuilderDefaults
9
+
10
+ alias_tag 'Configure'
11
+ alias_tag 'Set'
12
+
13
+ def initialize(opts = {})
14
+ super(opts)
15
+ declare!(:DOCTYPE, :Configure, :PUBLIC,
16
+ '-//Jetty//Configure//EN',
17
+ 'http://www.eclipse.org/jetty/configure.dtd')
18
+ end
19
+
20
+ def configure!(&block)
21
+ configure :class => 'org.eclipse.jetty.webapp.WebAppContext', &block
22
+ end
23
+
24
+ def set!(name, value)
25
+ set value, :name => name
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,398 @@
1
+ require 'fileutils'
2
+ require 'rake/tasklib'
3
+ require 'zip/zipfilesystem'
4
+
5
+ require 'rubylet/webapp_descriptor_builder'
6
+ require 'rubylet/glassfish_descriptor_builder'
7
+ require 'rubylet/jetty_descriptor_builder'
8
+
9
+ module ParamAccessor
10
+ # Define a 'param', like attr_accessor, but with an optional default
11
+ # value. If params are defined as objects that respond to +:call+
12
+ # (e.g. a +Proc+) or a block is given, the proc or block will be
13
+ # instance_eval'ed in the context of the instance once on first
14
+ # read, after which the value is cached and returned on subsequent
15
+ # reads.
16
+ def param_accessor(sym, default = nil, &block)
17
+ if !default.nil? && block_given?
18
+ raise ArgumentError, 'both default value and block may not be given'
19
+ end
20
+
21
+ iv = "@#{sym}"
22
+ define_method(sym) do
23
+ v = instance_variable_get(iv)
24
+ val = if !v.nil?
25
+ v
26
+ elsif !default.nil?
27
+ default
28
+ elsif block_given?
29
+ block
30
+ else
31
+ nil
32
+ end
33
+
34
+ if val.respond_to?(:call)
35
+ newval = instance_eval(&val)
36
+ instance_variable_set(iv, newval)
37
+ newval
38
+ else
39
+ val
40
+ end
41
+ end
42
+
43
+ define_method("#{sym}=") do |val|
44
+ instance_variable_set(iv, val)
45
+ end
46
+ end
47
+ end
48
+
49
+ module CommonParams
50
+ extend ParamAccessor
51
+
52
+ param_accessor :jruby_home do
53
+ unless self.respond_to?(:webapp) && webapp.jruby_home
54
+ # default to the current JRuby
55
+ if defined? JRUBY_VERSION
56
+ regex = %r{/lib/ruby/site_ruby.*}
57
+ $:.find { |p| p =~ regex }.gsub(regex, '')
58
+ else
59
+ raise "Please set jruby_home for rake task #{self}"
60
+ end
61
+ end
62
+ end
63
+
64
+ param_accessor :env do
65
+ {}
66
+ end
67
+
68
+ param_accessor :gems do
69
+ []
70
+ end
71
+
72
+ def gem(name, req = '>= 0')
73
+ gems << [name, req]
74
+ end
75
+
76
+ # If +bundle exec+ equivalent should be used when running the
77
+ # webapp. Defaults to true if +Gemfile+ exists, otherwise false.
78
+ param_accessor :bundle_exec, File.exists?('Gemfile')
79
+
80
+ param_accessor :boot
81
+
82
+ param_accessor :app_root, Dir.pwd
83
+
84
+ param_accessor :servlet_class
85
+
86
+ # Directory from which to serve static files. Defaults to
87
+ # "#{app_root}/public".
88
+ param_accessor :resource_base do
89
+ ::File.join(app_root, 'public')
90
+ end
91
+
92
+ param_accessor :compile_mode
93
+
94
+ param_accessor :compat_version
95
+
96
+ # CONCURRENT and SINGLETON are classloader shared singletons!
97
+ # Probably not what you want when deploying multiple apps to one
98
+ # servlet container. So it's between THREADSAFE and SINGLETHREAD.
99
+ # Default: unspecified; uses rubylet default of THREADSAFE.
100
+ param_accessor :local_context_scope
101
+
102
+ def common_params
103
+ yield 'jrubyHome', jruby_home
104
+ env.each do |key, value|
105
+ yield "env.#{key}", value
106
+ end
107
+ gems.each do |(name, req)|
108
+ yield "gem.#{name}", req
109
+ end
110
+ yield 'bundleExec', bundle_exec
111
+ yield 'boot', boot
112
+ yield 'servletClass', servlet_class
113
+ yield 'appRoot', app_root
114
+ yield 'compileMode', compile_mode
115
+ yield 'compatVersion', compat_version
116
+ yield 'localContextScope', local_context_scope
117
+ end
118
+ end
119
+
120
+ class StaticFileFilter
121
+ extend ParamAccessor
122
+
123
+ param_accessor :name, 'StaticFileFilter'
124
+
125
+ param_accessor :java_class, 'com.commongroundpublishing.rubylet.StaticFileFilter'
126
+
127
+ param_accessor :doc_base
128
+
129
+ param_accessor :async_supported, false
130
+
131
+ param_accessor :url_pattern, '/*'
132
+
133
+ # @param [WebappDescriptorBuilder] w
134
+ def call(w)
135
+ w.filter { |f|
136
+ f.filter_name name
137
+ f.filter_class java_class
138
+ f.init_param! 'docBase', doc_base
139
+ f.async_supported async_supported if async_supported
140
+ }
141
+ w.filter_mapping { |f|
142
+ f.filter_name name
143
+ f.url_pattern url_pattern
144
+ }
145
+ end
146
+ end
147
+
148
+ class RubyletDescriptor
149
+ extend ParamAccessor
150
+ include CommonParams
151
+
152
+ param_accessor :name do
153
+ "Rubylet - #{File.basename(app_root)}"
154
+ end
155
+
156
+ param_accessor :java_servlet_class, 'com.commongroundpublishing.rubylet.Servlet'
157
+
158
+ param_accessor :url_pattern, '/*'
159
+
160
+ param_accessor :servlet_path do
161
+ # if url_pattern is (alpha-numeric or slashes)/*
162
+ if url_pattern =~ /^([\w\/]+)\/\*$/
163
+ $1
164
+ end
165
+ end
166
+
167
+ param_accessor :async_supported, false
168
+
169
+ attr_reader :webapp
170
+
171
+ def initialize(webapp)
172
+ @webapp = webapp
173
+ end
174
+
175
+ # @param [WebappDescriptorBuilder] w
176
+ def call(w)
177
+ w.servlet { |s|
178
+ s.servlet_name name
179
+ s.servlet_class java_servlet_class
180
+ common_params do |key, value|
181
+ s.init_param! key, value
182
+ end
183
+ s.init_param! 'servletPath', servlet_path
184
+ s.load_on_startup 1
185
+ s.async_supported async_supported if async_supported
186
+ }
187
+
188
+ w.servlet_mapping { |s|
189
+ s.servlet_name name
190
+ s.url_pattern url_pattern
191
+ }
192
+ end
193
+ end
194
+
195
+ module Rubylet
196
+ class WarTask < Rake::TaskLib
197
+ extend ParamAccessor
198
+ include CommonParams
199
+
200
+ # The name of the web application. The WAR file output will be
201
+ # derived from this, +"#{name}.war"+.
202
+ param_accessor :name, 'webapp'
203
+
204
+ # The directory in which to create the WAR file. Defaults to +./pkg+.
205
+ param_accessor :output_directory, ::File.join(Dir.pwd, 'pkg')
206
+
207
+ param_accessor :java_servlets_version, '3.0'
208
+
209
+ param_accessor :display_name do
210
+ "#{name}"
211
+ end
212
+
213
+ param_accessor(:listeners) { [] }
214
+
215
+ param_accessor(:filters) { [] }
216
+
217
+ param_accessor(:servlets) { [] }
218
+
219
+ # TODO: currently does not work with Jetty
220
+ param_accessor(:resources) { [] }
221
+
222
+ def initialize
223
+ yield(self) if block_given?
224
+ define
225
+ end
226
+
227
+ def filter(&block)
228
+ filters << block
229
+ end
230
+
231
+ def external_jruby
232
+ listeners << proc do |w|
233
+ w.listener! 'com.commongroundpublishing.rubylet.ExternalJRubyLoader'
234
+ end
235
+ end
236
+
237
+ def static_file_filter
238
+ f = StaticFileFilter.new
239
+ yield(f) if block_given?
240
+ filters << f
241
+ end
242
+
243
+ def servlet(&block)
244
+ servlets << block
245
+ end
246
+
247
+ def rubylet
248
+ s = RubyletDescriptor.new(self)
249
+ yield(s) if block_given?
250
+ servlets << s
251
+ end
252
+
253
+ def webapp_descriptor(opts = {})
254
+ builder = WebappDescriptorBuilder.new(opts)
255
+ builder.web_app!(java_servlets_version) { |w|
256
+ w.display_name display_name()
257
+
258
+ # If defined as context params, will apply to all Rubylet servlets
259
+ common_params do |key, value|
260
+ w.context_param! key, value
261
+ end
262
+
263
+ listeners.each do |block|
264
+ block.call(w)
265
+ end
266
+
267
+ filters.each do |block|
268
+ block.call(w)
269
+ end
270
+
271
+ servlets.each do |block|
272
+ block.call(w)
273
+ end
274
+
275
+ resources.each do |res|
276
+ w.resource_ref do |r|
277
+ r.description(res[:description]) if res[:description]
278
+ r.res_ref_name(res[:name])
279
+ r.res_type(res[:type] || 'javax.sql.DataSource')
280
+ r.res_auth(res[:auth] || 'Container')
281
+ end
282
+ end
283
+ }
284
+ end
285
+
286
+ def glassfish_descriptor(opts = {})
287
+ builder = GlassfishDescriptorBuilder.new(opts)
288
+ builder.glassfish_web_app { |w|
289
+ w.alternate_doc_root!('/*', resource_base)
290
+ resources.each do |res|
291
+ w.resource_ref do |r|
292
+ r.res_ref_name res[:name]
293
+ r.jndi_name res[:jndi_name] || res[:name]
294
+ end
295
+ end
296
+ }
297
+ end
298
+
299
+ def jetty_descriptor(opts = {})
300
+ builder = JettyDescriptorBuilder.new(opts)
301
+ builder.configure! { |c|
302
+ c.set!('resourceBase', resource_base)
303
+ }
304
+ end
305
+
306
+ def rubylet_jar
307
+ base = ::File.expand_path('../..', __FILE__)
308
+ jar = Dir[::File.join(base, 'rubylet-ee-*.jar')].first
309
+ unless jar
310
+ raise 'cannot find rubylet-ee-VERSION.jar; was this gem built correctly?'
311
+ end
312
+ jar
313
+ end
314
+
315
+ def war(warfile)
316
+ Zip::ZipFile.open(warfile, Zip::ZipFile::CREATE) do |z|
317
+ z.dir.mkdir('WEB-INF')
318
+ z.file.open('WEB-INF/web.xml', 'w') do |f|
319
+ webapp_descriptor(:target => f)
320
+ end
321
+ z.file.open('WEB-INF/jetty-web.xml', 'w') do |f|
322
+ jetty_descriptor(:target => f)
323
+ end
324
+ z.file.open('WEB-INF/glassfish-web.xml', 'w') do |f|
325
+ glassfish_descriptor(:target => f)
326
+ end
327
+
328
+ container = rubylet_jar
329
+ z.dir.mkdir('WEB-INF/lib')
330
+ z.file.open("WEB-INF/lib/#{::File.basename(container)}", 'w') do |f|
331
+ ::File.open(container) do |input|
332
+ buf = ''
333
+ while input.read(4096, buf)
334
+ f.write(buf)
335
+ end
336
+ end
337
+ end
338
+ end
339
+ end
340
+
341
+ # Runs maven if we are a JRuby process. Currently not used.
342
+ #
343
+ # See http://watchitlater.com/blog/2011/08/jruby-rake-and-maven/
344
+ def mvn(*args)
345
+ mvn = catch(:mvn) do
346
+ ENV['PATH'].split(::File::PATH_SEPARATOR).each do |path|
347
+ Dir.glob(::File.join(path, 'mvn')).each do |file|
348
+ if ::File.executable?(file)
349
+ throw :mvn, if ::File.symlink?(file)
350
+ ::File.readlink(file)
351
+ else
352
+ file
353
+ end
354
+ end
355
+ end
356
+ end
357
+ end
358
+
359
+ raise 'No maven found on $PATH' unless mvn
360
+
361
+ mvn_home = ::File.expand_path(::File.join(mvn, '..', '..'))
362
+ m2_conf = ::File.expand_path(::File.join(mvn_home, 'bin', 'm2.conf'))
363
+
364
+ java.lang.System.setProperty('maven.home', mvn_home)
365
+ java.lang.System.setProperty('classworlds.conf', m2_conf)
366
+
367
+ Dir[::File.join(mvn_home, 'boot', '*.jar')].each do |jar|
368
+ require jar
369
+ end
370
+ launcher = Java::org.codehaus.plexus.classworlds.launcher.Launcher
371
+ exit_code = launcher.mainWithExitCode(args.flatten.to_java(:string))
372
+ raise "Maven exited #{exit_code}" unless exit_code == 0
373
+ end
374
+
375
+ private
376
+
377
+ def define
378
+ rakefile = 'Rakefile'
379
+ file rakefile
380
+
381
+ warfile = "#{output_directory}/#{name}.war"
382
+
383
+ file warfile => Dir['**/*rb'] do
384
+ ::File.delete(warfile) if ::File.exists?(warfile)
385
+ FileUtils.mkdir_p("#{output_directory}")
386
+ war(warfile)
387
+ end
388
+
389
+ desc 'Create a very-skinny WAR referencing an external Rack app'
390
+ task :war => [warfile, rakefile]
391
+
392
+ task :clean do
393
+ ::File.delete warfile
394
+ end
395
+ end
396
+
397
+ end
398
+ end
@@ -0,0 +1,90 @@
1
+ require 'builder'
2
+ require 'rubylet/builder_alias_tag'
3
+ require 'rubylet/builder_defaults'
4
+
5
+ module Rubylet
6
+ class WebappDescriptorBuilder < ::Builder::XmlMarkup
7
+ extend BuilderAliasTag
8
+ include BuilderDefaults
9
+
10
+ # def self.alias_tag(tag_name, method_name = tag_name.downcase.gsub('-', '_'))
11
+ # define_method(method_name.to_sym) do |*args, &block|
12
+ # tag!(tag_name, *args, &block)
13
+ # end
14
+ # end
15
+
16
+ alias_tag 'web-app'
17
+
18
+ alias_tag 'display-name'
19
+
20
+ alias_tag 'listener'
21
+ alias_tag 'listener-class'
22
+
23
+ alias_tag 'filter-name'
24
+ alias_tag 'filter-class'
25
+ alias_tag 'filter-mapping'
26
+
27
+ alias_tag 'servlet-name'
28
+ alias_tag 'servlet-class'
29
+ alias_tag 'servlet-mapping'
30
+ alias_tag 'async-supported'
31
+ alias_tag 'load-on-startup'
32
+
33
+ alias_tag 'url-pattern'
34
+ alias_tag 'context-param'
35
+ alias_tag 'init-param'
36
+ alias_tag 'param-name'
37
+ alias_tag 'param-value'
38
+
39
+ alias_tag 'resource-ref'
40
+ alias_tag 'description'
41
+ alias_tag 'res-ref-tag'
42
+ alias_tag 'res-ref-name'
43
+ alias_tag 'res-type'
44
+ alias_tag 'res-auth'
45
+
46
+ # Write a context param tag unless value is nil.
47
+ def context_param!(name, value)
48
+ return unless value
49
+ context_param { |p|
50
+ p.param_name name
51
+ p.param_value value
52
+ }
53
+ end
54
+
55
+ # Write an init param tag unless value is nil.
56
+ def init_param!(name, value)
57
+ return unless value
58
+ init_param { |p|
59
+ p.param_name name
60
+ p.param_value value
61
+ }
62
+ end
63
+
64
+ def listener!(klass)
65
+ listener { |w| w.listener_class(klass) }
66
+ end
67
+
68
+ def web_app!(version, metadata_complete = true, &block)
69
+ xmlns, schema_loc =
70
+ case version.to_s
71
+ when '2.5'
72
+ j2ee = 'http://java.sun.com/xml/ns/j2ee'
73
+ [j2ee, "#{j2ee}/web-app_2_5.xsd"]
74
+ when '3.0'
75
+ javaee = 'http://java.sun.com/xml/ns/javaee'
76
+ [javaee, "#{javaee} #{javaee}/web-app_3_0.xsd"]
77
+ else
78
+ raise ArgumentError, "unknown java servlet version #{version}"
79
+ end
80
+
81
+ web_app('xmlns' => xmlns,
82
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
83
+ 'xsi:schemaLocation' => schema_loc,
84
+ 'version' => version.to_s,
85
+ 'metadata-complete' => metadata_complete,
86
+ &block)
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+ require 'rubylet/war_task'
3
+
4
+ module Rubylet
5
+ JAVAEE_SCHEMA = 'http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd'
6
+
7
+ describe WarTask do
8
+
9
+ before :each do
10
+ @task = WarTask.new
11
+ end
12
+
13
+ it 'generates web.xml' do
14
+ xml = @task.webapp_descriptor
15
+ xml.must_validate JAVAEE_SCHEMA
16
+ end
17
+
18
+ it 'generates glassfish-web.xml' do
19
+ @task.glassfish_descriptor
20
+
21
+ end
22
+
23
+ it 'generates jetty-web.xml' do
24
+ @task.jetty_descriptor
25
+ end
26
+
27
+ it 'adds servlet descriptors' do
28
+ @task.compile_mode = 'JIT'
29
+ @task.static_file_filter
30
+ @task.rubylet do |s|
31
+ s.name = 'myname'
32
+ end
33
+ @task.rubylet do |s|
34
+ s.name = 'MyOtherServlet'
35
+ end
36
+ xml = @task.webapp_descriptor
37
+
38
+ xml.must_validate JAVAEE_SCHEMA
39
+
40
+ # puts xml
41
+ xml.must_match %r{<servlet-name>myname</servlet-name>}
42
+ xml.must_match %r{rubylet.Servlet</servlet-class>}
43
+ end
44
+
45
+ # it 'generate war' do
46
+ # Rake::Task['war'].invoke
47
+ # end
48
+
49
+ # it 'runs maven' do
50
+ # @task.mvn('--version')
51
+ # end
52
+
53
+ end
54
+ end
@@ -0,0 +1,55 @@
1
+ if RUBY_VERSION =~ /^1.8/
2
+ require 'rubygems'
3
+ gem 'minitest'
4
+ end
5
+
6
+ require 'minitest/spec'
7
+ require 'minitest/autorun'
8
+ require 'minitest/matchers'
9
+
10
+ # Validation matcher of XMl text against a schema. TODO: should fetch
11
+ # and report line number from underlying java exception.
12
+ #
13
+ # Requires Java.
14
+ class Validate
15
+ attr_reader :schema_url
16
+
17
+ attr_accessor :schema_url, :error
18
+
19
+ def initialize(schema_url)
20
+ @schema_url = schema_url
21
+ end
22
+
23
+ def failure_message
24
+ " expected no errors but got #{error}"
25
+ end
26
+
27
+ def negative_failure_message
28
+ ' expected errors but got none'
29
+ end
30
+
31
+ def description
32
+ "validate against XML schema #{schema_url}"
33
+ end
34
+
35
+ def matches?(subject)
36
+ factory =
37
+ Java::JavaxXmlValidation::SchemaFactory.newInstance('http://www.w3.org/2001/XMLSchema')
38
+
39
+ url = Java::JavaNet::URL.new(schema_url)
40
+ schema = factory.newSchema(url)
41
+ validator = schema.newValidator
42
+ reader = Java::JavaIO::StringReader.new(subject.to_s)
43
+ source = Java::JavaxXmlTransformStream::StreamSource.new(reader)
44
+
45
+ begin
46
+ validator.validate(source)
47
+ true
48
+ rescue => e
49
+ self.error = e.message
50
+ false
51
+ end
52
+ end
53
+ end
54
+
55
+ MiniTest::Unit::TestCase.register_matcher Validate, :validate
metadata ADDED
@@ -0,0 +1,192 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubylet-tasks
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: java
7
+ authors:
8
+ - CG Labs
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: builder
16
+ version_requirements: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ! '>='
19
+ - !ruby/object:Gem::Version
20
+ version: !binary |-
21
+ MA==
22
+ none: false
23
+ requirement: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ! '>='
26
+ - !ruby/object:Gem::Version
27
+ version: !binary |-
28
+ MA==
29
+ none: false
30
+ prerelease: false
31
+ type: :runtime
32
+ - !ruby/object:Gem::Dependency
33
+ name: rake
34
+ version_requirements: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: !binary |-
39
+ MA==
40
+ none: false
41
+ requirement: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: !binary |-
46
+ MA==
47
+ none: false
48
+ prerelease: false
49
+ type: :runtime
50
+ - !ruby/object:Gem::Dependency
51
+ name: zip
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: !binary |-
57
+ MA==
58
+ none: false
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: !binary |-
64
+ MA==
65
+ none: false
66
+ prerelease: false
67
+ type: :runtime
68
+ - !ruby/object:Gem::Dependency
69
+ name: mini_aether
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: !binary |-
75
+ MA==
76
+ none: false
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: !binary |-
82
+ MA==
83
+ none: false
84
+ prerelease: false
85
+ type: :development
86
+ - !ruby/object:Gem::Dependency
87
+ name: minitest
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: !binary |-
93
+ MA==
94
+ none: false
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: !binary |-
100
+ MA==
101
+ none: false
102
+ prerelease: false
103
+ type: :development
104
+ - !ruby/object:Gem::Dependency
105
+ name: minitest-matchers
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: !binary |-
111
+ MA==
112
+ none: false
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: !binary |-
118
+ MA==
119
+ none: false
120
+ prerelease: false
121
+ type: :development
122
+ - !ruby/object:Gem::Dependency
123
+ name: version
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ! '>='
127
+ - !ruby/object:Gem::Version
128
+ version: !binary |-
129
+ MA==
130
+ none: false
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: !binary |-
136
+ MA==
137
+ none: false
138
+ prerelease: false
139
+ type: :development
140
+ description: ''
141
+ email:
142
+ - eng@commongroundpublishing.com
143
+ executables: []
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - VERSION
148
+ - MIT-LICENSE
149
+ - lib/rubylet/builder_alias_tag.rb
150
+ - lib/rubylet/builder_defaults.rb
151
+ - lib/rubylet/war_task.rb
152
+ - lib/rubylet/webapp_descriptor_builder.rb
153
+ - lib/rubylet/jetty_descriptor_builder.rb
154
+ - lib/rubylet/glassfish_descriptor_builder.rb
155
+ - lib/rubylet-ee-0.1.0-SNAPSHOT.jar
156
+ - spec/spec_helper.rb
157
+ - spec/rubylet/war_task_spec.rb
158
+ - examples/Gemfile~
159
+ - examples/Gemfile
160
+ - examples/Rakefile~
161
+ - examples/Gemfile.lock
162
+ - examples/Rakefile
163
+ - examples/config.ru
164
+ - examples/pkg/test_app.war
165
+ - examples/tmp/restart.txt
166
+ homepage:
167
+ licenses: []
168
+ post_install_message:
169
+ rdoc_options: []
170
+ require_paths:
171
+ - lib
172
+ required_ruby_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ! '>='
175
+ - !ruby/object:Gem::Version
176
+ version: !binary |-
177
+ MA==
178
+ none: false
179
+ required_rubygems_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ! '>='
182
+ - !ruby/object:Gem::Version
183
+ version: !binary |-
184
+ MA==
185
+ none: false
186
+ requirements: []
187
+ rubyforge_project:
188
+ rubygems_version: 1.8.24
189
+ signing_key:
190
+ specification_version: 3
191
+ summary: Rake tasks for rubylet, rubylet-ee, and Java servlets
192
+ test_files: []