torquebox-cache 2.0.3-java → 2.1.0-java
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/active_support/cache/torque_box_store.rb +5 -1
- data/lib/cache.rb +54 -138
- data/lib/cache_listener.rb +7 -1
- data/lib/gem_hook.rb +6 -3
- data/lib/polyglot-cache-1.7.1.jar +0 -0
- data/lib/polyglot-core-1.7.1.jar +0 -0
- data/lib/{dm-infinispan-adapter.rb → sequence.rb} +42 -2
- data/lib/torquebox-cache.jar +0 -0
- data/lib/torquebox-cache.rb +4 -2
- data/spec/cache_listener_spec.rb +4 -0
- data/spec/cache_spec.rb +35 -22
- data/spec/gem_hook_spec.rb +31 -0
- data/spec/spec_helper.rb +0 -7
- data/spec/torque_box_store_spec.rb +14 -24
- metadata +17 -40
- data/lib/datamapper/dm-infinispan-adapter.rb +0 -129
- data/lib/datamapper/model.rb +0 -187
- data/lib/datamapper/search.rb +0 -146
- data/spec/dm-infinispan-adapter_spec.rb +0 -375
@@ -84,6 +84,10 @@ module ActiveSupport
|
|
84
84
|
|
85
85
|
protected
|
86
86
|
|
87
|
+
def defaults
|
88
|
+
{:name=>'__torque_box_store__', :mode => :invalidation, :sync => false}
|
89
|
+
end
|
90
|
+
|
87
91
|
def encode value
|
88
92
|
Marshal.dump(value).to_java_bytes
|
89
93
|
end
|
@@ -116,7 +120,7 @@ module ActiveSupport
|
|
116
120
|
private
|
117
121
|
|
118
122
|
def cache
|
119
|
-
@cache ||= TorqueBox::Infinispan::Cache.new(options)
|
123
|
+
@cache ||= TorqueBox::Infinispan::Cache.new( defaults.merge(options) )
|
120
124
|
end
|
121
125
|
end
|
122
126
|
end
|
data/lib/cache.rb
CHANGED
@@ -18,6 +18,7 @@
|
|
18
18
|
require 'torquebox/kernel'
|
19
19
|
require 'torquebox/injectors'
|
20
20
|
require 'torquebox/transactions'
|
21
|
+
require 'sequence'
|
21
22
|
|
22
23
|
module TorqueBox
|
23
24
|
module Infinispan
|
@@ -31,7 +32,7 @@ module TorqueBox
|
|
31
32
|
end
|
32
33
|
|
33
34
|
def getTransactionManager
|
34
|
-
|
35
|
+
fetch('transaction-manager')
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -45,40 +46,6 @@ module TorqueBox
|
|
45
46
|
end
|
46
47
|
end
|
47
48
|
|
48
|
-
class Sequence
|
49
|
-
include java.io.Serializable
|
50
|
-
|
51
|
-
class Codec
|
52
|
-
def self.encode(sequence)
|
53
|
-
sequence.value.to_s
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.decode(sequence_bytes)
|
57
|
-
sequence_bytes && Sequence.new( sequence_bytes.to_s.to_i )
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def initialize(amount = 1)
|
62
|
-
@data = amount
|
63
|
-
end
|
64
|
-
|
65
|
-
def value
|
66
|
-
@data ? @data.to_i : @data
|
67
|
-
end
|
68
|
-
|
69
|
-
def next(amount = 1)
|
70
|
-
Sequence.new( @data.to_i + amount )
|
71
|
-
end
|
72
|
-
|
73
|
-
def ==(other)
|
74
|
-
self.value == other.value
|
75
|
-
end
|
76
|
-
|
77
|
-
def to_s
|
78
|
-
"Sequence: #{self.value}"
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
49
|
class Cache
|
83
50
|
include TorqueBox::Injectors
|
84
51
|
|
@@ -87,8 +54,9 @@ module TorqueBox
|
|
87
54
|
java_import org.infinispan.config.Configuration::CacheMode
|
88
55
|
java_import org.infinispan.transaction::TransactionMode
|
89
56
|
java_import org.infinispan.transaction::LockingMode
|
57
|
+
java_import org.projectodd.polyglot.cache.as::CacheService
|
90
58
|
INFINISPAN_AVAILABLE = true
|
91
|
-
rescue NameError
|
59
|
+
rescue NameError => e
|
92
60
|
INFINISPAN_AVAILABLE = false
|
93
61
|
# Not running inside TorqueBox
|
94
62
|
end
|
@@ -106,21 +74,38 @@ module TorqueBox
|
|
106
74
|
options[:name] || TORQUEBOX_APP_NAME
|
107
75
|
end
|
108
76
|
|
109
|
-
def
|
110
|
-
|
77
|
+
def persisted?
|
78
|
+
!options[:persist].nil?
|
79
|
+
end
|
80
|
+
|
81
|
+
def replicated?
|
82
|
+
[:r, :repl, :replicated, :replication].include? options[:mode]
|
83
|
+
end
|
84
|
+
|
85
|
+
def distributed?
|
86
|
+
[:d, :dist, :distributed, :distribution].include? options[:mode]
|
87
|
+
end
|
88
|
+
|
89
|
+
def invalidated?
|
90
|
+
[:i, :inv, :invalidated, :invalidation].include? options[:mode]
|
91
|
+
end
|
92
|
+
|
93
|
+
def clustered?
|
94
|
+
INFINISPAN_AVAILABLE && service.clustered?
|
111
95
|
end
|
112
96
|
|
113
97
|
def clustering_mode
|
114
|
-
|
115
|
-
distributed = [:d, :dist, :distributed, :distribution].include? options[:mode]
|
98
|
+
return CacheMode::LOCAL unless clustered?
|
116
99
|
sync = options[:sync]
|
117
100
|
case
|
118
|
-
when replicated
|
101
|
+
when replicated?
|
119
102
|
sync ? CacheMode::REPL_SYNC : CacheMode::REPL_ASYNC
|
120
|
-
when distributed
|
103
|
+
when distributed?
|
121
104
|
sync ? CacheMode::DIST_SYNC : CacheMode::DIST_ASYNC
|
122
|
-
|
105
|
+
when invalidated?
|
123
106
|
sync ? CacheMode::INVALIDATION_SYNC : CacheMode::INVALIDATION_ASYNC
|
107
|
+
else
|
108
|
+
sync ? CacheMode::DIST_SYNC : CacheMode::DIST_ASYNC
|
124
109
|
end
|
125
110
|
end
|
126
111
|
|
@@ -220,7 +205,7 @@ module TorqueBox
|
|
220
205
|
def transaction(&block)
|
221
206
|
if !transactional?
|
222
207
|
yield self
|
223
|
-
elsif
|
208
|
+
elsif fetch('transaction-manager').nil?
|
224
209
|
tm = cache.getAdvancedCache.getTransactionManager
|
225
210
|
begin
|
226
211
|
tm.begin if tm
|
@@ -258,15 +243,6 @@ module TorqueBox
|
|
258
243
|
cache.stop
|
259
244
|
end
|
260
245
|
|
261
|
-
def self.shutdown
|
262
|
-
Cache.local_managers.each { |m| m.stop }
|
263
|
-
end
|
264
|
-
|
265
|
-
@@local_managers = []
|
266
|
-
def self.local_managers
|
267
|
-
@@local_managers
|
268
|
-
end
|
269
|
-
|
270
246
|
def self.log( message, status = 'INFO' )
|
271
247
|
$stdout.puts( "#{status}: #{message}" )
|
272
248
|
end
|
@@ -282,108 +258,62 @@ module TorqueBox
|
|
282
258
|
end
|
283
259
|
|
284
260
|
def cache
|
285
|
-
if INFINISPAN_AVAILABLE
|
286
|
-
@cache ||=
|
261
|
+
if INFINISPAN_AVAILABLE
|
262
|
+
@cache ||= manager.running?( name ) ? reconfigure : configure
|
287
263
|
else
|
288
264
|
@cache ||= nothing
|
289
265
|
end
|
290
266
|
end
|
291
267
|
|
268
|
+
def service
|
269
|
+
@service ||= TorqueBox::ServiceRegistry[CacheService::CACHE]
|
270
|
+
end
|
271
|
+
|
292
272
|
def manager
|
293
|
-
|
294
|
-
@manager ||= TorqueBox::ServiceRegistry[org.jboss.msc.service.ServiceName::JBOSS.append( "infinispan", "torquebox" )]
|
295
|
-
rescue Exception => e
|
296
|
-
log( "Caught exception while looking up Infinispan service.", 'ERROR' )
|
297
|
-
log( e.message, 'ERROR' )
|
298
|
-
end
|
299
|
-
@manager
|
273
|
+
@manager ||= service.cache_container
|
300
274
|
end
|
301
|
-
|
275
|
+
|
302
276
|
def reconfigure(mode=clustering_mode)
|
303
|
-
|
304
|
-
base_config =
|
277
|
+
existing_cache = manager.get_cache(name)
|
278
|
+
base_config = existing_cache.configuration
|
305
279
|
unless base_config.cache_mode == mode
|
306
280
|
log( "Reconfiguring Infinispan cache #{name} from #{base_config.cache_mode} to #{mode}" )
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
config.transaction.transactionMode( transaction_mode )
|
311
|
-
config.transaction.recovery.transactionManagerLookup( transaction_manager_lookup )
|
312
|
-
manager.define_configuration(name, config.build)
|
313
|
-
cache.start
|
281
|
+
existing_cache .stop
|
282
|
+
configure(mode)
|
283
|
+
existing_cache .start
|
314
284
|
end
|
315
|
-
return
|
285
|
+
return existing_cache
|
316
286
|
end
|
317
287
|
|
318
288
|
def configure(mode=clustering_mode)
|
319
289
|
log( "Configuring Infinispan cache #{name} as #{mode}" )
|
320
290
|
base_config = manager.default_configuration.clone
|
321
|
-
base_config.class_loader = java.lang::Thread.current_thread.context_class_loader
|
322
291
|
base_config.cache_mode = mode
|
323
|
-
|
324
292
|
config = base_config.fluent
|
325
293
|
config.transaction.transactionMode( transaction_mode )
|
326
|
-
config.transaction.recovery.transactionManagerLookup( transaction_manager_lookup )
|
327
|
-
manager.define_configuration(name, config.build )
|
328
|
-
manager.get_cache(name)
|
329
|
-
end
|
330
|
-
|
331
|
-
def transaction_manager_lookup
|
332
|
-
@tm ||= if inject('transaction-manager')
|
333
|
-
ContainerTransactionManagerLookup.new
|
334
|
-
else
|
335
|
-
org.infinispan.transaction.lookup.GenericTransactionManagerLookup.new
|
336
|
-
end
|
337
|
-
end
|
338
|
-
|
339
|
-
def clustered
|
340
|
-
(manager.running?(name) ? reconfigure : configure) if manager
|
341
|
-
rescue
|
342
|
-
log( "Clustered: Can't get clustered cache; falling back to local: #{$!}", 'ERROR' )
|
343
|
-
end
|
344
|
-
|
345
|
-
def local
|
346
|
-
log( "Configuring Infinispan local cache #{name}" )
|
347
|
-
bare_config = org.infinispan.config.Configuration.new
|
348
|
-
bare_config.class_loader = java.lang::Thread.current_thread.context_class_loader
|
349
|
-
|
350
|
-
config = bare_config.fluent
|
351
|
-
config.transaction.transactionMode( transaction_mode )
|
352
|
-
|
353
294
|
if transactional?
|
354
295
|
config.transaction.transactionManagerLookup( transaction_manager_lookup )
|
355
296
|
config.transaction.lockingMode( locking_mode )
|
356
297
|
end
|
357
|
-
|
358
|
-
if options[:persist]
|
359
|
-
log( "Configuring #{name} local cache for file-based persistence" )
|
298
|
+
if persisted?
|
360
299
|
store = org.infinispan.loaders.file.FileCacheStoreConfig.new
|
361
300
|
store.purge_on_startup( false )
|
362
301
|
store.location(options[:persist]) if File.exist?( options[:persist].to_s )
|
363
302
|
config.loaders.add_cache_loader( store )
|
364
303
|
end
|
304
|
+
manager.define_configuration(name, config.build )
|
305
|
+
manager.get_cache(name)
|
306
|
+
end
|
365
307
|
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
end
|
373
|
-
|
374
|
-
if ((local_manager = Cache.find_local_manager(name)) == nil)
|
375
|
-
log( "No local CacheManager exists for #{name}. Creating one." )
|
376
|
-
local_manager = org.infinispan.manager.DefaultCacheManager.new
|
377
|
-
local_manager.define_configuration( name, config.build )
|
378
|
-
Cache.local_managers << local_manager
|
379
|
-
end
|
380
|
-
|
381
|
-
local_manager.get_cache( self.name )
|
382
|
-
rescue Exception => e
|
383
|
-
log( "Unable to obtain local cache: #{$!}", 'ERROR' )
|
384
|
-
log( e.backtrace, 'ERROR' )
|
308
|
+
def transaction_manager_lookup
|
309
|
+
@tm ||= if fetch('transaction-manager')
|
310
|
+
ContainerTransactionManagerLookup.new
|
311
|
+
else
|
312
|
+
org.infinispan.transaction.lookup.GenericTransactionManagerLookup.new
|
313
|
+
end
|
385
314
|
end
|
386
315
|
|
316
|
+
|
387
317
|
def nothing
|
388
318
|
result = Object.new
|
389
319
|
def result.method_missing(*args); end
|
@@ -401,25 +331,11 @@ module TorqueBox
|
|
401
331
|
args << expires_in << SECONDS
|
402
332
|
args << expires << SECONDS
|
403
333
|
end
|
404
|
-
#$stderr.puts "cache=#{cache.inspect}"
|
405
|
-
#$stderr.puts "*args=#{args.inspect}"
|
406
334
|
cache.send( *args ) && true
|
407
335
|
end
|
408
336
|
|
409
|
-
# Finds the CacheManager for a given cache and returns it - or nil if not found
|
410
|
-
def self.find_local_manager( cache_name )
|
411
|
-
local_managers.each do |m|
|
412
|
-
if m.cache_exists( cache_name )
|
413
|
-
log( ":-:-:-: local_manager already exists for #{cache_name}" )
|
414
|
-
return m
|
415
|
-
end
|
416
|
-
end
|
417
|
-
return nil
|
418
|
-
end
|
419
|
-
|
420
337
|
end
|
421
338
|
|
422
|
-
at_exit { Cache.shutdown }
|
423
339
|
end
|
424
340
|
end
|
425
341
|
|
data/lib/cache_listener.rb
CHANGED
@@ -15,6 +15,8 @@
|
|
15
15
|
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
16
16
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
17
17
|
|
18
|
+
require 'jruby/core_ext'
|
19
|
+
|
18
20
|
module TorqueBox
|
19
21
|
module Infinispan
|
20
22
|
class CacheListener
|
@@ -28,7 +30,11 @@ module TorqueBox
|
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
|
-
|
33
|
+
if JRUBY_VERSION =~ /^1\.7/
|
34
|
+
add_class_annotations( { org.infinispan.notifications.Listener => { } } )
|
35
|
+
else
|
36
|
+
add_class_annotation( { org.infinispan.notifications.Listener => { } } )
|
37
|
+
end
|
32
38
|
add_method_signature( "event_fired", [java.lang.Void::TYPE, org.infinispan.notifications.cachelistener.event.Event] )
|
33
39
|
add_method_annotation( "event_fired",
|
34
40
|
{ org.infinispan.notifications.cachelistener.annotation.CacheEntryCreated => {},
|
data/lib/gem_hook.rb
CHANGED
@@ -16,7 +16,10 @@
|
|
16
16
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
17
17
|
|
18
18
|
require 'cache'
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
begin
|
20
|
+
ActiveSupport
|
21
|
+
require 'active_support/cache/torque_box_store.rb'
|
22
|
+
rescue NameError
|
23
|
+
# ActiveSupport not used
|
24
|
+
end
|
22
25
|
|
Binary file
|
Binary file
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2012 Red Hat, Inc, and individual contributors.
|
2
2
|
#
|
3
3
|
# This is free software; you can redistribute it and/or modify it
|
4
4
|
# under the terms of the GNU Lesser General Public License as
|
@@ -15,4 +15,44 @@
|
|
15
15
|
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
16
16
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
17
17
|
|
18
|
-
|
18
|
+
module TorqueBox
|
19
|
+
module Infinispan
|
20
|
+
|
21
|
+
class Sequence
|
22
|
+
include java.io.Serializable
|
23
|
+
|
24
|
+
class Codec
|
25
|
+
def self.encode(sequence)
|
26
|
+
sequence.value.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.decode(sequence_bytes)
|
30
|
+
sequence_bytes && Sequence.new( sequence_bytes.to_s.to_i )
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(amount = 1)
|
35
|
+
@data = amount
|
36
|
+
end
|
37
|
+
|
38
|
+
def value
|
39
|
+
@data ? @data.to_i : @data
|
40
|
+
end
|
41
|
+
|
42
|
+
def next(amount = 1)
|
43
|
+
Sequence.new( @data.to_i + amount )
|
44
|
+
end
|
45
|
+
|
46
|
+
def ==(other)
|
47
|
+
self.value == other.value
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_s
|
51
|
+
"Sequence: #{self.value}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
data/lib/torquebox-cache.jar
CHANGED
Binary file
|
data/lib/torquebox-cache.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
module TorqueboxCache
|
2
|
-
VERSION = '2.0
|
3
|
-
MAVEN_VERSION = '2.0
|
2
|
+
VERSION = '2.1.0'
|
3
|
+
MAVEN_VERSION = '2.1.0'
|
4
4
|
end
|
5
5
|
begin
|
6
6
|
require 'java'
|
7
7
|
require File.dirname(__FILE__) + '/torquebox-cache.jar'
|
8
|
+
require File.dirname(__FILE__) + '/polyglot-cache-1.7.1.jar'
|
9
|
+
require File.dirname(__FILE__) + '/polyglot-core-1.7.1.jar'
|
8
10
|
rescue LoadError
|
9
11
|
puts 'JAR-based gems require JRuby to load. Please visit www.jruby.org.'
|
10
12
|
raise
|
data/spec/cache_listener_spec.rb
CHANGED
@@ -19,6 +19,10 @@ require 'cache_listener'
|
|
19
19
|
|
20
20
|
describe TorqueBox::Infinispan::CacheListener do
|
21
21
|
before :each do
|
22
|
+
manager = org.infinispan.manager.DefaultCacheManager.new
|
23
|
+
service = org.projectodd.polyglot.cache.as.CacheService.new
|
24
|
+
service.stub!(:cache_container).and_return( manager )
|
25
|
+
TorqueBox::ServiceRegistry.stub!(:[]).with(org.projectodd.polyglot.cache.as.CacheService::CACHE).and_return( service )
|
22
26
|
@cache = TorqueBox::Infinispan::Cache.new( :name => 'foo-cache' )
|
23
27
|
end
|
24
28
|
|
data/spec/cache_spec.rb
CHANGED
@@ -18,6 +18,10 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
18
18
|
|
19
19
|
describe TorqueBox::Infinispan::Cache do
|
20
20
|
before :each do
|
21
|
+
manager = org.infinispan.manager.DefaultCacheManager.new
|
22
|
+
service = org.projectodd.polyglot.cache.as.CacheService.new
|
23
|
+
service.stub!(:cache_container).and_return( manager )
|
24
|
+
TorqueBox::ServiceRegistry.stub!(:[]).with(org.projectodd.polyglot.cache.as.CacheService::CACHE).and_return( service )
|
21
25
|
@cache = TorqueBox::Infinispan::Cache.new( :name => 'foo-cache' )
|
22
26
|
end
|
23
27
|
|
@@ -29,11 +33,6 @@ describe TorqueBox::Infinispan::Cache do
|
|
29
33
|
@cache.name.should == 'foo-cache'
|
30
34
|
end
|
31
35
|
|
32
|
-
it "should reuse existing cache managers for an extant local cache" do
|
33
|
-
TorqueBox::Infinispan::Cache.should_receive( :find_local_manager ).with( 'foo-cache' )
|
34
|
-
TorqueBox::Infinispan::Cache.new( :name => 'foo-cache' )
|
35
|
-
end
|
36
|
-
|
37
36
|
it "should respond to clustering_mode" do
|
38
37
|
@cache.should respond_to( :clustering_mode )
|
39
38
|
end
|
@@ -127,9 +126,7 @@ describe TorqueBox::Infinispan::Cache do
|
|
127
126
|
end
|
128
127
|
|
129
128
|
it "should increment a sequence" do
|
130
|
-
puts "AAAA"
|
131
129
|
@cache.increment("My Sequence Name", 1).should == 1
|
132
|
-
puts "BBBB"
|
133
130
|
@cache.increment("My Sequence Name", 1).should == 2
|
134
131
|
end
|
135
132
|
|
@@ -144,6 +141,37 @@ describe TorqueBox::Infinispan::Cache do
|
|
144
141
|
@cache.get('a false value').should be_false
|
145
142
|
end
|
146
143
|
|
144
|
+
it "should allow symbols as keys for basic put" do
|
145
|
+
@cache.put(:asymbol, "a value")
|
146
|
+
@cache.get(:asymbol).should == "a value"
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should allow symbols as keys for put_if_absent" do
|
150
|
+
@cache.put_if_absent(:asymbol, "a value")
|
151
|
+
@cache.get(:asymbol).should == "a value"
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should allow symbols as keys for increment" do
|
155
|
+
@cache.increment :countsymbol
|
156
|
+
@cache.get(:countsymbol).should == "1"
|
157
|
+
@cache.increment(:countsymbol).should == 2
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should store and retrieve zero" do
|
161
|
+
@cache.put(:mynumber, 0)
|
162
|
+
@cache.get(:mynumber).should == 0
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should store and retrieve integers" do
|
166
|
+
@cache.put(:mynumber, 30)
|
167
|
+
@cache.get(:mynumber).should == 30
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should store and retrieve floats" do
|
171
|
+
@cache.put(:mynumber, 1.0)
|
172
|
+
@cache.get(:mynumber).should == 1.0
|
173
|
+
end
|
174
|
+
|
147
175
|
it "should expire entries based on provided expiry durations" do
|
148
176
|
cache = TorqueBox::Infinispan::Cache.new( :name => 'expiring-cache' )
|
149
177
|
cache.put("foo", "bar", 0.1)
|
@@ -323,21 +351,6 @@ describe TorqueBox::Infinispan::Cache do
|
|
323
351
|
end
|
324
352
|
end
|
325
353
|
|
326
|
-
describe "with search" do
|
327
|
-
before :each do
|
328
|
-
@cache = TorqueBox::Infinispan::Cache.new( :name => 'foo-cache' )
|
329
|
-
end
|
330
|
-
|
331
|
-
it "should ask the cache for the search managager" do
|
332
|
-
@cache.should_receive :search_manager
|
333
|
-
Infinispan::Search.new(@cache, lambda{|v|v})
|
334
|
-
end
|
335
|
-
|
336
|
-
after :each do
|
337
|
-
@cache.clear
|
338
|
-
end
|
339
|
-
end
|
340
|
-
|
341
354
|
end
|
342
355
|
|
343
356
|
class Snuffleuffagus
|