buildr4osgi 0.9.0 → 0.9.2

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.
Files changed (43) hide show
  1. data/buildr4osgi.gemspec +2 -2
  2. data/lib/buildr4osgi/compile/compiler.rb +23 -5
  3. data/lib/buildr4osgi/compile.rb +1 -1
  4. data/lib/buildr4osgi/eclipse/feature.rb +206 -65
  5. data/lib/buildr4osgi/osgi/bundle.rb +5 -7
  6. data/lib/buildr4osgi/osgi/bundle_package.rb +2 -2
  7. data/lib/buildr4osgi/osgi/container.rb +5 -0
  8. data/lib/buildr4osgi/osgi/dependencies.rb +91 -0
  9. data/lib/buildr4osgi/osgi/library_extension.rb +6 -4
  10. data/lib/buildr4osgi/osgi/packaging.rb +78 -6
  11. data/lib/buildr4osgi/osgi/packaging_sources.rb +86 -0
  12. data/lib/buildr4osgi/osgi/project_extension.rb +9 -115
  13. data/lib/buildr4osgi/osgi/registry.rb +71 -1
  14. data/lib/buildr4osgi/osgi/resolving_strategies.rb +4 -2
  15. data/lib/buildr4osgi/osgi.rb +2 -0
  16. data/lib/buildr4osgi.rb +0 -1
  17. data/rakelib/release.rake +3 -0
  18. data/rakelib/rspec.rake +3 -3
  19. data/rakelib/stage.rake +7 -0
  20. data/spec/compile/compiler_spec.rb +40 -8
  21. data/spec/eclipse/feature_spec.rb +103 -6
  22. data/spec/osgi/bundle_spec.rb +2 -2
  23. data/spec/osgi/dependencies_spec.rb +91 -0
  24. data/spec/osgi/library_extension_spec.rb +17 -0
  25. data/spec/osgi/packaging_sources_spec.rb +71 -0
  26. data/spec/osgi/packaging_spec.rb +11 -1
  27. data/spec/osgi/project_extension_spec.rb +31 -21
  28. data/spec/osgi/registry_spec.rb +31 -0
  29. data/spec/osgi/resolving_strategies_spec.rb +116 -0
  30. data/spec/spec_helpers.rb +2 -2
  31. data/spec/tmp/remote/log4j/log4j/1.2.15/log4j-1.2.15.jar +0 -0
  32. data/spec/tmp/remote/log4j/log4j/1.2.15/log4j-1.2.15.pom +478 -0
  33. metadata +10 -13
  34. data/lib/buildr4osgi/nature/eclipse.rb +0 -80
  35. data/lib/buildr4osgi/nature/java.rb +0 -32
  36. data/lib/buildr4osgi/nature/nature.rb +0 -156
  37. data/lib/buildr4osgi/nature/osgi.rb +0 -32
  38. data/lib/buildr4osgi/nature/scala.rb +0 -32
  39. data/spec/nature/eclipse_spec.rb +0 -46
  40. data/spec/nature/java_spec.rb +0 -45
  41. data/spec/nature/osgi_spec.rb +0 -63
  42. data/spec/nature/scala_spec.rb +0 -45
  43. data/spec/nature_spec.rb +0 -144
data/buildr4osgi.gemspec CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  Gem::Specification.new do |spec|
18
18
  spec.name = 'buildr4osgi'
19
- spec.version = '0.9.0'
19
+ spec.version = '0.9.2'
20
20
  spec.author = 'Antoine Toulme'
21
21
  spec.email = "atoulme@intalio.com"
22
22
  spec.homepage = "http://buildr.apache.org/"
@@ -36,5 +36,5 @@ TEXT
36
36
  spec.rdoc_options = '--title', 'Buildr4osgi', '--main', 'README.rdoc',
37
37
  '--webcvs', 'http://github.com/intalio/buildr4osgi'
38
38
  spec.post_install_message = "To get started run buildr --help"
39
- spec.add_dependency("manifest", "= 0.0.6")
39
+ spec.add_dependency("manifest", "= 0.0.7")
40
40
  end
