summaryrefslogtreecommitdiff
path: root/lib/wsdl/soap/classDefCreator.rb
blob: 6c7d381932b6b544ec30c83a0d604211f8f84519 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# WSDL4R - Creating class definition from WSDL
# Copyright (C) 2002, 2003  NAKAMURA, Hiroshi <nahi@ruby-lang.org>.

# This program is copyrighted free software by NAKAMURA, Hiroshi.  You can
# redistribute it and/or modify it under the same terms of Ruby's license;
# either the dual license version in 2003, or any later version.


require 'wsdl/data'
require 'wsdl/soap/classDefCreatorSupport'
require 'xsd/codegen'


module WSDL
module SOAP


class ClassDefCreator
  include ClassDefCreatorSupport

  def initialize(definitions)
    @simpletypes = definitions.collect_simpletypes
    @complextypes = definitions.collect_complextypes
    @faulttypes = definitions.collect_faulttypes
  end

  def dump(class_name = nil)
    result = ""
    if class_name
      result = dump_classdef(class_name)
    else
      @complextypes.each do |type|
	case type.compoundtype
	when :TYPE_STRUCT
	  result << dump_classdef(type)
	when :TYPE_ARRAY
	  result << dump_arraydef(type)
       	else
	  raise RuntimeError.new("Unknown complexContent definition...")
	end
	result << "\n"
      end

      result << @simpletypes.collect { |type|
        dump_simpletypedef(type)
      }.join("\n")
    end
    result
  end

private

  def dump_simpletypedef(simpletype)
    qname = simpletype.name
    if simpletype.restriction.enumeration.empty?
      STDERR.puts("#{qname}: simpleType which is not enum type not supported.")
      return ""
    end
    c = XSD::CodeGen::ModuleDef.new(create_class_name(qname))
    c.comment = "#{ qname.namespace }"
    simpletype.restriction.enumeration.each do |value|
      c.def_const(safeconstname(value), value.dump)
    end
    c.dump
  end

  def dump_classdef(complextype)
    qname = complextype.name
    if @faulttypes.index(qname)
      c = XSD::CodeGen::ClassDef.new(create_class_name(qname),
        "::StandardError")
    else
      c = XSD::CodeGen::ClassDef.new(create_class_name(qname))
    end
    c.comment = "#{ qname.namespace }"
    c.def_classvar("schema_type", qname.name.dump)
    c.def_classvar("schema_ns", qname.namespace.dump)
    init_lines = ""
    params = []
    complextype.each_element do |element|
      name = element.name.name
      varname = safevarname(name)
      c.def_attr(name, true, varname)
      init_lines << "@#{ varname } = #{ varname }\n"
      params << "#{ varname } = nil"
    end
    complextype.attributes.each do |attribute|
      name = "attr_" + attribute.name
      varname = safevarname(name)
      c.def_attr(name, true, varname)
      init_lines << "@#{ varname } = #{ varname }\n"
      params << "#{ varname } = nil"
    end
    c.def_method("initialize", *params) do
      init_lines
    end
    c.dump
  end

  def dump_arraydef(complextype)
    qname = complextype.name
    c = XSD::CodeGen::ClassDef.new(create_class_name(qname), "::Array")
    c.comment = "#{ qname.namespace }"
    c.def_classvar("schema_type", qname.name.dump)
    c.def_classvar("schema_ns", qname.namespace.dump)
    c.dump
  end
end


end
end