copland 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/doc/README +88 -0
  2. data/doc/manual-html/chapter-1.html +454 -0
  3. data/doc/manual-html/chapter-10.html +399 -0
  4. data/doc/manual-html/chapter-11.html +600 -0
  5. data/doc/manual-html/chapter-12.html +406 -0
  6. data/doc/manual-html/chapter-2.html +382 -0
  7. data/doc/manual-html/chapter-3.html +424 -0
  8. data/doc/manual-html/chapter-4.html +432 -0
  9. data/doc/manual-html/chapter-5.html +381 -0
  10. data/doc/manual-html/chapter-6.html +364 -0
  11. data/doc/manual-html/chapter-7.html +434 -0
  12. data/doc/manual-html/chapter-8.html +373 -0
  13. data/doc/manual-html/chapter-9.html +324 -0
  14. data/doc/manual-html/copland.png +0 -0
  15. data/doc/manual-html/index.html +331 -0
  16. data/doc/manual-html/manual.css +179 -0
  17. data/doc/manual-html/tutorial-1.html +407 -0
  18. data/doc/manual-html/tutorial-2.html +451 -0
  19. data/doc/manual-html/tutorial-3.html +484 -0
  20. data/doc/manual-html/tutorial-4.html +446 -0
  21. data/doc/manual-html/tutorial-5.html +520 -0
  22. data/doc/manual/chapter.erb +18 -0
  23. data/doc/manual/example.erb +18 -0
  24. data/doc/manual/img/copland.png +0 -0
  25. data/doc/manual/index.erb +30 -0
  26. data/doc/manual/manual.css +179 -0
  27. data/doc/manual/manual.rb +239 -0
  28. data/doc/manual/manual.yml +2643 -0
  29. data/doc/manual/page.erb +102 -0
  30. data/doc/manual/tutorial.erb +30 -0
  31. data/doc/packages/copland.html +764 -0
  32. data/doc/packages/copland.lib.html +439 -0
  33. data/doc/packages/copland.remote.html +2096 -0
  34. data/doc/packages/copland.webrick.html +925 -0
  35. data/doc/packages/index.html +49 -0
  36. data/doc/packages/packrat.css +125 -0
  37. data/examples/calc/calc.rb +47 -0
  38. data/examples/calc/package.yml +35 -0
  39. data/examples/calc/services.rb +74 -0
  40. data/examples/solitaire-cipher/README +11 -0
  41. data/examples/solitaire-cipher/Rakefile +57 -0
  42. data/examples/solitaire-cipher/bin/main.rb +14 -0
  43. data/examples/solitaire-cipher/lib/cipher.rb +230 -0
  44. data/examples/solitaire-cipher/lib/cli.rb +24 -0
  45. data/examples/solitaire-cipher/lib/package.yml +106 -0
  46. data/examples/solitaire-cipher/test/tc_deck.rb +30 -0
  47. data/examples/solitaire-cipher/test/tc_key-stream.rb +19 -0
  48. data/examples/solitaire-cipher/test/tc_keying-algorithms.rb +31 -0
  49. data/examples/solitaire-cipher/test/tc_solitaire-cipher.rb +66 -0
  50. data/examples/solitaire-cipher/test/tc_unkeyed-algorithm.rb +17 -0
  51. data/examples/solitaire-cipher/test/tests.rb +2 -0
  52. data/lib/copland.rb +56 -0
  53. data/lib/copland/class-factory.rb +95 -0
  54. data/lib/copland/configuration-point.rb +38 -0
  55. data/lib/copland/configuration-point/common.rb +203 -0
  56. data/lib/copland/configuration-point/errors.rb +44 -0
  57. data/lib/copland/configuration-point/list.rb +59 -0
  58. data/lib/copland/configuration-point/map.rb +59 -0
  59. data/lib/copland/configuration/errors.rb +43 -0
  60. data/lib/copland/configuration/loader.rb +113 -0
  61. data/lib/copland/configuration/yaml/configuration-point.rb +87 -0
  62. data/lib/copland/configuration/yaml/implementor.rb +134 -0
  63. data/lib/copland/configuration/yaml/interceptor.rb +63 -0
  64. data/lib/copland/configuration/yaml/listener.rb +56 -0
  65. data/lib/copland/configuration/yaml/loader.rb +122 -0
  66. data/lib/copland/configuration/yaml/package.rb +125 -0
  67. data/lib/copland/configuration/yaml/parser.rb +71 -0
  68. data/lib/copland/configuration/yaml/schema.rb +165 -0
  69. data/lib/copland/configuration/yaml/service-point.rb +116 -0
  70. data/lib/copland/configuration/yaml/utils.rb +82 -0
  71. data/lib/copland/default-schema-processor.rb +144 -0
  72. data/lib/copland/errors.rb +82 -0
  73. data/lib/copland/event-producer.rb +95 -0
  74. data/lib/copland/impl/builder-factory.rb +112 -0
  75. data/lib/copland/impl/copland-config.yml +1 -0
  76. data/lib/copland/impl/include-exclude.rb +140 -0
  77. data/lib/copland/impl/logging-interceptor.rb +106 -0
  78. data/lib/copland/impl/package.yml +217 -0
  79. data/lib/copland/impl/startup.rb +116 -0
  80. data/lib/copland/impl/symbol-source-manager.rb +131 -0
  81. data/lib/copland/impl/symbol-source.rb +63 -0
  82. data/lib/copland/instantiator.rb +38 -0
  83. data/lib/copland/instantiator/abstract.rb +91 -0
  84. data/lib/copland/instantiator/complex.rb +96 -0
  85. data/lib/copland/instantiator/identity.rb +58 -0
  86. data/lib/copland/instantiator/simple.rb +68 -0
  87. data/lib/copland/interceptor-chain.rb +166 -0
  88. data/lib/copland/interceptor.rb +139 -0
  89. data/lib/copland/log-factory.rb +206 -0
  90. data/lib/copland/models.rb +39 -0
  91. data/lib/copland/models/abstract.rb +78 -0
  92. data/lib/copland/models/prototype-deferred.rb +58 -0
  93. data/lib/copland/models/prototype.rb +58 -0
  94. data/lib/copland/models/proxy.rb +100 -0
  95. data/lib/copland/models/singleton-deferred.rb +59 -0
  96. data/lib/copland/models/singleton.rb +77 -0
  97. data/lib/copland/models/threaded.rb +65 -0
  98. data/lib/copland/ordering.rb +123 -0
  99. data/lib/copland/package.rb +246 -0
  100. data/lib/copland/registry.rb +368 -0
  101. data/lib/copland/schema.rb +206 -0
  102. data/lib/copland/service-point.rb +282 -0
  103. data/lib/copland/utils.rb +221 -0
  104. data/lib/copland/version.rb +47 -0
  105. data/test/conf-test/list-bad-key.yml +30 -0
  106. data/test/conf-test/list-bad-missing.yml +28 -0
  107. data/test/conf-test/list-bad-type.yml +28 -0
  108. data/test/conf-test/list-good.yml +29 -0
  109. data/test/conf-test/map-bad-key.yml +25 -0
  110. data/test/conf-test/map-bad-missing.yml +24 -0
  111. data/test/conf-test/map-bad-type.yml +23 -0
  112. data/test/conf-test/map-good.yml +25 -0
  113. data/test/configuration-point/package.yml +52 -0
  114. data/test/configuration/yaml/config/copland-config.yml +2 -0
  115. data/test/configuration/yaml/config/module.yml +2 -0
  116. data/test/configuration/yaml/config/subdir/copland-config.yml +2 -0
  117. data/test/configuration/yaml/config/subdir/package.yml +4 -0
  118. data/test/configuration/yaml/defaults/package.yml +5 -0
  119. data/test/configuration/yaml/defaults/subdir/package.yml +4 -0
  120. data/test/configuration/yaml/tc_config-loader.rb +86 -0
  121. data/test/configuration/yaml/tc_configuration-point-processor.rb +134 -0
  122. data/test/configuration/yaml/tc_implementor-processor.rb +104 -0
  123. data/test/configuration/yaml/tc_interceptor-processor.rb +85 -0
  124. data/test/configuration/yaml/tc_listener-processor.rb +69 -0
  125. data/test/configuration/yaml/tc_loader.rb +74 -0
  126. data/test/configuration/yaml/tc_package-processor.rb +120 -0
  127. data/test/configuration/yaml/tc_parser.rb +94 -0
  128. data/test/configuration/yaml/tc_schema-parser.rb +160 -0
  129. data/test/configuration/yaml/tc_service-point-processor.rb +104 -0
  130. data/test/configuration/yaml/tc_type-validator.rb +90 -0
  131. data/test/custom-logger.yml +3 -0
  132. data/test/impl/logging/package.yml +44 -0
  133. data/test/impl/logging/services.rb +84 -0
  134. data/test/impl/startup/package.yml +46 -0
  135. data/test/impl/startup/services.rb +47 -0
  136. data/test/impl/symbols/package.yml +24 -0
  137. data/test/impl/symbols/services.rb +38 -0
  138. data/test/impl/tc_builder-factory.rb +173 -0
  139. data/test/impl/tc_logging-interceptor.rb +148 -0
  140. data/test/impl/tc_startup.rb +59 -0
  141. data/test/impl/tc_symbol-sources.rb +61 -0
  142. data/test/logger.yml +6 -0
  143. data/test/mock.rb +201 -0
  144. data/test/schema/bad-package.yml +65 -0
  145. data/test/schema/package.yml +102 -0
  146. data/test/schema/services.rb +5 -0
  147. data/test/services/package.yml +79 -0
  148. data/test/services/simple.rb +87 -0
  149. data/test/tc_class-factory.rb +93 -0
  150. data/test/tc_complex-instantiator.rb +107 -0
  151. data/test/tc_configuration-point-contrib.rb +74 -0
  152. data/test/tc_configuration-point-schema.rb +122 -0
  153. data/test/tc_configuration-point.rb +91 -0
  154. data/test/tc_default-schema-processor.rb +297 -0
  155. data/test/tc_identity-instantiator.rb +61 -0
  156. data/test/tc_interceptors.rb +84 -0
  157. data/test/tc_logger.rb +131 -0
  158. data/test/tc_models.rb +176 -0
  159. data/test/tc_package.rb +165 -0
  160. data/test/tc_proxy.rb +65 -0
  161. data/test/tc_registry.rb +141 -0
  162. data/test/tc_schema.rb +78 -0
  163. data/test/tc_service-point.rb +178 -0
  164. data/test/tc_service.rb +70 -0
  165. data/test/tc_simple-instantiator.rb +61 -0
  166. data/test/tests.rb +93 -0
  167. data/tutorial/01/main.rb +7 -0
  168. data/tutorial/01/package.yml +8 -0
  169. data/tutorial/01/tutorial.rb +7 -0
  170. data/tutorial/02/main.rb +10 -0
  171. data/tutorial/02/package.yml +27 -0
  172. data/tutorial/02/tutorial.rb +46 -0
  173. data/tutorial/03/main.rb +24 -0
  174. data/tutorial/03/package.yml +29 -0
  175. data/tutorial/03/tutorial.rb +48 -0
  176. data/tutorial/04/main.rb +24 -0
  177. data/tutorial/04/package.yml +35 -0
  178. data/tutorial/04/tutorial.rb +48 -0
  179. data/tutorial/05/functions/package.yml +16 -0
  180. data/tutorial/05/functions/services.rb +15 -0
  181. data/tutorial/05/main.rb +10 -0
  182. data/tutorial/05/package.yml +35 -0
  183. data/tutorial/05/tutorial.rb +53 -0
  184. metadata +260 -0