@@ -21,7 +21,7 @@ module Buildr4OSGi
21
21
  OPTIONS = [:warnings, :debug, :deprecation, :source, :target, :lint, :other]
22
22
 
23
23
  specify :language=>:java, :sources => 'java', :source_ext => 'java',
24
- :target=>'classes', :target_ext=>'class', :packaging=>:plugin
24
+ :target=>'classes', :target_ext=>'class', :packaging=>:jar
25
25
 
26
26
 
27
27
  def compile(sources, target, dependencies) #:nodoc:
@@ -33,16 +33,34 @@ module Buildr4OSGi
33
33
  source_paths = sources.select { |source| File.directory?(source) }
34
34
  cmd_args << '-sourcepath' << source_paths.join(File::PATH_SEPARATOR) unless source_paths.empty?
35
35
  cmd_args << '-d' << File.expand_path(target)
36
- cmd_args += javac_args
36
+ cmd_args += osgic_args
37
37
  cmd_args += files_from_sources(sources)
38
38
  unless Buildr.application.options.dryrun
39
39
  trace((%w[javac -classpath org.eclipse.jdt.internal.compiler.batch.Main] + cmd_args).join(' '))
40
40
  Java.load
41
- Java.org.eclipse.jdt.internal.compiler.batch.Main.main(cmd_args.
42
- to_java(Java.java.lang.String)) == 0 or fail 'Failed to compile, see errors above'
41
+ Java.org.eclipse.jdt.internal.compiler.batch.Main.compile(cmd_args.join(" ")) or
42
+ fail 'Failed to compile, see errors above'
43
43
  end
44
44
  end
45
- alias :osgic_args :javac_args
45
+
46
+ private
47
+
48
+ # See arg list here: http://publib.boulder.ibm.com/infocenter/rsahelp/v7r0m0/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm
49
+ def osgic_args #:nodoc:
50
+ args = []
51
+ args << '-warn:none' unless options[:warnings]
52
+ args << '-verbose' if Buildr.application.options.trace
53
+ args << '-g' if options[:debug]
54
+ args << '-deprecation' if options[:deprecation]
55
+ args << '-source' << options[:source].to_s if options[:source]
56
+ args << '-target' << options[:target].to_s if options[:target]
57
+ case options[:lint]
58
+ when Array then args << "-Xlint:#{options[:lint].join(',')}"
59
+ when String then args << "-Xlint:#{options[:lint]}"
60
+ when true then args << '-Xlint'
61
+ end
62
+ args + Array(options[:other])
63
+ end
46
64
 
47
65
  end
48
66
 
@@ -13,4 +13,4 @@
13
13
  # License for the specific language governing permissions and limitations under
14
14
  # the License.
15
15
 
16
- #require 'buildr4osgi/compile/compiler'
16
+ require 'buildr4osgi/compile/compiler'
@@ -17,20 +17,9 @@ module Buildr4OSGi
17
17
 
18
18
  module FeatureWriter
19
19
 
20
- attr_accessor :feature_id
21
- attr_accessor :version
22
- attr_accessor :label
23
- attr_accessor :copyright
24
- attr_accessor :image
25
- attr_accessor :provider
26
- attr_accessor :description
27
- attr_accessor :changesURL
28
- attr_accessor :license
29
- attr_accessor :licenseURL
30
- attr_accessor :branding_plugin
31
-
32
- attr_accessor :update_sites
33
- attr_accessor :discovery_sites
20
+ VARS = [:feature_id, :version, :label, :copyright, :image, :provider, :description, :changesURL, :license, :licenseURL, :branding_plugin, :update_sites, :discovery_sites]
21
+
22
+ eval(VARS.collect{|field| "attr_accessor :#{field}"}.join("\n"))
34
23
 
35
24
  # :nodoc:
36
25
  # When this module extends an object
@@ -120,61 +109,69 @@ PROPERTIES
120
109
 
121
110
  end
122
111
 
