gonzui 1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. data/AUTHORS.txt +9 -0
  2. data/History.txt +5539 -0
  3. data/Manifest.txt +115 -0
  4. data/PostInstall.txt +17 -0
  5. data/README.rdoc +149 -0
  6. data/Rakefile +28 -0
  7. data/bin/gonzui-db +167 -0
  8. data/bin/gonzui-import +177 -0
  9. data/bin/gonzui-remove +58 -0
  10. data/bin/gonzui-search +68 -0
  11. data/bin/gonzui-server +176 -0
  12. data/bin/gonzui-update +53 -0
  13. data/data/gonzui/catalog/catalog.ja +80 -0
  14. data/data/gonzui/doc/favicon.ico +0 -0
  15. data/data/gonzui/doc/folder.png +0 -0
  16. data/data/gonzui/doc/gonzui.css +279 -0
  17. data/data/gonzui/doc/gonzui.js +111 -0
  18. data/data/gonzui/doc/text.png +0 -0
  19. data/data/gonzuirc.sample +29 -0
  20. data/ext/autopack/autopack.c +88 -0
  21. data/ext/autopack/extconf.rb +3 -0
  22. data/ext/delta/delta.c +147 -0
  23. data/ext/delta/extconf.rb +5 -0
  24. data/ext/texttokenizer/extconf.rb +5 -0
  25. data/ext/texttokenizer/texttokenizer.c +93 -0
  26. data/ext/xmlformatter/extconf.rb +5 -0
  27. data/ext/xmlformatter/xmlformatter.c +207 -0
  28. data/lib/gonzui.rb +59 -0
  29. data/lib/gonzui/apt.rb +193 -0
  30. data/lib/gonzui/bdbdbm.rb +118 -0
  31. data/lib/gonzui/cmdapp.rb +14 -0
  32. data/lib/gonzui/cmdapp/app.rb +175 -0
  33. data/lib/gonzui/cmdapp/search.rb +134 -0
  34. data/lib/gonzui/config.rb +117 -0
  35. data/lib/gonzui/content.rb +19 -0
  36. data/lib/gonzui/dbm.rb +673 -0
  37. data/lib/gonzui/deindexer.rb +162 -0
  38. data/lib/gonzui/delta.rb +49 -0
  39. data/lib/gonzui/extractor.rb +347 -0
  40. data/lib/gonzui/fetcher.rb +309 -0
  41. data/lib/gonzui/gettext.rb +144 -0
  42. data/lib/gonzui/importer.rb +84 -0
  43. data/lib/gonzui/indexer.rb +316 -0
  44. data/lib/gonzui/info.rb +80 -0
  45. data/lib/gonzui/license.rb +100 -0
  46. data/lib/gonzui/logger.rb +48 -0
  47. data/lib/gonzui/monitor.rb +177 -0
  48. data/lib/gonzui/progressbar.rb +235 -0
  49. data/lib/gonzui/remover.rb +38 -0
  50. data/lib/gonzui/searcher.rb +330 -0
  51. data/lib/gonzui/searchquery.rb +235 -0
  52. data/lib/gonzui/searchresult.rb +111 -0
  53. data/lib/gonzui/updater.rb +254 -0
  54. data/lib/gonzui/util.rb +415 -0
  55. data/lib/gonzui/vcs.rb +128 -0
  56. data/lib/gonzui/webapp.rb +25 -0
  57. data/lib/gonzui/webapp/advsearch.rb +123 -0
  58. data/lib/gonzui/webapp/filehandler.rb +24 -0
  59. data/lib/gonzui/webapp/jsfeed.rb +61 -0
  60. data/lib/gonzui/webapp/markup.rb +445 -0
  61. data/lib/gonzui/webapp/search.rb +269 -0
  62. data/lib/gonzui/webapp/servlet.rb +319 -0
  63. data/lib/gonzui/webapp/snippet.rb +155 -0
  64. data/lib/gonzui/webapp/source.rb +37 -0
  65. data/lib/gonzui/webapp/stat.rb +137 -0
  66. data/lib/gonzui/webapp/top.rb +63 -0
  67. data/lib/gonzui/webapp/uri.rb +140 -0
  68. data/lib/gonzui/webapp/webrick.rb +48 -0
  69. data/script/console +10 -0
  70. data/script/destroy +14 -0
  71. data/script/generate +14 -0
  72. data/script/makemanifest.rb +21 -0
  73. data/tasks/extconf.rake +13 -0
  74. data/tasks/extconf/autopack.rake +43 -0
  75. data/tasks/extconf/delta.rake +43 -0
  76. data/tasks/extconf/texttokenizer.rake +43 -0
  77. data/tasks/extconf/xmlformatter.rake +43 -0
  78. data/test/_external_tools.rb +13 -0
  79. data/test/_test-util.rb +142 -0
  80. data/test/foo/Makefile.foo +66 -0
  81. data/test/foo/bar.c +5 -0
  82. data/test/foo/bar.h +6 -0
  83. data/test/foo/foo.c +25 -0
  84. data/test/foo/foo.spec +33 -0
  85. data/test/test_apt.rb +42 -0
  86. data/test/test_autopack_extn.rb +7 -0
  87. data/test/test_bdbdbm.rb +79 -0
  88. data/test/test_cmdapp-app.rb +35 -0
  89. data/test/test_cmdapp-search.rb +99 -0
  90. data/test/test_config.rb +28 -0
  91. data/test/test_content.rb +15 -0
  92. data/test/test_dbm.rb +171 -0
  93. data/test/test_deindexer.rb +50 -0
  94. data/test/test_delta.rb +66 -0
  95. data/test/test_extractor.rb +78 -0
  96. data/test/test_fetcher.rb +75 -0
  97. data/test/test_gettext.rb +50 -0
  98. data/test/test_gonzui.rb +11 -0
  99. data/test/test_helper.rb +10 -0
  100. data/test/test_importer.rb +56 -0
  101. data/test/test_indexer.rb +37 -0
  102. data/test/test_info.rb +82 -0
  103. data/test/test_license.rb +49 -0
  104. data/test/test_logger.rb +60 -0
  105. data/test/test_monitor.rb +23 -0
  106. data/test/test_searcher.rb +37 -0
  107. data/test/test_searchquery.rb +27 -0
  108. data/test/test_searchresult.rb +43 -0
  109. data/test/test_texttokenizer.rb +47 -0
  110. data/test/test_updater.rb +95 -0
  111. data/test/test_util.rb +149 -0
  112. data/test/test_vcs.rb +61 -0
  113. data/test/test_webapp-markup.rb +42 -0
  114. data/test/test_webapp-util.rb +19 -0
  115. data/test/test_webapp-xmlformatter.rb +19 -0
  116. metadata +291 -0
