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

root/branches/1_5/lib/wsdl/soap/servletStubCreator.rb

Revision 1948, 3.0 kB (checked in by nahi, 1 year ago)
  • let ClassNameCreator? handle modulepath. Foo::Baz and Bar::Baz have the same name (Baz) but these are different qnames so there's no need for name crash avoidaidance. closes #413.
Line 
1 # WSDL4R - Creating servlet stub code from WSDL.
2 # Copyright (C) 2000-2007  NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
4 # This program is copyrighted free software by NAKAMURA, Hiroshi.  You can
5 # redistribute it and/or modify it under the same terms of Ruby's license;
6 # either the dual license version in 2003, or any later version.
7
8
9 require 'wsdl/info'
10 require 'wsdl/soap/mappingRegistryCreator'
11 require 'wsdl/soap/methodDefCreator'
12 require 'wsdl/soap/classDefCreatorSupport'
13
14
15 module WSDL
16 module SOAP
17
18
19 class ServletStubCreator
20   include ClassDefCreatorSupport
21
22   attr_reader :definitions
23
24   def initialize(definitions, name_creator, modulepath = nil)
25     @definitions = definitions
26     @name_creator = name_creator
27     @modulepath = modulepath
28   end
29
30   def dump(service_name)
31     warn("- Servlet stub can have only 1 port for now.  So creating stub for the first port and rests are ignored.")
32     services = @definitions.service(service_name)
33     unless services
34       raise RuntimeError.new("service not defined: #{service_name}")
35     end
36     ports = services.ports
37     if ports.empty?
38       raise RuntimeError.new("ports not found for #{service_name}")
39     end
40     port = ports[0]
41     if port.porttype.nil?
42       raise RuntimeError.new("porttype not found for #{port}")
43     end
44     dump_porttype(port.porttype)
45   end
46
47 private
48
49   def dump_porttype(porttype)
50     class_name = mapped_class_name(porttype.name, @modulepath)
51     defined_const = {}
52     result = MethodDefCreator.new(@definitions, @name_creator, @modulepath, defined_const).dump(porttype.name)
53     methoddef = result[:methoddef]
54
55     wsdl_name = @definitions.name ? @definitions.name.name : 'default'
56     mrname = safeconstname(wsdl_name + 'MappingRegistry')
57    
58     c1 = XSD::CodeGen::ClassDef.new(class_name)
59     c1.def_require("soap/rpc/soaplet")
60     c1.def_code <<-EOD
61 Methods = [
62 #{methoddef.gsub(/^/, "  ")}
63 ]
64     EOD
65     defined_const.each do |ns, tag|
66       c1.def_const(tag, dq(ns))
67     end
68     c2 = XSD::CodeGen::ClassDef.new(class_name + "Servlet",
69       "::SOAP::RPC::SOAPlet")
70     c2.def_method("initialize", "router = nil") do
71       <<-EOD
72         super(router)
73         servant = #{class_name}.new
74         #{class_name}::Methods.each do |definitions|
75           opt = definitions.last
76           if opt[:request_style] == :document
77             @router.add_document_operation(servant, *definitions)
78           else
79             @router.add_rpc_operation(servant, *definitions)
80           end
81         end
82         @router.mapping_registry = #{mrname}::EncodedRegistry
83         @router.literal_mapping_registry = #{mrname}::LiteralRegistry
84       EOD
85     end
86     c1.dump + "\n" + c2.dump + format(<<-EOD)
87
88       if $0 == __FILE__
89         require 'webrick'
90         server = WEBrick::HTTPServer.new(
91           :BindAddress => "0.0.0.0",
92           :Port => 10080,
93           :DocumentRoot => "."
94         )
95         server.mount("/", #{c2.name}.new)
96         trap(:INT) do
97           server.shutdown
98         end
99         server.start
100       end
101     EOD
102   end
103 end
104
105
106 end
107 end
Note: See TracBrowser for help on using the browser.