123
-
112
+ #Marker module common to all feature packaging tasks.
113
+ #Tasks including this module are recognized internally as tasks packaging features.
114
+ module FeaturePackaging
115
+
116
+ end
124
117
 
125
118
  class FeatureTask < ::Buildr::Packaging::Java::JarTask
126
-
119
+ include FeaturePackaging
127
120
  attr_accessor :plugins
128
121
 
129
122
  attr_accessor :feature_xml
130
123
  attr_accessor :feature_properties
124
+
125
+ FeatureWriter::VARS << :plugins
126
+ FeatureWriter::VARS << :feature_xml
127
+ FeatureWriter::VARS << :feature_properties
128
+ FeatureWriter::VARS << :unjarred
131
129
 
132
130
  def initialize(*args) #:nodoc:
133
131
  super
134
132
  @unjarred = {}
135
133
  @plugins = ArrayAddWithOptions.new(@unjarred)
134
+
136
135
  end
137
136
 
138
137
  def generateFeature(project)
139
- feature_id ||= project.id
140
- version ||= project.version
141
-
142
138
  mkpath File.join(project.base_dir, 'target')
143
- resolved_plugins = {}
144
- unless @plugins.nil? || @plugins.empty?
145
- plugins.flatten.each do |plugin|
146
-
147
- artifact = case
148
- when plugin.is_a?(String)
149
- Buildr::artifact(plugin)
150
- when plugin.is_a?(Buildr::Project)
151
- Buildr::artifact(plugin.package(:plugin))
152
- else
153
- plugin
154
- end
155
- info = adaptPlugin(artifact)
156
- info[:unjarred] = @unjarred[plugin]
157
- resolved_plugins[info] = artifact
158
- end
159
- end
139
+ resolved_plugins = create_resolved_plugins
140
+ enhance(resolved_plugins.values)
160
141
  unless feature_xml
161
142
  File.open(File.join(project.base_dir, 'target', 'feature.xml'), 'w') do |f|
162
143
  f.write(writeFeatureXml(resolved_plugins.keys, feature_xml.nil? && feature_properties.nil? ))
163
144
  end
164
- path("eclipse/features/#{project.id}_#{project.version}").include File.join(project.base_dir, 'target/feature.xml')
145
+ path("eclipse/features/#{feature_id}_#{project.version}").include File.join(project.base_dir, 'target', 'feature.xml')
165
146
  else
166
- path("eclipse/features/#{project.id}_#{project.version}").include feature_xml
147
+ path("eclipse/features/#{feature_id}_#{project.version}").include feature_xml
167
148
  end
168
149
  unless feature_properties || feature_xml
169
150
  File.open(File.join(project.base_dir, 'target', 'feature.properties'), 'w') do |f|
170
151
  f.write(writeFeatureProperties())
171
152
  end
172
- path("eclipse/features/#{project.id}_#{project.version}").include File.join(project.base_dir, 'target/feature.properties')
153
+ path("eclipse/features/#{feature_id}_#{project.version}").include File.join(project.base_dir, 'target', 'feature.properties')
173
154
  else
174
- path("eclipse/features/#{project.id}_#{project.version}").include feature_properties if feature_properties
155
+ path("eclipse/features/#{feature_id}_#{project.version}").include feature_properties if feature_properties
175
156
  end
176
157
 
177
- resolved_plugins.each_pair do |info, plugin|
158
+ resolved_plugins.each_pair do |info, plugin|
159
+ unless info[:manifest].nil?
160
+ cp plugin.to_s, project.path_to("target/#{plugin.id}_#{plugin.version}.jar")
161
+ plugin = project.path_to("target/#{plugin.id}_#{plugin.version}.jar")
162
+ ::Buildr::Packaging::Java::Manifest.update_manifest(plugin) {|manifest|
163
+ #applies to sources bundles only: if it was the runtime manifest, then remove it altogether:
164
+ unless manifest.main["Bundle-SymbolicName"].nil?
165
+ #there was a symbolic name: assume this manifest was the runtime one.
166
+ #we don't want OSGi to confuse the runtime jar with the sources.
167
+ #ideally we would want keep an archive of the original
168
+ #runtime manifest as for example MANIFEST.MF.source
169
+ manifest.main.clear
170
+ end
171
+ manifest.main.merge! info[:manifest]
172
+ }
173
+ end
174
+
178
175
  if info[:unjarred]
