buildr4osgi 0.9.2 → 0.9.3

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 (47) hide show
  1. data/buildr4osgi.gemspec +2 -2
  2. data/lib/buildr4osgi.rb +2 -0
  3. data/lib/buildr4osgi/compile.rb +2 -1
  4. data/lib/buildr4osgi/compile/compiler.rb +1 -3
  5. data/lib/buildr4osgi/compile/external.rb +71 -0
  6. data/lib/buildr4osgi/eclipse.rb +3 -1
  7. data/lib/buildr4osgi/eclipse/feature.rb +12 -7
  8. data/lib/buildr4osgi/eclipse/p2.rb +137 -0
  9. data/lib/buildr4osgi/eclipse/site.rb +207 -0
  10. data/lib/buildr4osgi/osgi/bundle.rb +17 -12
  11. data/lib/buildr4osgi/osgi/bundle_package.rb +35 -11
  12. data/lib/buildr4osgi/osgi/container.rb +1 -0
  13. data/lib/buildr4osgi/osgi/execution_environment.rb +199 -0
  14. data/lib/buildr4osgi/osgi/library_extension.rb +14 -1
  15. data/lib/buildr4osgi/osgi/packaging_sources.rb +4 -0
  16. data/lib/buildr4osgi/osgi/project_extension.rb +59 -20
  17. data/lib/buildr4osgi/osgi/registry.rb +23 -29
  18. data/lib/buildr4osgi/osgi/resolving_strategies.rb +1 -0
  19. data/lib/buildr4osgi/osgi/version.rb +1 -1
  20. data/rakelib/all-in-one.rake +84 -0
  21. data/rakelib/stage.rake +5 -4
  22. data/spec/compile/external_spec.rb +41 -0
  23. data/spec/eclipse/p2_spec.rb +65 -0
  24. data/spec/eclipse/site_spec.rb +94 -0
  25. data/spec/osgi/bundle_package_spec.rb +13 -1
  26. data/spec/osgi/bundle_spec.rb +2 -2
  27. data/spec/osgi/execution_environment_spec.rb +48 -0
  28. data/spec/osgi/library_extension_spec.rb +15 -2
  29. data/spec/osgi/project_extension_spec.rb +86 -18
  30. data/spec/osgi/registry_spec.rb +30 -20
  31. data/spec/osgi/resolving_strategies_spec.rb +2 -2
  32. data/spec/osgi/version_spec.rb +6 -0
  33. data/spec/spec_helpers.rb +12 -0
  34. metadata +12 -16
  35. data/spec/tmp/remote/eclipse/org.eclipse.debug.ui/3.4.1.v20080811_r341/org.eclipse.debug.ui-3.4.1.v20080811_r341.jar +0 -0
  36. data/spec/tmp/remote/eclipse/org.eclipse.debug.ui/3.4.1.v20080811_r341/org.eclipse.debug.ui-3.4.1.v20080811_r341.pom +0 -82
  37. data/spec/tmp/remote/log4j/log4j/1.2.15/log4j-1.2.15.jar +0 -0
  38. data/spec/tmp/remote/log4j/log4j/1.2.15/log4j-1.2.15.pom +0 -478
  39. data/spec/tmp/remote/org/slf4j/jcl104-over-slf4j/1.5.8/jcl104-over-slf4j-1.5.8-sources.jar +0 -0
  40. data/spec/tmp/remote/org/slf4j/jcl104-over-slf4j/1.5.8/jcl104-over-slf4j-1.5.8.jar +0 -0
  41. data/spec/tmp/remote/org/slf4j/jcl104-over-slf4j/1.5.8/jcl104-over-slf4j-1.5.8.pom +0 -30
  42. data/spec/tmp/remote/org/slf4j/slf4j-api/1.5.8/slf4j-api-1.5.8-sources.jar +0 -0
  43. data/spec/tmp/remote/org/slf4j/slf4j-api/1.5.8/slf4j-api-1.5.8.jar +0 -0
  44. data/spec/tmp/remote/org/slf4j/slf4j-api/1.5.8/slf4j-api-1.5.8.pom +0 -101
  45. data/spec/tmp/remote/org/slf4j/slf4j-log4j12/1.5.8/slf4j-log4j12-1.5.8-sources.jar +0 -0
  46. data/spec/tmp/remote/org/slf4j/slf4j-log4j12/1.5.8/slf4j-log4j12-1.5.8.jar +0 -0
  47. data/spec/tmp/remote/org/slf4j/slf4j-log4j12/1.5.8/slf4j-log4j12-1.5.8.pom +0 -56
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.2'
19
+ spec.version = '0.9.3'
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.7")
39
+ spec.add_dependency("manifest", "= 0.0.8")
40
40
  end
