jettywrapper 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -7,3 +7,4 @@ coverage.data
7
7
  *~
8
8
  .yardoc
9
9
  doc
10
+ tmp/
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "jetty1"]
2
+ path = jetty1
3
+ url = git://github.com/projecthydra/hydra-jetty.git
data/jettywrapper.gemspec CHANGED
@@ -19,6 +19,9 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.required_rubygems_version = ">= 1.3.6"
21
21
 
22
+ s.add_dependency "logger"
23
+ s.add_dependency "loggable"
24
+
22
25
  # Bundler will install these gems too if you've checked this out from source from git and run 'bundle install'
23
26
  # It will not add these as dependencies if you require lyber-core for other projects
24
27
  s.add_development_dependency "ruby-debug"
data/lib/jettywrapper.rb CHANGED
@@ -1,10 +1,14 @@
1
1
  # Jettywrapper is a Singleton class, so you can only create one jetty instance at a time.
2
+ require 'rubygems'
3
+ require 'logger'
4
+ require 'loggable'
5
+ require 'singleton'
6
+ require 'ftools'
2
7
 
3
8
  class Jettywrapper
4
9
 
5
- require 'singleton'
6
10
  include Singleton
7
- require 'ftools'
11
+ include Loggable
8
12
 
9
13
  attr_accessor :pid # If Jettywrapper is running, what pid is it running as?
10
14
  attr_accessor :port # What port should jetty start on? Default is 8888
@@ -13,15 +17,19 @@ class Jettywrapper
13
17
  attr_accessor :quiet # Keep quiet about jetty output?
14
18
  attr_accessor :solr_home # Where is solr located? Default is jetty_home/solr
15
19
  attr_accessor :fedora_home # Where is fedora located? Default is jetty_home/fedora
20
+ attr_accessor :logger # Where should logs be written?
21
+ attr_accessor :base_path # The root of the application. Used for determining where log files and PID files should go.
16
22
 
17
23
  # configure the singleton with some defaults
18
24
  def initialize(params = {})
19
- @pid = nil
25
+ # @pid = nil
20
26
  if defined?(Rails.root)
21
27
  @base_path = Rails.root
22
28
  else
23
29
  @base_path = "."
24
30
  end
31
+ @logger = Logger.new("#{@base_path}/tmp/jettywrapper-debug.log")
32
+ @logger.debug 'Initializing jettywrapper'
25
33
  end
26
34
 
27
35
  class << self
@@ -93,9 +101,10 @@ class Jettywrapper
93
101
 
94
102
  return error
95
103
  end
96
-
97
- end #end of class << self
98
-
104
+
105
+ end #end of class << self
106
+
107
+
99
108
  # What command is being run to invoke jetty?
100
109
  def jetty_command
101
110
  "java -Djetty.port=#{@port} -Dsolr.solr.home=#{@solr_home} -Dfedora.home=#{@fedora_home} -jar start.jar"
@@ -103,18 +112,19 @@ class Jettywrapper
103
112
 
104
113
  # Start the jetty server. Check the pid file to see if it is running already,
105
114
  # and stop it if so. After you start jetty, write the PID to a file.
106
-
107
115
  def start
108
- puts "jetty_home: #{@jetty_home}"
109
- puts "solr_home: #{@solr_home}"
110
- puts "fedora_home: #{@fedora_home}"
111
- puts "jetty_command: #{jetty_command}"
116
+ @logger.debug "Starting jetty with these values: "
117
+ @logger.debug "jetty_home: #{@jetty_home}"
118
+ @logger.debug "solr_home: #{@solr_home}"
119
+ @logger.debug "fedora_home: #{@fedora_home}"
120
+ @logger.debug "jetty_command: #{jetty_command}"
121
+
112
122
  if pid
113
123
  begin
114
124
  Process.kill(0,pid)
115
125
  raise("Server is already running with PID #{pid}")
116
126
  rescue Errno::ESRCH
117
- STDERR.puts("Removing stale PID file at #{pid_path}")
127
+ @logger.warn "Removing stale PID file at #{pid_path}"
118
128
  File.delete(pid_path)
119
129
  end
120
130
  end
@@ -129,15 +139,16 @@ class Jettywrapper
129
139
  end
130
140
  f.puts "#{@pid}"
131
141
  f.close
142
+ @logger.debug "Wrote pid file to #{pid_path} with value #{@pid}"
132
143
  end
133
144
 
134
145
  def stop
135
- puts "stopping"
146
+ @logger.warn "stopping jetty... "
136
147
  if pid
137
148
  begin
138
149
  self.send "#{platform}_stop".to_sym
139
150
  rescue Errno::ESRCH
140
- STDERR.puts("Removing stale PID file at #{pid_path}")
151
+ @logger.warn "Removing stale PID file at #{pid_path}"
141
152
  end
