openwferu 0.9.1 → 0.9.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 (104) hide show
  1. data/{README → README.txt} +16 -13
  2. data/bin/validate-workflow.rb +46 -22
  3. data/examples/README.txt +8 -0
  4. data/examples/homeworkreview.rb +66 -0
  5. data/examples/quotereporter.rb +154 -0
  6. data/lib/{openwferu.rb → openwfe.rb} +6 -8
  7. data/lib/{ru → openwfe}/contextual.rb +11 -3
  8. data/lib/{ru → openwfe/engine}/engine.rb +50 -36
  9. data/lib/{ru/participant.rb → openwfe/engine/file_persisted_engine.rb} +21 -22
  10. data/lib/openwfe/expool/expressionpool.rb +534 -0
  11. data/lib/openwfe/expool/expstorage.rb +184 -0
  12. data/lib/openwfe/expool/journalexpstorage.rb +312 -0
  13. data/lib/openwfe/expool/yamlexpstorage.rb +127 -0
  14. data/lib/{ru → openwfe/expressions}/environment.rb +19 -14
  15. data/lib/{ru → openwfe/expressions}/expressionmap.rb +48 -21
  16. data/lib/{ru → openwfe/expressions}/fe_concurrence.rb +111 -35
  17. data/lib/openwfe/expressions/fe_cursor.rb +236 -0
  18. data/lib/{ru → openwfe/expressions}/fe_define.rb +5 -5
  19. data/lib/openwfe/expressions/fe_fqv.rb +99 -0
  20. data/lib/openwfe/expressions/fe_iterator.rb +182 -0
  21. data/lib/{ru/fe_misc.rb → openwfe/expressions/fe_losfor.rb} +14 -56
  22. data/lib/openwfe/expressions/fe_misc.rb +102 -0
  23. data/lib/{ru → openwfe/expressions}/fe_participant.rb +25 -14
  24. data/lib/{ru → openwfe/expressions}/fe_raw.rb +39 -75
  25. data/lib/{ru/fe_base.rb → openwfe/expressions/fe_sequence.rb} +40 -35
  26. data/lib/{ru → openwfe/expressions}/fe_subprocess.rb +30 -14
  27. data/lib/{ru → openwfe/expressions}/fe_time.rb +59 -31
  28. data/lib/{ru → openwfe/expressions}/fe_utils.rb +42 -26
  29. data/lib/{ru → openwfe/expressions}/fe_value.rb +20 -14
  30. data/lib/openwfe/expressions/flowexpression.rb +434 -0
  31. data/lib/openwfe/expressions/raw_prog.rb +391 -0
  32. data/lib/openwfe/expressions/raw_xml.rb +128 -0
  33. data/lib/openwfe/flowexpressionid.rb +148 -0
  34. data/lib/{ru → openwfe}/logging.rb +10 -6
  35. data/lib/{osocket.rb → openwfe/osocket.rb} +36 -35
  36. data/lib/{otime.rb → openwfe/otime.rb} +71 -21
  37. data/lib/openwfe/participants/atomparticipants.rb +144 -0
  38. data/lib/openwfe/participants/enoparticipant.rb +73 -0
  39. data/lib/openwfe/participants/participant.rb +85 -0
  40. data/lib/{ru → openwfe/participants}/participantmap.rb +40 -12
  41. data/lib/{ru → openwfe/participants}/participants.rb +41 -12
  42. data/lib/openwfe/participants/soapparticipants.rb +96 -0
  43. data/lib/{controlclient.rb → openwfe/rest/controlclient.rb} +12 -13
  44. data/lib/{definitions.rb → openwfe/rest/definitions.rb} +3 -3
  45. data/lib/{exception.rb → openwfe/rest/exception.rb} +3 -3
  46. data/lib/{restclient.rb → openwfe/rest/restclient.rb} +13 -22
  47. data/lib/{worklistclient.rb → openwfe/rest/worklistclient.rb} +33 -46
  48. data/lib/openwfe/rest/xmlcodec.rb +575 -0
  49. data/lib/{ru → openwfe}/rudefinitions.rb +32 -4
  50. data/lib/{ru → openwfe}/service.rb +20 -8
  51. data/lib/openwfe/storage/yamlfilestorage.rb +159 -0
  52. data/lib/{ru → openwfe/util}/dollar.rb +10 -8
  53. data/lib/openwfe/util/lru_cache.rb +149 -0
  54. data/lib/{ru → openwfe/util}/scheduler.rb +18 -10
  55. data/lib/{ru → openwfe/util}/schedulers.rb +7 -7
  56. data/lib/{utils.rb → openwfe/utils.rb} +93 -9
  57. data/lib/openwfe/workitem.rb +366 -0
  58. data/lib/openwfe/worklist/worklists.rb +175 -0
  59. data/test/README.txt +27 -0
  60. data/test/atomtest.rb +99 -0
  61. data/test/crontest.rb +58 -0
  62. data/test/dollartest.rb +3 -3
  63. data/test/feitest.rb +42 -14
  64. data/test/file_persistence_test.rb +93 -0
  65. data/test/flowtestbase.rb +72 -26
  66. data/test/ft_0.rb +1 -97
  67. data/test/ft_0b_sequence.rb +33 -0
  68. data/test/ft_0c_testname.rb +29 -0
  69. data/test/ft_10_loop.rb +48 -0
  70. data/test/ft_11_ppd.rb +292 -0
  71. data/test/ft_12_blockparticipant.rb +45 -0
  72. data/test/ft_13_eno.rb +51 -0
  73. data/test/ft_14_subprocess.rb +90 -0
  74. data/test/ft_14b_subprocess.rb +40 -0
  75. data/test/ft_15_iterator.rb +70 -0
  76. data/test/ft_16_fqv.rb +57 -0
  77. data/test/ft_1_unset.rb +25 -1
  78. data/test/ft_2_concurrence.rb +10 -5
  79. data/test/ft_3_equals.rb +35 -1
  80. data/test/ft_4_misc.rb +16 -1
  81. data/test/ft_5_time.rb +26 -1
  82. data/test/ft_6_lambda.rb +2 -1
  83. data/test/{ft_7_losfor.rb → ft_7_lose.rb} +41 -35
  84. data/test/ft_8_forget.rb +46 -0
  85. data/test/ft_9_cursor.rb +94 -0
  86. data/test/journal_persistence_test.rb +147 -0
  87. data/test/misctest.rb +13 -9
  88. data/test/rake_ptest.rb +18 -0
  89. data/test/rake_qtest.rb +43 -0
  90. data/test/{fulltest.rb → rake_test.rb} +2 -2
  91. data/test/raw_prog_test.rb +236 -0
  92. data/test/rest_test.rb +189 -0
  93. data/test/rutest_utils.rb +1 -1
  94. data/test/timetest.rb +42 -34
  95. metadata +125 -82
  96. data/lib/codec.rb +0 -573
  97. data/lib/flowexpressionid.rb +0 -139
  98. data/lib/ru/expressionpool.rb +0 -382
  99. data/lib/ru/expressionstorage.rb +0 -99
  100. data/lib/ru/flowexpression.rb +0 -272
  101. data/lib/ru/ruutils.rb +0 -70
  102. data/lib/test.rb +0 -222
  103. data/lib/workitem.rb +0 -249
  104. data/test/quicktest.rb +0 -21
