warbler 0.9.14 → 1.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.
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Copyright (c) 2010 Engine Yard, Inc.
3
+ * This source code is available under the MIT license.
4
+ * See the file LICENSE.txt for details.
5
+ */
6
+
7
+ import java.io.IOException;
8
+ import org.jruby.Ruby;
9
+ import org.jruby.runtime.load.BasicLibraryService;
10
+
11
+ public class WarblerWarService implements BasicLibraryService {
12
+ public boolean basicLoad(final Ruby runtime) throws IOException {
13
+ WarblerWar.create(runtime);
14
+ return true;
15
+ }
16
+ }
17
+
data/lib/warbler.rb CHANGED
@@ -1,16 +1,32 @@
1
1
  #--
2
- # (c) Copyright 2007-2008 Sun Microsystems, Inc.
3
- # See the file LICENSES.txt included with the distribution for
4
- # software license details.
2
+ # Copyright (c) 2010 Engine Yard, Inc.
3
+ # Copyright (c) 2007-2009 Sun Microsystems, Inc.
4
+ # This source code is available under the MIT license.
5
+ # See the file LICENSE.txt for details.
5
6
  #++
6
7
 
7
8
  # Warbler is a lightweight, flexible, Rake-based system for packaging your Rails apps
8
9
  # into .war files.
9
10
  module Warbler
10
11
  WARBLER_HOME = File.expand_path(File.dirname(__FILE__) + '/..') unless defined?(WARBLER_HOME)
12
+
13
+ class << self
14
+ attr_accessor :application
15
+ attr_accessor :framework_detection
16
+ attr_writer :project_application
17
+ end
18
+
19
+ def self.project_application
20
+ application.load_project_rakefile if application
21
+ @project_application || Rake.application
22
+ end
23
+ self.framework_detection = true
11
24
  end
12
25
 
13
26
  require 'warbler/gems'
14
27
  require 'warbler/config'
28
+ require 'warbler/war'
15
29
  require 'warbler/task'
16
- require 'warbler/version'
30
+ require 'warbler/application'
31
+ require 'warbler/runtime'
32
+ require 'warbler/version'
@@ -0,0 +1,63 @@
1
+ #--
2
+ # Copyright (c) 2010 Engine Yard, Inc.
3
+ # Copyright (c) 2007-2009 Sun Microsystems, Inc.
4
+ # This source code is available under the MIT license.
5
+ # See the file LICENSE.txt for details.
6
+ #++
7
+
8
+ require 'rake'
9
+
10
+ class Warbler::Application < Rake::Application
11
+ def initialize
12
+ super
13
+ Warbler.application = self
14
+ @project_loaded = false
15
+ end
16
+
17
+ def load_rakefile
18
+ @name = 'warble'
19
+
20
+ # Load the main warbler tasks
21
+ Warbler::Task.new
22
+
23
+ task :default => :war
24
+
25
+ desc "Generate a configuration file to customize your war assembly"
26
+ task :config do
27
+ if File.exists?(Warbler::Config::FILE) && ENV["FORCE"].nil?
28
+ puts "There's another bird sitting on my favorite branch"
29
+ puts "(file '#{Warbler::Config::FILE}' already exists. Pass argument FORCE=1 to override)"
30
+ elsif !File.directory?("config")
31
+ puts "I'm confused; my favorite branch is missing"
32
+ puts "(directory 'config' is missing)"
33
+ else
34
+ cp "#{Warbler::WARBLER_HOME}/warble.rb", Warbler::Config::FILE
35
+ end
36
+ end
37
+
38
+ desc "Display version of warbler"
39
+ task :version do
40
+ puts "Warbler version #{Warbler::VERSION}"
41
+ end
42
+ end
43
+
44
+ def load_project_rakefile
45
+ return if @project_loaded
46
+ # Load any application rakefiles to aid in autodetecting applications
47
+ app = Warbler.project_application = Rake::Application.new
48
+ Rake.application = app
49
+ Rake::Application::DEFAULT_RAKEFILES.each do |rf|
50
+ if File.exist?(rf)
51
+ load rf
52
+ break
53
+ end
54
+ end
55
+ Rake.application = self
56
+ @project_loaded = true
57
+ end
58
+
59
+ def run
60
+ Rake.application = self
61
+ super
62
+ end
63
+ end
@@ -1,7 +1,8 @@
1
1
  #--