142
153
  FileUtils.rm(pid_path)
143
154
  end
@@ -164,17 +175,19 @@ class Jettywrapper
164
175
 
165
176
  def nix_process
166
177
  @pid = fork do
167
- STDERR.close if @quiet
178
+ # STDERR.close if @quiet
168
179
  exec jetty_command
169
180
  end
170
181
  end
171
182
 
172
- # stop a running solr server
183
+ # stop jetty the windows way
173
184
  def win_stop
174
- Process.kill(1, @pid)
185
+ Process.kill(1, pid)
175
186
  end
176
187
 
188
+ # stop jetty the *nix way
177
189
  def nix_stop
190
+ @logger.debug "Killing process #{pid}"
178
191
  Process.kill('TERM',pid)
179
192
  end
180
193
 
@@ -182,16 +195,25 @@ class Jettywrapper
182
195
  File.join(pid_dir, pid_file)
183
196
  end
184
197
 
198
+ # The file where the process ID will be written
185
199
  def pid_file
186
200
  @pid_file || 'hydra-jetty.pid'
187
201
  end
188
202
 
203
+ # The directory where the pid_file will be written
189
204
  def pid_dir
190
205
  File.expand_path(@pid_dir || File.join(@base_path,'tmp','pids'))
191
206
  end
207
+
208
+ # Check to see if there is a pid file already
209
+ # @return true if the file exists, otherwise false
210
+ def pid_file?
211
+ return true if File.exist?(pid_path)
212
+ false
213
+ end
192
214
 
193
215
  def pid
194
- @pid || File.open( pid_path ) { |f| return f.gets.to_i } if File.exist?(pid_path)
216
+ @pid || File.open( pid_path ) { |f| return f.gets.to_i } if File.exist?(pid_path)
195
217
  end
196
-
218
+
197
219
  end
@@ -1 +1 @@
1
- GEMVERSION = "0.0.6"
1
+ GEMVERSION = "0.0.7"
@@ -0,0 +1,59 @@
1
+ require File.join(File.dirname(__FILE__), "/../spec_helper")
2
+ require File.join(File.dirname(__FILE__), "/../../lib/jettywrapper")
3
+ require 'rubygems'
4
+ require 'ruby-debug'
5
+ require 'uri'
6
+
7
+ module Hydra
8
+ describe Jettywrapper do
9
+ context "integration" do
10
+ before(:all) do
11
+ $stderr.reopen("/dev/null", "w")
12
+ end
13
+
14
+ it "starts" do
15
+
16
+ jetty_params = {
17
+ :jetty_home => File.expand_path("#{File.dirname(__FILE__)}/../../jetty1")
18
+
19
+ }
20
+ Jettywrapper.configure(jetty_params)
21
+ ts = Jettywrapper.instance
22
+ ts.logger.debug "Stopping jetty from rspec."
23
+ ts.stop
24
+ ts.start
25
+ ts.logger.debug "Jetty started from rspec at #{ts.pid}"
26
+ pid_from_file = File.open( ts.pid_path ) { |f| f.gets.to_i }
27
+ ts.pid.should eql(pid_from_file)
28
+ sleep 15 # give jetty time to start
29
+
30
+ # Can we connect to solr?
31
+ require 'net/http'
32
+ response = Net::HTTP.get_response(URI.parse("http://localhost:8888/solr/admin/"))
33
+ response.code.should eql("200")
34
+ ts.stop
35
+
36
+ end
37
+
38
+ it "won't start if it's already running" do
39
+ jetty_params = {
40
+ :jetty_home => File.expand_path("#{File.dirname(__FILE__)}/../../jetty1")
41
+
42
+ }
43
+ Jettywrapper.configure(jetty_params)
44
+ ts = Jettywrapper.instance
45
+ ts.logger.debug "Stopping jetty from rspec."
46
+ ts.stop
47
+ ts.start
48
+ sleep 15
49
+ ts.logger.debug "Jetty started from rspec at #{ts.pid}"
50
+ response = Net::HTTP.get_response(URI.parse("http://localhost:8888/solr/admin/"))
51
+ response.code.should eql("200")
52
+ lambda { ts.start }.should raise_exception(/Server is already running/)
53
+ ts.stop
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+ end
@@ -1,5 +1,7 @@
1
1
  require File.join(File.dirname(__FILE__), "/../spec_helper")
2
2
  require File.join(File.dirname(__FILE__), "/../../lib/jettywrapper")
3
+ require 'rubygems'
4
+ require 'ruby-debug'
3
5
 
4
6
  module Hydra
5
7
  describe Jettywrapper do
@@ -74,8 +76,56 @@ module Hydra
74
76
  ts.pid.should eql(5454)