179
176
  merge(plugin, :path => "eclipse/plugins/#{info[:id]}_#{info[:version]}")
180
177
  else
@@ -185,49 +182,75 @@ PROPERTIES
185
182
 
186
183
  protected
187
184
 
188
- class ArrayAddWithOptions < Array
189
-
190
- def initialize(options_hash)
191
- @options_hash = options_hash
192
- end
193
-
194
- def add_with_options(plugin, options = {:unjarred => false})
195
- add(plugin)
196
- @options_hash[plugin] = options[:unjarred] if options[:unjarred]
185
+ def create_resolved_plugins
186
+ resolved_plugins = {}
187
+ unless @plugins.nil? || @plugins.empty?
188
+ plugins.flatten.each do |plugin|
189
+
190
+ artifact = case
191
+ when plugin.is_a?(String)
192
+ Buildr::artifact(plugin)
193
+ when plugin.is_a?(Buildr::Project)
194
+ Buildr::artifact(plugin.package(:plugin))
195
+ else
196
+ plugin
197
+ end
198
+ info = adapt_plugin(artifact)
199
+ info[:unjarred] = @unjarred[plugin][:unjarred] unless @unjarred[plugin].nil?
200
+ resolved_plugins[info] = artifact
201
+ end
197
202
  end
198
-
199
- alias :add :<<
200
- alias :<< :add_with_options
201
-
203
+ resolved_plugins
202
204
  end
203
205
 
204
- def adaptPlugin(plugin)
206
+ def adapt_plugin(plugin)
205
207
  name = nil
206
208
  size = nil
207
209
  version = nil
208
210
  group = nil
211
+ repackage = nil
212
+ sourceBundle = nil
209
213
  if plugin.is_a? Buildr::Project
210
- plugin.package(:plugin).invoke #make sure it is present.
211
214
  size = File.size(plugin.package(:plugin).to_s)
212
215
  name = plugin.package(:plugin).manifest.main["Bundle-SymbolicName"]
213
216
  version = plugin.package(:plugin).manifest.main["Bundle-Version"]
214
- group = plugin.group
217
+ group = plugin.group
218
+ sourceBundle = plugin.package(:plugin).manifest.main["Eclipse-SourceBundle"]
215
219
  else
216
220
  plugin.invoke
221
+ if !File.exist?(plugin.to_s) and plugin.classifier.to_s == 'sources'
222
+ #make sure the artifact was downloaded.
223
+ #if the artifact is for the sources feature and it could not be located,
224
+ #don't crash. should we put something in the manifest?
225
+ return nil
226
+ end
217
227
  Zip::ZipFile.open(plugin.to_s) do |zip|
218
228
  entry = zip.find_entry("META-INF/MANIFEST.MF")
219
229
  unless entry.nil?
220
230
  manifest = Manifest.read(zip.read("META-INF/MANIFEST.MF"))
221
- bundle = ::OSGi::Bundle.fromManifest(manifest, plugin.to_s)
222
- unless bundle.nil?
223
- name = bundle.name
224
- version = bundle.version
231
+ sourceBundle = manifest.first["Eclipse-SourceBundle"].keys.first.strip unless manifest.first["Eclipse-SourceBundle"].nil?
232
+ if !manifest.first["Bundle-SymbolicName"].nil?
233
+ bundle = ::OSGi::Bundle.fromManifest(manifest, plugin.to_s)
234
+ unless bundle.nil?
235
+ name = bundle.name
236
+ version = bundle.version
237
+ end
225
238
  end
226
239
  end
227
240
  end
228
241
  group = plugin.to_hash[:group]
229
242
  size = File.size(plugin.to_s)
230
243
  end
