require 'soap/soap' require 'soap/mapping' InterfaceNS = 'http://soapinterop.org/' TypeNS = 'http://soapinterop.org/xsd' ApacheNS = 'http://xml.apache.org/xml-soap' module SOAPBuildersInterop extend SOAP MethodsBase = [ ['echoVoid'], ['echoString', [:in, 'inputString', nil], [:retval, 'return', nil]], ['echoStringArray', [:in, 'inputStringArray', nil], [:retval, 'return', nil]], ['echoInteger', [:in, 'inputInteger', nil], [:retval, 'return', nil]], ['echoIntegerArray', [:in, 'inputIntegerArray', nil], [:retval, 'return', nil]], ['echoFloat', [:in, 'inputFloat', nil], [:retval, 'return', nil]], ['echoFloatArray', [:in, 'inputFloatArray', nil], [:retval, 'return', nil]], ['echoStruct', [:in, 'inputStruct', nil], [:retval, 'return', nil]], ['echoStructArray', [:in, 'inputStructArray', nil], [:retval, 'return', nil]], ['echoDate', [:in, 'inputDate', nil], [:retval, 'return', nil]], ['echoBase64', [:in, 'inputBase64', nil], [:retval, 'return', nil]], ['echoHexBinary', [:in, 'inputHexBinary', nil], [:retval, 'return', nil]], ['echoBoolean', [:in, 'inputBoolean', nil], [:retval, 'return', nil]], ['echoDecimal', [:in, 'inputDecimal', nil], [:retval, 'return', nil]], ['echoMap', [:in, 'inputMap', nil], [:retval, 'return', nil]], ['echoMapArray', [:in, 'inputMapArray', nil], [:retval, 'return', nil]], ['echoDouble', [:in, 'inputDouble', nil], [:retval, 'return', nil]], ['echoXSDDateTime', [:in, 'inputXSDDateTime', nil], [:retval, 'return', nil]], ['echoXSDDate', [:in, 'inputXSDDate', nil], [:retval, 'return', nil]], ['echoXSDTime', [:in, 'inputXSDTime', nil], [:retval, 'return', nil]], ] MethodsGroupB = [ ['echoStructAsSimpleTypes', [:in, 'inputStruct', nil], [:out, 'outputString', nil], [:out, 'outputInteger', nil], [:out, 'outputFloat', nil]], ['echoSimpleTypesAsStruct', [:in, 'inputString', nil], [:in, 'inputInteger', nil], [:in, 'inputFloat', nil], [:retval, 'return', nil]], ['echo2DStringArray', [:in, 'input2DStringArray', nil], [:retval, 'return', nil]], ['echoNestedStruct', [:in, 'inputStruct', nil], [:retval, 'return', nil]], ['echoNestedArray', [:in, 'inputStruct', nil], [:retval, 'return', nil]], ] MethodsPolyMorph = [ ['echoPolyMorph', [:in, 'inputPolyMorph', nil], [:retval, 'return', nil]], ['echoPolyMorphStruct', [:in, 'inputPolyMorphStruct', nil], [:retval, 'return', nil]], ['echoPolyMorphArray', [:in, 'inputPolyMorphArray', nil], [:retval, 'return', nil]], ] module FloatSupport def floatEquals( lhs, rhs ) lhsVar = lhs.is_a?( SOAP::SOAPFloat )? lhs.data : lhs rhsVar = rhs.is_a?( SOAP::SOAPFloat )? rhs.data : rhs lhsVar == rhsVar end end class SOAPStruct include SOAP::Marshallable include FloatSupport attr_accessor :varInt, :varFloat, :varString def initialize( varInt, varFloat, varString ) @varInt = varInt @varFloat = varFloat ? SOAP::SOAPFloat.new( varFloat ) : nil @varString = varString end def ==( rhs ) r = if rhs.is_a?( self.class ) ( self.varInt == rhs.varInt && floatEquals( self.varFloat, rhs.varFloat ) && self.varString == rhs.varString ) else false end r end def to_s "#{ varInt }:#{ varFloat }:#{ varString }" end end class SOAPStructStruct include SOAP::Marshallable include FloatSupport attr_accessor :varInt, :varFloat, :varString, :varStruct def initialize( varInt, varFloat, varString, varStruct = nil ) @varInt = varInt @varFloat = varFloat ? SOAP::SOAPFloat.new( varFloat ) : nil @varString = varString @varStruct = varStruct end def ==( rhs ) r = if rhs.is_a?( self.class ) ( self.varInt == rhs.varInt && floatEquals( self.varFloat, rhs.varFloat ) && self.varString == rhs.varString && self.varStruct == rhs.varStruct ) else false end r end def to_s "#{ varInt }:#{ varFloat }:#{ varString }:#{ varStruct }" end end class PolyMorphStruct include SOAP::Marshallable attr_reader :varA, :varB, :varC def initialize( varA, varB, varC ) @varA = varA @varB = varB @varC = varC end def ==( rhs ) r = if rhs.is_a?( self.class ) ( self.varA == rhs.varA && self.varB == rhs.varB && self.varC == rhs.varC ) else false end r end def to_s "#{ varA }:#{ varB }:#{ varC }" end end class SOAPArrayStruct include SOAP::Marshallable include FloatSupport attr_accessor :varInt, :varFloat, :varString, :varArray def initialize( varInt, varFloat, varString, varArray = nil ) @varInt = varInt @varFloat = varFloat ? SOAP::SOAPFloat.new( varFloat ) : nil @varString = varString @varArray = varArray end def ==( rhs ) r = if rhs.is_a?( self.class ) ( self.varInt == rhs.varInt && floatEquals( self.varFloat, rhs.varFloat ) && self.varString == rhs.varString && self.varArray == rhs.varArray ) else false end r end def to_s "#{ varInt }:#{ varFloat }:#{ varString }:#{ varArray }" end end class StringArray < Array; end class IntArray < Array; end class FloatArray < Array; end class SOAPStructArray < Array; end class SOAPMapArray < Array; end class ArrayOfanyType < Array; end MappingRegistry = SOAP::Mapping::Registry.new MappingRegistry.set( ::SOAPBuildersInterop::SOAPStruct, ::SOAP::SOAPStruct, ::SOAP::Mapping::Registry::TypedStructFactory, { :type => XSD::QName.new( TypeNS, "SOAPStruct" ) } ) MappingRegistry.set( ::SOAPBuildersInterop::SOAPStructStruct, ::SOAP::SOAPStruct, ::SOAP::Mapping::Registry::TypedStructFactory, { :type => XSD::QName.new( TypeNS, "SOAPStructStruct" ) } ) MappingRegistry.set( ::SOAPBuildersInterop::PolyMorphStruct, ::SOAP::SOAPStruct, ::SOAP::Mapping::Registry::TypedStructFactory, { :type => XSD::QName.new( TypeNS, "PolyMorphStruct" ) } ) MappingRegistry.set( ::SOAPBuildersInterop::SOAPArrayStruct, ::SOAP::SOAPStruct, ::SOAP::Mapping::Registry::TypedStructFactory, { :type => XSD::QName.new( TypeNS, "SOAPArrayStruct" ) } ) MappingRegistry.set( ::SOAPBuildersInterop::StringArray, ::SOAP::SOAPArray, ::SOAP::Mapping::Registry::TypedArrayFactory, { :type => XSD::QName.new( XSD::Namespace, XSD::StringLiteral ) } ) MappingRegistry.set( ::SOAPBuildersInterop::IntArray, ::SOAP::SOAPArray, ::SOAP::Mapping::Registry::TypedArrayFactory, { :type => XSD::QName.new( XSD::Namespace, XSD::IntLiteral ) } ) MappingRegistry.set( ::SOAPBuildersInterop::FloatArray, ::SOAP::SOAPArray, ::SOAP::Mapping::Registry::TypedArrayFactory, { :type => XSD::QName.new( XSD::Namespace, XSD::FloatLiteral ) } ) MappingRegistry.set( ::SOAPBuildersInterop::SOAPStructArray, ::SOAP::SOAPArray, ::SOAP::Mapping::Registry::TypedArrayFactory, { :type => XSD::QName.new( TypeNS, 'SOAPStruct' ) } ) MappingRegistry.set( ::SOAPBuildersInterop::SOAPMapArray, ::SOAP::SOAPArray, ::SOAP::Mapping::Registry::TypedArrayFactory, { :type => XSD::QName.new( ApacheNS, 'Map' ) } ) MappingRegistry.set( ::SOAPBuildersInterop::ArrayOfanyType, ::SOAP::SOAPArray, ::SOAP::Mapping::Registry::TypedArrayFactory, { :type => XSD::AnyTypeName } ) end