75
77
  end
76
78
 
79
+ it "knows what its pid file should be called" do
80
+ ts = Jettywrapper.configure(@jetty_params)
81
+ ts.pid_file.should eql("hydra-jetty.pid")
82
+ end
83
+
84
+ it "knows where its pid file should be written" do
85
+ ts = Jettywrapper.configure(@jetty_params)
86
+ ts.pid_dir.should eql(File.expand_path("#{ts.base_path}/tmp/pids"))
87
+ end
88
+
89
+ it "writes a pid to a file when it is started" do
90
+ jetty_params = {
91
+ :jetty_home => '/tmp'
92
+ }
93
+ ts = Jettywrapper.configure(jetty_params)
94
+ Jettywrapper.any_instance.stubs(:fork).returns(2222)
95
+ FileUtils.rm(ts.pid_path)
96
+ ts.pid_file?.should eql(false)
97
+ ts.start
98
+ ts.pid.should eql(2222)
99
+ ts.pid_file?.should eql(true)
100
+ pid_from_file = File.open( ts.pid_path ) { |f| f.gets.to_i }
101
+ pid_from_file.should eql(2222)
102
+ end
103
+
104
+ it "checks to see if jetty is running already before it starts" do
105
+ jetty_params = {
106
+ :jetty_home => '/tmp'
107
+ }
108
+ ts = Jettywrapper.configure(jetty_params)
109
+ Jettywrapper.any_instance.stubs(:fork).returns(3333)
110
+ FileUtils.rm(ts.pid_path)
111
+ ts.pid_file?.should eql(false)
112
+ ts.start
113
+ ts.pid.should eql(3333)
114
+ Jettywrapper.any_instance.stubs(:fork).returns(4444)
115
+ ts.start
116
+ ts.pid.should eql(4444)
117
+ end
118
+
77
119
  end # end of instantiation context
78
120
 
121
+ context "logging" do
122
+ it "has a logger" do
123
+ ts = Jettywrapper.configure(@jetty_params)
124
+ ts.logger.should be_kind_of(Logger)
125
+ end
126
+
127
+ end # end of logging context
128
+
79
129
  context "wrapping a task" do
80
130
  it "wraps another method" do
81
131
  Jettywrapper.any_instance.stubs(:start).returns(true)
@@ -110,7 +160,6 @@ module Hydra
110
160
  error.message.should eql("foo")
111
161
  end
112
162
 
113
- end
114
-
163
+ end # end of wrapping context
115
164
  end
116
165
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jettywrapper
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 6
10
- version: 0.0.6
9
+ - 7
10
+ version: 0.0.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - Bess Sadler
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-21 00:00:00 -07:00
18
+ date: 2011-06-22 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -29,8 +29,8 @@ dependencies:
29
29
  - 0
30
30
  version: "0"
31
31
  requirement: *id001
32
- type: :development
33
- name: ruby-debug
32
+ type: :runtime
33
+ name: logger
34
34
  prerelease: false
35
35
  - !ruby/object:Gem::Dependency
36
36
  version_requirements: &id002 !ruby/object:Gem::Requirement
@@ -43,11 +43,39 @@ dependencies:
43
43
  - 0
44
44
  version: "0"
45
45
  requirement: *id002
46
+ type: :runtime
47
+ name: loggable
48
+ prerelease: false
49
+ - !ruby/object:Gem::Dependency
50
+ version_requirements: &id003 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ hash: 3
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ requirement: *id003
60
+ type: :development
61
+ name: ruby-debug
62
+ prerelease: false
63
+ - !ruby/object:Gem::Dependency
64
+ version_requirements: &id004 !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ hash: 3
70
+ segments:
71
+ - 0
72
+ version: "0"
73
+ requirement: *id004
46
74
  type: :development
47
75
  name: ruby-debug-base
48
76
  prerelease: false
49
77
  - !ruby/object:Gem::Dependency
50
- version_requirements: &id003 !ruby/object:Gem::Requirement
78
+ version_requirements: &id005 !ruby/object:Gem::Requirement
51
79
  none: false
52
80
  requirements:
53
81
  - - <
@@ -57,12 +85,12 @@ dependencies:
57
85
  - 2
58
86
  - 0
59
87
  version: "2.0"
60
- requirement: *id003
88
+ requirement: *id005
61
89
  type: :development
62
90
  name: rspec
63
91
  prerelease: false
64
92
  - !ruby/object:Gem::Dependency
65
- version_requirements: &id004 !ruby/object:Gem::Requirement
93
+ version_requirements: &id006 !ruby/object:Gem::Requirement
66
94
  none: false
67
95
  requirements:
68
96
  - - <
@@ -73,12 +101,12 @@ dependencies:
73
101
  - 0
