File Coverage

blib/lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
Criterion Covered Total %
statement 18 98 18.3
branch 0 36 0.0
condition 0 9 0.0
subroutine 6 19 31.5
pod 1 11 9.0
total 25 173 14.4


line stmt bran cond sub pod time code
1             package SOAP::WSDL::Generator::Template::Plugin::XSD;
2 1     1   30582 use strict;
  1         2  
  1         43  
3 1     1   6 use warnings;
  1         2  
  1         42  
4 1     1   11 use Carp qw(confess);
  1         2  
  1         69  
5 1     1   954 use Class::Std::Fast::Storable constructor => 'none';
  1         36099  
  1         8  
6 1     1   157 use Scalar::Util qw(blessed);
  1         3  
  1         111  
7 1     1   5 use version; our $VERSION = qv('3.001');
  1         2  
  1         6  
8              
9             my %namespace_prefix_map_of :ATTR(:name :default<{}>);
10             my %namespace_map_of :ATTR(:name :default<{}>);
11             my %prefix_of :ATTR(:name :default<()>);
12             my %prefix_resolver_of :ATTR(:name :default<()>);
13             my %definitions_of :ATTR(:name :default<()>);
14              
15              
16             # create a singleton
17             sub load { # called as MyPlugin->load($context)
18 0     0 0   my ($class, $context, @arg_from) = @_;
19 0           my $stash = $context->stash();
20 0           my $self = bless \do { my $o = Class::Std::Fast::ID() }, $class;
  0            
21 0           $self->set_prefix_resolver( $stash->{ context }->{ prefix_resolver });
22 0           $self->set_definitions( $stash->{ definitions });
23 0           return $self; # returns 'MyPlugin'
24             }
25              
26             sub new {
27 0 0   0 0   return shift if ref $_[0];
28              
29 0           my ($class, $arg_ref) = @_;
30              
31 0           my $self = bless \do { my $o = Class::Std::Fast::ID() }, $class;
  0            
32 0           $self->set_prefix_resolver( $arg_ref->{ prefix_resolver });
33 0           $self->set_definitions( $arg_ref->{ definitions });
34 0           return $self; # returns 'MyPlugin'
35             }
36              
37             sub _get_prefix {
38 0     0     my ($self, $type, $node) = @_;
39 0 0         my $namespace = defined ($node)
    0          
40             ? ref($node)
41             ? $node->get_targetNamespace()
42             : $node
43             : undef;
44 0 0         return $self->get_prefix_resolver()->resolve_prefix(
45             $type,
46             $namespace,
47             ref($node)
48             ? $node
49             : undef
50             );
51             }
52              
53             sub create_xsd_name {
54 0     0 0   my ($self, $node) = @_;
55 0 0 0       confess "no node $node" if not defined($node)
56             or $node eq "";
57 0           my $name = $self->_resolve_prefix($node) #. '::'
58             . $node->get_name();
59 0           return $self->perl_name( $name );
60             }
61              
62             sub create_typemap_name {
63 0     0 0   my ($self, $node) = @_;
64 0           my $name = $self->_get_prefix('typemap') #. '::'
65             . $node->get_name();
66 0           return $self->perl_name( $name );
67             }
68              
69             sub create_server_name {
70 0     0 0   my ($self, $server, $port) = @_;
71 0           my $port_name = $port->get_name();
72 0           $port_name =~s{\A (?:.+)\. ([^\.]+) \z}{$1}x;
73 0           my $name = join( q{},
74             $self->_get_prefix('server', $server),
75             join( '::', $server->get_name(), $port_name)
76             );
77 0           return $self->perl_name( $name );
78             }
79              
80             sub create_interface_name {
81 0     0 0   my ($self, $server, $port) = @_;
82 0           my $port_name = $port->get_name();
83 0           $port_name =~s{\A (?:.+)\. ([^\.]+) \z}{$1}x;
84 0           my $name = join( q{},
85             $self->_get_prefix('interface', $server),
86             join( '::', $server->get_name(), $port_name )
87             );
88 0           return $self->perl_name( $name );
89             }
90              
91             sub _resolve_prefix {
92 0     0     my ($self, $node) = @_;
93              
94 0 0         if ($node->isa('SOAP::WSDL::XSD::Builtin')) {
95 0           return $self->_get_prefix('type', $node)
96             }
97 0 0 0       if ( $node->isa('SOAP::WSDL::XSD::SimpleType')
98             or $node->isa('SOAP::WSDL::XSD::ComplexType')
99             ) {
100 0           return $self->_get_prefix('type', $node);
101             }
102 0 0         if ( $node->isa('SOAP::WSDL::XSD::Element') ) {
103 0           return $self->_get_prefix('element', $node);
104             }
105 0 0         if ( $node->isa('SOAP::WSDL::XSD::Attribute') ) {
106 0           return $self->_get_prefix('attribute', $node);
107             }
108             }
109              
110             sub perl_name {
111 0     0 1   my $self = shift;
112 0           my $name = shift;
113 0           $name =~s{\-}{_}xmsg;
114 0           $name =~s{\.}{::}xmsg;
115 0           return $name;
116             }
117              
118             sub perl_var_name {
119 0     0 0   my $self = shift;
120 0           my $name = shift;
121 0           $name =~s{\-}{_}xmsg;
122 0           $name =~s{\.}{__}xmsg;
123 0           return $name;
124             }
125              
126             sub create_subpackage_name {
127 0     0 0   my $self = shift;
128 0           my $arg_ref = shift;
129 0 0         my $type = ref $arg_ref eq 'HASH' ? $arg_ref->{ value } : $arg_ref;
130              
131 0   0       my @name_from = $type->get_name() || (); ;
132              
133             # search for top node in tree (the one directly below the Schema)
134 0           my $parent = $type;
135 0           my $top_node = $parent;
136 0 0         if (! $parent->get_parent()->isa('SOAP::WSDL::XSD::Schema') ) {
137 0           NAMES: while ($parent = $parent->get_parent()) {
138 0           $top_node = $parent;
139 0 0         last NAMES if $parent->get_parent()->isa('SOAP::WSDL::XSD::Schema');
140             # skip empty names - atomic types have no name...
141 0 0         unshift @name_from, $parent->get_name()
142             if $parent->get_name();
143             }
144             }
145             # create name for top node
146 0 0         die "No top node found" if not defined $top_node;
147 0           my $top_node_name = $self->create_xsd_name($top_node);
148 0 0         my $package_name = join('::_', $top_node_name , (@name_from) ? join('::', @name_from) : () );
149              
150             # replace dots by :: in name - subpackage names may include dots, too
151 0           $package_name =~s{\.}{::}xg;
152              
153 0           return $package_name;
154             }
155              
156             sub create_xmlattr_name {
157 0     0 0   return join '::', shift->create_subpackage_name(shift), 'XmlAttr';
158             }
159              
160             sub element_name {
161 0     0 0   my $self = shift;
162 0           my $element = shift;
163              
164 0 0         confess "no element object" unless blessed $element;
165              
166 0           my $name = $element->get_name();
167 0 0         if (! $name) {
168 0           while (my $ref = $element->get_ref()) {
169 0           $element = $self->get_definitions()->first_types()
170             ->find_element($element->expand( $ref ) );
171 0           $name = $element->get_name();
172 0 0         last if ($name);
173             }
174             }
175 0           return $name;
176             }
177              
178             1;
179              
180             =pod
181              
182             =head1 NAME
183              
184             SOAP::WSDL::Generator::Template::Plugin::XSD - Template plugin for the XSD generator
185              
186             =head1 METHODS
187              
188             =head2 perl_name
189              
190             XSD.perl_name(element.get_name);
191              
192             Converts a XML name into a valid perl name (valid for subroutines, variables
193             or the like).
194              
195             perl_name takes a crude approach by just replacing . and - (dot and dash)
196             with a underscore. This may or may not be sufficient, and may or may not
197             provoke collisions in your XML names.
198              
199             =head1 LICENSE AND COPYRIGHT
200              
201             Copyright 2008 Martin Kutter.
202              
203             This file is part of SOAP-WSDL. You may distribute/modify it under the same
204             terms as perl itself
205              
206             =head1 AUTHOR
207              
208             Martin Kutter Emartin.kutter fen-net.deE
209              
210             =head1 REPOSITORY INFORMATION
211              
212             $Rev: 564 $
213             $LastChangedBy: kutterma $
214             $Id: ComplexType.pm 564 2008-02-23 13:31:39Z kutterma $
215             $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm $
216              
217             =cut
218