2
- # (c) Copyright 2007-2009 Sun Microsystems, Inc.
3
- # See the file LICENSES.txt included with the distribution for
4
- # software license details.
2
+ # Copyright (c) 2010 Engine Yard, Inc.
3
+ # Copyright (c) 2007-2009 Sun Microsystems, Inc.
4
+ # This source code is available under the MIT license.
5
+ # See the file LICENSE.txt for details.
5
6
  #++
6
7
 
7
8
  require 'ostruct'
@@ -11,11 +12,20 @@ module Warbler
11
12
  class Config
12
13
  TOP_DIRS = %w(app config lib log vendor)
13
14
  FILE = "config/warble.rb"
15
+ DEFAULT_GEM_PATH = '/WEB-INF/gems'
14
16
  BUILD_GEMS = %w(warbler rake rcov)
15
17
 
16
- # Directory where files will be staged, defaults to tmp/war
18
+ # Deprecated: No longer has any effect.
17
19
  attr_accessor :staging_dir
18
20
 
21
+ # A hash of files that Warbler will build into the .war file. Keys
22
+ # to the hash are filenames in the .war, values are either nil
23
+ # (for a directory entry), the source filenames or IO objects for
24
+ # temporary file contents. This will be filled with files by the
25
+ # various Warbler tasks as they run. You can add arbitrary
26
+ # filenames to this hash if you wish.
27
+ attr_accessor :files
28
+
19
29
  # Directory where the war file will be written. Can be used to direct
20
30
  # Warbler to place your war file directly in your application server's
21
31
  # autodeploy directory. Defaults to the root of the Rails directory.
@@ -38,7 +48,7 @@ module Warbler
38
48
  # Java libraries to copy to WEB-INF/lib
39
49
  attr_accessor :java_libs
40
50
 
41
- # Rubygems to install into the webapp at WEB-INF/gems
51
+ # Rubygems to install into the webapp.
42
52
  attr_accessor :gems
43
53
 
44
54
  # Whether to include dependent gems (default true)
@@ -63,6 +73,17 @@ module Warbler
63
73
  # by jar -cf....
64
74
  attr_accessor :manifest_file
65
75
 
76
+ # Files for WEB-INF directory (next to web.xml). Contains web.xml by default.
77
+ # If there are .erb files they will be processed with webxml config.
78
+ attr_accessor :webinf_files
79
+
80
+ # Use Bundler to locate gems if Gemfile is found. Default is true.
81
+ attr_accessor :bundler
82
+
83
+ # Path to the pre-bundled gem directory inside the war file. Default is '/WEB-INF/gems'.
84
+ # This also sets 'gem.path' inside web.xml.
85
+ attr_accessor :gem_path
86
+
66
87
  # Extra configuration for web.xml. Controls how the dynamically-generated web.xml
67
88
  # file is generated.
68
89
  #
@@ -78,6 +99,7 @@ module Warbler
78
99
  # * <tt>webxml.rails.env</tt> -- the Rails environment to use for the
79
100
  # running application, usually either development or production (the
80
101
  # default).
102
+ # * <tt>webxml.gem.path</tt> -- the path to your bundled gem directory
81
103
  # * <tt>webxml.jruby.min.runtimes</tt> -- minimum number of pooled runtimes to
82
104
  # keep around during idle time
83
105
  # * <tt>webxml.jruby.max.runtimes</tt> -- maximum number of pooled Rails
@@ -92,13 +114,13 @@ module Warbler
92
114
 
93
115
  def initialize(warbler_home = WARBLER_HOME)
94
116
  @warbler_home = warbler_home
95
- @staging_dir = File.join("tmp", "war")
96
117
  @dirs = TOP_DIRS.select {|d| File.directory?(d)}
