trinidad 1.3.5 → 1.4.0.RC
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.
- data/Gemfile +8 -2
- data/History.txt +43 -0
- data/LICENSE +3 -2
- data/README.md +121 -51
- data/Rakefile +2 -3
- data/lib/trinidad.rb +6 -10
- data/lib/trinidad/command_line_parser.rb +65 -65
- data/lib/trinidad/configuration.rb +103 -26
- data/lib/trinidad/lifecycle/base.rb +70 -0
- data/lib/trinidad/lifecycle/host.rb +87 -0
- data/lib/trinidad/lifecycle/host/restart_reload.rb +13 -0
- data/lib/trinidad/lifecycle/host/rolling_reload.rb +72 -0
- data/lib/trinidad/lifecycle/web_app/default.rb +94 -0
- data/lib/trinidad/lifecycle/web_app/shared.rb +53 -0
- data/lib/trinidad/lifecycle/web_app/war.rb +52 -0
- data/lib/trinidad/logging.rb +282 -0
- data/lib/trinidad/server.rb +142 -149
- data/lib/trinidad/version.rb +1 -1
- data/lib/trinidad/web_app.rb +278 -106
- data/rakelib/tomcat.rake +41 -10
- data/src/java/org/apache/juli/FileHandler.java +401 -0
- data/trinidad.gemspec +5 -9
- metadata +29 -19
- data/lib/trinidad/core_ext.rb +0 -42
- data/lib/trinidad/lifecycle/lifecycle_listener_base.rb +0 -88
- data/lib/trinidad/lifecycle/lifecycle_listener_default.rb +0 -84
- data/lib/trinidad/lifecycle/lifecycle_listener_host.rb +0 -81
- data/lib/trinidad/lifecycle/lifecycle_listener_war.rb +0 -43
- data/lib/trinidad/lifecycle/takeover.rb +0 -25
- data/lib/trinidad/log_formatter.rb +0 -18
- data/lib/trinidad/rackup_web_app.rb +0 -16
- data/lib/trinidad/rails_web_app.rb +0 -13
- data/lib/trinidad/war_web_app.rb +0 -19
data/lib/trinidad/core_ext.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
Hash.class_eval do
|
2
|
-
# Merges self with another hash, recursively.
|
3
|
-
#
|
4
|
-
# This code was lovingly stolen from some random gem:
|
5
|
-
# http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
|
6
|
-
#
|
7
|
-
# Thanks to whoever made it.
|
8
|
-
def deep_merge(hash)
|
9
|
-
target = dup
|
10
|
-
|
11
|
-
hash.keys.each do |key|
|
12
|
-
if hash[key].is_a? Hash and self[key].is_a? Hash
|
13
|
-
target[key] = target[key].deep_merge(hash[key])
|
14
|
-
next
|
15
|
-
end
|
16
|
-
|
17
|
-
value = hash[key]
|
18
|
-
value.strip! if value.respond_to?(:strip!)
|
19
|
-
target[key] = value
|
20
|
-
end
|
21
|
-
|
22
|
-
target
|
23
|
-
end
|
24
|
-
|
25
|
-
def deep_merge!(second)
|
26
|
-
second.each_pair do |k,v|
|
27
|
-
if self[k].is_a?(Hash) and second[k].is_a?(Hash)
|
28
|
-
self[k].deep_merge!(second[k])
|
29
|
-
else
|
30
|
-
self[k] = second[k]
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def symbolize!
|
36
|
-
keys.each do |key|
|
37
|
-
self[key].symbolize! if self[key].is_a?(Hash)
|
38
|
-
self[key.to_sym] = self.delete(key)
|
39
|
-
end
|
40
|
-
self
|
41
|
-
end
|
42
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
module Trinidad
|
2
|
-
module Lifecycle
|
3
|
-
class Base
|
4
|
-
include Trinidad::Tomcat::LifecycleListener
|
5
|
-
attr_reader :webapp
|
6
|
-
|
7
|
-
def initialize(webapp)
|
8
|
-
@webapp = webapp
|
9
|
-
@configured_logger = false
|
10
|
-
end
|
11
|
-
|
12
|
-
def lifecycleEvent(event)
|
13
|
-
if Trinidad::Tomcat::Lifecycle::BEFORE_START_EVENT == event.type
|
14
|
-
context = event.lifecycle
|
15
|
-
configure_defaults(context)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def configure_defaults(context)
|
20
|
-
remove_defaults(context)
|
21
|
-
configure_logging
|
22
|
-
end
|
23
|
-
|
24
|
-
def remove_defaults(context)
|
25
|
-
context.remove_welcome_file('index.jsp')
|
26
|
-
context.remove_welcome_file('index.htm')
|
27
|
-
context.remove_welcome_file('index.html')
|
28
|
-
|
29
|
-
jsp_servlet = context.find_child('jsp')
|
30
|
-
context.remove_child(jsp_servlet) if jsp_servlet
|
31
|
-
|
32
|
-
context.remove_servlet_mapping('*.jspx')
|
33
|
-
context.remove_servlet_mapping('*.jsp')
|
34
|
-
|
35
|
-
context.process_tlds = false
|
36
|
-
context.xml_validation = false
|
37
|
-
end
|
38
|
-
|
39
|
-
def configure_logging
|
40
|
-
return if @configured_logger
|
41
|
-
|
42
|
-
log_path = File.join(@webapp.work_dir, 'log', "#{@webapp.environment}.log")
|
43
|
-
log_file = java.io.File.new(log_path)
|
44
|
-
|
45
|
-
unless log_file.exists
|
46
|
-
log_file.parent_file.mkdirs
|
47
|
-
log_file.create_new_file
|
48
|
-
end
|
49
|
-
|
50
|
-
jlogging = java.util.logging
|
51
|
-
|
52
|
-
file_handler = jlogging.FileHandler.new(log_path, true)
|
53
|
-
|
54
|
-
out_handler = jlogging.ConsoleHandler.new
|
55
|
-
out_handler.set_output_stream JRuby.runtime.out
|
56
|
-
|
57
|
-
err_handler = jlogging.ConsoleHandler.new
|
58
|
-
err_handler.set_output_stream JRuby.runtime.err
|
59
|
-
|
60
|
-
logger = jlogging.Logger.get_logger("")
|
61
|
-
|
62
|
-
log_level = @webapp.log
|
63
|
-
unless %w{ALL CONFIG FINE FINER FINEST INFO OFF SEVERE WARNING}.include?(log_level)
|
64
|
-
puts "Invalid log level #{log_level}, using default: INFO"
|
65
|
-
log_level = 'INFO'
|
66
|
-
end
|
67
|
-
|
68
|
-
level = jlogging.Level.parse(log_level)
|
69
|
-
|
70
|
-
console_handler = logger.handlers.first
|
71
|
-
logger.remove_handler(console_handler)
|
72
|
-
|
73
|
-
logger.add_handler(file_handler)
|
74
|
-
logger.add_handler(out_handler)
|
75
|
-
logger.add_handler(err_handler)
|
76
|
-
|
77
|
-
logger.handlers.each do |handler|
|
78
|
-
handler.level = level
|
79
|
-
handler.formatter = Trinidad::LogFormatter.new
|
80
|
-
end
|
81
|
-
|
82
|
-
logger.level = level
|
83
|
-
|
84
|
-
@configured_logger = true
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
module Trinidad
|
2
|
-
module Lifecycle
|
3
|
-
class Default < Base
|
4
|
-
def configure_defaults(context)
|
5
|
-
super
|
6
|
-
deployment_descriptor = configure_deployment_descriptor(context)
|
7
|
-
unless deployment_descriptor
|
8
|
-
configure_rack_servlet(context)
|
9
|
-
configure_rack_listener(context)
|
10
|
-
end
|
11
|
-
configure_init_params(context)
|
12
|
-
configure_context_loader(context)
|
13
|
-
end
|
14
|
-
|
15
|
-
def configure_deployment_descriptor(context)
|
16
|
-
if descriptor = @webapp.default_deployment_descriptor
|
17
|
-
listeners = context.findLifecycleListeners
|
18
|
-
context_config = listeners && listeners.find do |listener|
|
19
|
-
listener.is_a?(Trinidad::Tomcat::ContextConfig)
|
20
|
-
end
|
21
|
-
|
22
|
-
unless context_config
|
23
|
-
context_config = Trinidad::Tomcat::ContextConfig.new
|
24
|
-
context.addLifecycleListener(context_config)
|
25
|
-
end
|
26
|
-
|
27
|
-
context_config.setDefaultWebXml(descriptor)
|
28
|
-
end
|
29
|
-
descriptor
|
30
|
-
end
|
31
|
-
|
32
|
-
def configure_rack_servlet(context)
|
33
|
-
wrapper = context.create_wrapper
|
34
|
-
if @webapp.servlet[:instance]
|
35
|
-
wrapper.servlet = @webapp.servlet[:instance]
|
36
|
-
else
|
37
|
-
wrapper.servlet_class = @webapp.servlet[:class]
|
38
|
-
end
|
39
|
-
wrapper.name = @webapp.servlet[:name]
|
40
|
-
|
41
|
-
context.add_child(wrapper)
|
42
|
-
context.add_servlet_mapping('/*', wrapper.name)
|
43
|
-
end
|
44
|
-
|
45
|
-
def configure_rack_listener(context)
|
46
|
-
context.addApplicationListener(@webapp.rack_listener) unless @webapp.servlet[:instance]
|
47
|
-
end
|
48
|
-
|
49
|
-
def configure_init_params(context)
|
50
|
-
@webapp.init_params.each do |name, value|
|
51
|
-
context.addParameter(name, value)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def configure_context_loader(context)
|
56
|
-
class_loader = @webapp.class_loader
|
57
|
-
|
58
|
-
add_application_jars(class_loader)
|
59
|
-
add_application_java_classes(class_loader)
|
60
|
-
|
61
|
-
loader = Trinidad::Tomcat::WebappLoader.new(class_loader)
|
62
|
-
loader.container = context
|
63
|
-
context.loader = loader
|
64
|
-
end
|
65
|
-
|
66
|
-
def add_application_jars(class_loader)
|
67
|
-
return unless @webapp.libs_dir
|
68
|
-
|
69
|
-
resources_dir = File.join(@webapp.web_app_dir, @webapp.libs_dir, '**', '*.jar')
|
70
|
-
|
71
|
-
Dir[resources_dir].each do |resource|
|
72
|
-
class_loader.addURL(java.io.File.new(resource).to_url)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def add_application_java_classes(class_loader)
|
77
|
-
return unless @webapp.classes_dir
|
78
|
-
|
79
|
-
resources_dir = File.join(@webapp.web_app_dir, @webapp.classes_dir)
|
80
|
-
class_loader.addURL(java.io.File.new(resources_dir).to_url)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
module Trinidad
|
2
|
-
module Lifecycle
|
3
|
-
|
4
|
-
class Host
|
5
|
-
include Trinidad::Tomcat::LifecycleListener
|
6
|
-
|
7
|
-
attr_reader :contexts
|
8
|
-
|
9
|
-
def initialize(tomcat, *contexts)
|
10
|
-
@tomcat = tomcat
|
11
|
-
@contexts = contexts
|
12
|
-
end
|
13
|
-
|
14
|
-
def lifecycleEvent(event)
|
15
|
-
host = event.lifecycle
|
16
|
-
|
17
|
-
case event.type
|
18
|
-
when Trinidad::Tomcat::Lifecycle::BEFORE_START_EVENT
|
19
|
-
init_monitors
|
20
|
-
when Trinidad::Tomcat::Lifecycle::PERIODIC_EVENT
|
21
|
-
check_monitors
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def init_monitors
|
26
|
-
@contexts.each do |c|
|
27
|
-
monitor = c[:monitor]
|
28
|
-
opts = File.exist?(monitor) ? 'r' : 'w+'
|
29
|
-
|
30
|
-
unless File.exist?(dir = File.dirname(monitor))
|
31
|
-
Dir.mkdir dir
|
32
|
-
end
|
33
|
-
|
34
|
-
file = File.new(monitor, opts)
|
35
|
-
c[:mtime] = file.mtime
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def check_monitors
|
40
|
-
@contexts.each do |c|
|
41
|
-
# double check monitor, capistrano removes it temporarily
|
42
|
-
sleep(0.5) unless File.exist?(c[:monitor])
|
43
|
-
next unless File.exist?(c[:monitor])
|
44
|
-
|
45
|
-
if (mtime = File.mtime(c[:monitor])) > c[:mtime] && !c[:lock]
|
46
|
-
c[:lock] = true
|
47
|
-
c[:mtime] = mtime
|
48
|
-
c[:context] = create_takeover(c)
|
49
|
-
Thread.new { c[:context].start }
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def create_takeover(c)
|
55
|
-
web_app = c[:app]
|
56
|
-
old_context = c[:context]
|
57
|
-
|
58
|
-
context = Trinidad::Tomcat::StandardContext.new
|
59
|
-
context.name = rand.to_s
|
60
|
-
context.path = old_context.path
|
61
|
-
context.doc_base = web_app.web_app_dir
|
62
|
-
|
63
|
-
context.add_lifecycle_listener Trinidad::Tomcat::Tomcat::DefaultWebXmlListener.new
|
64
|
-
|
65
|
-
config = Trinidad::Tomcat::ContextConfig.new
|
66
|
-
config.default_web_xml = 'org/apache/catalina/startup/NO_DEFAULT_XML'
|
67
|
-
context.add_lifecycle_listener config
|
68
|
-
|
69
|
-
Trinidad::Extensions.configure_webapp_extensions(web_app.extensions, @tomcat, context)
|
70
|
-
|
71
|
-
web_app.generate_class_loader
|
72
|
-
context.add_lifecycle_listener(web_app.define_lifecycle)
|
73
|
-
context.add_lifecycle_listener(Trinidad::Lifecycle::Takeover.new(c))
|
74
|
-
|
75
|
-
old_context.parent.add_child context
|
76
|
-
|
77
|
-
context
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module Trinidad
|
2
|
-
module Lifecycle
|
3
|
-
class War < Base
|
4
|
-
def lifecycleEvent(event)
|
5
|
-
case event.type
|
6
|
-
when Trinidad::Tomcat::Lifecycle::AFTER_STOP_EVENT
|
7
|
-
destroy_expanded_app
|
8
|
-
when Trinidad::Tomcat::Lifecycle::BEFORE_START_EVENT
|
9
|
-
expand_app(event.lifecycle)
|
10
|
-
end
|
11
|
-
|
12
|
-
super
|
13
|
-
end
|
14
|
-
|
15
|
-
def configure_defaults(context)
|
16
|
-
super
|
17
|
-
configure_class_loader(context)
|
18
|
-
end
|
19
|
-
|
20
|
-
def configure_class_loader(context)
|
21
|
-
loader = Trinidad::Tomcat::WebappLoader.new(@webapp.class_loader)
|
22
|
-
loader.container = context
|
23
|
-
context.loader = loader
|
24
|
-
end
|
25
|
-
|
26
|
-
def destroy_expanded_app
|
27
|
-
require 'fileutils'
|
28
|
-
FileUtils.rm_rf @webapp.web_app_dir.gsub(/\.war$/, '')
|
29
|
-
end
|
30
|
-
|
31
|
-
def expand_app(context)
|
32
|
-
if !File.exist?(context.doc_base)
|
33
|
-
host = context.parent
|
34
|
-
war_file = java.io.File.new(@webapp.web_app_dir)
|
35
|
-
war = java.net.URL.new("jar:" + war_file.toURI.toURL.to_s + "!/")
|
36
|
-
path_name = File.basename(context.doc_base)
|
37
|
-
|
38
|
-
Trinidad::Tomcat::ExpandWar.expand(host, war, path_name)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Trinidad
|
2
|
-
module Lifecycle
|
3
|
-
class Takeover
|
4
|
-
include Trinidad::Tomcat::LifecycleListener
|
5
|
-
def initialize(old)
|
6
|
-
@old = old
|
7
|
-
end
|
8
|
-
|
9
|
-
def lifecycleEvent(event)
|
10
|
-
if event.type == Trinidad::Tomcat::Lifecycle::AFTER_START_EVENT
|
11
|
-
begin
|
12
|
-
name = @old[:context].name
|
13
|
-
|
14
|
-
@old[:context].stop
|
15
|
-
@old[:context].destroy
|
16
|
-
|
17
|
-
event.lifecycle.name = name
|
18
|
-
ensure
|
19
|
-
@old.delete(:lock)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Trinidad
|
2
|
-
class LogFormatter < Java::JavaUtilLogging::Formatter
|
3
|
-
def initialize(format = "yyyy-MM-dd HH:mm:ss")
|
4
|
-
@format = Java::JavaText::SimpleDateFormat.new format
|
5
|
-
calendar = Java::JavaUtil::GregorianCalendar.new
|
6
|
-
calendar.time_zone = Java::JavaUtil::SimpleTimeZone.new(0, 'UTC')
|
7
|
-
@format.calendar = calendar
|
8
|
-
end
|
9
|
-
|
10
|
-
def format(record)
|
11
|
-
timestamp = @format.format(Java::JavaUtil::Date.new record.millis)
|
12
|
-
level = record.level.name
|
13
|
-
message = record.message.chomp
|
14
|
-
|
15
|
-
"#{timestamp} #{level}: #{message}\n"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Trinidad
|
2
|
-
class RackupWebApp < WebApp
|
3
|
-
|
4
|
-
def init_params
|
5
|
-
super
|
6
|
-
if rackup_path = rackup
|
7
|
-
rackup_path = File.join(rackup_path, 'config.ru') if File.directory?(rackup_path)
|
8
|
-
add_parameter_unless_exist('rackup.path', rackup_path)
|
9
|
-
add_parameter_unless_exist('rack.env', environment.to_s)
|
10
|
-
end
|
11
|
-
@params
|
12
|
-
end
|
13
|
-
|
14
|
-
def context_listener; 'org.jruby.rack.RackServletContextListener'; end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Trinidad
|
2
|
-
class RailsWebApp < WebApp
|
3
|
-
|
4
|
-
def init_params
|
5
|
-
super
|
6
|
-
add_parameter_unless_exist 'rails.env', environment.to_s
|
7
|
-
add_parameter_unless_exist 'rails.root', '/'
|
8
|
-
@params
|
9
|
-
end
|
10
|
-
|
11
|
-
def context_listener; 'org.jruby.rack.rails.RailsServletContextListener'; end
|
12
|
-
end
|
13
|
-
end
|
data/lib/trinidad/war_web_app.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
module Trinidad
|
2
|
-
class WarWebApp < WebApp
|
3
|
-
def context_path
|
4
|
-
super.gsub(/\.war$/, '')
|
5
|
-
end
|
6
|
-
|
7
|
-
def work_dir
|
8
|
-
File.join(web_app_dir.gsub(/\.war$/, ''), 'WEB-INF')
|
9
|
-
end
|
10
|
-
|
11
|
-
def monitor
|
12
|
-
File.expand_path(web_app_dir)
|
13
|
-
end
|
14
|
-
|
15
|
-
def define_lifecycle
|
16
|
-
Trinidad::Lifecycle::War.new(self)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|