jnlp 0.7.3 → 0.8.0
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.
- checksums.yaml +7 -0
- data/History.txt +4 -0
- data/README.rdoc +31 -17
- data/lib/jnlp.rb +5 -1
- data/lib/jnlp/icon.rb +48 -0
- data/lib/jnlp/j2se.rb +79 -0
- data/lib/jnlp/jnlp.rb +62 -655
- data/lib/jnlp/property.rb +51 -0
- data/lib/jnlp/resource.rb +422 -0
- data/lib/jnlp/version.rb +2 -2
- metadata +88 -33
- data/lib/jnlp/rack_server.rb +0 -21
@@ -0,0 +1,51 @@
|
|
1
|
+
module Jnlp #:nodoc:
|
2
|
+
#
|
3
|
+
# Property objects encapsulate <property> elements present in a
|
4
|
+
# Java Web Start Jnlp <resources> element.
|
5
|
+
#
|
6
|
+
class Property
|
7
|
+
#
|
8
|
+
# Contains the Hpricot element parsed from the orginal Jnlp
|
9
|
+
# that was used to create the Property
|
10
|
+
#
|
11
|
+
attr_reader :property
|
12
|
+
#
|
13
|
+
# Contains the name of the Property
|
14
|
+
#
|
15
|
+
#
|
16
|
+
# Example:
|
17
|
+
#
|
18
|
+
# "maven.jnlp.version"
|
19
|
+
#
|
20
|
+
attr_reader :name
|
21
|
+
#
|
22
|
+
# Contains the value of the Property
|
23
|
+
#
|
24
|
+
#
|
25
|
+
# Example:
|
26
|
+
#
|
27
|
+
# "all-otrunk-snapshot-0.1.0-20080310.211515"
|
28
|
+
#
|
29
|
+
attr_reader :value
|
30
|
+
#
|
31
|
+
# Contains the value of the os attribute in the
|
32
|
+
# parent <resources> element that contains this property
|
33
|
+
# if the attribute was set in the parent.
|
34
|
+
# Example:
|
35
|
+
#
|
36
|
+
# "Mac OS X"
|
37
|
+
#
|
38
|
+
attr_reader :os
|
39
|
+
#
|
40
|
+
# Creates a new Jnlp::Property object.
|
41
|
+
# * _prop_: the Hpricot parsing of the specific jnlp/resources/property element
|
42
|
+
# * _os_: optional: include it if the resources parent element that contains the property has this attribute set
|
43
|
+
#
|
44
|
+
def initialize(prop, os=nil)
|
45
|
+
@property = prop
|
46
|
+
@name = prop['name']
|
47
|
+
@value = prop['value']
|
48
|
+
@os = os
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,422 @@
|
|
1
|
+
module Jnlp
|
2
|
+
#
|
3
|
+
# Jnlp::Resource objects encapsulate both jar and nativelib elements present in a
|
4
|
+
# Java Web Start Jnlp <resources> element.
|
5
|
+
#
|
6
|
+
class Resource
|
7
|
+
#
|
8
|
+
# Contains the Hpricot element parsed from the orginal Jnlp
|
9
|
+
# that was used to create the resource
|
10
|
+
#
|
11
|
+
attr_reader :resource
|
12
|
+
#
|
13
|
+
# Contains the path to the resource taken from the href attribute
|
14
|
+
#
|
15
|
+
# Example:
|
16
|
+
#
|
17
|
+
# "org/concord/httpclient/" || ""
|
18
|
+
#
|
19
|
+
attr_reader :href_path
|
20
|
+
#
|
21
|
+
# Contains the kind of the resource
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
#
|
25
|
+
# "jar" || "nativelib"
|
26
|
+
#
|
27
|
+
attr_reader :kind
|
28
|
+
#
|
29
|
+
# Contains the base name of the resource
|
30
|
+
#
|
31
|
+
# Example:
|
32
|
+
#
|
33
|
+
# "httpclient"
|
34
|
+
#
|
35
|
+
attr_reader :name
|
36
|
+
#
|
37
|
+
# Contains the Java Web Start specification of the OS for
|
38
|
+
# the <resources> parent of this resource if the attribute
|
39
|
+
# value exists
|
40
|
+
#
|
41
|
+
# Example:
|
42
|
+
#
|
43
|
+
# ""
|
44
|
+
#
|
45
|
+
attr_reader :os
|
46
|
+
#
|
47
|
+
# Contains the href attribute of the resource
|
48
|
+
#
|
49
|
+
# Example:
|
50
|
+
#
|
51
|
+
# "net/sf/sail/webstart-proxy/jetty-proxy/jetty-proxy.jar"
|
52
|
+
#
|
53
|
+
attr_reader :main
|
54
|
+
#
|
55
|
+
# Contains a boolean that repesents whether the main_class for this
|
56
|
+
# jnlp is contained within this jar.
|
57
|
+
# This attribute is optional in a jnlp and if present should
|
58
|
+
# only be present and set to true on one jar resource in a jnlp.
|
59
|
+
#
|
60
|
+
attr_reader :href
|
61
|
+
#
|
62
|
+
# Contains the url reference to the resource
|
63
|
+
#
|
64
|
+
# Example:
|
65
|
+
#
|
66
|
+
# "http://jnlp.concord.org/dev/org/concord/httpclient/httpclient.jar?version-id=0.1.0-20071212.220020-17"
|
67
|
+
#
|
68
|
+
attr_reader :url
|
69
|
+
#
|
70
|
+
# Contains the url reference to the gzipped pack200 version of the resource
|
71
|
+
#
|
72
|
+
# Example:
|
73
|
+
#
|
74
|
+
# "http://jnlp.concord.org/dev/org/concord/httpclient/httpclient__V0.1.0-20071212.220020-17.jar.pack.gz"
|
75
|
+
#
|
76
|
+
attr_reader :url_pack_gz
|
77
|
+
#
|
78
|
+
# Contains the filename of the resource
|
79
|
+
#
|
80
|
+
# Example:
|
81
|
+
#
|
82
|
+
# "httpclient__V0.1.0-20071212.220020-17.jar"
|
83
|
+
#
|
84
|
+
attr_reader :suffix
|
85
|
+
#
|
86
|
+
# Contains the suffix of the resource
|
87
|
+
#
|
88
|
+
# Example:
|
89
|
+
#
|
90
|
+
# "__V0.1.0.jar"
|
91
|
+
#
|
92
|
+
attr_reader :filename
|
93
|
+
#
|
94
|
+
# Contains the filename of the gzipped pack200 version of the resource
|
95
|
+
#
|
96
|
+
# Example:
|
97
|
+
#
|
98
|
+
# "httpclient__V0.1.0-20071212.220020-17.jar.pack.gz"
|
99
|
+
#
|
100
|
+
attr_reader :filename_pack
|
101
|
+
#
|
102
|
+
# Contains the filename of the pack200 version of the resource
|
103
|
+
#
|
104
|
+
# Example:
|
105
|
+
#
|
106
|
+
# "httpclient__V0.1.0-20071212.220020-17.jar.pack"
|
107
|
+
#
|
108
|
+
attr_reader :filename_pack_gz
|
109
|
+
#
|
110
|
+
# Contains the size of the resource
|
111
|
+
#
|
112
|
+
# Example:
|
113
|
+
#
|
114
|
+
# 294248
|
115
|
+
#
|
116
|
+
attr_reader :size
|
117
|
+
#
|
118
|
+
# Contains the size of the gzipped pack200 version of the resource
|
119
|
+
#
|
120
|
+
# Example:
|
121
|
+
#
|
122
|
+
# 112213
|
123
|
+
#
|
124
|
+
attr_reader :size_pack_gz
|
125
|
+
#
|
126
|
+
# Contains boolean value indicating whether the signature of the
|
127
|
+
# cached local copy of the resource verified successfully
|
128
|
+
#
|
129
|
+
# The value is nil if no local cache has been created.
|
130
|
+
#
|
131
|
+
# Example:
|
132
|
+
#
|
133
|
+
# true || false || nil
|
134
|
+
#
|
135
|
+
attr_reader :signature_verified
|
136
|
+
#
|
137
|
+
# Contains the absolute local path of cache directory
|
138
|
+
#
|
139
|
+
# Example:
|
140
|
+
#
|
141
|
+
# "/Users/stephen/dev/jetty-jnlp-proxy/cache"
|
142
|
+
#
|
143
|
+
attr_reader :local_cache_dir
|
144
|
+
#
|
145
|
+
# Contains the relative local path of the resource
|
146
|
+
#
|
147
|
+
# Example:
|
148
|
+
#
|
149
|
+
# "net/sf/sail/webstart-proxy/jetty-proxy/jetty-proxy__V0.1.0-20080318.093629-72.jar"
|
150
|
+
#
|
151
|
+
attr_reader :relative_local_path
|
152
|
+
#
|
153
|
+
# Contains the absolute local path of the resource
|
154
|
+
#
|
155
|
+
# Example:
|
156
|
+
#
|
157
|
+
# "/Users/stephen/dev/jetty-jnlp-proxy/cache/net/sf/sail/webstart-proxy/jetty-proxy/jetty-proxy__V0.1.0-20080318.093629-72.jar"
|
158
|
+
#
|
159
|
+
attr_reader :local_path
|
160
|
+
#
|
161
|
+
# Contains the relative local path of the packed, gzipped resource
|
162
|
+
#
|
163
|
+
# Example:
|
164
|
+
#
|
165
|
+
# "net/sf/sail/webstart-proxy/jetty-proxy/jetty-proxy__V0.1.0-20080318.093629-72.jar.pack.gz"
|
166
|
+
#
|
167
|
+
attr_reader :relative_local_path_pack_gz
|
168
|
+
#
|
169
|
+
# Contains the absolute local path of the resource
|
170
|
+
#
|
171
|
+
# Example:
|
172
|
+
#
|
173
|
+
# "/Users/stephen/dev/jetty-jnlp-proxy/cache/net/sf/sail/webstart-proxy/jetty-proxy/jetty-proxy__V0.1.0-20080318.093629-72.jar.pack.gz"
|
174
|
+
#
|
175
|
+
attr_reader :local_path_pack_gz
|
176
|
+
#
|
177
|
+
# Contains the version string of the resource
|
178
|
+
#
|
179
|
+
# Example:
|
180
|
+
#
|
181
|
+
# "0.1.0-20080318.093629-72"
|
182
|
+
#
|
183
|
+
attr_reader :version_str
|
184
|
+
#
|
185
|
+
# Contains the version of the resource
|
186
|
+
#
|
187
|
+
# Example:
|
188
|
+
#
|
189
|
+
# "0.1.0"
|
190
|
+
#
|
191
|
+
attr_reader :version
|
192
|
+
#
|
193
|
+
# Contains the date string of the resource
|
194
|
+
#
|
195
|
+
# Example:
|
196
|
+
#
|
197
|
+
# "20080318.093629"
|
198
|
+
#
|
199
|
+
attr_reader :date_str
|
200
|
+
#
|
201
|
+
# Contains a Ruby DateTime object representation of the resource's date string
|
202
|
+
#
|
203
|
+
# Example:
|
204
|
+
#
|
205
|
+
# #<DateTime: 85338394589/86400,0,2299161>
|
206
|
+
#
|
207
|
+
attr_reader :date_time
|
208
|
+
#
|
209
|
+
# Contains the revision of the resource
|
210
|
+
#
|
211
|
+
# Example:
|
212
|
+
#
|
213
|
+
# 72
|
214
|
+
#
|
215
|
+
attr_reader :revision
|
216
|
+
#
|
217
|
+
# Contains the certificate version of the resource
|
218
|
+
# if one exists, otherwize it is nil
|
219
|
+
#
|
220
|
+
# Example:
|
221
|
+
#
|
222
|
+
# "s1"
|
223
|
+
#
|
224
|
+
attr_reader :certificate_version
|
225
|
+
#
|
226
|
+
def initialize(res, codebase, os)
|
227
|
+
@resource = res
|
228
|
+
@kind = res.name
|
229
|
+
@main = res['main'] && res['main'] == 'true'
|
230
|
+
@href = res['href']
|
231
|
+
@href_path = File.dirname(@href)
|
232
|
+
if @href_path == '.'
|
233
|
+
@href_path = ''
|
234
|
+
else
|
235
|
+
@href_path = @href_path + '/'
|
236
|
+
end
|
237
|
+
@name = File.basename(@href).chomp('.jar')
|
238
|
+
@version_str = res['version']
|
239
|
+
if @version_str
|
240
|
+
@suffix = "__V#{@version_str}.jar"
|
241
|
+
else
|
242
|
+
@suffix = ".jar"
|
243
|
+
end
|
244
|
+
@filename = "#{@name}#{@suffix}"
|
245
|
+
@filename_pack = @filename + ".pack"
|
246
|
+
@filename_pack_gz = @filename_pack + ".gz"
|
247
|
+
|
248
|
+
@url = "#{codebase}/#{@href_path}#{@name}.jar"
|
249
|
+
@url << "?version-id=#{@version_str}" if @version_str
|
250
|
+
# example: data-util__V0.1.0-20070926.155656-107.jar.pack
|
251
|
+
# @url_pack = "#{codebase}/#{@href_path}#{@filename}.pack"
|
252
|
+
# example: data-util__V0.1.0-20070926.155656-107.jar.pack.gz
|
253
|
+
@url_pack_gz = "#{codebase}/#{@href_path}#{@filename}.pack.gz"
|
254
|
+
@version, @revision, @date_str, @date_time, @certificate_version = parse_version_str(@version_str)
|
255
|
+
@os = os
|
256
|
+
end
|
257
|
+
#
|
258
|
+
# parse_version_str
|
259
|
+
#
|
260
|
+
# input examples:
|
261
|
+
#
|
262
|
+
# "0.1.0-20070926.155656-107"
|
263
|
+
#
|
264
|
+
# or a newer example:
|
265
|
+
#
|
266
|
+
# "0.1.0-20090618.143130-890-s1"
|
267
|
+
#
|
268
|
+
# but ... some version strings just look like this:
|
269
|
+
#
|
270
|
+
# "0.1.0"
|
271
|
+
#
|
272
|
+
# or this:
|
273
|
+
#
|
274
|
+
# "2.1.7-r2"
|
275
|
+
#
|
276
|
+
# results:
|
277
|
+
#
|
278
|
+
# version # => '0.1.0'
|
279
|
+
# revision # => 20
|
280
|
+
# date_str # => '20070926.155656'
|
281
|
+
# date_time # => #<DateTime: 10673317777/10800,0,2299161>
|
282
|
+
# certificate_version # => 's1'
|
283
|
+
#
|
284
|
+
def parse_version_str(version_str)
|
285
|
+
version = date_str = certificate_version = ''
|
286
|
+
revision = date_time = nil
|
287
|
+
if version_str && version_str.length > 0
|
288
|
+
if md = version_str.match(/(\d|\.)+/)
|
289
|
+
version = md[0]
|
290
|
+
# date_str
|
291
|
+
if md2 = md.post_match.match(/-([\d]{8}.[\d]{6})(-|$)/)
|
292
|
+
date_str = md2[1]
|
293
|
+
d, t = date_str.scan(/\d+/) # => ["20070926", "155656"]
|
294
|
+
d1 = "#{d[0..3]}-#{d[4..5]}-#{d[6..7]}" # => "2007-09-26"
|
295
|
+
t1 = "#{t[0..1]}:#{t[2..3]}:#{t[4..5]}" # => "15:56:56"
|
296
|
+
dt = "#{d1}T#{t1}Z" # => "2007-09-26T15:56:56Z"
|
297
|
+
date_time = DateTime.parse(dt) # => #<DateTime: 10673317777/10800,0,2299161>
|
298
|
+
# revision
|
299
|
+
if md3 = md2.post_match.match(/\d+/)
|
300
|
+
revision = md3[0].to_i
|
301
|
+
end
|
302
|
+
else
|
303
|
+
if match = md.post_match[/\d+/]
|
304
|
+
revision = match.to_i
|
305
|
+
end
|
306
|
+
end
|
307
|
+
# certificate_version
|
308
|
+
if match = md.post_match[/-(s\d+)/, 1]
|
309
|
+
certificate_version = match
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
[version, revision, date_str, date_time, certificate_version]
|
314
|
+
end
|
315
|
+
#
|
316
|
+
# Set's up the local cache directory references
|
317
|
+
#
|
318
|
+
def local_cache_dir=(dir_path)
|
319
|
+
@local_cache_dir = File.expand_path(dir_path)
|
320
|
+
@relative_local_path = "#{@href_path}#{@filename}"
|
321
|
+
@local_path = "#{@local_cache_dir}/#{@relative_local_path}"
|
322
|
+
end
|
323
|
+
#
|
324
|
+
# Copies the file referenced in _source_ to _destination_
|
325
|
+
# _source_ can be a url or local file path
|
326
|
+
# _destination_ must be a local path
|
327
|
+
#
|
328
|
+
# Will copy file if the file does not exists
|
329
|
+
# OR if the the file exists but the signature has
|
330
|
+
# not been successfully verified.
|
331
|
+
#
|
332
|
+
# Returns file size if cached succesfully, false otherwise.
|
333
|
+
#
|
334
|
+
def update_cache(source=@url, destination=@local_path, options={})
|
335
|
+
unless destination
|
336
|
+
raise ArgumentError, "Must specify destination directory when updatng resource", caller
|
337
|
+
end
|
338
|
+
file_exists = File.exists?(destination)
|
339
|
+
if file_exists && @signature_verified == nil
|
340
|
+
verify_signature
|
341
|
+
end
|
342
|
+
unless file_exists && @signature_verified
|
343
|
+
FileUtils.mkdir_p(File.dirname(destination))
|
344
|
+
puts "reading: #{source}" if options[:verbose]
|
345
|
+
tried_to_read = 0
|
346
|
+
begin
|
347
|
+
jarfile = open(source)
|
348
|
+
rescue OpenURI::HTTPError => e
|
349
|
+
puts e
|
350
|
+
if tried_to_read < 1
|
351
|
+
tried_to_read += 1
|
352
|
+
retry
|
353
|
+
end
|
354
|
+
end
|
355
|
+
if jarfile.class == Tempfile
|
356
|
+
FileUtils.cp(jarfile.path, destination)
|
357
|
+
puts "copying to: #{destination}" if options[:verbose]
|
358
|
+
else
|
359
|
+
File.open(destination, 'w') {|f| f.write jarfile.read }
|
360
|
+
puts "writing to: #{destination}" if options[:verbose]
|
361
|
+
end
|
362
|
+
puts "#{jarfile.size} bytes written" if options[:verbose]
|
363
|
+
verify_signature ? jarfile.size : false
|
364
|
+
else
|
365
|
+
File.size(destination)
|
366
|
+
end
|
367
|
+
end
|
368
|
+
#
|
369
|
+
# Verifies signature of locallly cached resource
|
370
|
+
#
|
371
|
+
# Returns boolean value indicating whether the signature of the
|
372
|
+
# cached local copy of the resource verified successfully
|
373
|
+
#
|
374
|
+
# The value return is nil if no local cache has been created.
|
375
|
+
#
|
376
|
+
# Example:
|
377
|
+
#
|
378
|
+
# true || false || nil
|
379
|
+
#
|
380
|
+
def verify_signature
|
381
|
+
if @local_path
|
382
|
+
if RUBY_PLATFORM =~ /java/
|
383
|
+
begin
|
384
|
+
jarfile = java.util.jar.JarInputStream.new(FileInputStream.new(@local_path), true)
|
385
|
+
@signature_verified = true
|
386
|
+
rescue NativeException
|
387
|
+
@signature_verified = false
|
388
|
+
end
|
389
|
+
else
|
390
|
+
# Use IO.popen instead of system() to absorb
|
391
|
+
# jarsigners messages to $stdout
|
392
|
+
response = IO.popen("jarsigner -verify #{@local_path}"){|io| io.gets}
|
393
|
+
@signature_verified = ($?.exitstatus == 0)
|
394
|
+
end
|
395
|
+
else
|
396
|
+
nil
|
397
|
+
end
|
398
|
+
end
|
399
|
+
#
|
400
|
+
# Copies the resource referenced in Resource#url
|
401
|
+
# to the local cache.
|
402
|
+
#
|
403
|
+
# If the resource is successully cached locally and the
|
404
|
+
# signature is verified the size of the resource is retured.
|
405
|
+
#
|
406
|
+
# If the signature is not verified then false is returned.
|
407
|
+
#
|
408
|
+
def cache_resource(dest_dir=@local_cache_dir, options={})
|
409
|
+
unless dest_dir
|
410
|
+
raise ArgumentError, "Must specify destination directory when creating resource", caller
|
411
|
+
end
|
412
|
+
self.local_cache_dir=dest_dir
|
413
|
+
@size = update_cache(@url, @local_path, options)
|
414
|
+
if options[:include_pack_gz]
|
415
|
+
@relative_local_path_pack_gz = "#{@relative_local_path}.pack.gz"
|
416
|
+
@local_path_pack_gz = "#{dest_dir}/#{@relative_local_path_pack_gz}"
|
417
|
+
@size_pack_gz = update_cache(@url_pack_gz, @local_path_pack_gz, options)
|
418
|
+
end
|
419
|
+
@signature_verified ? @size : @signature_verified
|
420
|
+
end
|
421
|
+
end
|
422
|
+
end
|