244
+ if plugin.classifier.to_s == 'sources' and (sourceBundle.nil? || name.nil? || version.nil?)
245
+ # Try, if possible, to get the name and the version from the original binaries then.
246
+ runtimeArtifact = Buildr::artifact(plugin.to_hash.merge(:classifier => nil, :type => :jar))
247
+ runtimeManifest = extraPackagedManifest(runtimeArtifact)
248
+ manifest = ::OSGi::create_source_bundle_manifest(runtimeManifest)
249
+ repackage = {}
250
+ manifest.main.each {|key,value| repackage[key] = value }
251
+ name = repackage["Bundle-SymbolicName"].split(';').first
252
+ version = repackage["Bundle-Version"]
253
+ end
231
254
  if (name.nil? || version.nil?)
232
255
  raise "The dependency #{plugin} is not an Eclipse plugin: make sure the headers " +
233
256
  "Bundle-SymbolicName and Bundle-Version are present in the manifest"
@@ -237,9 +260,85 @@ PROPERTIES
237
260
  size ||= 0
238
261
  end
239
262
  return {:id => name, :group => group, :version => version,
240
- :"download-size" => size, :"install-size" => size, :unpack => false}
263
+ :"download-size" => size, :"install-size" => size, :unpack => false, :manifest => repackage}
241
264
  end
265
+
266
+ #returns the META-INF/MANIFEST.MF file for something that
267
+ #is either an artifact either a the package(:jar) of a buildr project.
268
+ def extraPackagedManifest(plugin)
269
+ if plugin.is_a? Buildr::Project
270
+ return plugin.package(:plugin).manifest
271
+ else #an artifact
272
+ plugin.invoke
273
+ javaManifest = ::Buildr::Packaging::Java::Manifest.from_zip(plugin.to_s)
274
+ hash = {} #need to make it a hash:
275
+ javaManifest.main.each {|key,value| hash[key] = value }
276
+ return hash
277
+ end
278
+ end
279
+
242
280
  end
281
+
282
+ class ArrayAddWithOptions < Array
283
+
284
+ def initialize(options_hash)
285
+ @options_hash = options_hash
286
+ end
287
+
288
+ def add_with_options(*args)
289
+ plugin = args.shift
290
+ options = {}
291
+ while(!args.empty?)
292
+ option = args.shift
293
+ case
294
+ when option.is_a?(Hash)
295
+ options.merge!(option)
296
+ when option.is_a?(Symbol)
297
+ options.merge!({option => true})
298
+ else
299
+ raise "Impossible to find what this option means: #{option}"
300
+ end
301
+ end
302
+ add(plugin)
303
+ @options_hash[plugin] = options
304
+ end
305
+
306
+ alias :add :<<
307
+ alias :<< :add_with_options
308
+
309
+ end
310
+
311
+
312
+ module SDKFeatureEnabler
313
+
314
+ def create_resolved_plugins
315
+ resolved_plugins = {}
316
+ unless @plugins.nil? || @plugins.empty?
317
+ plugins.flatten.each do |plugin|
318
+
319
+ artifact = case
320
+ when plugin.is_a?(String)
321
+ Buildr::artifact(plugin)
322
+ when plugin.is_a?(Buildr::Project)
323
+ Buildr::artifact(plugin.package(:sources))
324
+ else
325
+ plugin
326
+ end
327
+ artifact = Buildr::artifact(artifact.to_hash.merge(:classifier => "sources")) if artifact.is_a?(Buildr::Artifact)
328
+ info = adapt_plugin(artifact)
329
+ if !info.nil?
330
+ info[:unjarred] = @unjarred[plugin][:unjarred] unless @unjarred[plugin].nil?
331
+ resolved_plugins[info] = artifact
332
+ end
333
+ end
334
+ end
335
+ resolved_plugins
336
+ end
337
+
338
+
339
+ end
340
+
341
+
243
342
 
244
343
  # Methods added to project to package a project as a feature
245
344
  #
@@ -247,17 +346,53 @@ PROPERTIES
247
346
  include Extension
248
347
 
249
348
  protected