97
118
  @includes = FileList[]
98
119
  @excludes = FileList[]
99
120
  @java_libs = default_jar_files
100
121
  @java_classes = FileList[]
101
122
  @gems = Warbler::Gems.new
123
+ @gem_path = DEFAULT_GEM_PATH
102
124
  @gem_dependencies = true
103
125
  @exclude_logs = true
104
126
  @public_html = FileList["public/**/*"]
@@ -106,17 +128,24 @@ module Warbler
106
128
  @webxml = default_webxml_config
107
129
  @rails_root = File.expand_path(defined?(RAILS_ROOT) ? RAILS_ROOT : Dir.getwd)
108
130
  @war_name = File.basename(@rails_root)
131
+ @bundler = true
132
+ @webinf_files = default_webinf_files
109
133
  auto_detect_frameworks
110
134
  yield self if block_given?
135
+ update_gem_path
136
+ detect_bundler_gems
111
137
  @excludes += warbler_vendor_excludes(warbler_home)
112
138
  @excludes += FileList["**/*.log"] if @exclude_logs
113
- @excludes << @staging_dir
114
139
  end
115
140
 
116
141
  def gems=(value)
117
142
  @gems = Warbler::Gems.new(value)
118
143
  end
119
144
 
145
+ def relative_gem_path
146
+ @gem_path[1..-1]
147
+ end
148
+
120
149
  private
121
150
  def warbler_vendor_excludes(warbler_home)
122
151
  warbler = File.expand_path(warbler_home)
@@ -133,8 +162,9 @@ module Warbler
133
162
  p.java_libs = ["WEB-INF/lib/%f"]
134
163
  p.java_classes = ["WEB-INF/classes/%p"]
135
164
  p.application = ["WEB-INF/%p"]
136
- p.gemspecs = ["WEB-INF/gems/specifications/%f"]
137
- p.gems = ["WEB-INF/gems/gems/%n"]
165
+ p.webinf = ["WEB-INF/%{.erb$,}f"]
166
+ p.gemspecs = ["#{relative_gem_path}/specifications/%f"]
167
+ p.gems = ["#{relative_gem_path}/gems/%p"]
138
168
  p
139
169
  end
140
170
 
@@ -147,13 +177,61 @@ module Warbler
147
177
  c
148
178
  end
149
179
 
180
+ def default_webinf_files
181
+ webxml = if File.exist?("config/web.xml")
182
+ "config/web.xml"
183
+ elsif File.exist?("config/web.xml.erb")
184
+ "config/web.xml.erb"
185
+ else
186
+ "#{WARBLER_HOME}/web.xml.erb"
187
+ end
188
+ FileList[webxml]
189
+ end
190
+
191
+ def update_gem_path
192
+ if @gem_path != DEFAULT_GEM_PATH
193
+ @gem_path = "/#{@gem_path}" unless @gem_path =~ %r{^/}
194
+ sub_gem_path = @gem_path[1..-1]
195
+ @pathmaps.gemspecs.each {|p| p.sub!(DEFAULT_GEM_PATH[1..-1], sub_gem_path)}
196
+ @pathmaps.gems.each {|p| p.sub!(DEFAULT_GEM_PATH[1..-1], sub_gem_path)}
197
+ @webxml["gem"]["path"] = @gem_path
198
+ end
199
+ end
200
+
201
+ def detect_bundler_gems
202
+ if @bundler && File.exist?("Gemfile")
203
+ @gems.clear
204
+ @gem_dependencies = false # Bundler takes care of these
205
+ require 'bundler'
206
+ env = Bundler.respond_to?(:runtime) ? Bundler.runtime : Bundler.load
207
+ def Bundler.env_file; root.join(::Warbler::Runtime::WAR_ENV); end
208
+ env.extend Warbler::Runtime
209
+ env.gem_path = @gem_path
210
+ env.write_war_environment
211
+ env.war_specs.each {|spec| @gems << spec }
212
+ else
213
+ @bundler = false
214
+ end
215
+ end
216
+
150
217
  def default_jar_files
