/usr/local/CPAN/CORBA-JAVA/CORBA/JAVA/UidVisitor.pm
#
# Interface Definition Language (OMG IDL CORBA v3.0)
#
# IDL to Java Language Mapping Specification, Version 1.2 August 2002
#
package CORBA::JAVA::UidVisitor;
use strict;
use warnings;
our $VERSION = '2.61';
use Data::Dumper;
use Digest::SHA1 qw(sha1_hex);
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
bless $self, $class;
my ($parser) = @_;
$self->{symbtab} = $parser->YYData->{symbtab};
return $self;
}
sub _get_defn {
my $self = shift;
my ($defn) = @_;
if (ref $defn) {
return $defn;
}
else {
return $self->{symbtab}->Lookup($defn);
}
}
sub _get_uid {
my $self = shift;
my ($tree) = @_;
return uc(substr(sha1_hex(Dumper($tree)), 0, 16));
}
#
# 3.5 OMG IDL Specification
#
sub visitSpecification {
my $self = shift;
my ($node) = @_;
if (exists $node->{list_import}) {
foreach (@{$node->{list_import}}) {
$self->_get_defn($_)->visit($self);
}
}
foreach (@{$node->{list_export}}) {
$self->{symbtab}->Lookup($_)->visit($self);
}
}
#
# 3.6 Import Declaration
#
sub visitImport {
my $self = shift;
my ($node) = @_;
foreach (@{$node->{list_decl}}) {
$self->_get_defn($_)->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->{java_uid});
foreach (@{$node->{list_export}}) {
$self->{symbtab}->Lookup($_)->visit($self);
}
my $uid = {};
$uid->{$node->{java_name}} = undef;
if (exists $node->{inheritance}) {
if (exists $node->{inheritance}->{list_interface}) {
foreach (@{$node->{inheritance}->{list_interface}}) {
my $base = $self->_get_defn($_);
$uid->{$base->{java_name}} = $base->{java_uid};
}
}
if (exists $node->{inheritance}->{list_value}) {
foreach (@{$node->{inheritance}->{list_value}}) {
my $base = $self->_get_defn($_);
$uid->{$base->{java_name}} = $base->{java_uid};
}
}
}
if ($node->{list_member}) {
foreach (@{$node->{list_member}}) {
my $defn = $self->_get_defn($_);
$defn->visit($self); # 'Member'
$uid->{$defn->{java_name}} = $defn->{java_type};
}
}
$node->{java_uid} = $self->_get_uid($uid);
}
sub visitForwardBaseInterface {
# empty
}
#
# 3.9 Value Declaration
#
sub visitStateMember {
# empty
}
sub visitInitializer {
# empty
}
sub visitBoxedValue {
my $self = shift;
my ($node) = @_;
return if (exists $node->{java_uid});
my $type = $self->_get_defn($node->{type});
$type->visit($self);
my $uid = {};
$uid->{$node->{java_name}} = $node->{java_type_code};
$node->{java_uid} = $self->_get_uid($uid);
}
#
# 3.10 Constant Declaration
#
sub visitConstant {
# empty
}
#
# 3.11 Type Declaration
#
sub visitTypeDeclarator {
my $self = shift;
my ($node) = @_;
my $type = $self->_get_defn($node->{type});
$type->visit($self);
}
sub visitNativeType {
# empty
}
#
# 3.11.1 Basic Types
#
sub visitBasicType {
# empty
}
#
# 3.11.2 Constructed Types
#
# 3.11.2.1 Structures
#
sub visitStructType {
my $self = shift;
my ($node) = @_;
return if (exists $node->{java_uid});
my $uid = {};
foreach (@{$node->{list_member}}) {
my $defn = $self->_get_defn($_);
$uid->{$defn->{java_name}} = $defn->{java_type};
$self->_get_defn($defn->{type})->visit($self);
}
$node->{java_uid} = $self->_get_uid($uid);
}
# 3.11.2.2 Discriminated Unions
#
sub visitUnionType {
my $self = shift;
my ($node) = @_;
return if (exists $node->{java_uid});
$self->_get_defn($node->{type})->visit($self);
my $uid = {};
$uid->{_d} = $self->_get_defn($node->{type})->{java_type};
foreach (@{$node->{list_expr}}) {
my $elt = $self->_get_defn($_->{element});
$elt->visit($self);
foreach my $label (@{$_->{list_label}}) {
if (ref $label eq 'CORBA::IDL::Default') {
$uid->{default} = $elt->{java_Name};
}
else {
$uid->{$label->{java_literal}} = $elt->{java_Name};
}
}
}
$node->{java_uid} = $self->_get_uid($uid);
}
sub visitElement {
my $self = shift;
my ($node) = @_;
my $member = $self->_get_defn($node->{value});
$self->_get_defn($member->{type})->visit($self);
}
# 3.11.2.4 Enumerations
#
sub visitEnumType {
my $self = shift;
my ($node) = @_;
my $uid = {};
foreach (@{$node->{list_expr}}) {
$uid->{$_->{java_name}} = undef;
}
$node->{java_uid} = $self->_get_uid($uid);
}
#
# 3.11.3 Template Types
#
sub visit_TemplateType {
# empty
}
#
# 3.12 Exception Declaration
#
sub visitException {
shift->visitStructType(@_);
}
#
# 3.13 Operation Declaration
#
sub visitOperation {
# empty
}
#
# 3.14 Attribute Declaration
#
sub visitAttribute {
# empty
}
#
# 3.15 Repository Identity Related Declarations
#
sub visitTypeId {
# empty
}
sub visitTypePrefix {
# empty
}
#
# 3.16 Event Declaration
#
#
# 3.17 Component Declaration
#
sub visitProvides {
# empty
}
sub visitUses {
# empty
}
sub visitPublishes {
# empty
}
sub visitEmits {
# empty
}
sub visitConsumes {
# empty
}
#
# 3.18 Home Declaration
#
sub visitFactory {
# empty
}
sub visitFinder {
# empty
}
1;