@@ -1,6 +1,6 @@
1
1
  #
2
2
  #--
3
- # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
+ # Copyright (c) 2006-2007, John Mettraux, OpenWFE.org
4
4
  # All rights reserved.
5
5
  #
6
6
  # Redistribution and use in source and binary forms, with or without
@@ -37,7 +37,7 @@
37
37
  # "made in Japan"
38
38
  #
39
39
 
40
- module OpenWFEru
40
+ module OpenWFE
41
41
 
42
42
  #OPENWFE_VERSION = '1.7.2pre17'
43
43
  OPENWFE_VERSION = '0.9.2'
@@ -45,8 +45,9 @@ module OpenWFEru
45
45
  #
46
46
  # service names
47
47
 
48
- S_LOGGER = 'logger'
48
+ S_LOGGER = :logger
49
49
 
50
+ S_ENGINE = 'engine'
50
51
  S_EXPRESSION_MAP = 'expressionMap'
51
52
  S_EXPRESSION_POOL = 'expressionPool'
52
53
  S_EXPRESSION_STORAGE = 'expressionStorage'
@@ -66,12 +67,39 @@ module OpenWFEru
66
67
  #
67
68
  # some expression attribute names
68
69
 
69
- A_FORGET = 'forget'
70
+ #A_FORGET = 'forget'
71
+ # replaced by a symbol
70
72
 