151
218
  require 'jruby-jars'
152
- FileList["#{@warbler_home}/lib/*.jar", JRubyJars.core_jar_path, JRubyJars.stdlib_jar_path]
219
+ require 'jruby-rack'
220
+ FileList[JRubyJars.core_jar_path, JRubyJars.stdlib_jar_path, JRubyJars.jruby_rack_jar_path]
153
221
  end
154
222
 
155
223
  def auto_detect_frameworks
156
- !Warbler.framework_detection || auto_detect_rails || auto_detect_merb || auto_detect_rackup
224
+ return unless Warbler.framework_detection
225
+ if File.exist?(".bundle/environment.rb")
226
+ begin # Don't want Bundler to load from .bundle/environment
227
+ mv(".bundle/environment.rb",".bundle/environment-save.rb", :verbose => false)
228
+ auto_detect_rails || auto_detect_merb || auto_detect_rackup
229
+ ensure
230
+ mv(".bundle/environment-save.rb",".bundle/environment.rb", :verbose => false)
231
+ end
232
+ else
233
+ auto_detect_rails || auto_detect_merb || auto_detect_rackup
234
+ end
157
235
  end
158
236
 
159
237
  def auto_detect_rails
@@ -166,9 +244,17 @@ module Warbler
166
244
  @gems["rails"] = Rails::VERSION::STRING
167
245
  end
168
246
  if defined?(Rails.configuration.gems)
169
- Rails.configuration.gems.each {|g| @gems << Gem::Dependency.new(g.name, g.requirement) }
247
+ Rails.configuration.gems.each do |g|
248
+ @gems << Gem::Dependency.new(g.name, g.requirement) if Dir["vendor/gems/#{g.name}*"].empty?
249
+ end
250
+ end
251
+ if defined?(Rails.configuration.threadsafe!) &&
252
+ (defined?(Rails.configuration.allow_concurrency) && # Rails 3
253
+ Rails.configuration.allow_concurrency && Rails.configuration.preload_frameworks) ||
254
+ (defined?(Rails.configuration.action_controller.allow_concurrency) && # Rails 2
255
+ Rails.configuration.action_controller.allow_concurrency && Rails.configuration.action_controller.preload_frameworks)
256
+ @webxml.jruby.max.runtimes = 1
170
257
  end
171
- @webxml.jruby.max.runtimes = 1 if defined?(Rails.configuration.threadsafe!)
172
258
  true
173
259
  end
174
260
 
@@ -189,6 +275,7 @@ module Warbler
189
275
  return false unless File.exist?("config.ru")
190
276
  @webxml.booter = :rack
191
277
  @webxml.rackup = File.read("config.ru")
278
+ true
192
279
  end
193
280
  end
194
281
 
data/lib/warbler/gems.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  #--
2
- # (c) Copyright 2007-2008 Sun Microsystems, Inc.
3
- # See the file LICENSES.txt included with the distribution for
4
- # software license details.
2
+ # Copyright (c) 2010 Engine Yard, Inc.
3
+ # Copyright (c) 2007-2009 Sun Microsystems, Inc.
4
+ # This source code is available under the MIT license.
5
+ # See the file LICENSE.txt for details.
5
6
  #++
6
7
 
7
8
  module Warbler