@@ -0,0 +1,269 @@
1
+ #
2
+ # search.rb - search servlet
3
+ #
4
+ # Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
5
+ # All rights reserved.
6
+ # This is free software with ABSOLUTELY NO WARRANTY.
7
+ #
8
+ # You can redistribute it and/or modify it under the terms of
9
+ # the GNU General Public License version 2.
10
+ #
11
+
12
+ module Gonzui
13
+ class SearchServlet < GonzuiAbstractServlet
14
+ def self.mount_point
15
+ "search"
16
+ end
17
+
18
+ def do_make_status_line(result)
19
+ right = ""
20
+ if result.nhits > 0
21
+ qs = @search_query.string
22
+ from = (@search_query.package or @search_query.path)
23
+ qs = @search_query.simplified_string if from
24
+ to = [result.nhits, @from + @nresults_per_page].min
25
+ right = [:span]
26
+ limit_exceeded_mark = if result.limit_exceeded? then "+" else "" end
27
+ right.push(_("Results "),
28
+ [:strong, commify(@from + 1)], " - ",
29
+ [:strong, commify(to)], _(" of "),
30
+ [:strong, commify(result.nhits)],
31
+ limit_exceeded_mark,
32
+ _(" for "),
33
+ [:strong, qs])
34
+ right.push(_(" from "), [:strong, from]) if from
35
+ end
36
+ center = [:a, {:href => make_google_uri(@search_query)},
37
+ _("Google it")]
38
+ return center, right
39
+ end
40
+
41
+ def make_expansion_link(item)
42
+ if item.has_more_in_package?
43
+ package_name = @dbm.get_package_name(item.package_id)
44
+ # FIXME: it should be simplified.
45
+ qs = sprintf("package:%s %s", package_name,
46
+ @search_query.simplified_string)
47
+ search_query = SearchQuery.new(@config, qs, @search_query.options)
48
+ uri = make_search_uri(search_query)
49
+ from = package_name
50
+ elsif item.has_more_in_path?
51
+ path = @dbm.get_path(item.path_id)
52
+ qs = sprintf("path:%s %s", path,
53
+ @search_query.simplified_string)
54
+ search_query = SearchQuery.new(@config, qs, @search_query.options)
55
+ uri = make_search_uri(search_query)
56
+ from = File.basename(path)
57
+ else
58
+ assert_not_reached
59
+ end
60
+ dd = [:dd,[:a, {:href => uri, :class => "more" },
61
+ sprintf(_("More results from %s"), from)]]
62
+ return dd
63
+ end
64
+
65
+ def make_package_name_line(package_name)
66
+ uri = make_markup_uri(package_name)
67
+ dt = [:dt, {:class => "package"}, [:a, {:href => uri}, package_name]]
68
+ return dt
69
+ end
70
+
71
+ def make_source_path_line(item, package_name, path, markup_uri)
72
+ lineno_uri = make_lineno_uri(markup_uri, item.list.first.lineno)
73
+ source_line = [:dt, {:class => "source"}, [:a,
74
+ {:href => lineno_uri},
75
+ File.relative_path(path, package_name)]]
76
+ file_info = @dbm.get_content_info(item.path_id)
77
+ size = [:span, {:class => "size"},
78
+ sprintf(_(" - %s - %s lines"),
79
+ format_bytes(file_info.size),
80
+ commify(file_info.nlines))
81
+ ]
82
+ source_line.push(size)
83
+ end
84
+
85
+ def make_result_list_by_snippet(result)
86
+ dl = [:dl]
87
+ prev_package_id = nil
88
+ nresults = 0
89
+
90
+ result.each_from(@from) {|item|
91
+ assert(item.list.length > 0)
92
+ package_name = @dbm.get_package_name(item.package_id)
93
+
94
+ if item.package_id != prev_package_id
95
+ dt = make_package_name_line(package_name)
96
+ dl.push(dt)
97
+ prev_package_id = item.package_id
98
+ end
99
+
100
+ path = @dbm.get_path(item.path_id)
101
+ markup_uri = make_markup_uri(path, @search_query)
102
+ dt = make_source_path_line(item, package_name, path, markup_uri)
103
+ dl.push(dt)
104
+
105
+ #
106
+ # FIXME: if the target content is a text file, it's
107
+ # better to make a snippet like google's one instead
108
+ # of a line-oriented style.
109
+ #
110
+ content = @dbm.get_content(item.path_id)
111
+ maker = SnippetMaker.new(content, item, markup_uri)
112
+ pre = maker.make_line_oriented_kwic
113
+ dl.push([:dd, pre])
114
+
115
+ if item.has_more?
116
+ link = make_expansion_link(item)
117
+ dl.push(link)
118
+ end
119
+ nresults += 1
120
+ break if nresults >= @nresults_per_page
121
+ }
122
+ return dl
123
+ end
124
+
125
+ def make_result_list_like_grep(result)
126
+ assert_equal(1, result.length)
127
+ dl = [:dl]
128
+ item = result.first
129
+
130
+ package_name = @dbm.get_package_name(item.package_id)
131
+ path = @dbm.get_path(item.path_id)
132
+ markup_uri = make_markup_uri(path, @search_query)
133
+
134
+ dl.push(make_package_name_line(package_name))
135
+ dl.push(make_source_path_line(item, package_name, path, markup_uri))
136
+
137
+ content = @dbm.get_content(item.path_id)
138
+ maker = SnippetMaker.new(content, item, markup_uri)
139
+ snippet = maker.make_context_grep
140
+ dl.push([:dd, snippet])
141
+ return dl
142
+ end
143
+
144
+ def do_make_navi(from)
145
+ make_search_uri(@search_query,
146
+ :from => from,
147
+ :nresults_per_page => @nresults_per_page)
148
+ end
149
+
150
+ def redirect_to_uri(uri)
151
+ @response.set_redirect(HTTPStatus::MovedPermanently, uri)
152
+ assert_not_reached
153
+ end
154
+
155
+ # FIXME: it's not used
156
+ def redirect_to_single_result(result)
157
+ item = result.first
158
+ occ = item.list.first
159
+ path = @dbm.get_path(item.path_id)
160
+ lineno = (occ.lineno or 1)
161
+ markup_uri = make_markup_uri(path, @search_query)
162
+ lineno_uri = make_lineno_uri(markup_uri, lineno)
163
+ redirect_to_uri(lineno_uri)
164
+ end
165
+
166
+
167
+ def make_not_found_message
168
+ message = [:div, {:class => "message"},
169
+ sprintf(_("No contents were found matching your search - %s."),
170
+ @search_query.string)
171
+ ]
172
+ return message
173
+ end
174
+
175
+ def make_query_error_message(e)
176
+ message =[:div]
177
+ message.push(make_not_found_message)
178
+ message.push([:div, {:class => "message"}, _(e.message)])
179
+ return message
180
+ end
181
+
182
+ def make_result_content(result)
183
+ @from = 0 if @from >= result.length
184
+
185
+ if result.empty?
186
+ make_not_found_message
187
+ elsif result.single_path?
188
+ make_result_list_like_grep(result)
189
+ else
190
+ make_result_list_by_snippet(result)
191
+ end
192
+ end
193
+
194
+ def redirect_if_necessary
195
+ if @search_query.empty?
196
+ redirect_to_uri(make_top_uri)
197
+ elsif @search_query.path_only?
198
+ markup_uri = make_markup_uri(@search_query.path, @search_query)
199
+ redirect_to_uri(markup_uri)
200
+ elsif @search_query.package_only?
201
+ markup_uri = make_markup_uri(@search_query.package, @search_query)
202
+ redirect_to_uri(markup_uri)
203
+ end
204
+ end
205
+
206
+ def make_result_navi(result)
207
+ make_navi(result.length, @from, @nresults_per_page, @config.max_pages)
208
+ end
209
+
210
+ def make_notice
211
+ if @search_query.ignored_words.empty?
212
+ return ""
213
+ else
214
+ div = [:div, {:class => "notice"}]
215
+ message =
216
+ sprintf(_("\"%s\" (and any subsequent words) was ignored because queries are limited to %d words."),
217
+ @search_query.ignored_words.first,
218
+ @config.max_words
219
+ )
220
+ div.push(message)
221
+ return div
222
+ end
223
+ end
224
+
225
+ def do_GET(request, response)
226
+ init_servlet(request, response)
227
+ log(@search_query.string)
228
+
229
+ title = make_title(@search_query.string)
230
+ html = make_html
231
+ head = [:head, title, make_script, *make_meta_and_css]
232
+ body = [:body]
233
+ body.push(make_h1)
234
+ body.push(make_search_form)
235
+
236
+ result = nil
237
+ navi = nil
238
+ begin
239
+ @search_query.validate
240
+ redirect_if_necessary
241
+
242
+ searcher = Searcher.new(@dbm, @search_query,
243
+ @config.max_results_overall)
244
+ result = searcher.search
245
+ content = make_result_content(result)
246
+ if result.length > @nresults_per_page
247
+ navi = make_result_navi(result)
248
+ end
249
+ rescue QueryError => e
250
+ result = SearchResult.new
251
+ content = make_query_error_message(e)
252
+ end
253
+ status_line = make_status_line(_("Search"), result)
254
+
255
+ body.push(make_notice)
256
+ body.push(status_line)
257
+ body.push(content)
258
+ body.push(navi) if navi
259
+
260
+ body.push(make_footer)
261
+ html.push(head)
262
+ html.push(body)
263
+ set_content_type_text_html
264
+ response.body = format_html(html)
265
+ end
266
+
267
+ GonzuiServlet.register(self)
268
+ end
269
+ end
@@ -0,0 +1,319 @@
1
+ #
2
+ # servlet.rb - servelt framework
3
+ #
4
+ # Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
5
+ # All rights reserved.
6
+ # This is free software with ABSOLUTELY NO WARRANTY.
7
+ #
8
+ # You can redistribute it and/or modify it under the terms of
9
+ # the GNU General Public License version 2.
10
+ #
11
+
12
+ require 'webrick'
13
+ include WEBrick
14
+
15
+ module Gonzui
16
+ module GonzuiServlet
17
+ extend Util
18
+ ServletRegistry = {}
19
+
20
+ module_function
21
+ def servlets
22
+ ServletRegistry.values
23
+ end
24
+
25
+ def register(klass)
26
+ mount_point = klass.mount_point
27
+ assert(!ServletRegistry.include?(mount_point))
28
+ ServletRegistry[mount_point] = klass
29
+ end
30
+ end
31
+
32
+ module HTMLMaker
33
+ def make_content_script_type
34
+ [:meta,
35
+ {
36
+ "http-equiv" => "content-script-type",
37
+ :content => "text/javascript"
38
+ }
39
+ ]
40
+ end
41
+
42
+ def make_css
43
+ [:link,
44
+ {
45
+ :rel => "stylesheet",
46
+ :href => make_doc_uri("gonzui.css"),
47
+ :media => "all", :type => "text/css"
48
+ }
49
+ ]
50
+ end
51
+
52
+ def make_footer
53
+ [:div, {:class => "footer"},
54
+ [:a, {:href => make_markup_uri}, _("List of all packages")],
55
+ " - ",
56
+ [:a, {:href => make_stat_uri}, _("Statistics")],
57
+ " - ",
58
+ [:a, {:href => Gonzui::GONZUI_URI}, _("About gonzui")],
59
+ ]
60
+ end
61
+
62
+ def make_html
63
+ [:html, {:xmlns => "http://www.w3.org/1999/xhtml"}]
64
+ end
65
+ def make_meta
66
+ [:meta, {:name => "robots", :content => "noarchive"}]
67
+ end
68
+
69
+ def make_meta_and_css
70
+ [ make_meta, make_content_script_type, make_css ]
71
+ end
72
+
73
+ def make_title(sub_title = nil)
74
+ if sub_title
75
+ return [:title, sprintf("%s: %s", @config.site_title, sub_title)]
76
+ else
77
+ return [:title, @config.site_title]
78
+ end
79
+ end
80
+
81
+ def make_h1
82
+ [:h1, [:a, {:href => make_top_uri}, @config.site_title]]
83
+ end
84
+
85
+ def make_navi(nitems, from, max_per_page, max_pages = nil)
86
+ return "" if nitems <= max_per_page
87
+ navi = [:div, {:class => "navi"}]
88
+ if from > 0
89
+ f = [from - max_per_page, 0].max
90
+ uri = do_make_navi(f)
91
+ navi.push([:a, {:href => uri}, _("prev")], " ")
92
+ end
93
+
94
+ if nitems > max_per_page
95
+ (0..((nitems - 1) / max_per_page)).each {|i|
96
+ break if max_pages and i >= max_pages
97
+ f = i * max_per_page
98
+ if f == from
99
+ navi.push((i + 1).to_s + " ")
100
+ else
101
+ uri = do_make_navi(f)
102
+ navi.push([:a, {:href => uri}, (i + 1).to_s], " ")
103
+ end
104
+ }
105
+ end
106
+
107
+ if from + max_per_page < nitems
108
+ f = [from + max_per_page, 0].max
109
+ uri = do_make_navi(f)
110
+ navi.push([:a, {:href => uri}, _("next")])
111
+ end
112
+ return navi
113
+ end
114
+
115
+ def make_script
116
+ [:script, {:type => "text/javascript",
117
+ :src => make_doc_uri("gonzui.js")}, ""]
118
+ end
119
+
120
+ def make_property_select(short_name, current_value, each, *excludes)
121
+ select = [:select, {:name => short_name}]
122
+ o = [:option, {:type => "radio", :name => short_name, :value => "all"},
123
+ _("All")]
124
+ select.push(o)
125
+ @dbm.send(each) {|id, abbrev, name|
126
+ next if excludes.include?(abbrev)
127
+ o = [:option,
128
+ {:type => "radio", :name => short_name, :value => abbrev},
129
+ _(name)]
130
+ if abbrev == current_value
131
+ o[1][:selected] = "selected"
132
+ end
133
+ select.push(o)
134
+ }
135
+ return select
136
+ end
137
+
138
+ def make_format_select
139
+ make_property_select(get_short_name(:format),
140
+ @search_query.format,
141
+ :each_format,
142
+ "binary")
143
+ end
144
+
145
+ def make_license_select
146
+ make_property_select(get_short_name(:license),
147
+ @search_query.license,
148
+ :each_license)
149
+ end
150
+
151
+ def make_search_form(options = {})
152
+ query = @search_query.string
153
+ form = [:form, {:method => "get", :action =>
154
+ make_uri_general(SearchServlet)}]
155
+ iquery = [:input, {:type => "text", :size => 50,
156
+ :name => get_short_name(:basic_query),
157
+ :value => query}]
158
+ isubmit = [:input, {:type => "submit", :value => _("Search")}]
159
+ p = [:p]
160
+ p.push(iquery)
161
+ if options[:central]
162
+ p.push([:br])
163
+ else
164
+ p.push(" ")
165
+ end
166
+
167
+ p.push(isubmit)
168
+ select = make_format_select
169
+ p.push([:br])
170
+ p.push(_("Format: "))
171
+ p.push(select)
172
+ p.push(make_spacer)
173
+ uri = make_advanced_search_uri(@search_query)
174
+ p.push([:a, {:href => uri, :onclick => "passQuery(this)"},
175
+ _("Advanced Search")])
176
+ p.push([:script, "initFocus();"])
177
+ form.push(p)
178
+ return form
179
+ end
180
+
181
+ def make_spacer
182
+ [:span, {:class => "spacer" }, " "]
183
+ end
184
+
185
+ def make_status_line(status_title, *options)
186
+ status_line = [:table, {:class => "status"}]
187
+ items = do_make_status_line(*options)
188
+ right = (items.pop or "")
189
+
190
+ tds = []
191
+ tds.push([:td, {:class => "left"}, status_title])
192
+ items.each {|item|
193
+ tds.push([:td, {:class => "center"}, item])
194
+ }
195
+ unless right.empty?
196
+ r = [:td, {:class => "right"}, right]
197
+ r.push(" (", [:strong, sprintf("%.2f", Time.now - @start_time)],
198
+ _(" seconds)"))
199
+ tds.push(r)
200
+ end
201
+ status_line.push([:tr, *tds])
202
+ return status_line
203
+ end
204
+ end
205
+
206
+ class ServletError < GonzuiError; end
207
+
208
+ class GonzuiAbstractServlet < HTTPServlet::AbstractServlet
209
+ include Util
210
+ include GetText
211
+ include URIMaker
212
+ include HTMLMaker
213
+
214
+ def initialize(server, config, logger, dbm, catalog_repository)
215
+ @server = server
216
+ @config = config
217
+ @logger = logger
218
+ @dbm = dbm
219
+ @catalog_repository = catalog_repository
220
+ @servlet_name = /(\w+)Servlet$/.match(self.class.to_s)[1].downcase
221
+ @start_time = Time.now
222
+ end
223
+
224
+ private
225
+ def make_search_query(query)
226
+ format = get_query_value(query, :format)
227
+ license = get_query_value(query, :license)
228
+
229
+ basic_query = get_query_value(query, :basic_query)
230
+ target_type = get_query_value(query, :target_type)
231
+ phrase_query = get_query_value(query, :phrase_query)
232
+ query_string = ""
233
+ query_string << target_type << ":" if target_type
234
+ query_string << basic_query if basic_query
235
+ if phrase_query
236
+ query_string << " " unless basic_query.empty?
237
+ query_string << '"' << phrase_query << '"'
238
+ end
239
+ @search_query = SearchQuery.new(@config,
240
+ query_string,
241
+ :format => format,
242
+ :license => license)
243
+ end
244
+
245
+ def parse_request
246
+ query = @request.query
247
+ @from = get_query_value(query, :from)
248
+ @grep_pattern = get_query_value(query, :grep_pattern)
249
+ @display_language = get_query_value(query, :display_language)
250
+ @nresults_per_page = get_query_value(query, :nresults_per_page)
251
+
252
+ @from = 0 if @from < 0
253
+ @nresults_per_page = 1 if @nresults_per_page <= 0
254
+ if @nresults_per_page > @config.max_results_per_page
255
+ @nresults_per_page = @config.max_results_per_page
256
+ end
257
+
258
+ @search_query = make_search_query(query)
259
+ @ip_address = @request.peeraddr[3]
260
+ end
261
+
262
+ def init_catalog
263
+ if @display_language
264
+ catalog = @catalog_repository.choose(@display_language)
265
+ set_catalog(catalog)
266
+ else
267
+ accept_languages = @request.accept_language
268
+ accept_languages.each {|lang|
269
+ catalog = @catalog_repository.choose(lang)
270
+ if catalog
271
+ set_catalog(catalog)
272
+ break
273
+ end
274
+ }
275
+ end
276
+ end
277
+
278
+ public
279
+ def get_mime_type(path)
280
+ HTTPUtils.mime_type(path, @server[:MimeTypes])
281
+ end
282
+
283
+ # ex. image
284
+ def get_media_type(path)
285
+ get_mime_type(path).split("/").first
286
+ end
287
+
288
+ def format_html(html)
289
+ formatter = XMLFormatter.new
290
+ formatter.add_xml_declaration
291
+ formatter.add_doctype
292
+ return formatter.format(html)
293
+ end
294
+
295
+ def set_content_type_text_html
296
+ @response["Content-Type"] = "text/html; charset=utf-8"
297
+ end
298
+
299
+ def init_servlet(request, response)
300
+ @request = request
301
+ @response = response
302
+ parse_request
303
+ init_catalog
304
+ end
305
+
306
+ def log(message = nil)
307
+ if message
308
+ @logger.log("%s %s [%s]", @servlet_name, message, @ip_address)
309
+ else
310
+ @logger.log("%s [%s]", @servlet_name, @ip_address)
311
+ end
312
+ end
313
+
314
+ def make_path
315
+ path = @request.path_info.prechop
316
+ return path
317
+ end
318
+ end
319
+ end