mentawai 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,5 @@
1
- == 0.6.0 2008-04-30
1
+ == 0.7.0 2008-05-07
2
2
 
3
- * MentaOnRuby is now a web container as well as a web server
4
- * Now supports directory listing, default page, and static file serving like a web server
5
- * No more /views or /actions directory. Now we have /WEB-INF/src and /WEB-INF/lib
6
- * ERB pages can be anywere now
7
- * Everything inside /WEB-INF directory is protected from external access
8
- * You can run different applications in the same instance of MentaOnRuby ('/' = /ROOT directory like Java servlets)
9
- * You can use the new page method content_type to set the content-type of a erb template (ex: text/xml)
10
- * Many other improvements and bug fixes
3
+ * Forget about different applications running inside the same server
4
+ (Ruby does not have a classloader like Java)
5
+ * i18n is working as well as page methods (master file inside /WEB-INF/i18n)
@@ -21,6 +21,7 @@ lib/mentawai/core/invocation_chain.rb
21
21
  lib/mentawai/core/output.rb
22
22
  lib/mentawai/core/session.rb
23
23
  lib/mentawai/handler/menta_handler.rb
24
+ lib/mentawai/i18n/i18n_file.rb
24
25
  lib/mentawai/i18n/loc_manager.rb
25
26
  lib/mentawai/loader.rb
26
27
  lib/mentawai/page/methods/content_type.rb
data/bin/menta CHANGED
@@ -3,7 +3,7 @@
3
3
  def version
4
4
  require 'mentawai/version'
5
5
  puts "mentawai #{Mentawai::VERSION::STRING}" +
6
- " - Mentawai Web Container, Server and Framework in Ruby"
6
+ " - Mentawai Web Framework in Ruby"
7
7
  puts "More information on http://www.mentaframework.org"
8
8
  end
9
9
 
@@ -12,7 +12,7 @@ def help
12
12
  puts
13
13
  puts "-v,--version\t\tShow version"
14
14
  puts "-h,--help\t\tShow this help"
15
- puts "-c,--create <dirname>\tCreate web container (default dirname = 'mentawai')"
15
+ puts "-c,--create <dirname>\tCreate web application (default dirname = 'mentawai')"
16
16
  end
17
17
 
18
18
  START_FILE = <<EOF
@@ -25,31 +25,17 @@ server = Server.new
25
25
  server.host = '127.0.0.1'
26
26
  server.port = 8081
27
27
 
28
- # Configure the parameters of your web application... (ROOT context)
28
+ # Configure the parameters of your web application... (optional)
29
29
 