@@ -0,0 +1,43 @@
1
+ module Warbler
2
+ # Extension module for a Bundler::Runtime instance, to add methods
3
+ # to create a Bundler environment file specific to war packaging.
4
+ module Runtime
5
+ WAR_ENV = ".bundle/war-environment.rb"
6
+
7
+ attr_writer :gem_path
8
+ def gem_path
9
+ @gem_path || Config::DEFAULT_GEM_PATH
10
+ end
11
+
12
+ class Spec
13
+ def initialize(spec, gem_path)
14
+ location = spec[:loaded_from][%r{(.*)/specifications}, 1]
15
+ spec = spec.dup
16
+ spec[:loaded_from] = spec[:loaded_from].sub(location, gem_path)
17
+ spec[:load_paths] = spec[:load_paths].map {|p| p.sub(location, gem_path)}
18
+ @spec = spec
19
+ end
20
+
21
+ def inspect
22
+ str = @spec.inspect
23
+ str.gsub(%r'"/WEB-INF(/[^"]*)"', 'File.expand_path("../..\1", __FILE__)')
24
+ end
25
+ end
26
+
27
+ def rb_lock_file
28
+ root.join(WAR_ENV)
29
+ end
30
+
31
+ def specs_for_lock_file
32
+ super.map {|s| Spec.new(s, gem_path)}
33
+ end
34
+
35
+ def write_war_environment
36
+ write_rb_lock
37
+ end
38
+
39
+ def war_specs
40
+ respond_to?(:requested_specs) ? requested_specs : specs_for
41
+ end
42
+ end
43
+ end
data/lib/warbler/task.rb CHANGED
@@ -1,39 +1,29 @@
1
1
  #--
2
- # (c) Copyright 2007-2009 Sun Microsystems, Inc.
3
- # See the file LICENSES.txt included with the distribution for
4
- # software license details.
2
+ # Copyright (c) 2010 Engine Yard, Inc.
3
+ # Copyright (c) 2007-2009 Sun Microsystems, Inc.
4
+ # This source code is available under the MIT license.
5
+ # See the file LICENSE.txt for details.
5
6
  #++
6
7
 
7
8
  require 'rake'
8
9
  require 'rake/tasklib'
10
+ require 'stringio'
11
+ require 'zip/zip'
9
12
 
10
13
  module Warbler
11
- class << self
12
- attr_writer :project_application
13
- def project_application
14
- @project_application || Rake.application
15
- end
16
-
17
- attr_accessor :framework_detection
18
- end
19
- self.framework_detection = true
20
-
21
14
  # Warbler Rake task. Allows defining multiple configurations inside the same
22
15
  # Rakefile by using different task names.
23
16
  class Task < Rake::TaskLib
24
- COPY_PROC = proc {|t| cp t.prerequisites.last, t.name }
25
-
26
17
  # Task name
27
18
  attr_accessor :name
28
19
 
29
20
  # Warbler::Config
30
21
  attr_accessor :config
31
22
 
32
- # Whether to print a line when a file or directory task is declared; helps
33
- # to see what is getting included
34
- attr_accessor :verbose
23
+ # Warbler::War
24
+ attr_accessor :war
35
25
 
36
- def initialize(name = :war, config = nil, tasks = :define_tasks)
26
+ def initialize(name = :war, config = nil)
37
27
  @name = name
38
28
  @config = config
39
29
  if @config.nil? && File.exists?(Config::FILE)
@@ -41,310 +31,87 @@ module Warbler
41
31
  end
42
32
  @config ||= Config.new
43
33
  unless @config.kind_of? Config
44
- warn "War::Config not provided by override in initializer or #{Config::FILE}; using defaults"
34
+ warn "Warbler::Config not provided by override in initializer or #{Config::FILE}; using defaults"
45
35
  @config = Config.new
46
36
  end
37
+ @war = Warbler::War.new
47
38
  yield self if block_given?
48
- send tasks
39
+ define_tasks
49
40
  end
50
41
 
51
42
  private
52
43
  def define_tasks
53
44
  define_main_task
