buildr4osgi 0.9.0 → 0.9.2

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