trinidad 1.3.5 → 1.4.0.RC
Sign up to get free protection for your applications and to get access to all the features.
- 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
|