@@ -0,0 +1,112 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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,
10
+ # this list of conditions and the following disclaimer.
11
+ #
12
+ # * Redistributions in binary form must reproduce the above copyright
13
+ # notice, this list of conditions and the following disclaimer in the
14
+ # documentation and/or other materials provided with the distribution.
15
+ #
16
+ # * The names of its contributors may not be used to endorse or promote
17
+ # products derived from this software without specific prior written
18
+ # 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
+
34
+ require 'copland/errors'
35
+ require 'copland/utils'
36
+ require 'singleton'
37
+
38
+ module Copland
39
+ module Implementation
40
+
41
+ # This is the implementation of the BuilderFactory service. It constructs
42
+ # service implementations and wires services together automatically, as
43
+ # determined by their dependencies in the configuration files.
44
+ class BuilderFactory
45
+
46
+ # This is the list of patterns that are recognized as "setter" methods.
47
+ # These are used when determining how to set properties.
48
+ SETTERS = [ "%s=", "set_%s" ]
49
+
50
+ # This is the factory method used to construct new services. Based
51
+ # on the +parms+ argument, the new service is instantiated, initialized,
52
+ # and returned.
53
+ def create_instance( point, parms )
54
+ ensure_log( point )
55
+
56
+ klass = Copland::get_class( parms['class'] )
57
+
58
+ args = ( parms['parameters'] || [] )
59
+
60
+ if klass.include?( Singleton )
61
+ if args.length > 0
62
+ raise CoplandException,
63
+ "Singleton instances cannot have constructor parameters"
64
+ end
65
+ obj = klass.instance
66
+ else
67
+ obj = klass.new( *args )
68
+ end
69
+
70
+ if parms['properties']
71
+ parms['properties'].each_pair do |name, value|
72
+ catch( :property_set ) do
73
+ SETTERS.each do |pattern|
74
+ setter = pattern % name
75
+ if obj.respond_to?( setter )
76
+ obj.__send__( setter, value )
77
+ throw :property_set
78
+ end
79
+ end
80
+
81
+ @log.warn "no setter for #{name.inspect} found on " +
82
+ "#{klass} (#{point.full_name})"
83
+ obj.instance_variable_set "@#{name}".intern, value
84
+ end
85
+ end
86
+ end
87
+
88
+ if parms['invoke']
89
+ parms['invoke'].each_pair do |name, value|
90
+ obj.__send__( name, *( value || [] ) )
91
+ end
92
+ end
93
+
94
+ initialize_method = parms[ 'initialize-method' ] ||
95
+ "initialize_service"
96
+
97
+ if obj.respond_to?( initialize_method )
98
+ obj.__send__( initialize_method )
99
+ end
100
+
101
+ return obj
102
+ end
103
+
104
+ def ensure_log( point )
105
+ return if @log
106
+ @log = point.owner.registry.logs.get( "copland.BuilderFactory" )
107
+ end
108
+
109
+ end
110
+
111
+ end
112
+ end
@@ -0,0 +1 @@
1
+ yaml-package-file: package.yml
@@ -0,0 +1,140 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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,
10
+ # this list of conditions and the following disclaimer.
11
+ #
12
+ # * Redistributions in binary form must reproduce the above copyright
13
+ # notice, this list of conditions and the following disclaimer in the
14
+ # documentation and/or other materials provided with the distribution.
15
+ #
16
+ # * The names of its contributors may not be used to endorse or promote
17
+ # products derived from this software without specific prior written
18
+ # 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
+
34
+ require 'copland/errors'
35
+
36
+ module Copland
37
+ module Implementation
38
+
39
+ # A simple structure for representing a single include/exclude pattern.
40
+ IncludeExcludePattern = Struct.new( :name, :comparitor, :arity )
41
+
42
+ # A module encapsulating the factory end of a service with include/exclude
43
+ # functionality. Such functionality involves a schema with include and
44
+ # exclude elements, each of which must be an array of method names that
45
+ # should be included or excluded. See the IncludeExclude module for more
46
+ # info.
47
+ module IncludeExcludeFactory
48
+
49
+ # This is the regular expression for parsing elements in an include or
50
+ # exclude array.
51
+ PATTERN = /^
52
+ (.*?) (?# this matches the method name pattern)
53
+ (?: (?# begin optional arity section)
54
+ \( (?# begin parenthesized section)
55
+ ([<=>])? (?# optional comparator character)
56
+ (\d+) (?# arity specification)
57
+ \) (?# end parenthesized section)
58
+ )? (?# end optional arity section)
59
+ $/x
60
+
61
+ # This is a utility function for converting an array of strings
62
+ # representing method name patterns, into an array of
63
+ # IncludeExcludePattern instances.
64
+ def build_map( array )
65
+ ( array || [] ).map do |pattern|
66
+ unless pattern =~ PATTERN
67
+ raise CoplandException,
68
+ "invalid logging interceptor method pattern: #{pattern.inspect}"
69
+ end
70
+
71
+ name = $1
72
+ comparitor = $2
73
+ arity = ( $3 || -1 ).to_i
74
+
75
+ comparitor ||= ">" if arity < 0
76
+ comparitor ||= "="
77
+
78
+ IncludeExcludePattern.new( Regexp.new( "^" + name + "$" ),
79
+ comparitor,
80
+ arity )
81
+ end
82
+ end
83
+
84
+ end
85
+
86
+ # This module encapsulates the service end of a service with
87
+ # include/exclude functionality.
88
+ module IncludeExclude
89
+
90
+ # Returns +false+ if the given context object "matches" any of the
91
+ # exclude patterns without matching any of the include patterns.
92
+ # The context object must respond to the <tt>:sym</tt> and
93
+ # <tt>:args</tt> messages, where <tt>:sym</tt> is a symbol identifying
94
+ # the method being matched, and <tt>:args</tt> is an array of
95
+ # arguments that will be sent to that method.
96
+ def match( context )
97
+ match = true
98
+
99
+ @excludes.each do |pattern|
100
+ if match_pattern( context, pattern )
101
+ match = false
102
+ break
103
+ end
104
+ end
105
+
106
+ unless match
107
+ @includes.each do |pattern|
108
+ if match_pattern( context, pattern )
109
+ match = true
110
+ break
111
+ end
112
+ end
113
+ end
114
+
115
+ return match
116
+ end
117
+ private :match
118
+
119
+ # Returns +true+ if the given context matches the given pattern, and
120
+ # +false+ otherwise.
121
+ def match_pattern( context, pattern )
122
+ if context.sym.to_s =~ pattern.name
123
+ case pattern.comparitor
124
+ when "<"
125
+ return context.args.length < pattern.arity
126
+ when ">"
127
+ return context.args.length > pattern.arity
128
+ when "="
129
+ return context.args.length == pattern.arity
130
+ end
131
+ end
132
+
133
+ return false
134
+ end
135
+ private :match_pattern
136
+
137
+ end
138
+
139
+ end
140
+ end
@@ -0,0 +1,106 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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,
10
+ # this list of conditions and the following disclaimer.
11
+ #
12
+ # * Redistributions in binary form must reproduce the above copyright
13
+ # notice, this list of conditions and the following disclaimer in the
14
+ # documentation and/or other materials provided with the distribution.
15
+ #
16
+ # * The names of its contributors may not be used to endorse or promote
17
+ # products derived from this software without specific prior written
18
+ # 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
+
34
+ require 'copland/impl/include-exclude'
35
+
36
+ module Copland
37
+ module Implementation
38
+
39
+ # This is the implementation of the service factory that provides
40
+ # instances of logging interceptors. It includes the IncludeExcludeFactory
41
+ # functionality.
42
+ class LoggingInterceptorFactory
43
+ include IncludeExcludeFactory
44
+
45
+ # Returns a new LoggingInterceptor instance, initialized with the given
46
+ # parameters.
47
+ def create_instance( point, parms )
48
+ includes = build_map( parms[ "include" ] )
49
+ excludes = build_map( parms[ "exclude" ] )
50
+
51
+ return LoggingInterceptor.new( point, includes, excludes )
52
+ end
53
+
54
+ end
55
+
56
+ # A LoggingInterceptor is an interceptor object that logs method
57
+ # invocations and exceptions. It includes the IncludeExclude functionality.
58
+ class LoggingInterceptor
59
+ include IncludeExclude
60
+
61
+ # The log used by this interceptor to log messages.
62
+ attr_reader :log
63
+
64
+ # The array of patterns of methods to log.
65
+ attr_reader :includes
66
+
67
+ # The array of patterns of methods to _not_ log.
68
+ attr_reader :excludes
69
+
70
+ # Create a new LoggingInterceptor for the given service point, with the
71
+ # given list of include and exclude patterns. The logger object will be
72
+ # created as well, named with the service point's full name.
73
+ def initialize( point, includes, excludes )
74
+ @log = point.owner.registry.logs.get( point.full_name )
75
+ @includes = includes
76
+ @excludes = excludes
77
+ end
78
+
79
+ # Processes a method invocation context. If the current log has debugging
80
+ # activated, and the requested method is not excluded by the
81
+ # interceptor's exclude and include patterns, then a message will be
82
+ # written for the method's invocation, its return code, and any exception
83
+ # that is thrown.
84
+ def process( chain, context )
85
+ if @log.debug? && match( context )
86
+ args = context.args.map { |i| i.inspect } .join( ', ' )
87
+ @log.debug "#{context.sym}( #{args} )"
88
+
89
+ begin
90
+ result = chain.process_next( context )
91
+ rescue Exception => e
92
+ @log.debug "#{context.sym} raised #{e.message.inspect} (#{e.class})"
93
+ raise
94
+ end
95
+
96
+ @log.debug "#{context.sym} => #{result.inspect}"
97
+ return result
98
+ else
99
+ return chain.process_next( context )
100
+ end
101
+ end
102
+
103
+ end
104
+
105
+ end
106
+ end
@@ -0,0 +1,217 @@
1
+ ---
2
+ id: copland
3
+ description: >-
4
+ The copland package is the standard package defined by the Copland
5
+ distribution. It includes the core services and interceptors, such as the
6
+ BuilderFactory and the LoggingInterceptor.
7
+
8
+ configuration-points:
9
+
10
+ SymbolSources:
11
+ type: list
12
+ description: >-
13
+ This is a list of services or objects that can be queried to provide
14
+ symbols. Packages may contribute additional symbol sources to this
15
+ list. Additionally, the sources may be given an explicit order in
16
+ which they will be queried for symbols, allowing some sources to take
17
+ precendence over others.
18
+ schema:
19
+ definition:
20
+ source:
21
+ type: any
22
+ required: true
23
+ description: >-
24
+ The implementor of the symbol source that is being contributed.
25
+ It must be the name of a class, or an instance of a service.
26
+ name:
27
+ type: string
28
+ description: >-
29
+ The name given to this symbol source. This allows it to be
30
+ referenced in other sources' before and after lists.
31
+ before:
32
+ type: array
33
+ description: >-
34
+ A list of symbol sources to be queried after this source.
35
+ after:
36
+ type: array
37
+ description: >-
38
+ A list of symbol sources to be queried before this source.
39
+
40
+ FactoryDefaults:
41
+ type: map
42
+ description: >-
43
+ This symbol source configuration point allows packages to define "factory
44
+ defaults" for various substitution symbols that they export.
45
+
46
+ ApplicationDefaults:
47
+ type: map
48
+ description: >-
49
+ This symbol source configuration point allows packages to override
50
+ factory default values (see the FactoryDefaults configuration point).
51
+
52
+ Startup:
53
+ type: list
54
+ description: >-
55
+ This is the data source for the Startup service. This allows services
56
+ to register themselves to be automatically started when the registry
57
+ has finished initializing. Services may also register their preferred
58
+ ordering for startup.
59
+ schema:
60
+ name: ClientDefinition
61
+ definition:
62
+ service:
63
+ type: string
64
+ required: true
65
+ description: The (full) name of the client service.
66
+ enabled:
67
+ type: boolean
68
+ description: Whether or not the service should be notified.
69
+ before:
70
+ type: array
71
+ description: >-
72
+ A list of other service names that should be notified after this
73
+ service.
74
+ after:
75
+ type: array
76
+ description: >-
77
+ A list of other service names that should be notified before this
78
+ service.
79
+
80
+ service-points:
81
+
82
+ FactoryDefaults:
83
+ model: singleton
84
+ description: >-
85
+ The service point that provides access to the FactoryDefaults
86
+ configuration point.
87
+ implementor:
88
+ class: copland/impl/symbol-source/Copland::Implementation::SymbolSource
89
+ properties:
90
+ defaults: !!configuration FactoryDefaults
91
+
92
+ ApplicationDefaults:
93
+ model: singleton
94
+ description: >-
95
+ The service point that provides access to the ApplicationDefaults
96
+ configuration point.
97
+ implementor:
98
+ class: copland/impl/symbol-source/Copland::Implementation::SymbolSource
99
+ properties:
100
+ defaults: !!configuration ApplicationDefaults
101
+
102
+ SymbolSourceManager:
103
+ model: singleton
104
+ description: >-
105
+ The service that manages all contributed symbol sources, and which may be
106
+ queried to obtain values known by any of them.
107
+ implementor:
108
+ class: copland/impl/symbol-source-manager/Copland::Implementation::SymbolSourceManager
109
+ parameters:
110
+ - !!configuration SymbolSources
111
+
112
+ BuilderFactory:
113
+ implementor:
114
+ copland/impl/builder-factory/Copland::Implementation::BuilderFactory
115
+ model: singleton
116
+ description: >-
117
+ Used to construct a service from a class name and optional constructor
118
+ parameters and properties.
119
+ schema:
120
+ definition:
121
+ class:
122
+ required: true
123
+ type: string
124
+ description: >-
125
+ The path description of the class to instantiate. This takes the
126
+ form "path/to/file/Full::Class::Name". Then, "require" will be
127
+ invoked on the "path/to/file" portion, and the class itself will
128
+ then be resolved. If the class includes the Singleton module,
129
+ the singleton instance will be correctly resolved; in this case,
130
+ it is an error to specify construction parameters.
131
+ parameters:
132
+ type: array
133
+ description: >-
134
+ A list of values that should be passed (in order) to the
135
+ constructor of the class. It is illegal to specify this value if
136
+ the class includes the Singleton module.
137
+ properties:
138
+ type: hash
139
+ description: >-
140
+ A hash of property-name/value pairs that describe the properties
141
+ to set on the instantiated object. Assignment occurs as follows:
142
+ first, a setter is searched for, either "name=" or "set_name".
143
+ If one is found, it is used to set the property. If no such
144
+ setter exists, the property is set directly using
145
+ "instance_variable_set".
146
+ invoke:
147
+ type: hash
148
+ description: >-
149
+ A hash of method-name/parameter pairs, where the value of each
150
+ pair is an array of parameters to pass to the method. These
151
+ methods will be invoked in no particular order, after all
152
+ properties have been assigned.
153
+ initialize-method:
154
+ type: string
155
+ description: >-
156
+ This describes the name of the method to invoke when the service
157
+ has been completely instantiated (and all properties wired into
158
+ it). This defaults to "initialize_service". If the method does not
159
+ exist, then nothing is invoked.
160
+
161
+ LoggingInterceptor:
162
+ implementor:
163
+ copland/impl/logging-interceptor/Copland::Implementation::LoggingInterceptorFactory
164
+ description: >-
165
+ An interceptor that adds logging to a service. Log entries are created
166
+ for all method calls (on enter and exit) and for any raised exceptions.
167
+ By default, all methods implemented by the service are included for
168
+ logging, and may only be excluded by using the 'exclude' element.
169
+ Anything matching any of the exclusion patterns will not be logged,
170
+ unless it also matches an 'include' pattern.
171
+ model: singleton
172
+ schema:
173
+ name: IncludeExcludeSchema
174
+ description: >-
175
+ This is a schema that may be used by any service that wishes to
176
+ incorporate "include/exclude" functionality into itself.
177
+ definition:
178
+ include:
179
+ type: array
180
+ description: >-
181
+ A list of special expressions that define which methods are
182
+ included in the operation. These expressions take the format
183
+ "pattern" (where pattern in a regular expression that should
184
+ match the method's name), or "pattern(arity)", where arity is
185
+ either a positive integer (indicating that only methods
186
+ with that arity match), or a positive integer preceded by a
187
+ comparison operator (<, =, or >).
188
+ exclude:
189
+ type: array
190
+ description: >-
191
+ A list of special expressions that define which methods are
192
+ excluded from the operation. The format for these expressions
193
+ is described under the 'include' element.
194
+
195
+ Startup:
196
+ model: singleton
197
+ description: >-
198
+ This is a service that will be automatically instantiated when the
199
+ registry is initialized. Once invoked, it inspects the Startup
200
+ configuration point to determine which other services to load. These
201
+ clients will be ordered based on their 'before' and 'after'
202
+ preferences, and then all enabled services will be started.
203
+ implementor:
204
+ class: copland/impl/startup/Copland::Implementation::Startup
205
+ properties:
206
+ clients: !!configuration Startup
207
+ registry: !!service Registry
208
+
209
+ contributions:
210
+
211
+ SymbolSources:
212
+ - name: FactoryDefaults
213
+ source: !!service FactoryDefaults
214
+ after:
215
+ - ApplicationDefaults
216
+ - name: ApplicationDefaults
217
+ source: !!service ApplicationDefaults