71
73
  A_SYNC = 'sync'
72
74
  A_COUNT = 'count'
73
75
  A_REMAINING = 'remaining'
74
76
  REM_CANCEL = 'cancel'
77
+
78
+ #
79
+ # some file storage default values
80
+ DEFAULT_FILE_STORAGE_PATH = "./work"
81
+
82
+ #
83
+ # A mixin for easy OpenWFE service lookup
84
+ # (assumes the presence of an application context instance var)
85
+ #
86
+ module OwfeServiceLocator
87
+ def get_engine
88
+ return @application_context[S_ENGINE]
89
+ end
90
+ def get_expression_map
91
+ return @application_context[S_EXPRESSION_MAP]
92
+ end
93
+ def get_expression_pool
94
+ return @application_context[S_EXPRESSION_POOL]
95
+ end
96
+ def get_expression_storage
97
+ return @application_context[S_EXPRESSION_STORAGE]
98
+ end
99
+ def get_participant_map
100
+ return @application_context[S_PARTICIPANT_MAP]
101
+ end
102
+ end
75
103
 
76
104
  end
77
105
 
@@ -1,6 +1,6 @@
1
1
  #
2
- #<tt>
3
- # Copyright (c) 2006, John Mettraux, OpenWFE.org
2
+ #--
3
+ # Copyright (c) 2006-2007, John Mettraux, OpenWFE.org
4
4
  # All rights reserved.
5
5
  #
6
6
  # Redistribution and use in source and binary forms, with or without
@@ -28,7 +28,7 @@
28
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
30
  # POSSIBILITY OF SUCH DAMAGE.
31
- #</tt>
31
+ #++
32
32
  #
33
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
34
34
  #
@@ -39,28 +39,40 @@
39
39
  # John Mettraux at openwfe.org
40
40
  #
41
41
 
42
- require 'ru/logging'
43
- require 'ru/contextual'
42
+ require 'openwfe/logging'
43
+ require 'openwfe/contextual'
44
44
 
45
45
 
46
- module OpenWFEru
46
+ module OpenWFE
47
47
 
48
48
  module ServiceMixin
49
49
  include Contextual, Logging
50
50
 
51
51
  attr_accessor \
52
52
  :service_name
53
+
54
+ def service_init (service_name, application_context)
55
+
56
+ @service_name = service_name
57
+ @application_context = application_context
58
+ end
53
59
  end
54
60
 
55
61
  class Service
56
62
  include ServiceMixin
57
63
 
58
64
  def initialize (service_name, application_context)
59
- @service_name = service_name
60
- @application_context = application_context
65
+
66
+ service_init(service_name, application_context)
61
67
  end
62
68
 
63
69
  end
64
70
 
71
+ def register (service)
72
+
73
+ service.application_context[service.service_name] = service
74
+ return service
75
+ end
76
+
65
77
  end
66
78
 
