/usr/local/CPAN/CORBA-XMLSchemas/CORBA/XMLSchemas/NameVisitor.pm
#
# Interface Definition Language (OMG IDL CORBA v3.0)
#
# CORBA to WSDL/SOAP Interworking Specification, Version 1.1 February 2005
#
package CORBA::XMLSchemas::NameVisitor;
use strict;
use warnings;
our $VERSION = '2.60';
# builds $node->{xsd_name} and $node->{xsd_qname}
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
bless $self, $class;
my ($parser, $ns) = @_;
$self->{key} = 'xsd_name';
$self->{tns} = 'tns:';
$self->{xsd} = 'xs:';
$self->{xsd} = $ns . ':' if (defined $ns);
$self->{corba} = 'corba:';
$self->{symbtab} = $parser->YYData->{symbtab};
$self->{root} = $parser->YYData->{root};
return $self;
}
sub _get_defn {
my $self = shift;
my ($defn) = @_;
if (ref $defn) {
return $defn;
}
else {
return $self->{symbtab}->Lookup($defn);
}
}
#
# See 1.2 Scoped Names
#
sub _get_name {
my $self = shift;
my ($node) = @_;
my $name = $node->{full};
$name =~ s/^:://;
$name =~ s/::/\./g;
return $name;
}
#
# 3.5 OMG IDL Specification
#
sub visitSpecification {
my $self = shift;
my ($node) = @_;
if (exists $node->{list_import}) {
foreach (@{$node->{list_import}}) {
$_->visit($self);
}
}
foreach (@{$node->{list_export}}) {
$self->{symbtab}->Lookup($_)->visit($self);
}
}
#
# 3.7 Module Declaration
#
sub visitModules {
my $self = shift;
my ($node) = @_;
foreach (@{$node->{list_export}}) {
$self->{symbtab}->Lookup($_)->visit($self);
}
}
#
# 3.8 Interface Declaration
#
sub visitBaseInterface {
my $self = shift;
my ($node) = @_;
return if (exists $node->{xsd_name});
$node->{xsd_name} = $self->_get_name($node);
$node->{xsd_qname} = $self->{corba} . 'ObjectReference';
foreach (@{$node->{list_export}}) {
$self->{symbtab}->Lookup($_)->visit($self);
}
}
#
# 3.9 Value Declaration
#
sub visitRegularValue {
my $self = shift;
my ($node) = @_;
return if (exists $node->{xsd_name});
$node->{xsd_name} = $self->_get_name($node);
$node->{xsd_qname} = $self->{tns} . $node->{xsd_name};
foreach (@{$node->{list_export}}) {
$self->{symbtab}->Lookup($_)->visit($self);
}
}
sub visitStateMember {
shift->visitMember(@_);
}
sub visitInitializer {
# empty
}
sub visitBoxedValue {
shift->visitTypeDeclarator(@_);
}
#
# 3.10 Constant Declaration
#
sub visitConstant {
# empty
}
#
# 3.11 Type Declaration
#
sub visitTypeDeclarator {
my $self = shift;
my ($node) = @_;
return if (exists $node->{xsd_name});
$node->{xsd_name} = $self->_get_name($node);
$node->{xsd_qname} = $self->{tns} . $node->{xsd_name};
my $type = $self->_get_defn($node->{type});
$type->visit($self);
$self->{root}->{need_corba} = 1
if ($type->isa('BaseInterface'));
}
sub visitNativeType {
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = $node->{idf};
}
#
# 3.11.1 Basic Types
#
# See 1.2.6 Primitive Types
#
sub visitIntegerType {
my $self = shift;
my ($node) = @_;
if ($node->{value} eq 'short') {
$node->{xsd_name} = 'short';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
elsif ($node->{value} eq 'unsigned short') {
$node->{xsd_name} = 'unsignedShort';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
elsif ($node->{value} eq 'long') {
$node->{xsd_name} = 'int';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
elsif ($node->{value} eq 'unsigned long') {
$node->{xsd_name} = 'unsignedInt';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
elsif ($node->{value} eq 'long long') {
$node->{xsd_name} = 'long';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
elsif ($node->{value} eq 'unsigned long long') {
$node->{xsd_name} = 'unsignedLong';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
else {
warn __PACKAGE__,"::visitIntegerType $node->{value}.\n";
}
}
sub visitFloatingPtType {
my $self = shift;
my ($node) = @_;
if ($node->{value} eq 'float') {
$node->{xsd_name} = 'float';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
elsif ($node->{value} eq 'double') {
$node->{xsd_name} = 'double';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
elsif ($node->{value} eq 'long double') {
$node->{xsd_name} = 'double';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
else {
warn __PACKAGE__,"::visitFloatingPtType $node->{value}.\n";
}
}
sub visitCharType {
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = 'string';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
sub visitWideCharType {
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = 'string';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
sub visitBooleanType {
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = 'boolean';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
sub visitOctetType {
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = 'unsignedByte';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
sub visitAnyType { # See 1.2.7.8 Any
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = 'CORBA.Any';
$node->{xsd_qname} = $self->{corba} . $node->{xsd_name};
$self->{root}->{need_any} = 1;
}
sub visitObjectType { # See 1.2.5 Object References
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = 'ObjectReference';
$node->{xsd_qname} = $self->{corba} . $node->{xsd_name};
$self->{root}->{need_corba} = 1;
}
sub visitValueBaseType {
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = 'ObjectReference';
$node->{xsd_qname} = $self->{corba} . $node->{xsd_name};
$self->{root}->{need_corba} = 1;
}
#
# 3.11.2 Constructed Types
#
# 3.11.2.1 Structures
#
sub visitStructType {
my $self = shift;
my ($node) = @_;
return if (exists $node->{xsd_name});
$node->{xsd_name} = $self->_get_name($node);
$node->{xsd_qname} = $self->{tns} . $node->{xsd_name};
foreach (@{$node->{list_member}}) {
$self->_get_defn($_)->visit($self);
}
}
sub visitMember {
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = $node->{idf};
my $type = $self->_get_defn($node->{type});
$type->visit($self);
$self->{root}->{need_corba} = 1
if ($type->isa('BaseInterface'));
}
# 3.11.2.2 Discriminated Unions
#
sub visitUnionType {
my $self = shift;
my ($node) = @_;
return if (exists $node->{xsd_name});
$node->{xsd_name} = $self->_get_name($node);
$node->{xsd_qname} = $self->{tns} . $node->{xsd_name};
$self->_get_defn($node->{type})->visit($self);
foreach (@{$node->{list_expr}}) {
$_->{element}->visit($self); # element
}
}
sub visitElement {
my $self = shift;
my ($node) = @_;
$self->_get_defn($node->{value})->visit($self); # single or array
}
# 3.11.2.4 Enumerations
#
sub visitEnumType {
my $self = shift;
my ($node) = @_;
return if (exists $node->{xsd_name});
$node->{xsd_name} = $self->_get_name($node);
$node->{xsd_qname} = $self->{tns} . $node->{xsd_name};
foreach (@{$node->{list_expr}}) {
$_->visit($self); # enum
}
}
sub visitEnum {
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = $node->{idf};
}
#
# 3.11.3 Template Types
#
# See 1.2.7.5 Sequences
#
sub visitSequenceType {
my $self = shift;
my ($node) = @_;
my $type = $self->_get_defn($node->{type});
$type->visit($self);
$self->{root}->{need_corba} = 1
if ($type->isa('BaseInterface'));
}
#
# See 1.2.6 Primitive Types
#
sub visitStringType {
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = 'string';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
sub visitWideStringType {
shift->visitStringType(@_);
}
#
# See 1.2.7.9 Fixed
#
sub visitFixedPtType {
my $self = shift;
my ($node) = @_;
$node->{xsd_name} = 'decimal';
$node->{xsd_qname} = $self->{xsd} . $node->{xsd_name};
}
#
# 3.12 Exception Declaration
#
# See 1.2.8.5 Exceptions
#
sub visitException {
shift->visitStructType(@_);
}
#
# 3.13 Operation Declaration
#
# See 1.2.8.2 Interface as Binding Operation
#
sub visitOperation {
my $self = shift;
my ($node) = @_;
$self->{op} = $node->{idf};
$node->{xsd_name} = $self->_get_name($node);
$node->{xsd_qname} = $self->{tns} . $node->{xsd_name};
$self->_get_defn($node->{type})->visit($self);
foreach (@{$node->{list_param}}) {
$_->visit($self); # parameter
}
}
sub visitParameter {
my $self = shift;
my ($node) = @_;
if ($self->{op} =~ /^_set_/) {
$node->{xsd_name} = 'value';
}
else {
$node->{xsd_name} = $node->{idf};
}
my $type = $self->_get_defn($node->{type});
$type->visit($self);
$self->{root}->{need_corba} = 1
if ($type->isa('BaseInterface'));
}
sub visitVoidType {
# empty
}
#
# 3.14 Attribute Declaration
#
sub visitAttribute {
my $self = shift;
my ($node) = @_;
$node->{_get}->visit($self);
$node->{_set}->visit($self)
if (exists $node->{_set});
}
#
# 3.15 Repository Identity Related Declarations
#
sub visitTypeId {
# empty
}
sub visitTypePrefix {
# empty
}
#
# 3.16 Event Declaration
#
sub visitEvent {
# no mapping
}
#
# 3.17 Component Declaration
#
sub visitComponent {
# no mapping
}
sub visitForwardComponent {
# no mapping
}
sub visitProvides {
# no mapping
}
sub visitUses {
# no mapping
}
sub visitPublishes {
# no mapping
}
sub visitEmits {
# no mapping
}
sub visitConsumes {
# no mapping
}
#
# 3.18 Home Declaration
#
sub visitFactory {
# no mapping
}
sub visitFinder {
# no mapping
}
1;