Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

Changeset 1857

Show
Ignore:
Timestamp:
06/19/07 23:21:24 (1 year ago)
Author:
nahi
Message:
  • let xsd2ruby.rb generate a mapping registry and a mapper from XML Schema definition. the mapper has obj2xml and xml2obj which uses the generated mapping registry. you can use this instead of XSD::Mapping.obj2xml and XSD::Mapping.xml2obj which does not know anything about mapping. closes #362, #363.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/bin/xsd2ruby.rb

    r1437 r1857  
    1111  OptSet = [ 
    1212    ['--xsd','-x', GetoptLong::REQUIRED_ARGUMENT], 
    13     ['--classname','-n', GetoptLong::NO_ARGUMENT], 
     13    ['--module_path','-m', GetoptLong::REQUIRED_ARGUMENT], 
     14    ['--classdef','-e', GetoptLong::OPTIONAL_ARGUMENT], 
     15    ['--mapping_registry','-r', GetoptLong::NO_ARGUMENT], 
     16    ['--mapper','-p', GetoptLong::NO_ARGUMENT], 
    1417    ['--force','-f', GetoptLong::NO_ARGUMENT], 
    1518    ['--quiet','-q', GetoptLong::NO_ARGUMENT], 
     
    4447 
    4548Example: 
    46   #{ $0 } --xsd myapp.xsd --classname Foo 
     49  #{ $0 } --xsd myapp.xsd --classdef foo 
    4750 
    4851Options: 
    4952  --xsd xsd_location 
    50   --classname classname 
     53  --classdef [filenameprefix] 
     54  --mapping_registry 
     55  --mapper 
     56  --module_path [Module::Path::Name] 
    5157  --force 
    5258  --quiet 
     
    6369        when "--xsd" 
    6470          xsd = arg 
    65         when "--classname" 
     71        when "--module_path" 
     72          opt['module_path'] = arg 
     73        when "--classdef", "--mapping_registry", "--mapper" 
    6674          opt[name.sub(/^--/, '')] = arg.empty? ? nil : arg 
    6775        when "--force" 
  • trunk/lib/soap/baseData.rb

    r1846 r1857  
    581581  def initialize(elename, text = nil) 
    582582    super() 
    583     if !elename.is_a?(XSD::QName) 
     583    if elename.nil? 
     584      elename = XSD::QName::EMPTY 
     585    elsif !elename.is_a?(XSD::QName) 
    584586      elename = XSD::QName.new(nil, elename) 
    585587    end 
  • trunk/lib/soap/mapping/literalregistry.rb

    r1853 r1857  
    127127    if definition.type 
    128128      ele.extraattr[XSD::AttrTypeName] = definition.type 
     129    end 
     130    if qname.nil? and definition.elename 
     131      ele.elename = definition.elename 
    129132    end 
    130133    stubobj2soap_elements(obj, ele, definition.elements) 
  • trunk/lib/wsdl/xmlSchema/xsd2ruby.rb

    r1824 r1857  
    1010require 'wsdl/xmlSchema/importer' 
    1111require 'wsdl/soap/classDefCreator' 
     12require 'wsdl/soap/literalMappingRegistryCreator' 
     13require 'logger' 
    1214 
    1315 
     
    2729    end 
    2830    @xsd = import(@location) 
    29     @name = create_classname(@xsd) 
     31    @name = @opt['classdef'] || create_classname(@xsd) 
    3032    create_file 
    3133  end 
     
    4345 
    4446  def create_file 
    45     create_classdef 
     47    @modulepath = @opt['module_path'] 
     48    create_classdef if @opt.key?('classdef') 
     49    create_mapping_registry if @opt.key?('mapping_registry') 
     50    create_mapper if @opt.key?('mapper') 
    4651  end 
    4752 
     
    5156    check_file(@classdef_filename) or return 
    5257    write_file(@classdef_filename) do |f| 
    53       f << WSDL::SOAP::ClassDefCreator.new(@xsd).dump 
     58      f << WSDL::SOAP::ClassDefCreator.new(@xsd, @modulepath).dump 
    5459    end 
     60  end 
     61 
     62  def create_mapping_registry 
     63    @logger.info { "Creating mapping registry definition." } 
     64    @mr_filename = @name + '_mapping_registry.rb' 
     65    check_file(@mr_filename) or return 
     66    write_file(@mr_filename) do |f| 
     67      f << dump_mapping_registry 
     68    end 
     69  end 
     70 
     71  def create_mapper 
     72    @logger.info { "Creating mapper definition." } 
     73    @mapper_filename = @name + '_mapper.rb' 
     74    check_file(@mapper_filename) or return 
     75    write_file(@mapper_filename) do |f| 
     76      f << dump_mapper 
     77    end 
     78  end 
     79 
     80  def dump_mapping_registry 
     81    creator = WSDL::SOAP::LiteralMappingRegistryCreator.new(@xsd, @modulepath) 
     82    module_name = XSD::CodeGen::GenSupport.safeconstname( 
     83      @name + 'MappingRegistry') 
     84    if @modulepath 
     85      module_name = [@modulepath, module_name].join('::') 
     86    end 
     87    m = XSD::CodeGen::ModuleDef.new(module_name) 
     88    m.def_require("xsd/mapping") 
     89    m.def_require("#{@classdef_filename}") 
     90    varname = 'Registry' 
     91    m.def_const(varname, '::SOAP::Mapping::LiteralRegistry.new') 
     92    m.def_code(creator.dump(varname)) 
     93    m.dump 
     94  end 
     95 
     96  def dump_mapper 
     97    class_name = XSD::CodeGen::GenSupport.safeconstname(@name + 'Mapper') 
     98    if @modulepath 
     99      class_name = [@modulepath, class_name].join('::') 
     100    end 
     101    mr_name = XSD::CodeGen::GenSupport.safeconstname(@name + 'MappingRegistry') 
     102    c = XSD::CodeGen::ClassDef.new(class_name, 'XSD::Mapping::Mapper') 
     103    c.def_require("#{@mr_filename}") 
     104    c.def_method("initialize") do 
     105      "super(#{mr_name}::Registry)" 
     106    end 
     107    c.dump 
    55108  end 
    56109 
  • trunk/lib/xsd/mapping.rb

    r1824 r1857  
    1919module Mapping 
    2020  MappingRegistry = SOAP::Mapping::LiteralRegistry.new 
    21   MappingOpt = {:default_encodingstyle => SOAP::LiteralNamespace} 
    2221 
    2322  def self.obj2xml(obj, elename = nil, io = nil) 
    24     if !elename.nil? and !elename.is_a?(XSD::QName) 
    25       elename = XSD::QName.new(nil, elename) 
    26     end 
    27     elename ||= XSD::QName.new(nil, SOAP::Mapping.name2elename(obj.class.to_s)) 
    28     soap = SOAP::Mapping.obj2soap(obj, MappingRegistry) 
    29     soap.elename = elename 
    30     generator = SOAP::SOAPGenerator.new(MappingOpt) 
    31     generator.generate(soap, io) 
     23    Mapper.new(MappingRegistry).obj2xml(obj, elename, io) 
    3224  end 
    3325 
    34   def self.xml2obj(stream) 
    35     parser = SOAP::Parser.new(MappingOpt) 
    36     soap = parser.parse(stream) 
    37     SOAP::Mapping.soap2obj(soap, MappingRegistry) 
     26  def self.xml2obj(stream, klass = nil) 
     27    Mapper.new(MappingRegistry).xml2obj(stream, klass) 
     28  end 
     29 
     30  class Mapper 
     31    MAPPING_OPT = {:default_encodingstyle => SOAP::LiteralNamespace} 
     32 
     33    def initialize(registry) 
     34      @registry = registry 
     35    end 
     36 
     37    def obj2xml(obj, elename = nil, io = nil) 
     38      if !elename.nil? and !elename.is_a?(XSD::QName) 
     39        elename = XSD::QName.new(nil, elename) 
     40      end 
     41      soap = SOAP::Mapping.obj2soap(obj, @registry, elename) 
     42      if soap.elename == XSD::QName::EMPTY 
     43        soap.elename = 
     44          XSD::QName.new(nil, SOAP::Mapping.name2elename(obj.class.to_s)) 
     45      end 
     46      generator = SOAP::SOAPGenerator.new(MAPPING_OPT) 
     47      generator.generate(soap, io) 
     48    end 
     49 
     50    def xml2obj(stream, klass = nil) 
     51      parser = SOAP::Parser.new(MAPPING_OPT) 
     52      soap = parser.parse(stream) 
     53      SOAP::Mapping.soap2obj(soap, @registry, klass) 
     54    end 
    3855  end 
    3956end 
  • trunk/test/wsdl/soap/wsdl2ruby/section/test_section.rb

    r1794 r1857  
    1313 
    1414  def setup 
    15     system("cd #{DIR} && #{RUBY} #{pathname("../../../../../bin/xsd2ruby.rb")} --xsd #{pathname("section.xsd")} --force --quiet") 
     15    system("cd #{DIR} && #{RUBY} #{pathname("../../../../../bin/xsd2ruby.rb")} --xsd #{pathname("section.xsd")} --classdef --force --quiet") 
    1616  end 
    1717