54
- define_clean_task
55
- define_public_task
56
- define_gems_task
57
- define_webxml_task
58
- define_app_task
59
- define_jar_task
60
- define_exploded_task
61
- define_debug_task
62
- end
63
-
64
- def define_main_task
65
- desc "Create #{@config.war_name}.war"
66
- task @name => ["#{@name}:app", "#{@name}:public", "#{@name}:webxml", "#{@name}:jar"]
67
- end
68
-
69
- def define_clean_task
70
- with_namespace_and_config do |name, config|
71
- desc "Clean up the .war file and the staging area"
72
- task "clean" do
73
- rm_rf config.staging_dir
74
- rm_f "#{config.war_name}.war"
75
- end
76
- task "clear" => "#{name}:clean"
77
- end
78
- end
79
-
80
- def define_public_task
81
- public_target_files = define_public_file_tasks
82
- with_namespace_and_config do
83
- desc "Copy all public HTML files to the root of the .war"
84
- task "public" => public_target_files
85
- task "debug:public" do
86
- puts "", "public files:"
87
- puts *public_target_files
88
- end
89
- end
90
- end
91
-
92
- def define_gems_task
93
- directory "#{config.staging_dir}/#{apply_pathmaps("sources-0.0.1.gem", :gems).pathmap("%d")}"
94
- targets = define_copy_gems_task
95
- with_namespace_and_config do
96
- desc "Unpack all gems into WEB-INF/gems"
97
- task "gems" => targets
98
- task "debug:gems" do
99
- puts "", "gems files:"
100
- puts *targets
101
- end
45
+ namespace name do
46
+ define_clean_task
47
+ define_files_task
48
+ define_gemjar_task
49
+ define_jar_task
50
+ define_debug_task
102
51
  end
103
52
  end
104
53
 
105
- def define_webxml_task
106
- with_namespace_and_config do |name, config|
107
- desc "Generate a web.xml file for the webapp"
108
- task "webxml" do
109
- mkdir_p "#{config.staging_dir}/WEB-INF"
110
- if File.exist?("config/web.xml")
111
- cp "config/web.xml", "#{config.staging_dir}/WEB-INF"
112
- else
113
- erb = if File.exist?("config/web.xml.erb")
114
- "config/web.xml.erb"
115
- else
116
- "#{WARBLER_HOME}/web.xml.erb"
117
- end
118
- require 'erb'
119
- erb = ERB.new(File.open(erb) {|f| f.read })
120
- File.open("#{config.staging_dir}/WEB-INF/web.xml", "w") do |f|
121
- f << erb.result(erb_binding(config.webxml))
122
- end
123
- end
54
+ def define_main_task
55
+ desc "Create the project .war file"
56
+ task @name do
57
+ # Invoke this way so custom dependencies can be defined before
58
+ # the file find routine is run
59
+ ["#{@name}:files", "#{@name}:jar"].each do |t|
60
+ Rake::Task[t].invoke
124
61
  end
125
62
  end
126
63
  end
127
64
 
128
- def define_java_libs_task
129
- target_files = @config.java_libs.map do |lib|
130
- define_file_task(lib,
131
- "#{@config.staging_dir}/#{apply_pathmaps(lib, :java_libs)}")
132
- end
133
- with_namespace_and_config do |name, config|
134
- desc "Copy all java libraries into the .war"
135
- task "java_libs" => target_files
136
- task "debug:java_libs" do
137
- puts "", "java_libs files:"
138
- puts *target_files
139
- end
65
+ def define_clean_task
66
+ desc "Remove the .war file"
67
+ task "clean" do
68
+ rm_f "#{config.war_name}.war"
140
69
  end
141
- target_files
70
+ task "clear" => "#{name}:clean"
142
71
  end
143
72
 
144
- def define_java_classes_task
145
- target_files = @config.java_classes.map do |f|
146
- define_file_task(f,
147
- "#{@config.staging_dir}/#{apply_pathmaps(f, :java_classes)}")
148
- end
149
- with_namespace_and_config do |name, config|
150
- desc "Copy java classes into the .war"
151
- task "java_classes" => target_files
152
- task "debug:java_classes" do
153
- puts "", "java_classes files:"
154
- puts *target_files
155
- end
73
+ def define_files_task
74
+ task "files" do
75
+ war.apply(config)
156
76
  end
157
- target_files
158
77
  end
159
78
 
