Changeset 1895
- Timestamp:
- 07/21/07 12:57:01 (1 year ago)
- Files:
-
- trunk/lib/soap/mapping/wsdlencodedregistry.rb (modified) (2 diffs)
- trunk/lib/soap/mapping/wsdlliteralregistry.rb (modified) (1 diff)
- trunk/lib/wsdl/soap/cgiStubCreator.rb (modified) (2 diffs)
- trunk/lib/wsdl/soap/classDefCreatorSupport.rb (modified) (1 diff)
- trunk/lib/wsdl/soap/driverCreator.rb (modified) (4 diffs)
- trunk/lib/wsdl/soap/encodedMappingRegistryCreator.rb (modified) (2 diffs)
- trunk/lib/wsdl/soap/literalMappingRegistryCreator.rb (modified) (3 diffs)
- trunk/lib/wsdl/soap/mappingRegistryCreatorSupport.rb (modified) (1 diff)
- trunk/lib/wsdl/soap/methodDefCreator.rb (modified) (4 diffs)
- trunk/lib/wsdl/soap/standaloneServerStubCreator.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/mapping/wsdlencodedregistry.rb
r1824 r1895 57 57 def soap2obj(node, obj_class = nil) 58 58 begin 59 return any2obj(node, obj_class) 59 unless obj_class 60 typestr = XSD::CodeGen::GenSupport.safeconstname(node.elename.name) 61 obj_class = Mapping.class_from_name(typestr) 62 end 63 return Mapping._soap2obj(node, Mapping::DefaultRegistry, obj_class) 60 64 rescue MappingError 61 65 end … … 199 203 end 200 204 end 201 202 def any2obj(node, obj_class)203 unless obj_class204 typestr = XSD::CodeGen::GenSupport.safeconstname(node.elename.name)205 obj_class = Mapping.class_from_name(typestr)206 end207 if obj_class and obj_class.class_variables.include?('@@schema_element')208 soap2stubobj(node, obj_class)209 else210 Mapping._soap2obj(node, Mapping::DefaultRegistry, obj_class)211 end212 end213 214 def soap2stubobj(node, obj_class)215 obj = Mapping.create_empty_object(obj_class)216 unless node.is_a?(SOAPNil)217 add_elements2stubobj(node, obj)218 end219 obj220 end221 222 def add_elements2stubobj(node, obj)223 definition = Mapping.schema_definition_classdef(obj.class)224 vars = {}225 node.each do |name, value|226 item = definition.elements.find { |k, v| k.elename == value.elename }227 if item and item.mapped_class228 # klass must be a SOAPBasetype or a class229 if item.mapped_class.include?(::SOAP::SOAPBasetype)230 if value.respond_to?(:data)231 child = item.mapped_class.new(value.data).data232 else233 child = item.mapped_class.new(nil).data234 end235 else236 child = Mapping._soap2obj(value, self, item.mapped_class)237 end238 else # untyped element is treated as anyType.239 child = Mapping._soap2obj(value, self)240 end241 if item and item.as_array?242 (vars[name] ||= []) << child243 else244 vars[name] = child245 end246 end247 Mapping.set_attributes(obj, vars)248 end249 205 end 250 206 trunk/lib/soap/mapping/wsdlliteralregistry.rb
r1878 r1895 53 53 # node should be a SOAPElement 54 54 def soap2obj(node, obj_class = nil) 55 # obj_class is given when rpc/literal service. but ignored for now.56 55 begin 57 56 return any2obj(node, obj_class) trunk/lib/wsdl/soap/cgiStubCreator.rb
r1824 r1895 48 48 def dump_porttype(name) 49 49 class_name = create_class_name(name, @modulepath) 50 result = MethodDefCreator.new(@definitions, @modulepath).dump(name) 50 defined_const = {} 51 result = MethodDefCreator.new(@definitions, @modulepath, defined_const).dump(name) 51 52 methoddef = result[:methoddef] 52 53 wsdl_name = @definitions.name ? @definitions.name.name : 'default' … … 59 60 ] 60 61 EOD 62 defined_const.each do |ns, tag| 63 c1.def_const(tag, dq(ns)) 64 end 61 65 c2 = XSD::CodeGen::ClassDef.new(class_name + "App", 62 66 "::SOAP::RPC::CGIStub") trunk/lib/wsdl/soap/classDefCreatorSupport.rb
r1891 r1895 89 89 end 90 90 91 def assign_const(value, prefix = '') 92 return if value.nil? or @defined_const.key?(value) 93 name = value.scan(/[^:\/]+\/?\z/)[0] || 'C' 94 tag = prefix + safeconstname(name) 95 if @defined_const.value?(tag) 96 idx = 0 97 while true 98 tag = prefix + safeconstname(name + "_#{idx}") 99 break unless @defined_const.value?(tag) 100 idx += 1 101 raise RuntimeError.new("too much similar names") if idx > 100 102 end 103 end 104 @defined_const[value] = tag 105 end 106 91 107 def create_type_name(element) 92 108 if element.type == XSD::AnyTypeName trunk/lib/wsdl/soap/driverCreator.rb
r1824 r1895 29 29 30 30 def dump(porttype = nil) 31 result = ''31 result = "require 'soap/rpc/driver'\n\n" 32 32 if @modulepath 33 result << "\n"34 33 @modulepath.each do |name| 35 34 result << "module #{name}\n" 36 35 end 36 result << "\n" 37 37 end 38 38 if porttype.nil? … … 57 57 def dump_porttype(porttype) 58 58 class_name = create_class_name(porttype) 59 result = MethodDefCreator.new(@definitions, @modulepath).dump(porttype) 59 defined_const = {} 60 result = MethodDefCreator.new(@definitions, @modulepath, defined_const).dump(porttype) 60 61 methoddef = result[:methoddef] 61 62 binding = @definitions.bindings.find { |item| item.type == porttype } … … 67 68 68 69 c = XSD::CodeGen::ClassDef.new(class_name, "::SOAP::RPC::Driver") 69 c.def_require("soap/rpc/driver")70 70 c.def_const("DefaultEndpointUrl", ndq(address)) 71 71 c.def_code <<-EOD … … 102 102 EOD 103 103 end 104 defined_const.each do |ns, tag| 105 c.def_const(tag, dq(ns)) 106 end 104 107 c.dump 105 108 end trunk/lib/wsdl/soap/encodedMappingRegistryCreator.rb
r1891 r1895 89 89 parsed_element = parse_elements(typedef.elements, qname.namespace) 90 90 var[:schema_element] = dump_schema_element_definition(parsed_element, 2) 91 assign_const(var[:schema_ns], 'Ns') 91 92 dump_entry(@varname, var) 92 93 end … … 111 112 var[:schema_ns] = qname.namespace 112 113 var[:schema_type] = qname.name 114 assign_const(var[:schema_ns], 'Ns') 113 115 dump_entry(@varname, var) 114 116 end trunk/lib/wsdl/soap/literalMappingRegistryCreator.rb
r1891 r1895 142 142 var[:schema_attribute] = define_attribute(typedef.attributes) 143 143 end 144 assign_const(var[:schema_ns], 'Ns') 144 145 dump_entry(@varname, var) 145 146 end … … 187 188 parsed_element << [child_element_name.name, child_element_name, type, occurrence] 188 189 var[:schema_element] = dump_schema_element_definition(parsed_element, 2) 190 assign_const(var[:schema_ns], 'Ns') 189 191 dump_entry(@varname, var) 190 192 end … … 206 208 var[:schema_attribute] = define_attribute(type_or_element.attributes) 207 209 end 210 assign_const(var[:schema_ns], 'Ns') 208 211 dump_entry(@varname, var) 209 212 end trunk/lib/wsdl/soap/mappingRegistryCreatorSupport.rb
r1891 r1895 54 54 ndq(type) 55 55 end 56 end57 58 def assign_const(value, prefix = '')59 return if value.nil? or @defined_const.key?(value)60 name = value.scan(/[^:\/]+\z/)[0] || ''61 tag = prefix + safeconstname(name)62 if @defined_const.value?(tag)63 idx = 064 while true65 tag = prefix + safeconstname(name + "_#{idx}")66 break unless @defined_const.value?(tag)67 idx += 168 raise RuntimeError.new("too much similar names") if idx > 10069 end70 end71 @defined_const[value] = tag72 56 end 73 57 trunk/lib/wsdl/soap/methodDefCreator.rb
r1861 r1895 21 21 attr_reader :definitions 22 22 23 def initialize(definitions, modulepath )23 def initialize(definitions, modulepath, defined_const) 24 24 @definitions = definitions 25 25 @modulepath = modulepath … … 30 30 @encoded = false 31 31 @literal = false 32 @defined_const = defined_const 32 33 end 33 34 … … 139 140 end 140 141 if style == :rpc 142 assign_const(qname.namespace, 'Ns') 141 143 return <<__EOD__ 142 [ #{ qname.dump},144 [ #{dqname(qname)}, 143 145 #{definitions}] 144 146 __EOD__ … … 159 161 elsif definedtype = @complextypes[part.type] 160 162 case definedtype.compoundtype 161 when :TYPE_STRUCT, :TYPE_EMPTY # ToDo: empty should be treated as void. 162 type = create_class_name(part.type, @modulepath) 163 [type, part.type.namespace, part.type.name] 164 when :TYPE_ARRAY 165 arytype = definedtype.find_arytype || XSD::AnyTypeName 166 arytypename = arytype.name.sub(/\[(?:,)*\]$/, '') 167 arytypedef = create_class_name(XSD::QName.new(nil, arytypename), @modulepath) 168 [arytypedef + '[]', part.type.namespace, part.type.name] 169 when :TYPE_SIMPLE 163 when :TYPE_STRUCT, :TYPE_EMPTY, :TYPE_ARRAY, :TYPE_SIMPLE 170 164 type = create_class_name(part.type, @modulepath) 171 165 [type, part.type.namespace, part.type.name] trunk/lib/wsdl/soap/standaloneServerStubCreator.rb
r1824 r1895 49 49 def dump_porttype(name) 50 50 class_name = create_class_name(name, @modulepath) 51 result = MethodDefCreator.new(@definitions, @modulepath).dump(name) 51 defined_const = {} 52 result = MethodDefCreator.new(@definitions, @modulepath, defined_const).dump(name) 52 53 methoddef = result[:methoddef] 53 54 … … 62 63 ] 63 64 EOD 65 defined_const.each do |ns, tag| 66 c1.def_const(tag, dq(ns)) 67 end 64 68 c2 = XSD::CodeGen::ClassDef.new(class_name + "App", 65 69 "::SOAP::RPC::StandaloneServer")