349
+
350
+ # returns true if the project defines at least one feature packaging.
351
+ # We keep this method protected and we will call it using send.
352
+ def is_packaging_feature()
353
+ packages.each {|package| return true if package.is_a?(::Buildr4OSGi::FeaturePackaging)}
354
+ false
355
+ end
250
356
 
251
357
  def package_as_feature(file_name)
252
358
  task = FeatureTask.define_task(file_name)
253
359
  task.extend FeatureWriter
254
- task.enhance do |feature|
255
- feature.generateFeature(project)
360
+ task.feature_id ||= project.id
361
+ task.version ||= project.version
362
+ task.enhance do |featureTask|
363
+ featureTask.generateFeature(project)
256
364
  end
365
+ task
257
366
  end
258
367
 
259
368
  def package_as_feature_spec(spec) #:nodoc:
260
- spec.merge(:type=>:jar, :classifier=>'feature')
369
+ spec.merge(:type=>:zip, :id => name.split(":").last)
370
+ end
371
+
372
+ def package_as_SDK_feature(file_name) #:nodoc:
373
+ return package_as_sources_before_SDK_feature(file_name) unless is_packaging_feature
374
+ featurePackage = packages.select {|package| package.is_a?(::Buildr4OSGi::FeaturePackaging)}.first.dup
375
+ sdkPackage = FeatureTask.define_task(file_name)
376
+ sdkPackage.enhance do |featureTask|
377
+ featureTask.generateFeature(project)
378
+ end
379
+ sdkPackage.extend FeatureWriter
380
+ sdkPackage.extend SDKFeatureEnabler
381
+
382
+ FeatureWriter::VARS.each do |ivar|
383
+ value = featurePackage.instance_variable_get("@#{ivar}")
384
+ new_value = value.clone rescue value
385
+ sdkPackage.instance_variable_set("@#{ivar}", new_value)
386
+ end
387
+
388
+ sdkPackage.feature_id += ".sources"
389
+ sdkPackage
390
+ end
391
+
392
+ def package_as_SDK_feature_spec(spec) #:nodoc:
393
+ spec = package_as_sources_spec_before_SDK_feature(spec)
394
+ spec.merge!(:type=>:zip, :id => name.split(":").last, :classifier => "sources") if is_packaging_feature
395
+ spec
261
396
  end
262
397
  end
263
398
 
@@ -267,5 +402,11 @@ end
267
402
  module Buildr #:nodoc:
268
403
  class Project #:nodoc:
269
404
  include Buildr4OSGi::ActAsFeature
405
+
406
+ alias :package_as_sources_before_SDK_feature :package_as_sources
407
+ alias :package_as_sources :package_as_SDK_feature
408
+
409
+ alias :package_as_sources_spec_before_SDK_feature :package_as_sources_spec
410
+ alias :package_as_sources_spec :package_as_SDK_feature_spec
270
411
  end
271
412
  end
@@ -14,8 +14,6 @@
14
14
  # the License.
15
15
 
16
16
  module OSGi #:nodoc:
17
-
18
- OSGI_GROUP_ID = "osgi"
19
17
 
20
18
  # :nodoc:
21
19
  # Module extending projects
@@ -31,7 +29,7 @@ module OSGi #:nodoc:
31
29
  #
32
30
  def matches(criteria = {:name => "", :version => "", :exports_package => "", :fragment_for => ""})
33
31
  if File.exists?(File.join(base_dir, "META-INF", "MANIFEST.MF"))
34
- manifest = ::Buildr::Packaging::Java::Manifest.new(File.join(base_dir, "META-INF", "MANIFEST.MF"))
32
+ manifest = ::Buildr::Packaging::Java::Manifest.new(File.read(File.join(base_dir, "META-INF", "MANIFEST.MF")))
35
33
  end
36
34
  manifest ||= ::Buildr::Packaging::Java::Manifest.new()