30
- root_app_options = {
31
- :app_context => '/', # default = '/'
30
+ server.options = {
32
31
  :app_manager_file => 'app_manager.rb', # default = 'app_manager.rb'
33
32
  :app_manager_class => 'AppManager', # default = 'AppManager'
34
33
  :action_extension => 'mtw', # default = 'mtw'
35
- :listing_allowed => false, # default = false
34
+ :listing_allowed => true, # default = false
36
35
  :default_page => 'index.erb', # default = 'index.erb'
37
36
  :dirs_allowed_for_listing => [] # default = []
38
37
  }
39
38
 
40
- server.add(root_app_options)
41
-
42
- # Configure the parameters of a second web application... (/myapp context)
43
-
44
- myapp_app_options = {
45
- :app_context => '/myapp',
46
- :action_extension => 'menta',
47
- :listing_allowed => true,
48
- :dirs_allowed_for_listing => ['img']
49
- }
50
-
51
- server.add(myapp_app_options)
52
-
53
39
  # Start mongrel server to serve your Mentawai applications...
54
40
 
55
41
  server.start
@@ -57,7 +43,7 @@ server.start
57
43
 
58
44
  EOF
59
45
 
60
- APP_MANAGER_FILE_1 = <<EOF
46
+ APP_MANAGER_FILE = <<EOF
61
47
  include Mentawai::Core
62
48
 
63
49
  class AppManager < ApplicationManager
@@ -74,23 +60,7 @@ class AppManager < ApplicationManager
74
60
  end
75
61
  EOF
76
62
 
77
- APP_MANAGER_FILE_2 = <<EOF
78
- include Mentawai::Core
79
-
80
- class AppManager < ApplicationManager
81
-
82
- def init(appContext)
83
-
84
- # Define an action...
85
- action(:action_name => "/Hello", :class_name => "MyApp2::Hello").on(:success => fwd("hello.erb"))
86
-
87
- end
88
-
89
- end
90
- EOF
91
-
92
-
93
- ACTION_FILE_1 = <<EOF
63
+ ACTION_FILE = <<EOF
94
64
 
95
65
  module MyApp1
96
66
 
@@ -128,33 +98,7 @@ module MyApp1
128
98
  end
129
99
  EOF
130
100
 
131
- ACTION_FILE_2 = <<EOF
132
-
133
- module MyApp2
134
-
135
- class Hello < Mentawai::Core::Action
136
-
137
- def sayHi
138
-
139
- output['username'] = "Sergio"
140
-
141
- :success
142
-
143
- end
144
-
145
- def sayHello
146
-
147
- output['username'] = "Rubem"
148
-
149
- :success
150
-
151
- end
152
-
153
- end
154
- end
155
- EOF
156
-
157
- VIEW_FILE_1 = <<EOF
101
+ VIEW_FILE = <<EOF
158
102
  <html>
159
103
  <body>
160
104
  <title>ROOT ('/') Mentawai Application</title>
@@ -166,62 +110,33 @@ VIEW_FILE_1 = <<EOF
166
110
  </html>
167
111
  EOF
168
112
 
169
- VIEW_FILE_2 = <<EOF
170
- <html>
171
- <body>
172
- <title>myapp ('/myapp') Mentawai Application</title>
173
- <!-- using menta method m_out -->
174
- <h3>Hi1: <%= m_out('username') %></h3>
175
- </body>
176
- </html>
177
- EOF
178
-
179
-
180
113
  def create_app(app)
181
114
  Dir.mkdir(app)
182
115
 
183
- Dir.mkdir(app + '/ROOT')
184
- Dir.mkdir(app + '/ROOT/WEB-INF')
185
- Dir.mkdir(app + '/ROOT/WEB-INF/src')
186
- Dir.mkdir(app + '/ROOT/WEB-INF/lib')
187
-
188
- Dir.mkdir(app + '/myapp')
189
- Dir.mkdir(app + '/myapp/WEB-INF')
190
- Dir.mkdir(app + '/myapp/WEB-INF/src')
191
- Dir.mkdir(app + '/myapp/WEB-INF/lib')
116
+ Dir.mkdir(app + '/WEB-INF')
117
+ Dir.mkdir(app + '/WEB-INF/src')
118
+ Dir.mkdir(app + '/WEB-INF/lib')
192
119
 
193
120
  f = File.open(app + '/start.rb', 'w')
194
121
  f.print START_FILE
195
122
  f.close
196
123
 
197
- f = File.open(app + '/ROOT/WEB-INF/app_manager.rb', 'w')
198
- f.print APP_MANAGER_FILE_1
199
- f.close
200
-
201
- f = File.open(app + '/ROOT/WEB-INF/src/hello.rb', 'w')
202
- f.print ACTION_FILE_1
203
- f.close
204
-
205
- f = File.open(app + '/ROOT/hello.erb', 'w')
206
- f.print VIEW_FILE_1
207
- f.close
208
-
209
- f = File.open(app + '/myapp/WEB-INF/app_manager.rb', 'w')
210
- f.print APP_MANAGER_FILE_2
124
+ f = File.open(app + '/WEB-INF/app_manager.rb', 'w')
125
+ f.print APP_MANAGER_FILE
211
126
  f.close
212
127
 
213
- f = File.open(app + '/myapp/WEB-INF/src/hello.rb', 'w')
214
- f.print ACTION_FILE_2
128
+ f = File.open(app + '/WEB-INF/src/hello.rb', 'w')
129
+ f.print ACTION_FILE
215
130
  f.close
216
131
 
217
- f = File.open(app + '/myapp/hello.erb', 'w')
218
- f.print VIEW_FILE_2
132
+ f = File.open(app + '/hello.erb', 'w')
133
+ f.print VIEW_FILE
219
134
  f.close
220
135
 
221
- puts "Mentawai web container created: #{app}"
136
+ puts "Mentawai web application created: #{app}"
222
137
  puts "To run: ruby start.rb inside \"#{app}\""
223
138
  puts
224
- puts "Successfuly created a mentawai server!"
139
+ puts "Successfuly created mentawai application!"
225
140
  end
226
141
 
227
142
  if %w(-v --version).include? ARGV.first
@@ -3,16 +3,14 @@ module Mentawai
3
3
 
4
4
  class Application
5
5
 
6
- attr_reader :appContext, :contextPath, :appManagerFilename, :appManagerClass, :appManagerFile, :appManager, :extension, :default_page, :listing_allowed, :dirs_allowed_for_listing
6
+ attr_reader :appContext, :appManagerFilename, :appManagerClass, :appManagerFile, :appManager, :extension, :default_page, :listing_allowed, :dirs_allowed_for_listing
7
7
 
8
- def initialize(params)
8
+ def initialize(params = {})
9
9
 
10
10
  @appContext = Hash.new
11
11
 
12
- @contextPath = params[:app_context] || '/'
13
-
14
12
  @appManagerFilename = params[:app_manager_file] || 'app_manager.rb'
15
- @appManagerFilename = ".#{contextPathDir}/WEB-INF/#{@appManagerFilename.sub(/^\//, "")}"
13
+ @appManagerFilename = "./WEB-INF/#{@appManagerFilename.sub(/^\//, "")}"
16
14
  raise "Application manager does not exist: " + @appManagerFilename if not File.exists?(@appManagerFilename)
17
15
 
18
16
  @appManagerClass = params[:app_manager_class] || 'AppManager'
@@ -33,16 +31,8 @@ module Mentawai
33
31
 
34
32
  end
35
33
 
36
- def contextPathDir
37
- if contextPath == '/'
38
- "/ROOT"
39
- else
40
- contextPath
41
- end
42
- end
43
-
44
34
  def to_s
45
- "#{contextPath} (#{appManagerFilename}/#{appManagerClass})"
35
+ "#{appManagerFilename}/#{appManagerClass}/#{extension}"
46
36
  end
47
37
 
48
38
  def reloadAppManager(force = false)
@@ -53,7 +43,7 @@ module Mentawai
53
43
  puts "Reloading app manager: " + @appManagerFilename
54
44
  end
55
45
  load @appManagerFilename
56
- @appManager = eval(appManagerClass + ".new(self)")
46
+ @appManager = eval(appManagerClass + ".new")
57
47
  @appManager.init(@appContext)
58
48
  @appManagerFileLastModified = @appManagerFile.mtime
59
49
  end
@@ -32,6 +32,10 @@ module Mentawai
32
32
  fieldErrs
33
33
  end
34
34
 
35
+ def i18n
36
+ LocaleManager.instance.get_i18n(locale)
37
+ end
38
+
35
39
  end
36
40
 
37
41
  end
@@ -4,34 +4,37 @@ module Mentawai
4
4
  module Core
5
5
 
6
6
  class ApplicationManager
7
+
8
+ def self.instance
9
+ @@instance
10
+ end
7
11
 
8
- def initialize(app)
12
+ def initialize
9
13
 
10
14
  puts "Initializing application manager..."
11
15
 
12
- @app = app
13
-
14
16
  @actions = Hash.new
15
17
  @innerActions = Hash.new
16
18
 
17
19
  @globalFilters = Array.new
18
20
  @globalConsequences = Hash.new
19
21
 
20
- @loader = Loader.new(".#{app.contextPathDir}/WEB-INF")
22
+ @loader = Loader.new("./WEB-INF")
21
23
  @loader.reloadFiles
22
24
 
23
25
  @pageMethods = initPageMethods
24
26
  @customPageMethods = Hash.new
27
+
28
+ # Set a singleton here so that the whole application can
29
+ # have a quick access to the ApplicationManager class...
30
+ @@instance = self
31
+
25
32
  end
26
33
 
27
34
  def init(application)
28
35
  # should be overriden...
29
36
  end
30
37
 
31
- def app
32
- @app
33
- end
34
-
35
38
  def pageMethods
36
39
  @pageMethods
37
40
  end
@@ -119,7 +122,7 @@ module Mentawai
119
122
  # Methods to create consequences...
120
123
 
121
124
  def fwd(page)
122
- Forward.new(app.contextPathDir, page)
125
+ Forward.new(page)
123
126
  end
124
127
 
125
128
  private
@@ -134,6 +137,7 @@ module Mentawai
134
137
  h[:m_has_errors] = %w{ Mentawai::Page::Method::Message hasErrors }
135
138
  h[:m_has_error] = %w{ Mentawai::Page::Method::Message hasError }
136
139
  h[:m_has_msgs] = %w{ Mentawai::Page::Method::Message hasMessages }
140
+ h[:m_has_field_errors] = %w{ Mentawai::Page::Method::Message hasFieldErrors }
137
141
  h[:m_has_msg] = h[:m_has_msgs]
138
142
  h[:m_errors] = %w{ Mentawai::Page::Method::Message errors }
139
143
  h[:m_error] = %w{ Mentawai::Page::Method::Message error }
@@ -12,7 +12,6 @@ module Mentawai
12
12
  @@forward_cache.extend(MonitorMixin)
13
13
 
14
14
  def initialize(app)
15
- @contextPath = app.contextPath
16
15
  @appContext = app.appContext
17
16
  @appManager = app.appManager
18
17
  @extension = app.extension
@@ -20,7 +19,7 @@ module Mentawai
20
19
  @action = nil
21
20
  end
22
21
 
23
- attr_reader :appManager, :contextPath, :extension
22
+ attr_reader :appManager, :extension
24
23
 
25
24
  def action
26
25
  @action
@@ -119,15 +118,13 @@ module Mentawai
119
118
  # Use conventions to find a view
120
119
  dest = '/' + actionName + "/" + (innerAction ? innerAction : 'index') + '.erb'
121
120
 
122
- full_dest = @appManager.app.contextPathDir + dest
123
-
124
121
  # Cache forward consequence...
125
122
  @@forward_cache.synchronize {
126
- conseq = @@forward_cache[full_dest]
123
+ conseq = @@forward_cache[dest]
127
124
  if not conseq then
128
125
  # Check if file exists
129
- if File.exists?('.' + full_dest) then
130
- @@forward_cache[full_dest] = conseq = Forward.new(@appManager.app.contextPathDir, dest)
126
+ if File.exists?('.' + dest) then
127
+ @@forward_cache[dest] = conseq = Forward.new(dest)
131
128
  end
132
129
  end
133
130
  }
@@ -145,8 +142,6 @@ module Mentawai
145
142
 
146
143
  # Accessing a page file directly
147
144
 
148
- full_url = @appManager.app.contextPathDir + req.fullpath
149
-
150
145
  url = req.fullpath.dup
151
146
 
152
147
  fix_url(url)
@@ -159,8 +154,8 @@ module Mentawai
159
154
 
160
155
  # Cache forward consequence...
161
156
  @@forward_cache.synchronize {
162
- forward = @@forward_cache[full_url]
163
- @@forward_cache[full_url] = forward = Forward.new(@appManager.app.contextPathDir, url) if not forward
157
+ forward = @@forward_cache[url]
158
+ @@forward_cache[url] = forward = Forward.new(url) if not forward
164
159
  }
165
160
 
166
161
  @consequence = forward
@@ -172,7 +167,6 @@ module Mentawai
172
167
  protected
173
168
 
174
169
  def fix_url(url)
175
- url.gsub!(/^#{@contextPath}/, "") # remove context path
176
170
  url.gsub!(/\?.*$/, "") # remove query string (if present)
177
171
  url.gsub!(/^\//, "") # remove a '/' from begining
178
172
  url.gsub!(/\/$/, "") # remove a '/' from ending
@@ -192,7 +186,7 @@ module Mentawai
192
186
  action.application = @appContext
193
187
  action.page = Hash.new
194
188
  locales = get_locales(request.env['HTTP_ACCEPT_LANGUAGE'])
195
- action.locale = LocaleManager.instance.get(locales)
189
+ action.locale = LocaleManager.instance.get_locale(locales)
196
190
  else
197
191
  raise "Not an action: " + action.to_s
198
192
  end
@@ -17,7 +17,7 @@ module Mentawai
17
17
  @@types.key?(extension)
18
18
  end
19
19
 
20
- def initialize(context_path_dir, page)
20
+ def initialize(page)
21
21
  @page = page
22
22
 
23
23
  extension = nil
@@ -33,9 +33,9 @@ module Mentawai
33
33
  @contentType = @@types[extension]
34
34
 
35
35
  if page !~ /^\//
36
- @filename = ".#{context_path_dir}/#{page}"
36
+ @filename = "./#{page}"
37
37
  else
38
- @filename = ".#{context_path_dir}#{page}"
38
+ @filename = ".#{page}"
39
39
  end
40
40
 
41
41
  raise "Cannot find page: " + @filename if not File.exists?(@filename)
@@ -6,23 +6,14 @@ module Mentawai
6
6
 
7
7
  class MentaHandler < Rack::Handler::Mongrel
8
8
 
9
- def initialize(server, app)
9
+ def initialize(server, rack_app)
10
10
 
11
- @server = server
11
+ @menta_app = server.app
12
12
 
13
- listing_allowed = false
13
+ @dir_handler = Mongrel::DirHandler.new('.', @menta_app.listing_allowed, @menta_app.default_page)
14
14
 
15
- # Check if any application has listing turned on...
16
- @server.apps.each do |k,v|
17
- if v.listing_allowed
18
- listing_allowed = true
19
- break
20
- end
21
- end
22
-
23
- @dir_handler = Mongrel::DirHandler.new('.', listing_allowed)
15
+ super rack_app
24
16
 
25
- super app
26
17
  end
27
18
 
28
19
  def self.mime_types
@@ -42,6 +33,8 @@ module Mentawai
42
33
 
43
34
  def process(request, response)
44
35
 
36
+ # Construct Rack request...
37
+
45
38
  env = {}.replace(request.params)
46
39
  env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
47
40
  env["QUERY_STRING"] ||= ""
@@ -51,13 +44,7 @@ module Mentawai
51
44
 
52
45
  url = req.fullpath
53
46
 
54
- context_path = @server.find_context_path(url)
55
-
56
- app = @server.apps[context_path]
57
-
58
- context_path_dir = app.contextPathDir
59
-
60
- ru = RequestURL.new(context_path, context_path_dir, url, app.default_page)
47
+ ru = RequestURL.new(url, @menta_app.default_page, request)
61
48
 
62
49
  # Block forbidden directory...
63
50
  if ru.forbidden? then
@@ -68,7 +55,7 @@ module Mentawai
68
55
  end
69
56
 
70
57
  # Block if no listing is allowed and this is a directory...
71
- if ru.is_dir? and not app.listing_allowed
58
+ if ru.is_dir? and not @menta_app.listing_allowed
72
59
  response.start(403) do |head,out|
73
60
  out << "Listing is not unabled for this application!"
74
61
  end
@@ -76,13 +63,13 @@ module Mentawai
76
63
  end
77
64
 
78
65
  # Block if listing is allowed but directory is not allowed...
79
- if ru.is_dir? and app.listing_allowed and not app.dirs_allowed_for_listing.empty?
66
+ if ru.is_dir? and @menta_app.listing_allowed and not @menta_app.dirs_allowed_for_listing.empty?
80
67
 
81
68
  allowed = false
82
69
 
83
- app.dirs_allowed_for_listing.each do |dir|
70
+ @menta_app.dirs_allowed_for_listing.each do |dir|
84
71
  dir = '/' + dir if dir !~ /^\//
85
- if ru.url_without_context_dir =~ /^#{dir}\/?$/
72
+ if ru.url =~ /^#{dir}\/?$/
86
73
  allowed = true
87
74
  break
88
75
  end
@@ -96,16 +83,21 @@ module Mentawai
96
83
  end
97
84
  end
98
85
 
99
- if url =~ /\.#{app.extension}\??$/ or url =~ /\.#{app.extension}\?.+$/
86
+ if ru.url =~ /\.#{@menta_app.extension}\??$/ or ru.url =~ /\.#{@menta_app.extension}\?.+$/
100
87
  # We need to process this inside the Mentawai controller... (action request)
101
88
  super
102
- elsif (url =~ /(\.\w+)\??$/ or url =~ /(\.\w+)\?.+$/) and Mentawai::Core::Forward.is_registered?($1)
89
+ elsif (ru.url =~ /(\.\w+)\??$/ or ru.url =~ /(\.\w+)\?.+$/) and Mentawai::Core::Forward.is_registered?($1)
90
+
91
+ if not ru.exists?
92
+ response.start(404) do |head,out|
93
+ out << "Page not found!!"
94
+ end
95
+ return
96
+ end
97
+
103
98
  # We need to process this inside the Mentawai controller... (ERB page request)
104
99
  super
105
100
  else
106
- # Change Mongrel request to reflect the context path dir...
107
- request.params["PATH_INFO"] = ru.url_with_context_dir
108
-
109
101
  # Let Mongrel serve this request...
110
102
  @dir_handler.process(request, response)
111
103
  end
@@ -115,53 +107,49 @@ module Mentawai
115
107
 
116
108
  class RequestURL
117
109
 
118
- def initialize(context_path, context_path_dir, url, default_page)
110
+ def initialize(url, default_page, request)
119
111
 
120
- # Construct file path for the URL...
121
- if context_path == '/'
122
- @url_file_path = '.' + context_path_dir + url
123
- @url_with_context_dir = context_path_dir + url
124
- @url_without_context_dir = url
125
- else
126
- @url_file_path = '.' + url
127
- @url_with_context_dir = url
128
- @url_without_context_dir = url.sub(/#{context_path_dir}/, "")
129
- @url_without_context_dir = '/' if @url_without_context_dir == ""
130
- end
131
-
112
+ @url = url.dup
113
+ @url_file_path = '.' + url
132
114
  @is_dir = File.directory?(@url_file_path)
115
+ @exists = File.exists?(@url_file_path)
133
116
 
134
117
  # Check if we need to append the default_page
135
- if @is_dir
118
+ if @is_dir and default_page
136
119
  url_file_path_with_default_page = append_filename(@url_file_path, default_page)
137
120
  if File.exists?(url_file_path_with_default_page)
138
121
  @is_dir = false
139
- @url_without_context_dir = append_filename(@url_without_context_dir, default_page)
140
- @url_with_context_dir = append_filename(@url_with_context_dir, default_page)
122
+ @url = append_filename(@url, default_page)
141
123
  @url_file_path = url_file_path_with_default_page
124
+ @exists = File.exists?(@url_file_path)
125
+ request.params["PATH_INFO"] = @url.dup # change here too
142
126
  end
143
127
  end
144
128
 
145
129
  # Check if this is a forbidden URL
146
- if @url_with_context_dir =~ /^#{context_path_dir}\/WEB-INF/
130
+ if @url =~ /^\/start\.rb/ or @url =~ /^\/WEB-INF/
147
131
  @forbidden = true
148
132
  else
149
133
  @forbidden = false
150
134
  end
151
135
  end
152
136
 
153
- attr_reader :url_without_context_dir, :url_with_context_dir, :url_file_path
137
+ attr_reader :url, :url_file_path
154
138
 
155
139
  def is_dir?
156
140
  @is_dir
157
141
  end
158
142
 
143
+ def exists?
144
+ @exists
145
+ end
146
+
159
147
  def forbidden?
160
148
  @forbidden
161
149
  end
162
150
 
163
151
  def to_s
164
- "RequestURL: without=#{url_without_context_dir} with=#{url_with_context_dir} path=#{url_file_path} forbidden=#{forbidden?} is_dir=#{is_dir?}"
152
+ "RequestURL: url=#{url} path=#{url_file_path} forbidden=#{forbidden?} is_dir=#{is_dir?}"
165
153
  end
166
154
 
167
155
  private
@@ -0,0 +1,81 @@
1
+ require 'thread'
2
+ require 'mentawai/util/properties'
3
+
4
+ include Mentawai::Util
5
+
6
+ module Mentawai
7
+ module I18N
8
+
9
+ class I18NFile
10
+
11
+ def initialize(fullpath)
12
+
13
+ @fullpath = fullpath
14
+
15
+ @prop = Properties.loadProp(@fullpath)
16
+
17
+ if @prop
18
+ @file = File.new(@fullpath)
19
+ @last_modified = @file.mtime
20
+ else
21
+ @file = @last_modified = nil
22
+ end
23
+
24
+ @last_check = Time.now
25
+ @lock = Mutex.new
26
+ end
27
+
28
+ def [](key)
29
+
30
+ prop = get_prop
31
+
32
+ if prop
33
+ if prop.key?(key)
34
+ # Return the key value...
35
+ prop[key]
36
+ else
37
+ # Key is not in the file
38
+ '!' + key + '!'
39
+ end
40
+ else
41
+ # If file does not exist, return the key...
42
+ key
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def get_prop
49
+
50
+ if Time.now - @last_check > 5
51
+
52
+ @lock.synchronize {
53
+
54
+ @last_check = Time.now
55
+
56
+ if not @prop
57
+ @prop = Properties.loadProp(@fullpath)
58
+ return nil if not @prop
59
+ @file = File.new(@fullpath)
60
+ @last_modified = @file.mtime
61
+ end
62
+
63
+ if @last_modified != @file.mtime
64
+
65
+ @last_modified = @file.mtime
66
+
67
+ @prop = Properties.loadProp(@fullpath)
68
+
69
+ end
70
+ }
71
+
72
+ end
73
+
74
+ @prop
75
+
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+ end
@@ -1,4 +1,5 @@
1
1
  require 'singleton'
2
+ require 'mentawai/i18n/i18n_file'
2
3
 
3
4
  module Mentawai
4
5
  module I18N
@@ -6,27 +7,53 @@ module Mentawai
6
7
  class LocaleManager
7
8
  include Singleton
8
9
 
10
+ MASTER_FILE = './WEB-INF/i18n/master'
11
+ DEFAULT_LOCALE = 'en_US'
12
+
9
13
  def initialize
10
14
  @locales = Array.new
15
+ @i18n = Hash.new
11
16
  end
12
17
 
13
18
  def add(loc)
19
+ # Add locale to the list...
14
20
  @locales.add(loc)
21
+
22
+ # Add master file...
23
+ @i18n[loc] = I18NFile.new(MASTER_FILE + '_' + loc + '.i18n')
15
24
  end
16
25
 
17
26
  def locales
18
27
  @locales
19
28
  end
20
29
 
30
+ def i18n
31
+ @i18n
32
+ end
33
+
21
34
  def default
22
35
  if @locales.empty?
23
- 'en_US'
36
+ DEFAULT_LOCALE
24
37
  else
25
38
  @locales[0]
26
39
  end
27
40
  end
28
41
 
29
- def get(locale, return_default = true)
42
+ def get_i18n(locale, return_default = true)
43
+ if i18n.key?(locale)
44
+ i18n[locale]
45
+ elsif return_default
46
+ if i18n.key?(default)
47
+ i18n[default]
48
+ else
49
+ i18n[default] = I18NFile.new(MASTER_FILE + '_' + default + '.i18n')
50
+ end
51
+ else
52
+ nil
53
+ end
54
+ end
55
+
56
+ def get_locale(locale, return_default = true)
30
57
 
31
58
  if locale.nil?
32
59
  return return_default ? default : nil
@@ -35,7 +62,7 @@ module Mentawai
35
62
  # If array, try to match any of them
36
63
  if locale.is_a?(Array)
37
64
  locale.each do |loc|
38
- l = get(loc, false) # recursive no default here...
65
+ l = get_locale(loc, false) # recursive no default here...
39
66
  return l if l
40
67
  end
41
68
  return return_default ? default : nil
@@ -6,25 +6,56 @@ module Mentawai
6
6
 
7
7
  class Message < Mentawai::Page::PageMethod
8
8
 
9
- def initialize(action, parameters)
9
+ def initialize(controller, parameters)
10
10
  super
11
11
  @errors = output['errors']
12
12
  @messages = output['messages']
13
13
  @fieldErrors = output['fieldErrors']
14
14
  @fieldName = params[:field]
15
+ @i18n = controller.action.i18n
15
16
  end
16
17
 
17
- attr_reader :errors, :messages, :fieldErrors
18
-
19
18
  def get_default_key
20
19
  :field
21
20
  end
22
21
 
22
+ def errors
23
+ return nil if @errors.nil? or not @errors.is_a?(Array) or @errors.empty?
24
+ res = ""
25
+ @errors.each do |err|
26
+ res += @i18n[err] + "<br/>"
27
+ end
28
+ res
29
+ end
30
+
31
+ def messages
32
+ return nil if @messages.nil? or not @messages.is_a?(Array) or @messages.empty?
33
+ res = ""
34
+ @messages.each do |msg|
35
+ res += @i18n[msg] + "<br/>"
36
+ end
37
+ res
38
+ end
39
+
40
+ def fieldErrors
41
+ return nil if @fieldErrors.nil? or not @fieldErrors.is_a?(Hash) or @fieldErrors.empty?
42
+ res = ""
43
+ @fieldErrors.each do |k, msg|
44
+ res += @i18n[msg] + "<br/>"
45
+ end
46
+ res
47
+ end
48
+
23
49
  def hasErrors
24
- return false if @errors.nil? || !@errors.is_a?(Array)
50
+ return false if not @errors or not @errors.is_a?(Array)
25
51
  !@errors.empty?
26
52
  end
27
53
 
54
+ def hasFieldErrors
55
+ return false if @fieldErrors.nil? or not @fieldErrors.is_a?(Hash)
56
+ !@fieldErrors.empty?
57
+ end
58
+
28
59
  def hasError
29
60
  if @fieldName
30
61
  hasFieldError
@@ -53,8 +84,8 @@ module Mentawai
53
84
 
54
85
  def fieldError
55
86
  raise "Missing field for field error!" if @fieldName.nil?
56
- return nil if @fieldErrors.nil? || !@fieldErrors.is_a?(Hash)
57
- @fieldErrors[@fieldName]
87
+ return nil if @fieldErrors.nil? or not @fieldErrors.is_a?(Hash)
88
+ @i18n[@fieldErrors[@fieldName]]
58
89
  end
59
90
 
60
91
  def error
@@ -62,13 +93,13 @@ module Mentawai
62
93
  fieldError
63
94
  else
64
95
  return nil if @errors.nil? || !@errors.is_a?(Array) || @errors.empty?
65
- @errors[0]
96
+ @i18n[@errors[0]]
66
97
  end
67
98
  end
68
99
 
69
100
  def message
70
101
  return nil if @messages.nil? || !@messages.is_a?(Array) || @messages.empty?
71
- @messages[0]
102
+ @i18n[@messages[0]]
72
103
  end
73
104
 
74
105
  end
@@ -7,14 +7,15 @@ module Mentawai
7
7
 
8
8
  class Server
9
9
 
10
- attr_accessor :host, :port
10
+ attr_accessor :host, :port, :options
11
+
12
+ attr_reader :app
11
13
 
12
14
  def initialize(path = nil)
13
15
 
14
16
  @host = "127.0.0.1"
15
17
  @port = 8081
16
-
17
- @apps = Hash.new
18
+ @options = {}
18
19
 
19
20
  if not path
20
21
  @loader = nil
@@ -24,30 +25,6 @@ module Mentawai
24
25
  end
25
26
  end
26
27
 
27
- attr_reader :apps
28
-
29
- def add_application(app_options)
30
-
31
- app = Application.new(app_options)
32
-
33
- raise "Context already exists: " + app.contextPath if @apps.has_key?(app.contextPath)
34
-
35
- # add /WEB-INF/src and lib directory to the load path...
36
- $:.unshift(".#{app.contextPathDir}/WEB-INF/lib")
37
- $:.unshift(".#{app.contextPathDir}/WEB-INF/src")
38
-
39
- @apps[app.contextPath] = app
40
-
41
- app.reloadAppManager
42
-
43
- end
44
-
45
- alias add add_application
46
-
47
- def contexts
48
- @apps.keys
49
- end
50
-
51
28
  def call(env)
52
29
 
53
30
  # force reload of any mentawai file if modified...
@@ -56,36 +33,23 @@ module Mentawai
56
33
  req = Rack::Request.new(env)
57
34
  res = Rack::Response.new(env)
58
35
 
59
- contextPath = find_context_path(req.fullpath)
60
-
61
- env['menta.contextPath'] = contextPath
62
-
63
- app = @apps[contextPath]
64
36
  app.reloadAppManager(filesLoaded > 0)
65
37
 
66
38
  controller = Mentawai::Core::Controller.new(app)
39
+
67
40
  controller.service(env, req, res)
68
- end
69
-
70
- def find_context_path(fullpath)
71
- # Extract context path from URL...
72
- if fullpath =~ /(\/[^\/]*)/ then
73
- contextPath = $1
74
- else
75
- raise "Cannot get context path: " + env.fullpath
76
- end
77
41
 
78
- # Decide about context path...
79
- if @apps.has_key?(contextPath) then
80
- contextPath
81
- elsif @apps.has_key?('/') then
82
- '/'
83
- else
84
- raise "Cannot find context: " + contextPath
85
- end
86
42
  end
87
43
 
88
- def start
44
+ def start()
45
+
46
+ @app = Application.new(options)
47
+
48
+ # add /WEB-INF/src and lib directory to the load path...
49
+ $:.unshift("./WEB-INF/lib")
50
+ $:.unshift("./WEB-INF/src")
51
+
52
+ @app.reloadAppManager
89
53
 
90
54
  session_config = { :cookie_expire_after => 0, :session_expire_after => 10 }
91
55
  session_server = Mentawai::Session::MentaSession.new(self, session_config)
@@ -4,8 +4,10 @@ module Mentawai
4
4
 
5
5
  class Properties
6
6
 
7
- def self.load(filename)
7
+ def self.loadProp(filename)
8
+
8
9
  return nil if not File.exists?(filename)
10
+
9
11
  properties = {}
10
12
 
11
13
  value = key = ''
@@ -1,7 +1,7 @@
1
1
  module Mentawai #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 6
4
+ MINOR = 7
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mentawai
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergio Oliveira Jr.
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-04-30 00:00:00 -03:00
12
+ date: 2008-05-07 00:00:00 -03:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -50,6 +50,7 @@ files:
50
50
  - lib/mentawai/core/output.rb
51
51
  - lib/mentawai/core/session.rb
52
52
  - lib/mentawai/handler/menta_handler.rb
53
+ - lib/mentawai/i18n/i18n_file.rb
53
54
  - lib/mentawai/i18n/loc_manager.rb
54
55
  - lib/mentawai/loader.rb
55
56
  - lib/mentawai/page/methods/content_type.rb