data/lib/buildr4osgi.rb CHANGED
@@ -20,8 +20,10 @@ require 'buildr4osgi/compile'
20
20
  # Methods defined in Buildr4OSGi are both instance methods (e.g. when included in Project)
21
21
  # and class methods when invoked like Buildr4OSGi.project_library(SLF4J, "group", "foo", "1.0.0").
22
22
  module Buildr4OSGi ; extend self ; end
23
+ module OSGi ; extend self ; end
23
24
  # The Buildfile object (self) has access to all the Buildr4OSGi methods and constants.
24
25
  class << self ; include Buildr4OSGi ; end
26
+ class << self ; include OSGi ; end
25
27
  class Object #:nodoc:
26
28
  Buildr4OSGi.constants.each do |name|
27
29
  const = Buildr4OSGi.const_get(name)
@@ -13,4 +13,5 @@
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
+ require 'buildr4osgi/compile/external'
@@ -27,8 +27,6 @@ module Buildr4OSGi
27
27
  def compile(sources, target, dependencies) #:nodoc:
28
28
  check_options options, OPTIONS
29
29
  cmd_args = []
30
- # tools.jar contains the Java compiler.
31
- dependencies << Java.tools_jar if Java.tools_jar
32
30
  cmd_args << '-classpath' << dependencies.join(File::PATH_SEPARATOR) unless dependencies.empty?
33
31
  source_paths = sources.select { |source| File.directory?(source) }
34
32
  cmd_args << '-sourcepath' << source_paths.join(File::PATH_SEPARATOR) unless source_paths.empty?
@@ -36,7 +34,7 @@ module Buildr4OSGi
36
34
  cmd_args += osgic_args
37
35
  cmd_args += files_from_sources(sources)
38
36
  unless Buildr.application.options.dryrun
39
- trace((%w[javac -classpath org.eclipse.jdt.internal.compiler.batch.Main] + cmd_args).join(' '))
37
+ trace((%w[java -classpath org.eclipse.jdt.internal.compiler.batch.Main] + cmd_args).join(' '))
40
38
  Java.load
41
39
  Java.org.eclipse.jdt.internal.compiler.batch.Main.compile(cmd_args.join(" ")) or
42
40
  fail 'Failed to compile, see errors above'