160
- def define_app_task
161
- webinf_target_files = define_webinf_file_tasks
162
- with_namespace_and_config do |name, config|
163
- desc "Copy all application files into the .war"
164
- task "app" => ["#{name}:gems", *webinf_target_files]
165
- task "debug:app" do
166
- puts "", "app files:"
167
- puts *webinf_target_files
79
+ def define_gemjar_task
80
+ gem_jar = Warbler::War.new
81
+ task "gemjar" => "files" do
82
+ gem_path = Regexp::quote(config.relative_gem_path)
83
+ gems = war.files.select{|k,v| k =~ %r{#{gem_path}/} }
84
+ gems.each do |k,v|
85
+ gem_jar.files[k.sub(%r{#{gem_path}/}, '')] = v
168
86
  end
87
+ war.files["WEB-INF/lib/gems.jar"] = "tmp/gems.jar"
88
+ war.files.reject!{|k,v| k =~ /#{gem_path}/ }
89
+ mkdir_p "tmp"
90
+ gem_jar.create("tmp/gems.jar")
169
91
  end
170
92
  end
171
93
 
172
94
  def define_jar_task
173
- with_namespace_and_config do |name, config|
174
- desc "Run the jar command to create the .war"
175
- task "jar" do
176
- war_path = "#{config.war_name}.war"
177
- war_path = File.join(config.autodeploy_dir, war_path) if config.autodeploy_dir
178
- flags, manifest = config.manifest_file ? ["cfm", config.manifest_file] : ["cf", ""]
179
- sh "jar #{flags} #{war_path} #{manifest} -C #{config.staging_dir} ."
180
- end
181
- end
182
- end
183
-
184
- def define_exploded_task
185
- with_namespace_and_config do |name,config|
186
- libs = define_java_libs_task
187
- desc "Create an exploded war in the app's public directory"
188
- task "exploded" => ["webxml", "java_classes", "gems", *libs] do
189
- cp "#{@config.staging_dir}/WEB-INF/web.xml", "."
190
- cp File.join(WARBLER_HOME, "sun-web.xml"), "." unless File.exists?("sun-web.xml")
191
- ln_sf "#{@config.staging_dir}/WEB-INF/gems", "."
192
- if File.directory?("#{@config.staging_dir}/WEB-INF/classes")
193
- ln_sf "#{@config.staging_dir}/WEB-INF/classes", "."
194
- end
195
- mkdir_p "lib"
196
- libs.each {|l| ln_sf l, "lib/#{File.basename(l)}"}
197
- ln_sf "..", "public/WEB-INF"
198
- end
199
-
200
- task "clean:exploded" do
201
- (libs.map {|l| "lib/#{File.basename(l)}" } +
202
- ["gems", "public/WEB-INF", "classes"]).each do |l|
203
- rm_f l if File.exist?(l) && File.symlink?(l)
204
- end
205
- rm_f "*web.xml"
206
- end
95
+ task "jar" do
96
+ war.create(config)
207
97
  end
208
98
  end
209
99
 
210
100
  def define_debug_task
211
- with_namespace_and_config do |name, config|
212
- task "debug" do
213
- require 'yaml'
214
- puts YAML::dump(config)
215
- end
216
- all_debug_tasks = %w(: app java_libs java_classes gems public includes excludes).map do |n|
217
- n.sub(/^:?/, "#{name}:debug:").sub(/:$/, '')
218
- end
219
- task "debug:all" => all_debug_tasks
220
- end
221
- end
222
-
223
- def define_public_file_tasks
224
- @config.public_html.map do |f|
225
- define_file_task(f, "#{@config.staging_dir}/#{apply_pathmaps(f, :public_html)}")
226
- end
227
- end
228
-
229
- def define_webinf_file_tasks
230
- target_files = @config.dirs.select do |d|
231
- exists = File.directory?(d)
232
- warn "warning: application directory `#{d}' does not exist or is not a directory; skipping" unless exists
233
- exists
234
- end.map do |d|
235
- define_file_task(d, "#{@config.staging_dir}/#{apply_pathmaps(d, :application)}")
236
- end
237
- files = FileList[*(@config.dirs.map{|d| "#{d}/**/*"})]
238
- files.include *(@config.includes.to_a)
239
- files.exclude *(@config.excludes.to_a)
240
- target_files += files.map do |f|
241
- define_file_task(f,
242
- "#{@config.staging_dir}/#{apply_pathmaps(f, :application)}")
101
+ desc "Dump diagnostic information"
102
+ task "debug" => "files" do
103
+ require 'yaml'
104
+ puts YAML::dump(config)
105
+ war.files.each {|k,v| puts "#{k} -> #{String === v ? v : '<blob>'}"}
243
106
  end
244
- target_files += define_java_libs_task
245
- target_files += define_java_classes_task
246
- task "#@name:debug:includes" do
107
+ task "debug:includes" => "files" do
247
108
  puts "", "included files:"
248
- puts *files.include
109
+ puts *war.webinf_filelist.include
249
110
  end
250
- task "#@name:debug:excludes" do
111
+ task "debug:excludes" => "files" do
251
112
  puts "", "excluded files:"
252
- puts *files.exclude
253
- end
254
- target_files
255
- end
256
-
257
- def define_file_task(source, target)
258
- if File.directory?(source)
259
- directory target
260
- puts %{directory "#{target}"} if verbose
261
- else
262
- directory File.dirname(target)
263
- file(target => [File.dirname(target), source], &COPY_PROC)
264
- puts %{file "#{target}" => "#{source}"} if verbose
265
- end
266
- target
267
- end
268
-
269
- def with_namespace_and_config
270
- name, config = @name, @config
271
- namespace name do
272
- yield name, config
273
- end
274
- end
275
-
276
- def define_copy_gems_task
277
- targets = []
278
- @config.gems.each do |gem, version|
279
- define_single_gem_tasks(gem, targets, version)
280
- end
281
- targets
282
- end
283
-
284
- def define_single_gem_tasks(gem_pattern, targets, version = nil)
285
- gem = case gem_pattern
286
- when Gem::Dependency
287
- gem_pattern
288
- else
289
- Gem::Dependency.new(gem_pattern, Gem::Requirement.create(version))
290
- end
291
-
292
- # skip development dependencies
293
- return if gem.respond_to?(:type) and gem.type != :runtime
294
-
295
- matched = Gem.source_index.search(gem)
296
- fail "gem '#{gem}' not installed" if matched.empty?
297
- spec = matched.last
298
-
299
- # skip gems with no load path
300
- return if spec.loaded_from == ""
301
-
302
- gem_name = "#{spec.name}-#{spec.version}"
303
- unless spec.platform.nil? || spec.platform == Gem::Platform::RUBY
304
- [spec.platform, spec.original_platform].each do |p|
305
- name = "#{gem_name}-#{p}"
306
- if File.exist?(File.join(Gem.dir, 'cache', "#{name}.gem"))
307
- gem_name = name
308
- break
309
- end
310
- end
113
+ puts *war.webinf_filelist.exclude
311
114
  end
312
-
313
- gem_unpack_task_name = "gem:#{gem_name}"
314
- return if Rake::Task.task_defined?(gem_unpack_task_name)
315
-
316
- targets << define_file_task(spec.loaded_from,
317
- "#{@config.staging_dir}/#{apply_pathmaps(spec.loaded_from, :gemspecs)}")
318
-
319
- task targets.last do
320
- Rake::Task[gem_unpack_task_name].invoke
321
- end
322
-
323
- src = File.join(Gem.dir, 'cache', "#{gem_name}.gem")
324
- dest = "#{config.staging_dir}/#{apply_pathmaps(src, :gems)}"
325
-
326
- task gem_unpack_task_name => [dest.pathmap("%d")] do |t|
327
- require 'rubygems/installer'
328
- Gem::Installer.new(src, :unpack => true).unpack(dest)
329
- end
330
-
331
- if @config.gem_dependencies
332
- spec.dependencies.each do |dep|
333
- define_single_gem_tasks(dep, targets)
334
- end
335
- end
336
- end
337
-
338
- def erb_binding(webxml)
339
- binding
340
- end
341
-
342
- def apply_pathmaps(file, pathmaps)
343
- pathmaps = @config.pathmaps.send(pathmaps)
344
- pathmaps.each do |p|
345
- file = file.pathmap(p)
346
- end if pathmaps
347
- file
348
115
  end
349
116
  end
350
117
  end