@@ -0,0 +1,159 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2006-2007, Nicolas Modryzk and John Mettraux, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # . Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # . Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
18
+ # specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+ # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
34
+ #
35
+
36
+ #
37
+ # "made in Japan"
38
+ #
39
+ # Nicolas Modrzyk at openwfe.org
40
+ # John Mettraux at openwfe.org
41
+ #
42
+
43
+ require 'yaml'
44
+ require 'fileutils'
45
+
46
+ require 'openwfe/utils'
47
+ require 'openwfe/service'
48
+
49
+ require 'openwfe/expressions/flowexpression'
50
+ require 'openwfe/expressions/raw_xml'
51
+ #
52
+ # making sure classes in those files are loaded
53
+ # before their yaml persistence is tuned
54
+ # (else the reopening of the class is interpreted as
55
+ # a definition of the class...)
56
+
57
+
58
+ module OpenWFE
59
+
60
+
61
+ #
62
+ # yaml expression storage
63
+ #
64
+ class YamlFileStorage
65
+ include ServiceMixin
66
+
67
+ attr_accessor :basepath
68
+
69
+ def initialize (service_name, application_context, path)
70
+ service_init(service_name, application_context)
71
+ @basepath = path
72
+ FileUtils.makedirs @basepath
73
+ end
74
+
75
+ def []= (id, object)
76
+
77
+ fei_path = compute_file_path(id)
78
+ fei_parent_path = File.dirname(fei_path)
79
+
80
+ FileUtils.makedirs(fei_parent_path) \
81
+ if not File.exist?(fei_parent_path)
82
+
83
+ fd = IO.sysopen(fei_path , "w+")
84
+ io = IO.open(fd , "w+")
85
+
86
+ data = YAML.dump(object)
87
+
88
+ io.write(data)
89
+ io.close
90
+ end
91
+
92
+ #
93
+ # deletes the whole storage directory... beware...
94
+ #
95
+ def purge
96
+ FileUtils.remove_dir @basepath
97
+ end
98
+
99
+ #
100
+ # check whether the key has a file in the file storage
101
+ def has_key? (fei)
102
+ File.exist?(compute_file_path(fei))
103
+ end
104
+
105
+ def remove (fei, workitem)
106
+
107
+ fei_path = compute_file_path(fei)
108
+
109
+ if File.exist?(fei_path)
110
+ File.delete(fei_path)
111
+ else
112
+ raise "Object not found at #{fei_path}"
113
+ end
114
+ end
115
+
116
+ def [] (fei)
117
+ fei_path = compute_file_path(fei)
118
+
119
+ return nil if not File.exist?(fei_path)
120
+
121
+ data = IO.read(compute_file_path(fei))
122
+ object = YAML.load(data)
123
+
124
+ object.application_context = @application_context
125
+
126
+ return object
127
+ end
128
+
129
+ def length
130
+ return count_expression(0, @basepath)
131
+ end
132
+
133
+ protected
134
+
135
+ def count_expression (count, item)
136
+
137
+ return count + 1 if OpenWFE::ends_with(item, ".yaml")
138
+
139
+ if File.stat(item).directory?
140
+
141
+ d = Dir.new(item)
142
+ d.each do |i|
143
+ next if i == "." or i == ".."
144
+ i = item + "/" + i
145
+ count = count_expression(count, i)
146
+ end
147
+ d.close()
148
+ end
149
+
150
+ return count
151
+ end
152
+
153
+ def compute_file_path (fei)
154
+ raise "this should be implemented in a subclass"
155
+ end
156
+
157
+ end
158
+
159
+ end
@@ -1,6 +1,6 @@
1
1
  #
2
- #<tt>
3
- # Copyright (c) 2006, John Mettraux, OpenWFE.org
2
+ #--
3
+ # Copyright (c) 2006-2007, John Mettraux, OpenWFE.org
4
4
  # All rights reserved.
5
5
  #
6
6
  # Redistribution and use in source and binary forms, with or without
@@ -28,7 +28,7 @@
28
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
30
  # POSSIBILITY OF SUCH DAMAGE.
31
- #</tt>
31
+ #++
32
32
  #
33
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
34
34
  #
@@ -45,9 +45,9 @@
45
45
  # 'dollar notation' implementation in Ruby
46
46
  #
47
47
 
48
- module OpenWFEru
48
+ module OpenWFE
49
49
 
50
- def OpenWFEru.dsub (text, dict)
50
+ def OpenWFE.dsub (text, dict)
51
51
 
52
52
  #puts "### text is >#{text}<"
53
53
 
@@ -100,11 +100,11 @@ module OpenWFEru
100
100
  return dsub("#{pre}#{value}#{text[j+1..-1]}", dict)
101
101
  end
102
102
 
103
- def OpenWFEru.unescape (text)
103
+ def OpenWFE.unescape (text)
104
104
  return text.gsub("\\\\\\$\\{", "\\${")
105
105
  end
106
106
 
