gojee-sunspot-solr 2.0.2

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.
Files changed (44) hide show
  1. data/Gemfile +3 -0
  2. data/README.rdoc +24 -0
  3. data/bin/sunspot-installer +20 -0
  4. data/bin/sunspot-solr +80 -0
  5. data/lib/sunspot/solr/installer.rb +25 -0
  6. data/lib/sunspot/solr/installer/config_installer.rb +46 -0
  7. data/lib/sunspot/solr/installer/task_helper.rb +13 -0
  8. data/lib/sunspot/solr/java.rb +10 -0
  9. data/lib/sunspot/solr/railtie.rb +15 -0
  10. data/lib/sunspot/solr/server.rb +229 -0
  11. data/lib/sunspot/solr/tasks.rb +49 -0
  12. data/lib/sunspot_solr.rb +5 -0
  13. data/solr/README.txt +42 -0
  14. data/solr/etc/jetty.xml +219 -0
  15. data/solr/etc/webdefault.xml +379 -0
  16. data/solr/lib/jetty-6.1.26-patched-JETTY-1340.jar +0 -0
  17. data/solr/lib/jetty-util-6.1.26-patched-JETTY-1340.jar +0 -0
  18. data/solr/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  19. data/solr/lib/jsp-2.1/core-3.1.1.jar +0 -0
  20. data/solr/lib/jsp-2.1/jsp-2.1.jar +0 -0
  21. data/solr/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  22. data/solr/lib/servlet-api-2.5-20081211.jar +0 -0
  23. data/solr/solr/.gitignore +1 -0
  24. data/solr/solr/README.txt +54 -0
  25. data/solr/solr/conf/admin-extra.html +31 -0
  26. data/solr/solr/conf/elevate.xml +36 -0
  27. data/solr/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  28. data/solr/solr/conf/protwords.txt +21 -0
  29. data/solr/solr/conf/schema.xml +250 -0
  30. data/solr/solr/conf/scripts.conf +24 -0
  31. data/solr/solr/conf/solrconfig.xml +934 -0
  32. data/solr/solr/conf/spellings.txt +2 -0
  33. data/solr/solr/conf/stopwords.txt +58 -0
  34. data/solr/solr/conf/synonyms.txt +31 -0
  35. data/solr/solr/conf/xslt/example.xsl +132 -0
  36. data/solr/solr/conf/xslt/example_atom.xsl +67 -0
  37. data/solr/solr/conf/xslt/example_rss.xsl +66 -0
  38. data/solr/solr/conf/xslt/luke.xsl +337 -0
  39. data/solr/start.jar +0 -0
  40. data/solr/webapps/solr.war +0 -0
  41. data/spec/server_spec.rb +98 -0
  42. data/spec/spec_helper.rb +18 -0
  43. data/sunspot_solr.gemspec +39 -0
  44. metadata +165 -0
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,24 @@
1
+ = Sunspot::Solr
2
+
3
+ Sunspot::Solr is a packaged distribution of Solr for use with the
4
+ Sunspot[http://outoftime.github.com/sunspot] and
5
+ Sunspot::Rails[https://github.com/outoftime/sunspot/tree/master/sunspot_rails]
6
+ gems. See those gems' documentation for more information.
7
+
8
+ == Installation
9
+
10
+ gem install sunspot_solr
11
+
12
+ In order to start the daemon, run:
13
+
14
+ sunspot-solr start -- [-d /path/to/data/directory] [-p port] [-s path/to/solr/home] [--pid-dir=path/to/pid/dir]
15
+
16
+ If you don't specify a data directory, your Solr index will be stored in your
17
+ operating system's temporary directory.
18
+
19
+ If you specify a solr home, the directory must contain a <code>conf</code>
20
+ directory, which should contain at least <code>schema.xml</code> and
21
+ <code>solrconfig.xml</code>. Be sure to copy the <code>schema.xml</code> out of
22
+ the Sunspot gem's <code>solr/solr/conf</code> directory. Sunspot relies on the
23
+ field name patterns defined in the packaged <code>schema.xml</code>, so those
24
+ cannot be modified.
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'sunspot', 'solr', 'installer')
5
+
6
+ home = ARGV.select { |arg| arg !~ /^-/ }.last || File.join(Dir.pwd, "solr")
7
+ options = {}
8
+
9
+ OptionParser.new do |opts|
10
+ opts.banner = "Usage: sunspot-installer [options] [solr-home]"
11
+ opts.on('-v', '--[no-]verbose', 'Run verbosely') do |v|
12
+ options[:verbose] = v
13
+ end
14
+ opts.on('-f', '--[no-]force', 'Overwrite schema and solrconfig files with Sunspot default, instead of modifying them (recommended for new Solr installation)') do |f|
15
+ options[:force] = f
16
+ end
17
+ end.parse!
18
+
19
+ Sunspot::Solr::Installer.execute(home, options)
20
+ puts "Installed to #{home}"
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby
2
+ begin
3
+ require 'fileutils'
4
+ require 'tempfile'
5
+ require 'tmpdir'
6
+ require 'optparse'
7
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'sunspot', 'solr', 'server')
8
+ rescue LoadError => e
9
+ if require 'rubygems'
10
+ retry
11
+ else
12
+ raise(e)
13
+ end
14
+ end
15
+
16
+ server = Sunspot::Solr::Server.new
17
+
18
+ opts = OptionParser.new do |opts|
19
+ opts.banner = "Usage: sunspot-solr (start|stop|run) [options]"
20
+
21
+ opts.on '-p', '--port=PORT', 'Port on which to run Solr (default 8983)' do |p|
22
+ server.port = p
23
+ end
24
+
25
+ opts.on '-b', '--bind-address=address', 'Interface on which to run Solr (default 0.0.0.0)' do |b|
26
+ server.bind_address = b
27
+ end
28
+
29
+ opts.on '-d', '--data-directory=DIRECTORY', 'Solr data directory' do |d|
30
+ server.solr_data_dir = File.expand_path(d)
31
+ end
32
+
33
+ opts.on '-s', '--solr-home=HOME', 'Solr home directory (should contain conf/ directory)' do |s|
34
+ server.solr_home = File.expand_path(s)
35
+ end
36
+
37
+ opts.on '-j', '--solr-jar=JAR', 'Solr start jar' do |j|
38
+ server.solr_jar = File.expand_path(j)
39
+ end
40
+
41
+ opts.on '--pid-dir=PID_DIR', 'Directory for pid files' do |pd|
42
+ server.pid_dir = File.expand_path(pd)
43
+ end
44
+
45
+ opts.on '-l', '--log-level=LOG_LEVEL', 'Solr logging level' do |l|
46
+ server.log_level = l
47
+ end
48
+
49
+ opts.on '--log-file=LOG_FILE', 'Path to Solr log file' do |lf|
50
+ server.log_file = File.expand_path(lf)
51
+ end
52
+
53
+ opts.on '--max-memory=MEMORY', 'Specify the maximum size of the memory allocation pool' do |mm|
54
+ server.max_memory = mm
55
+ end
56
+
57
+ opts.on '--min-memory=MEMORY', 'Specify the initial size of the memory allocation pool' do |mm|
58
+ server.min_memory = mm
59
+ end
60
+ end
61
+
62
+ opts.parse!
63
+
64
+ begin
65
+ case ARGV[0]
66
+ when 'start'
67
+ server.start
68
+ when 'run'
69
+ server.run
70
+ when 'stop'
71
+ server.stop
72
+ when 'restart'
73
+ server.stop
74
+ server.start
75
+ else
76
+ abort(opts.help)
77
+ end
78
+ rescue Sunspot::Solr::Server::ServerError => e
79
+ abort(e.message)
80
+ end
@@ -0,0 +1,25 @@
1
+ %w(task_helper config_installer).each do |file|
2
+ require File.join(File.dirname(__FILE__), 'installer', file)
3
+ end
4
+
5
+ module Sunspot
6
+ module Solr
7
+ class Installer
8
+ class <<self
9
+ def execute(solr_home, options = {})
10
+ new(solr_home, options).execute
11
+ end
12
+
13
+ private :new
14
+ end
15
+
16
+ def initialize(solr_home, options)
17
+ @solr_home, @options = solr_home, options
18
+ end
19
+
20
+ def execute
21
+ ConfigInstaller.execute(File.join(@solr_home, 'conf'), @options)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,46 @@
1
+ require 'fileutils'
2
+
3
+ module Sunspot
4
+ module Solr
5
+ class Installer
6
+ class ConfigInstaller
7
+ include TaskHelper
8
+
9
+ class <<self
10
+ def execute(config_path, options = {})
11
+ new(config_path, options).execute
12
+ end
13
+ end
14
+
15
+ def initialize(config_path, options)
16
+ @config_path = config_path
17
+ @verbose = !!options[:verbose]
18
+ @force = !!options[:force]
19
+ end
20
+
21
+ def execute
22
+ sunspot_config_path = File.join(File.dirname(__FILE__), '..', '..',
23
+ '..', '..', 'solr', 'solr', 'conf')
24
+ return if File.expand_path(sunspot_config_path) == File.expand_path(@config_path)
25
+
26
+ FileUtils.mkdir_p(@config_path)
27
+ Dir.glob(File.join(sunspot_config_path, '*.*')).each do |file|
28
+ file = File.expand_path(file)
29
+ dest = File.join(@config_path, File.basename(file))
30
+
31
+ if File.exist?(dest)
32
+ if @force
33
+ say("Removing existing file #{dest}")
34
+ else
35
+ next
36
+ end
37
+ end
38
+
39
+ say("Copying #{file} => #{dest}")
40
+ FileUtils.cp(file, dest)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,13 @@
1
+ module Sunspot
2
+ module Solr
3
+ class Installer
4
+ module TaskHelper
5
+ def say(message)
6
+ if @verbose
7
+ STDOUT.puts(message)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ module Sunspot
2
+ module Solr
3
+ module Java
4
+ def self.installed?
5
+ `java -version`
6
+ $?.success?
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ module Sunspot
2
+ module Solr
3
+ class Railtie < ::Rails::Railtie
4
+
5
+ rake_tasks do
6
+ load 'sunspot/solr/tasks.rb'
7
+ end
8
+
9
+ # generators do
10
+ # load "generators/sunspot_rails.rb"
11
+ # end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,229 @@
1
+ require 'escape'
2
+ require 'set'
3
+ require 'tempfile'
4
+ require 'sunspot/solr/java'
5
+ require 'sunspot/solr/installer'
6
+
7
+ module Sunspot
8
+ module Solr
9
+ class Server #:nodoc:
10
+ # Raised if #stop is called but the server is not running
11
+ ServerError = Class.new(RuntimeError)
12
+ AlreadyRunningError = Class.new(ServerError)
13
+ NotRunningError = Class.new(ServerError)
14
+ JavaMissing = Class.new(ServerError)
15
+
16
+ # Name of the sunspot executable (shell script)
17
+ SOLR_START_JAR = File.expand_path(
18
+ File.join(File.dirname(__FILE__), '..', '..', '..', 'solr', 'start.jar')
19
+ )
20
+
21
+ LOG_LEVELS = Set['SEVERE', 'WARNING', 'INFO', 'CONFIG', 'FINE', 'FINER', 'FINEST']
22
+
23
+ attr_accessor :min_memory, :max_memory, :bind_address, :port, :solr_data_dir, :solr_home, :log_file, :multicore
24
+ attr_writer :pid_dir, :pid_file, :log_level, :solr_data_dir, :solr_home, :solr_jar
25
+
26
+ def initialize(*args)
27
+ ensure_java_installed
28
+ super(*args)
29
+ end
30
+
31
+ #
32
+ # Bootstrap a new solr_home by creating all required
33
+ # directories.
34
+ #
35
+ # ==== Returns
36
+ #
37
+ # Boolean:: success
38
+ #
39
+ def bootstrap
40
+ unless @bootstrapped
41
+ install_solr_home
42
+ create_solr_directories
43
+ @bootstrapped = true
44
+ end
45
+ end
46
+
47
+ #
48
+ # Start the sunspot-solr server. Bootstrap solr_home first,
49
+ # if neccessary.
50
+ #
51
+ # ==== Returns
52
+ #
53
+ # Boolean:: success
54
+ #
55
+ def start
56
+ bootstrap
57
+
58
+ if File.exist?(pid_path)
59
+ existing_pid = IO.read(pid_path).to_i
60
+ begin
61
+ Process.kill(0, existing_pid)
62
+ raise(AlreadyRunningError, "Server is already running with PID #{existing_pid}")
63
+ rescue Errno::ESRCH
64
+ STDERR.puts("Removing stale PID file at #{pid_path}")
65
+ FileUtils.rm(pid_path)
66
+ end
67
+ end
68
+ fork do
69
+ pid = fork do
70
+ Process.setsid
71
+ STDIN.reopen('/dev/null')
72
+ STDOUT.reopen('/dev/null', 'a')
73
+ STDERR.reopen(STDOUT)
74
+ run
75
+ end
76
+ FileUtils.mkdir_p(pid_dir)
77
+ File.open(pid_path, 'w') do |file|
78
+ file << pid
79
+ end
80
+ end
81
+ end
82
+
83
+ #
84
+ # Run the sunspot-solr server in the foreground. Boostrap
85
+ # solr_home first, if neccessary.
86
+ #
87
+ # ==== Returns
88
+ #
89
+ # Boolean:: success
90
+ #
91
+ def run
92
+ bootstrap
93
+
94
+ command = ['java']
95
+ command << "-Xms#{min_memory}" if min_memory
96
+ command << "-Xmx#{max_memory}" if max_memory
97
+ command << "-Djetty.port=#{port}" if port
98
+ command << "-Djetty.host=#{bind_address}" if bind_address
99
+ command << "-Dsolr.data.dir=#{solr_data_dir}" if solr_data_dir && !multicore
100
+ command << "-Dsolr.solr.home=#{solr_home}" if solr_home
101
+ command << "-Djava.util.logging.config.file=#{logging_config_path}" if logging_config_path
102
+ command << '-jar' << File.basename(solr_jar)
103
+ FileUtils.cd(File.dirname(solr_jar)) do
104
+ exec(Escape.shell_command(command))
105
+ end
106
+ end
107
+
108
+ #
109
+ # Stop the sunspot-solr server.
110
+ #
111
+ # ==== Returns
112
+ #
113
+ # Boolean:: success
114
+ #
115
+ def stop
116
+ if File.exist?(pid_path)
117
+ pid = IO.read(pid_path).to_i
118
+ begin
119
+ Process.kill('TERM', pid)
120
+ rescue Errno::ESRCH
121
+ raise NotRunningError, "Process with PID #{pid} is no longer running"
122
+ ensure
123
+ FileUtils.rm(pid_path)
124
+ end
125
+ else
126
+ raise NotRunningError, "No PID file at #{pid_path}"
127
+ end
128
+ end
129
+
130
+
131
+ def multicore
132
+ @multicore || false
133
+ end
134
+
135
+ def log_level=(level)
136
+ unless LOG_LEVELS.include?(level.to_s.upcase)
137
+ raise(ArgumentError, "#{level} is not a valid log level: Use one of #{LOG_LEVELS.to_a.join(',')}")
138
+ end
139
+ @log_level = level.to_s.upcase
140
+ end
141
+
142
+ def log_level
143
+ @log_level || 'WARNING'
144
+ end
145
+
146
+ def pid_path
147
+ File.join(pid_dir, pid_file)
148
+ end
149
+
150
+ def pid_file
151
+ @pid_file || 'sunspot-solr.pid'
152
+ end
153
+
154
+ def pid_dir
155
+ File.expand_path(@pid_dir || FileUtils.pwd)
156
+ end
157
+
158
+ def solr_data_dir
159
+ File.expand_path(@solr_data_dir || Dir.tmpdir)
160
+ end
161
+
162
+ def solr_home
163
+ File.expand_path(@solr_home || File.join(File.dirname(solr_jar), 'solr'))
164
+ end
165
+
166
+ def solr_jar
167
+ @solr_jar || SOLR_START_JAR
168
+ end
169
+
170
+ #
171
+ # Copy default solr configuration files from sunspot
172
+ # gem to the new solr_home/config directory
173
+ #
174
+ # ==== Returns
175
+ #
176
+ # Boolean:: success
177
+ #
178
+ def install_solr_home
179
+ unless File.exists?(File.join(File.dirname(solr_jar), solr_home))
180
+ Sunspot::Solr::Installer.execute(
181
+ solr_home,
182
+ :force => true,
183
+ :verbose => true
184
+ )
185
+ end
186
+ end
187
+
188
+ #
189
+ # Create new solr_home, config, log and pid directories
190
+ #
191
+ # ==== Returns
192
+ #
193
+ # Boolean:: success
194
+ #
195
+ def create_solr_directories
196
+ [solr_data_dir, pid_dir].each do |path|
197
+ FileUtils.mkdir_p(path) unless File.exists?(path)
198
+ end
199
+ end
200
+
201
+ private
202
+
203
+ def ensure_java_installed
204
+ unless defined?(@java_installed)
205
+ @java_installed = Sunspot::Solr::Java.installed?
206
+ unless @java_installed
207
+ raise JavaMissing.new("You need a Java Runtime Environment to run the Solr server")
208
+ end
209
+ end
210
+ @java_installed
211
+ end
212
+
213
+ def logging_config_path
214
+ return @logging_config_path if defined?(@logging_config_path)
215
+ @logging_config_path =
216
+ if log_file
217
+ logging_config = Tempfile.new('logging.properties')
218
+ logging_config.puts("handlers = java.util.logging.FileHandler")
219
+ logging_config.puts("java.util.logging.FileHandler.level = #{log_level.to_s.upcase}")
220
+ logging_config.puts("java.util.logging.FileHandler.pattern = #{log_file}")
221
+ logging_config.puts("java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter")
222
+ logging_config.flush
223
+ logging_config.close
224
+ logging_config.path
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end