diff options
author | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-03 13:33:20 +0000 |
---|---|---|
committer | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-03 13:33:20 +0000 |
commit | df731e37a1953755edfedd1462995fa824ca22bf (patch) | |
tree | 38a98e1b29b3784843ad079fa003790c8f352f58 /lib/soap/property.rb | |
parent | 0d6fa996d9e842fe435308cef68df06bc3596a76 (diff) |
* added files:
* lib/soap/header/*
* lib/soap/rpc/httpserver.rb
* lib/wsdl/soap/cgiStubCreator.rb
* lib/wsdl/soap/classDefCreator.rb
* lib/wsdl/soap/classDefCreatorSupport.rb
* lib/wsdl/soap/clientSkeltonCreator.rb
* lib/wsdl/soap/driverCreator.rb
* lib/wsdl/soap/mappingRegistryCreator.rb
* lib/wsdl/soap/methodDefCreator.rb
* lib/wsdl/soap/servantSkeltonCreator.rb
* lib/wsdl/soap/standaloneServerStubCreator.rb
* lib/wsdl/xmlSchema/enumeration.rb
* lib/wsdl/xmlSchema/simpleRestriction.rb
* lib/wsdl/xmlSchema/simpleType.rb
* lib/xsd/codegen/*
* lib/xsd/codegen.rb
* sample/soap/authheader/*
* sample/soap/raa2.4/*
* sample/soap/ssl/*
* sample/soap/swa/*
* sample/soap/whois.rb
* sample/wsdl/raa2.4/*
* test/soap/header/*
* test/soap/ssl/*
* test/soap/struct/*
* test/soap/swa/*
* test/soap/wsdlDriver/*
* test/wsdl/multiplefault.wsdl
* test/wsdl/simpletype/*
* test/wsdl/test_multiplefault.rb
* modified files:
* lib/soap/baseData.rb
* lib/soap/element.rb
* lib/soap/generator.rb
* lib/soap/netHttpClient.rb
* lib/soap/parser.rb
* lib/soap/property.rb
* lib/soap/soap.rb
* lib/soap/streamHandler.rb
* lib/soap/wsdlDriver.rb
* lib/soap/wsdlDriver.rb
* lib/soap/encodingstyle/handler.rb
* lib/soap/encodingstyle/literalHandler.rb
* lib/soap/encodingstyle/soapHandler.rb
* lib/soap/mapping/factory.rb
* lib/soap/mapping/mapping.rb
* lib/soap/mapping/registry.rb
* lib/soap/mapping/rubytypeFactory.rb
* lib/soap/mapping/wsdlRegistry.rb
* lib/soap/rpc/cgistub.rb
* lib/soap/rpc/driver.rb
* lib/soap/rpc/proxy.rb
* lib/soap/rpc/router.rb
* lib/soap/rpc/soaplet.rb
* lib/soap/rpc/standaloneServer.rb
* lib/wsdl/data.rb
* lib/wsdl/definitions.rb
* lib/wsdl/operation.rb
* lib/wsdl/parser.rb
* lib/wsdl/soap/definitions.rb
* lib/wsdl/xmlSchema/complexContent.rb
* lib/wsdl/xmlSchema/complexType.rb
* lib/wsdl/xmlSchema/data.rb
* lib/wsdl/xmlSchema/parser.rb
* lib/wsdl/xmlSchema/schema.rb
* lib/xsd/datatypes.rb
* lib/xsd/qname.rb
* sample/soap/sampleStruct/server.rb
* sample/wsdl/amazon/AmazonSearch.rb
* sample/wsdl/amazon/AmazonSearchDriver.rb
* test/soap/test_property.rb
* test/soap/calc/test_calc_cgi.rb
* test/wsdl/test_emptycomplextype.rb
* summary
* add SOAP Header mustUnderstand support.
* add HTTP client SSL configuration and Cookies support (works
completely with http-access2).
* add header handler for handling sending/receiving SOAP Header.
* map Ruby's anonymous Struct to common SOAP Struct in SOAP Object
Model. it caused error.
* add WSDL simpleType support to restrict lexical value space.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6565 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/soap/property.rb')
-rw-r--r-- | lib/soap/property.rb | 88 |
1 files changed, 55 insertions, 33 deletions
diff --git a/lib/soap/property.rb b/lib/soap/property.rb index 079c294a77..113cc64f3c 100644 --- a/lib/soap/property.rb +++ b/lib/soap/property.rb @@ -34,22 +34,24 @@ module SOAP class Property include Enumerable - def self.load(stream) - new.load(stream) + module Util + def const_from_name(fqname) + fqname.split("::").inject(Kernel) { |klass, name| klass.const_get(name) } + end + module_function :const_from_name + + def require_from_name(fqname) + require File.join(fqname.split("::").collect { |ele| ele.downcase }) + end + module_function :require_from_name end - def self.open(filename) - File.open(filename) { |f| load(f) } + def self.load(stream) + new.load(stream) end - # find property from $:. def self.loadproperty(propname) - $:.each do |path| - if File.file?(file = File.join(path, propname)) - return open(file) - end - end - nil + new.loadproperty(propname) end def initialize @@ -87,6 +89,17 @@ class Property self end + # find property from $:. + def loadproperty(propname) + return loadpropertyfile(propname) if File.file?(propname) + $:.each do |path| + if File.file?(file = File.join(path, propname)) + return loadpropertyfile(file) + end + end + nil + end + # name: a Symbol, String or an Array def [](name) referent(name_to_a(name)) @@ -95,10 +108,10 @@ class Property # name: a Symbol, String or an Array # value: an Object def []=(name, value) - hooks = assign(name_to_a(name), value) - normalized_name = normalize_name(name) + name_pair = name_to_a(name).freeze + hooks = assign(name_pair, value) hooks.each do |hook| - hook.call(normalized_name, value) + hook.call(name_pair, value) end value end @@ -109,13 +122,15 @@ class Property self[generate_new_key] = value end - # name: a Symbol, String or an Array. nil means hook to the root + # name: a Symbol, String or an Array; nil means hook to the root + # cascade: true/false; for cascading hook of sub key # hook: block which will be called with 2 args, name and value - def add_hook(name = nil, &hook) - if name.nil? - assign_self_hook(&hook) + def add_hook(name = nil, cascade = false, &hook) + if name == nil or name == true or name == false + cascade = name + assign_self_hook(cascade, &hook) else - assign_hook(name_to_a(name), &hook) + assign_hook(name_to_a(name), cascade, &hook) end end @@ -192,14 +207,18 @@ protected @store[key] = value end - def local_hook(key) - @self_hook + (@hook[key] || NO_HOOK) + def local_hook(key, direct) + hooks = [] + (@self_hook + (@hook[key] || NO_HOOK)).each do |hook, cascade| + hooks << hook if direct or cascade + end + hooks end - def local_assign_hook(key, &hook) + def local_assign_hook(key, cascade, &hook) check_lock(key) @store[key] ||= nil - (@hook[key] ||= []) << hook + (@hook[key] ||= []) << [hook, cascade] end private @@ -217,23 +236,23 @@ private hook = NO_HOOK ary[0..-2].each do |name| key = to_key(name) - hook += ref.local_hook(key) + hook += ref.local_hook(key, false) ref = ref.deref_key(key) end last_key = to_key(ary.last) ref.local_assign(last_key, value) - hook + ref.local_hook(last_key) + hook + ref.local_hook(last_key, true) end - def assign_hook(ary, &hook) + def assign_hook(ary, cascade, &hook) ary[0..-2].inject(self) { |ref, name| ref.deref_key(to_key(name)) - }.local_assign_hook(to_key(ary.last), &hook) + }.local_assign_hook(to_key(ary.last), cascade, &hook) end - def assign_self_hook(&hook) + def assign_self_hook(cascade, &hook) check_lock(nil) - @self_hook << hook + @self_hook << [hook, cascade] end def each_key @@ -267,10 +286,6 @@ private end end - def normalize_name(name) - name_to_a(name).collect { |key| to_key(key) }.join('.') - end - def to_key(name) name.to_s.downcase end @@ -286,6 +301,13 @@ private def key_max (@store.keys.max { |l, r| l.to_s.to_i <=> r.to_s.to_i }).to_s.to_i end + + def loadpropertyfile(file) + puts "find property at #{file}" if $DEBUG + File.open(file) do |f| + load(f) + end + end end |