107
- def OpenWFEru.dosub (text, flow_expression, workitem)
107
+ def OpenWFE.dosub (text, flow_expression, workitem)
108
108
  return dsub(text, FlowDict.new(flow_expression, workitem))
109
109
  end
110
110
 
@@ -154,10 +154,12 @@ module OpenWFEru
154
154
  end
155
155
 
156
156
  def call_function (function_name)
157
+ #"function '#{function_name}' is not implemented"
158
+ "functions are not yet implemented"
157
159
  end
158
160
 
159
161
  def call_ruby (ruby_code)
160
- eval(ruby_code).to_s
162
+ eval(ruby_code, @flow_expression.get_binding).to_s
161
163
  end
162
164
  end
163
165
 
@@ -0,0 +1,149 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2006-2007, Nicolas Modryzk, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # . Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # . Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
18
+ # specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+ # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
34
+ #
35
+
36
+ #
37
+ # "made in Japan"
38
+ #
39
+ # Nicolas Modrzyk at openwfe.org
40
+ #
41
+
42
+ module OpenWFE
43
+
44
+ # Simple LRU cache based on
45
+
46
+ class LRUCache
47
+
48
+ # initialize the LRU.
49
+ # cache contains the mapping key,value
50
+ # queue contains the list of keys, according to the LRU
51
+ # max is the maximum number of items to keep in the cache
52
+ def initialize(max=20, maxttl=nil)
53
+ @cache = {}
54
+ @queue = []
55
+ @ttl_cache = {}
56
+ @max = max
57
+ @maxttl = maxttl
58
+ @finalizers = []
59
+ end
60
+
61
+ # Check to see if the cache contains the given key.
62
+ def include?(key)
63
+ @cache.include?(key)
64
+ end
65
+
66
+ # Return the element identified by the given key.
67
+ def [](key)
68
+ r = nil
69
+ if @cache.has_key? key
70
+ r = @cache[key]
71
+ @queue.push @queue.delete(key)
72
+ @ttl_cache[key] = Time.now.to_i
73
+ end
74
+ r
75
+ end
76
+
77
+ # Set the element of the cache identified by the given key.
78
+ def []=(key, val)
79
+ if @queue.length == @max
80
+ d = @queue.shift
81
+ @cache.delete d
82
+ end
83
+ if @queue.first and @maxttl
84
+ now = Time.now.to_i
85
+ while ((@ttl_cache[@queue.first] + @maxttl) < now)
86
+ d = @queue.shift
87
+ do_finalization(d,@cache[d])
88
+ @cache.delete d
89
+ end
90
+ end
91
+ @cache[key] = val
92
+ @ttl_cache[key] = Time.now.to_i
93
+ @queue.push key
94
+ end
95
+
96
+ # delete the key.
97
+ # TODO: check this is working
98
+ def delete(key)
99
+ d = @queue.delete(key)
100
+ do_finalization(d,@cache[d])
101
+ @cache.delete key
102
+ end
103
+
104
+ # Allows one to set the maximum size of the cache queue. If the queue
105
+ # is currently larger than the size that it is being set to, elements
106
+ # will be expired until the queue is at the maximum size.
107
+
108
+ def size=(max)
109
+ @max = max
110
+ while @queue.length > @max
111
+ d = @queue.shift
112
+ do_finalization(d,@cache[d])
113
+ @cache.delete d
114
+ end
115
+ @max
116
+ end
117
+ alias maxsize= size=
118
+
119
+ # Return the maximum size of the cache.
120
+ def maxsize
121
+ @max
122
+ end
123
+
124
+ # Return the current size of the cache.
125
+ def size
126
+ @queue.length
127
+ end
128
+
129
+ # Return a copy of current set of keys to cache elements.
130
+ def queue
131
+ @queue.dup
132
+ end
133
+
134
+ def add_finalizer(*args,&block)
135
+ @finalizers.push [block,args]
136
+ end
137
+
138
+ def do_finalization(key,obj)
139
+ begin
140
+ @finalizers.each do |f|
141
+ f[0].call(key,obj,*f[1])
142
+ end
143
+ rescue Exception => e
144
+ puts e, e.backtrace
145
+ raise e
146
+ end
147
+ end
148
+ end
149
+ end