37
35
  project.packages.select {|package| package.is_a? ::OSGi::BundlePackaging}.each {|p|
@@ -92,7 +90,7 @@ module OSGi #:nodoc:
92
90
  # Creates a bundle out of a project, using the manifest defined in its bundle package
93
91
  # and the MANIFEST.MF file present in the project if any.
94
92
  def self.fromProject(project)
95
- packaging = project.packages.select {|package| package.is_a?(::OSGi::BundlePackaging)}
93
+ packaging = project.packages.select {|package| package.is_a?(BundlePackaging)}
96
94
  raise "More than one bundle packaging is defined over the project #{project.id}, see BOSGI-16." if packaging.size > 1
97
95
  return nil if packaging.empty?
98
96
  manifest = ::Buildr::Packaging::Java::Manifest.new(File.exists?("META-INF/MANIFEST.MF") ? File.read("META-INF/MANIFEST.MF") : nil)
@@ -172,7 +170,7 @@ module OSGi #:nodoc:
172
170
  @optional = args[:optional]
173
171
  @start_level = 4
174
172
  @type = "jar" #it's always a jar, even if it is a directory: we will jar it for Maven.
175
- @group = OSGI_GROUP_ID
173
+ @group = GroupMatcher.instance.group(name)
176
174
  end
177
175
 
178
176
 
@@ -183,7 +181,7 @@ module OSGi #:nodoc:
183
181
  # Collect the bundle projects, duplicate them so no changes can be applied to them
184
182
  # and extend them with the BundleProjectMatcher module
185
183
 
186
- b_projects = OSGi::BundleProjects::bundle_projects.select {|p|
184
+ b_projects = BundleProjects::bundle_projects.select {|p|
187
185
  unless p == project
188
186
  p.extend BundleProjectMatcher
189
187
  p.matches(:name => name, :version => version)
@@ -227,7 +225,7 @@ module OSGi #:nodoc:
227
225
  when 0 then nil
228
226
  when 1 then bundles.first
229
227
  else
230
- OSGi::BundleResolvingStrategies.send(project.osgi.options.bundle_resolving_strategy, bundles)
228
+ BundleResolvingStrategies.send(project.osgi.options.bundle_resolving_strategy, bundles)
231
229
  end
232
230
  if bundle.nil?
233
231
  warn "Could not resolve bundle for #{self.to_s}"
@@ -35,9 +35,9 @@ module OSGi #:nodoc:
35
35
  def resolve_matching_artifacts(project)
36
36
  # Collect the bundle projects
37
37
  # and extend them with the BundleProjectMatcher module
38
- b_projects = OSGi::BundleProjects::bundle_projects.select {|p|
38
+ b_projects = BundleProjects::bundle_projects.select {|p|
39
39
  unless p == project
40
- p.extend OSGi::BundleProjectMatcher
40
+ p.extend BundleProjectMatcher
41
41
  p.matches(:exports_package => name, :version => version)
42
42
  end
43
43
  }
@@ -136,5 +136,10 @@ module OSGi #:nodoc:
136
136
  end
137
137
  selected
138
138
  end
139
+
140
+ def ==(other)
141
+ false unless other.is_a? Container
142
+ return location == other.location
143
+ end
139
144
  end
140
145
  end
@@ -0,0 +1,91 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+ module OSGi
17
+ #
18
+ # A class to read dependencies.yml, and get a flat array of projects and dependencies for a project.
19
+ #
20
+ class Dependencies
21
+
22
+ attr_accessor :dependencies, :projects
23
+
24
+ def initialize(project = nil)
25
+ @project = project
26
+ end
27
+
28
+ def read()
29
+ base_dir = find_root(@project).base_dir
30
+ @dependencies = []
31
+ @projects = []
32
+ @deps_yml = {}
33
+ return unless File.exists? File.join(base_dir, "dependencies.yml")
34
+ @deps_yml =YAML.load(File.read(File.join(base_dir, "dependencies.yml")))
35
+ return if @deps_yml[@project.name].nil? || @deps_yml[@project.name]["dependencies"].nil?
36
+ _read(@project, false)
37
+ @dependencies = @dependencies.flatten.compact.uniq
38
+ return @dependencies, @projects
39
+ end
40
+
41
+ def write(projects)
42
+ base_dir = find_root(@project).base_dir
43
+ written_dependencies = YAML.load(File.read(File.join(base_dir, "dependencies.yml"))) if File.exists? File.join(base_dir, "dependencies.yml")
44
+ written_dependencies ||= {}
45
+ written_dependencies.extend SortedHash
46
+ projects.each {|p|
47
+ p = p.name if p.is_a?(Project)
48
+ written_dependencies[p] ||= {}
49
+ written_dependencies[p].extend SortedHash
50
+ written_dependencies[p]["dependencies"] ||= []
51
+ written_dependencies[p]["projects"] ||= []
52
+ yield written_dependencies, p
53
+ written_dependencies[p]["dependencies"].sort!
54
+ written_dependencies[p]["projects"].sort!
55
+ }
56
+ Buildr::write File.join(base_dir, "dependencies.yml"), written_dependencies.to_yaml
57
+ end
58
+
59
+ private
60
+
61
+ def _read(project, add_project = true)
62
+ projects << project if add_project
63
+ return unless @deps_yml[project.name] && @deps_yml[project.name]["dependencies"]
64
+ @dependencies |= @deps_yml[project.name]["dependencies"]
65
+ @deps_yml[project.name]["projects"].each {|p| subp = Buildr::project(p) ; _read(subp) unless (projects.include?(subp) || subp == @project)}
66
+ end
67
+
68
+ def find_root(project)
69
+ project.parent.nil? ? project : find_root(project.parent)
70
+ end
71
+
72
+ # Copy/pasted from here: http://snippets.dzone.com/posts/show/5811
73
+ # no author information though.
74
+ module SortedHash
75
+
76
+ # Replacing the to_yaml function so it'll serialize hashes sorted (by their keys)
77
+ #
78
+ # Original function is in /usr/lib/ruby/1.8/yaml/rubytypes.rb
79
+ def to_yaml( opts = {} )
80
+ YAML::quick_emit( object_id, opts ) do |out|
81
+ out.map( taguri, to_yaml_style ) do |map|
82
+ sort.each do |k, v| # <-- here's my addition (the 'sort')
83
+ map.add( k, v )
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ end
@@ -53,7 +53,7 @@ module Buildr4OSGi #:nodoc:
53
53
  manifest = project.manifest.merge(read_m)
54
54
  end
55
55
  manifest["Bundle-Version"] = project.version # the version of the bundle packaged is ALWAYS the version of the project.
56
- manifest["Bundle-SymbolicName"] ||= project.id # if it was resetted to nil, we force the id to be added back.
56
+ manifest["Bundle-SymbolicName"] ||= project.id.split(":").last # if it was resetted to nil, we force the id to be added back.
57
57
 
58
58
  plugin.with :manifest=> manifest, :meta_inf=>meta_inf
59
59
  plugin.with [compile.target, resources.target].compact
@@ -136,13 +136,15 @@ module Buildr4OSGi #:nodoc:
136
136
  lib.invoke # make sure the artifact is present.
137
137
  Zip::ZipFile.foreach(lib.to_s) {|entry| entries << entry.name.sub(/(.*)\\/.*.class$/, '\\1').gsub(/\\//, '.') if /.*\\.class$/.match(entry.name)}
138
138
  }
139
- jar.with :manifest => {
140
- "Export-Package" => entries.uniq.sort.join(","),
139
+ lib_manifest = {
141
140
  "Bundle-Version" => "#{version}",
142
141
  "Bundle-SymbolicName" => project.name,
143
142
  "Bundle-Name" => names.join(", "),
144
143
  "Bundle-Vendor" => "Intalio, Inc."
145
- }.merge(#{options[:manifest].inspect})
144
+ }
145
+ lib_manifest["Export-Package"] = entries.uniq.sort.join(",") unless entries.empty?
146
+ lib_manifest["Bundle-ManifestVersion"] = "2"
147
+ jar.with :manifest => lib_manifest.merge(#{options[:manifest].inspect})
146
148
 
147
149
 
148
150
  }