74
102
  - 0
75
103
  version: 2.0.0
76
- requirement: *id004
104
+ requirement: *id006
77
105
  type: :development
78
106
  name: rspec-rails
79
107
  prerelease: false
80
108
  - !ruby/object:Gem::Dependency
81
- version_requirements: &id005 !ruby/object:Gem::Requirement
109
+ version_requirements: &id007 !ruby/object:Gem::Requirement
82
110
  none: false
83
111
  requirements:
84
112
  - - ">="
@@ -87,12 +115,12 @@ dependencies:
87
115
  segments:
88
116
  - 0
89
117
  version: "0"
90
- requirement: *id005
118
+ requirement: *id007
91
119
  type: :development
92
120
  name: mocha
93
121
  prerelease: false
94
122
  - !ruby/object:Gem::Dependency
95
- version_requirements: &id006 !ruby/object:Gem::Requirement
123
+ version_requirements: &id008 !ruby/object:Gem::Requirement
96
124
  none: false
97
125
  requirements:
98
126
  - - ">="
@@ -103,12 +131,12 @@ dependencies:
103
131
  - 8
104
132
  - 5
105
133
  version: 0.8.5
106
- requirement: *id006
134
+ requirement: *id008
107
135
  type: :development
108
136
  name: cucumber
109
137
  prerelease: false
110
138
  - !ruby/object:Gem::Dependency
111
- version_requirements: &id007 !ruby/object:Gem::Requirement
139
+ version_requirements: &id009 !ruby/object:Gem::Requirement
112
140
  none: false
113
141
  requirements:
114
142
  - - ">="
@@ -117,12 +145,12 @@ dependencies:
117
145
  segments:
118
146
  - 0
119
147
  version: "0"
120
- requirement: *id007
148
+ requirement: *id009
121
149
  type: :development
122
150
  name: cucumber-rails
123
151
  prerelease: false
124
152
  - !ruby/object:Gem::Dependency
125
- version_requirements: &id008 !ruby/object:Gem::Requirement
153
+ version_requirements: &id010 !ruby/object:Gem::Requirement
126
154
  none: false
127
155
  requirements:
128
156
  - - ">="
@@ -131,12 +159,12 @@ dependencies:
131
159
  segments:
132
160
  - 0
133
161
  version: "0"
134
- requirement: *id008
162
+ requirement: *id010
135
163
  type: :development
136
164
  name: gherkin
137
165
  prerelease: false
138
166
  - !ruby/object:Gem::Dependency
139
- version_requirements: &id009 !ruby/object:Gem::Requirement
167
+ version_requirements: &id011 !ruby/object:Gem::Requirement
140
168
  none: false
141
169
  requirements:
142
170
  - - ">="
@@ -145,12 +173,12 @@ dependencies:
145
173
  segments:
146
174
  - 0
147
175
  version: "0"
148
- requirement: *id009
176
+ requirement: *id011
149
177
  type: :development
150
178
  name: rcov
151
179
  prerelease: false
152
180
  - !ruby/object:Gem::Dependency
153
- version_requirements: &id010 !ruby/object:Gem::Requirement
181
+ version_requirements: &id012 !ruby/object:Gem::Requirement
154
182
  none: false
155
183
  requirements:
156
184
  - - "="
@@ -161,12 +189,12 @@ dependencies:
161
189
  - 6
162
190
  - 5
163
191
  version: 0.6.5
164
- requirement: *id010
192
+ requirement: *id012
165
193
  type: :development
166
194
  name: yard
167
195
  prerelease: false
168
196
  - !ruby/object:Gem::Dependency
169
- version_requirements: &id011 !ruby/object:Gem::Requirement
197
+ version_requirements: &id013 !ruby/object:Gem::Requirement
170
198
  none: false
171
199
  requirements:
172
200
  - - ">="
@@ -175,7 +203,7 @@ dependencies:
175
203
  segments:
176
204
  - 0
177
205
  version: "0"
178
- requirement: *id011
206
+ requirement: *id013
179
207
  type: :development
180
208
  name: RedCloth
181
209
  prerelease: false
@@ -190,6 +218,7 @@ extra_rdoc_files: []
190
218
 
191
219
  files:
192
220
  - .gitignore
221
+ - .gitmodules
193
222
  - .rvmrc
194
223
  - Gemfile
195
224
  - README.textile
@@ -197,6 +226,7 @@ files:
197
226
  - jettywrapper.gemspec
198
227
  - lib/jettywrapper.rb
199
228
  - lib/jettywrapper/version.rb
229
+ - spec/lib/jettywrapper_integration_spec.rb
200
230
  - spec/lib/jettywrapper_spec.rb
201
231
  - spec/spec_helper.rb
202
232
  has_rdoc: true