@@ -0,0 +1,71 @@
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
+ # We use an external compiler defined by ENV['EXTERNAL_COMPILER']
17
+ module Buildr4OSGi
18
+ module CompilerSupport
19
+ class ExternalC < Buildr::Compiler::Javac
20
+
21
+ OPTIONS = [:warnings, :debug, :deprecation, :source, :target, :lint, :other]
22
+
23
+ specify :language=>:java, :sources => 'java', :source_ext => 'java',
24
+ :target=>'classes', :target_ext=>'class', :packaging=>:jar
25
+
26
+
27
+ def compile(sources, target, dependencies) #:nodoc:
28
+ check_options options, OPTIONS
29
+ cmd_args = []
30
+ cmd_args << '-classpath' << dependencies.join(File::PATH_SEPARATOR) unless dependencies.empty?
31
+ source_paths = sources.select { |source| File.directory?(source) }
32
+ cmd_args << '-sourcepath' << source_paths.join(File::PATH_SEPARATOR) unless source_paths.empty?
33
+ cmd_args << '-d' << File.expand_path(target)
34
+ cmd_args += externalc_args
35
+ cmd_args += files_from_sources(sources)
36
+ unless Buildr.application.options.dryrun
37
+ fail "ENV['EXTERNAL_COMPILER'] is not defined" if ENV['EXTERNAL_COMPILER'].nil?
38
+ javac_path = "#{ENV['EXTERNAL_COMPILER']}#{File::SEPARATOR}bin#{File::SEPARATOR}java"
39
+ ecj_path = File.expand_path(File.join(File.dirname(__FILE__), "ecj-#{Buildr4OSGi::CompilerSupport::OSGiC::CURRENT_JDT_COMPILER}.jar"))
40
+ final_args = ([javac_path,"-classpath", ecj_path, "org.eclipse.jdt.internal.compiler.batch.Main"] + cmd_args).join(' ')
41
+ trace(final_args)
42
+ info %x[#{final_args}]
43
+ fail 'Failed to compile, see errors above' unless $?.success?
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ # 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
50
+ def externalc_args #:nodoc:
51
+ args = []
52
+ args << '-warn:none' unless options[:warnings]
53
+ args << '-verbose' if Buildr.application.options.trace
54
+ args << '-g' if options[:debug]
55
+ args << '-deprecation' if options[:deprecation]
56
+ args << '-source' << options[:source].to_s if options[:source]
57
+ args << '-target' << options[:target].to_s if options[:target]
58
+ case options[:lint]
59
+ when Array then args << "-Xlint:#{options[:lint].join(',')}"
60
+ when String then args << "-Xlint:#{options[:lint]}"
61
+ when true then args << '-Xlint'
62
+ end
63
+ args + Array(options[:other])
64
+ end
65
+
66
+ end
67
+
68
+ end
69
+ end
70
+
71
+ Buildr::Compiler.compilers << Buildr4OSGi::CompilerSupport::ExternalC
@@ -14,4 +14,6 @@
14
14
  # the License.
15
15
 
16
16
  require 'buildr4osgi/eclipse/plugin'
17
- require 'buildr4osgi/eclipse/feature'
17
+ require 'buildr4osgi/eclipse/feature'
18
+ require 'buildr4osgi/eclipse/site'
19
+ require 'buildr4osgi/eclipse/p2'
@@ -35,7 +35,7 @@ module Buildr4OSGi
35
35
  # Writes an Eclipse feature with this format:
36
36
  #<feature id="com.acme.MyFeature" label="%feature.name"
37
37
  # version="5.0.100" provider-name="%provider.name"
38
- # plugin="myPlugin.id">
38
+ # plugin="myPlugin.id" image="some_icon.gif">
39
39
  #
40
40
  # <description url="%changesURL">
41
41
  # %description
@@ -69,7 +69,7 @@ module Buildr4OSGi
69
69
  feature_properties = {"id" => feature_id, "label" => externalize_strings ? "%feature.name" : label,
70
70
  "version" => version, "provider-name" => externalize_strings ? "%provider.name" : provider}
71
71
  feature_properties.merge!("plugin" => branding_plugin) if branding_plugin
72
- feature_properties.merge!("plugin" => image) if image
72
+ feature_properties.merge!("image" => image) if image
73
73
  x.feature(feature_properties) {
74
74
  x.description( "%description", "url" => externalize_strings ? "%changesURL" : changesURL)
75
75
  x.copyright(copyright)
@@ -371,21 +371,26 @@ PROPERTIES
371
371
 
372
372
  def package_as_SDK_feature(file_name) #:nodoc:
373
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
374
+
375
375
  sdkPackage = FeatureTask.define_task(file_name)
376
- sdkPackage.enhance do |featureTask|
377
- featureTask.generateFeature(project)
378
- end
379
376
  sdkPackage.extend FeatureWriter
380
377
  sdkPackage.extend SDKFeatureEnabler
378
+ sdkPackage.enhance do |sdkTask|
379
+ featurePackage = packages.select {|package| package.is_a?(::Buildr4OSGi::FeaturePackaging)}.first
380
+ raise "Cannot use same feature.xml file for both binary and source features packaging" if (!featurePackage.feature_xml.nil?) && featurePackage.feature_xml == sdkTask.feature_xml
381
+ sdkTask.label += " - Sources" if featurePackage.label == sdkTask.label
382
+ sdkTask.description = "Sources for " + sdkTask.description if featurePackage.description == sdkTask.description
383
+ sdkTask.feature_id += ".sources" if featurePackage.feature_id == sdkTask.feature_id
384
+ sdkTask.generateFeature(project)
385
+ end
381
386
 
387
+ featurePackage = packages.select {|package| package.is_a?(::Buildr4OSGi::FeaturePackaging)}.first
382
388
  FeatureWriter::VARS.each do |ivar|
383
389
  value = featurePackage.instance_variable_get("@#{ivar}")
384
390
  new_value = value.clone rescue value
385
391
  sdkPackage.instance_variable_set("@#{ivar}", new_value)
386
392
  end
387
393
 
388
- sdkPackage.feature_id += ".sources"
389
394
  sdkPackage
390
395
  end
391
396
 
@@ -0,0 +1,137 @@
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 Buildr4OSGi
17
+
18
+ module P2
19
+
20
+ include Extension
21
+
22
+ def package_as_p2_from_site(file_name)
23
+ task = UpdateSitePublisherTask.define_task(file_name)
24
+ task.send :associate_with, self
25
+ return task
26
+ end
27
+
28
+ def package_as_p2_from_site_spec(spec)
29
+ spec.merge(:type => :zip, :classifier => "p2", :id => name.split(":").last)
30
+ end
31
+
32
+ class UpdateSitePublisherTask < ::Buildr::Packaging::Java::JarTask
33
+
34
+ attr_accessor :site
35
+ attr_reader :project
36
+
37
+ def initialize(*args) #:nodoc:
38
+ super
39
+ enhance do
40
+ # Buildr.ant('org.eclipse.equinox.p2.publisher.UpdateSitePublisher') do |ant|
41
+ # work_dir = File.join(project.base_dir, "target", "generated", "update-site")
42
+ # ant.java :fork => true, :failonerror => true, :classname=>'org.eclipse.equinox.p2.publisher.UpdateSitePublisher' do
43
+ # ant.arg :value => "metadataRepository"
44
+ # ant.arg :value => work_dir
45
+ # ant.arg :value => "artifactRepository"
46
+ # ant.arg :value => work_dir
47
+ # ant.arg :value => "compress"
48
+ # ant.arg :value => "publishArtifacts"
49
+ # end
50
+ # end
51
+ # http://wiki.eclipse.org/Equinox/p2/Publisher
52
+ #the p2.installer and the p2.agent don't work. currently debugging with a local eclipse sdk.
53
+ # download the app here: "org.eclipse.equinox.p2:installer:3.6M2-linux.gtk.x86:tgz"
54
+ # unzip it wherever it is.
55
+ # then invoke it on the cmd line `java -jar #{launcherLocation} -application ... -source #{siteLocation}`
56
+ #we need to give the ability to define an eclipse home that could be invoked as a replacement to this.
57
+ # p2installer = Buildr::artifact("org.eclipse.platform:eclipse-platform:tgz:3.6M3-linux-gtk")
58
+ # p2installer.invoke
59
+ # p2installerHome = File.join(project.base_dir, "target", "p2installer")
60
+ # Buildr::unzip(p2installerHome => p2installer).extract
61
+ # p2installerHome = File.join(p2installerHome, "eclipse")
62
+
63
+ #add the missing publisher plugin:
64
+ # p2publisher = Buildr::artifact("org.eclipse.equinox.p2:org.eclipse.equinox.p2.publisher:jar:1.1.0.v20090831")
65
+ # p2publisher.invoke
66
+ # cp p2publisher.to_s, File.join(p2installerHome, "plugins/#{p2publisher.id}_#{p2publisher.version}.jar")
67
+
68
+ siteWithoutP2 = project.package(:site)
69
+ siteWithoutP2.invoke
70
+
71
+ targetDir = File.join(project.base_dir, "target")
72
+ targetP2Repo = File.join(project.base_dir, "target", "p2repository");
73
+ mkpath targetP2Repo
74
+ Buildr::unzip(targetP2Repo=>siteWithoutP2.to_s).extract
75
+ eclipseSDK = Buildr::artifact("org.eclipse:eclipse-SDK:zip:3.6M3-win32")
76
+ eclipseSDK.invoke
77
+ p2installerHome = File.dirname eclipseSDK.to_s#"~/proj/eclipses/eclipse-SDK-3.6M3"
78
+ Buildr::unzip( p2installerHome => eclipseSDK.to_s ).extract
79
+ p2installerHome += "/eclipse"
80
+ launcherPlugin = Dir.glob("#{p2installerHome}/plugins/org.eclipse.equinox.launcher_*")[0]
81
+
82
+ application = "org.eclipse.equinox.p2.publisher.UpdateSitePublisher"
83
+ #this is where the artifacts are published.
84
+ metadataRepository_url = "file:#{targetP2Repo}"
85
+ artifactRepository_url = metadataRepository_url
86
+ metadataRepository_name = project.id + "_" + project.version
87
+ artifactRepository_name = project.id + "_" + project.version
88
+ source_absolutePath = targetP2Repo
89
+
90
+ cmdline = "java -jar #{launcherPlugin} -application #{application} \
91
+ -metadataRepository #{metadataRepository_url} \
92
+ -artifactRepository #{artifactRepository_url} \
93
+ -metadataRepositoryName #{metadataRepository_name} \
94
+ -artifactRepositoryName #{artifactRepository_name} \
95
+ -source #{source_absolutePath} \
96
+ -configs gtk.linux.x86 \
97
+ -publishArtifacts \
98
+ -clean -consoleLog"
99
+ puts "Invoking P2's metadata generation: #{cmdline}"
100
+ result = `#{cmdline}`
101
+ puts result
102
+
103
+ include targetP2Repo, :as=>"."
104
+
105
+ end
106
+ end
107
+
108
+ # :call-seq:
109
+ # with(options) => self
110
+ #
111
+ # Passes options to the task and returns self.
112
+ #
113
+ def with(options)
114
+ options.each do |key, value|
115
+ begin
116
+ send "#{key}=", value
117
+ rescue NoMethodError
118
+ raise ArgumentError, "#{self.class.name} does not support the option #{key}"
119
+ end
120
+ end
121
+ self
122
+ end
123
+
124
+ private
125
+
126
+ def associate_with(project)
127
+ @project = project
128
+ end
129
+
130
+ end
131
+ end
132
+ end
133
+
134
+ class Buildr::Project
135
+ include Buildr4OSGi::P2
136
+ end
137
+
@@ -0,0 +1,207 @@
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 Buildr4OSGi
17
+
18
+ class Category
19
+
20
+ attr_accessor :features, :name, :label, :description
21
+
22
+ def initialize()
23
+ @features = []
24
+ end
25
+
26
+ end
27
+
28
+ module SiteWriter
29
+
30
+ attr_accessor :description, :description_url, :categories
31
+
32
+ # :nodoc:
33
+ # When this module extends an object
34
+ # the categories are initialized as empty arrays.
35
+ #
36
+ def SiteWriter.extend_object(obj)
37
+ super(obj)
38
+ obj.categories = []
39
+ end
40
+
41
+ #
42
+ # http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/misc/update_sitemap.html
43
+ #
44
+ #<site pack200="false">
45
+ # <description url="http://www.example.com/DescriptionOfSite">Some description</description>
46
+ # <category-def name="some.id" label="Human readable label">
47
+ # <description>Some description</description>
48
+ # </category-def>
49
+ # <feature id="feature.id" version="2.0.3" url="features/myfeature.jar" patch="false">
50
+ # <category name="some.id"/>
51
+ # </feature>
52
+ #</site>
53
+ #
54
+ def writeSiteXml(feature_info)
55
+ x = Builder::XmlMarkup.new(:target => out = "", :indent => 1)
56
+ x.instruct!
57
+ x.site(:pack200 => "false") {
58
+ x.description(description, :url => description_url) if (description || description_url)
59
+ for category in categories
60
+ x.tag!("category-def", :name => category.name, :label => category.label) {
61
+ x.description category.description if category.description
62
+ }
63
+ end
64
+
65
+
66
+ f2c = feature_categories_map()
67
+ f2c.each_pair { |feature, categories|
68
+ info = feature_info[feature.to_s]
69
+ x.feature(:id => info[:id], :version => info[:version], :url => "features/#{info[:id]}_#{info[:version]}.jar", :patch => false) {
70
+ for category in categories
71
+ x.category(:name => category.name)
72
+ end
73
+ }
74
+ }
75
+ }
76
+ end
77
+
78
+ def feature_categories_map()
79
+ f2c = {}
80
+ categories.each do |category|
81
+ category.features.collect {|f| adapt_feature(f)}.flatten.each do |f|
82
+ f2c[f] ||= []
83
+ f2c[f] << category
84
+ end
85
+ end
86
+ f2c
87
+ end
88
+
89
+ def adapt_feature(obj)
90
+ artifact = case
91
+ when obj.is_a?(String)
92
+ Buildr::artifact(obj)
93
+ when obj.is_a?(Buildr::Project)
94
+ [Buildr::artifact(obj.package(:feature)), Buildr::artifact(obj.package(:sources))]
95
+ else
96
+ obj
97
+ end
98
+ artifact
99
+ end
100
+
101
+ end
102
+
103
+ #Marker module common to all sites packaging tasks.
104
+ #Tasks including this module are recognized internally as tasks packaging sites.
105
+ module SitePackaging
106
+
107
+ end
108
+
109
+ class SiteTask < ::Buildr::Packaging::Java::JarTask
110
+ include SitePackaging
111
+
112
+ attr_accessor :site_xml
113
+
114
+ def initialize(*args) #:nodoc:
115
+ super
116
+ end
117
+
118
+ def generateSite(project)
119
+ mkpath File.join(project.base_dir, 'target')
120
+ feature_files = find_feature_files()
121
+ info = {}
122
+ for feature in feature_files
123
+ dir = File.join(project.base_dir, 'target', File.basename(feature.to_s, ".*"))
124
+
125
+ feature_xml = nil
126
+ feature_info = {}
127
+ info[feature.to_s] = feature_info
128
+ Zip::ZipFile.open(feature.to_s) do |zip|
129
+
130
+ feature_xml = zip.read(zip.entries.select {|entry| entry.name.to_s.match(".*/feature\.xml")}.first)
131
+ doc = REXML::Document.new(feature_xml)
132
+ feature_info[:id] = REXML::XPath.first(doc, "/feature/@id")
133
+ feature_info[:version] = REXML::XPath.first(doc, "/feature/@version")
134
+ end
135
+ unzip = Buildr::unzip(dir => feature.to_s)
136
+
137
+ unzip.target.invoke
138
+ include(File.join(dir, "eclipse", "plugins", "*"), :path => "plugins")
139
+
140
+ Dir.glob(File.join(dir, "eclipse", "features", "*")).each do |feature_dir|
141
+ Buildr::zip(File.join(dir, "features", "#{File.basename(feature_dir)}.jar")).include(File.join(feature_dir, "*")).invoke
142
+ path("features").include File.join(dir, "features", "#{File.basename(feature_dir)}.jar")
143
+ end
144
+ end
145
+ if site_xml
146
+ path("").include site_xml
147
+ else
148
+ File.open(File.join(project.base_dir, 'target', 'site.xml'), 'w') do |f|
149
+ f.write(writeSiteXml(info))
150
+ end
151
+ path("").include File.join(project.base_dir, 'target', 'site.xml')
152
+ end
153
+
154
+ end
155
+
156
+ protected
157
+
158
+ def find_feature_files
159
+ feature_files = []
160
+ unless @categories.nil? || @categories.empty?
161
+ feature_categories_map.keys.uniq.each do |feature|
162
+ [adapt_feature(feature)].flatten.each do |artifact|
163
+ artifact.invoke
164
+ feature_files << artifact
165
+ end
166
+ end
167
+ end
168
+ feature_files
169
+ end
170
+
171
+ end
172
+
173
+ # Methods added to project to package a project as a site
174
+ #
175
+ module ActAsSite
176
+ include Extension
177
+
178
+ protected
179
+
180
+ # returns true if the project defines at least one site packaging.
181
+ # We keep this method protected and we will call it using send.
182
+ def is_packaging_site()
183
+ packages.each {|package| return true if package.is_a?(::Buildr4OSGi::SitePackaging)}
184
+ false
185
+ end
186
+
187
+ def package_as_site(file_name)
188
+ task = SiteTask.define_task(file_name)
189
+ task.extend SiteWriter
190
+ task.enhance do |siteTask|
191
+ siteTask.generateSite(project)
192
+ end
193
+ task
194
+ end
195
+
196
+ def package_as_site_spec(spec) #:nodoc:
197
+ spec.merge(:type=>:zip, :id => name.split(":").last)
198
+ end
199
+ end
200
+ end
201
+
202
+ module Buildr #:nodoc:
203
+ class Project #:nodoc:
204
+ include Buildr4OSGi::ActAsSite
205
+
206
+ end
207
+ end