culturecode-sunspot_solr 2.0.0.pre

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 +223 -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 +37 -0
  44. metadata +139 -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,223 @@
1
+ require 'set'
2
+ require 'tempfile'
3
+ require 'sunspot/solr/java'
4
+ require 'sunspot/solr/installer'
5
+
6
+ module Sunspot
7
+ module Solr
8
+ class Server #:nodoc:
9
+ # Raised if #stop is called but the server is not running
10
+ ServerError = Class.new(RuntimeError)
11
+ AlreadyRunningError = Class.new(ServerError)
12
+ NotRunningError = Class.new(ServerError)
13
+ JavaMissing = Class.new(ServerError)
14
+
15
+ # Name of the sunspot executable (shell script)
16
+ SOLR_START_JAR = File.expand_path(
17
+ File.join(File.dirname(__FILE__), '..', '..', '..', 'solr', 'start.jar')
18
+ )
19
+
20
+ LOG_LEVELS = Set['SEVERE', 'WARNING', 'INFO', 'CONFIG', 'FINE', 'FINER', 'FINEST']
21
+
22
+ attr_accessor :min_memory, :max_memory, :bind_address, :port, :solr_data_dir, :solr_home, :log_file
23
+ attr_writer :pid_dir, :pid_file, :log_level, :solr_data_dir, :solr_home, :solr_jar
24
+
25
+ def initialize(*args)
26
+ ensure_java_installed
27
+ super(*args)
28
+ end
29
+
30
+ #
31
+ # Bootstrap a new solr_home by creating all required
32
+ # directories.
33
+ #
34
+ # ==== Returns
35
+ #
36
+ # Boolean:: success
37
+ #
38
+ def bootstrap
39
+ unless @bootstrapped
40
+ install_solr_home
41
+ create_solr_directories
42
+ @bootstrapped = true
43
+ end
44
+ end
45
+
46
+ #
47
+ # Start the sunspot-solr server. Bootstrap solr_home first,
48
+ # if neccessary.
49
+ #
50
+ # ==== Returns
51
+ #
52
+ # Boolean:: success
53
+ #
54
+ def start
55
+ bootstrap
56
+
57
+ if File.exist?(pid_path)
58
+ existing_pid = IO.read(pid_path).to_i
59
+ begin
60
+ Process.kill(0, existing_pid)
61
+ raise(AlreadyRunningError, "Server is already running with PID #{existing_pid}")
62
+ rescue Errno::ESRCH
63
+ STDERR.puts("Removing stale PID file at #{pid_path}")
64
+ FileUtils.rm(pid_path)
65
+ end
66
+ end
67
+ fork do
68
+ pid = fork do
69
+ Process.setsid
70
+ STDIN.reopen('/dev/null')
71
+ STDOUT.reopen('/dev/null', 'a')
72
+ STDERR.reopen(STDOUT)
73
+ run
74
+ end
75
+ FileUtils.mkdir_p(pid_dir)
76
+ File.open(pid_path, 'w') do |file|
77
+ file << pid
78
+ end
79
+ end
80
+ end
81
+
82
+ #
83
+ # Run the sunspot-solr server in the foreground. Boostrap
84
+ # solr_home first, if neccessary.
85
+ #
86
+ # ==== Returns
87
+ #
88
+ # Boolean:: success
89
+ #
90
+ def run
91
+ bootstrap
92
+
93
+ command = ['java']
94
+ command << "-Xms#{min_memory}" if min_memory
95
+ command << "-Xmx#{max_memory}" if max_memory
96
+ command << "-Djetty.port=#{port}" if port
97
+ command << "-Djetty.host=#{bind_address}" if bind_address
98
+ command << "-Dsolr.data.dir=#{solr_data_dir}" if solr_data_dir
99
+ command << "-Dsolr.solr.home=#{solr_home}" if solr_home
100
+ command << "-Djava.util.logging.config.file=#{logging_config_path}" if logging_config_path
101
+ command << '-jar' << File.basename(solr_jar)
102
+ FileUtils.cd(File.dirname(solr_jar)) do
103
+ exec(*command)
104
+ end
105
+ end
106
+
107
+ #
108
+ # Stop the sunspot-solr server.
109
+ #
110
+ # ==== Returns
111
+ #
112
+ # Boolean:: success
113
+ #
114
+ def stop
115
+ if File.exist?(pid_path)
116
+ pid = IO.read(pid_path).to_i
117
+ begin
118
+ Process.kill('TERM', pid)
119
+ rescue Errno::ESRCH
120
+ raise NotRunningError, "Process with PID #{pid} is no longer running"
121
+ ensure
122
+ FileUtils.rm(pid_path)
123
+ end
124
+ else
125
+ raise NotRunningError, "No PID file at #{pid_path}"
126
+ end
127
+ end
128
+
129
+ def log_level=(level)
130
+ unless LOG_LEVELS.include?(level.to_s.upcase)
131
+ raise(ArgumentError, "#{level} is not a valid log level: Use one of #{LOG_LEVELS.to_a.join(',')}")
132
+ end
133
+ @log_level = level.to_s.upcase
134
+ end
135
+
136
+ def log_level
137
+ @log_level || 'WARNING'
138
+ end
139
+
140
+ def pid_path
141
+ File.join(pid_dir, pid_file)
142
+ end
143
+
144
+ def pid_file
145
+ @pid_file || 'sunspot-solr.pid'
146
+ end
147
+
148
+ def pid_dir
149
+ File.expand_path(@pid_dir || FileUtils.pwd)
150
+ end
151
+
152
+ def solr_data_dir
153
+ File.expand_path(@solr_data_dir || Dir.tmpdir)
154
+ end
155
+
156
+ def solr_home
157
+ File.expand_path(@solr_home || File.join(File.dirname(solr_jar), 'solr'))
158
+ end
159
+
160
+ def solr_jar
161
+ @solr_jar || SOLR_START_JAR
162
+ end
163
+
164
+ #
165
+ # Copy default solr configuration files from sunspot
166
+ # gem to the new solr_home/config directory
167
+ #
168
+ # ==== Returns
169
+ #
170
+ # Boolean:: success
171
+ #
172
+ def install_solr_home
173
+ unless File.exists?(solr_home)
174
+ Sunspot::Solr::Installer.execute(
175
+ solr_home,
176
+ :force => true,
177
+ :verbose => true
178
+ )
179
+ end
180
+ end
181
+
182
+ #
183
+ # Create new solr_home, config, log and pid directories
184
+ #
185
+ # ==== Returns
186
+ #
187
+ # Boolean:: success
188
+ #
189
+ def create_solr_directories
190
+ [solr_data_dir, pid_dir].each do |path|
191
+ FileUtils.mkdir_p(path) unless File.exists?(path)
192
+ end
193
+ end
194
+
195
+ private
196
+
197
+ def ensure_java_installed
198
+ unless defined?(@java_installed)
199
+ @java_installed = Sunspot::Solr::Java.installed?
200
+ unless @java_installed
201
+ raise JavaMissing.new("You need a Java Runtime Environment to run the Solr server")
202
+ end
203
+ end
204
+ @java_installed
205
+ end
206
+
207
+ def logging_config_path
208
+ return @logging_config_path if defined?(@logging_config_path)
209
+ @logging_config_path =
210
+ if log_file
211
+ logging_config = Tempfile.new('logging.properties')
212
+ logging_config.puts("handlers = java.util.logging.FileHandler")
213
+ logging_config.puts("java.util.logging.FileHandler.level = #{log_level.to_s.upcase}")
214
+ logging_config.puts("java.util.logging.FileHandler.pattern = #{log_file}")
215
+ logging_config.puts("java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter")
216
+ logging_config.flush
217
+ logging_config.close
218
+ logging_config.path
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end