# # Interface Definition Language (OMG IDL CORBA v3.0) # package CORBA::JAVA::ClassXmlVisitor; use strict; use warnings; our $VERSION = '2.63'; use CORBA::JAVA::ClassVisitor; use base qw(CORBA::JAVA::ClassVisitor); sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = {}; bless $self, $class; my ($parser) = @_; $self->{srcname} = $parser->YYData->{srcname}; $self->{srcname_size} = $parser->YYData->{srcname_size}; $self->{srcname_mtime} = $parser->YYData->{srcname_mtime}; $self->{symbtab} = $parser->YYData->{symbtab}; $self->{done_hash} = {}; $self->{num_key} = 'num_javaxml'; $self->{toString} = 1; $self->{equals} = 1; $self->{xml_pkg} = 'org.omg.CORBA.portable.XML'; return $self; } # # 3.8 Interface Declaration # sub _interface_helperXML { my ($self, $node) = @_; $self->open_stream($node, 'HelperXML.java'); my $FH = $self->{out}; print $FH "abstract public class ",$node->{java_helper},"HelperXML\n"; print $FH "{\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is)\n"; print $FH " {\n"; print $FH " return read (\$is, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is, java.lang.String tag)\n"; print $FH " {\n"; print $FH " // TODO\n"; print $FH " return null;\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value)\n"; print $FH " {\n"; print $FH " write (\$os, value, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value, java.lang.String tag)\n"; print $FH " {\n"; print $FH " \$os.write_Object ((org.omg.CORBA.Object) value, tag);\n"; print $FH " }\n"; print $FH "\n"; print $FH "}\n"; close $FH; } # # 3.9 Value Declaration # # 3.9.1 Regular Value Type # sub _value_helperXML { my ($self, $node) = @_; $self->open_stream($node, 'HelperXML.java'); my $FH = $self->{out}; print $FH "abstract public class ",$node->{java_helper},"HelperXML\n"; print $FH "{\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is)\n"; print $FH " {\n"; print $FH " return read (\$is, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is, java.lang.String tag)\n"; print $FH " {\n"; print $FH " // TODO (Pb with instanciation)\n"; print $FH " return null;\n"; # print $FH " ",$node->{java_Name}," value = new ",$node->{java_Name}," ();\n"; # print $FH " \$is.read_open_tag (tag);\n"; my $idx = 0; # foreach (@{$node->{list_member}}) { # StateMember # my $member = $self->_get_defn($_); # $self->_member_helperXML_read($member, $node, \$idx); # } # print $FH " \$is.read_close_tag (tag);\n"; # print $FH " return value;\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value)\n"; print $FH " {\n"; print $FH " write (\$os, value, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value, java.lang.String tag)\n"; print $FH " {\n"; print $FH " \$os.write_open_tag (tag);\n"; $idx = 0; foreach (@{$node->{list_member}}) { # StateMember my $member = $self->_get_defn($_); $self->_member_helperXML_write($member, $node, \$idx); } print $FH " \$os.write_close_tag (tag);\n"; print $FH " }\n"; print $FH "\n"; print $FH "}\n"; close $FH; } # 3.9.2 Boxed Value Type # sub _boxed_helperXML { my ($self, $node, $type, $array, $type2, $array_max) = @_; $self->open_stream($node, 'HelperXML.java'); my $FH = $self->{out}; # print $FH "public final class ",$node->{java_helper},"HelperXML implements org.omg.CORBA.portable.BoxedValueHelperXML\n"; print $FH "public final class ",$node->{java_helper},"HelperXML\n"; print $FH "{\n"; print $FH "\n"; if (exists $node->{java_primitive}) { print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is)\n"; } else { print $FH " public static ",$type->{java_Name},@{$array}," read (",$self->{xml_pkg},"InputStream \$is)\n"; } print $FH " {\n"; print $FH " // TODO (PB instanciation)\n"; print $FH " return null;\n"; print $FH " }\n"; print $FH "\n"; if (exists $node->{java_primitive}) { print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value)\n"; } else { print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$type->{java_Name},@{$array}," value)\n"; } print $FH " {\n"; print $FH " write (\$os, value, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; if (exists $node->{java_primitive}) { print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value, java.lang.String tag)\n"; } else { print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$type->{java_Name},@{$array}," value, java.lang.String tag)\n"; } print $FH " {\n"; print $FH " \$os.write_open_tag (tag);\n"; if (exists $node->{java_primitive}) { print $FH " ",$type->{java_write_xml},"value.value, \"value\");\n"; } else { my @tab = (q{ } x 4); my $i = 0; my $idx = q{}; my $tag; my $nb_item = scalar(@{$array}); if (exists $node->{array_size}) { foreach (@{$node->{array_size}}) { $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"value\""; print $FH @tab,"\$os.write_open_tag (",$tag,");\n"; print $FH @tab,"if (value",$idx,".length != (",$_->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; print $FH @tab,"for (int _i",$i," = 0; _i",$i," < (",$_->{java_literal},"); _i",$i,"++)\n"; print $FH @tab,"{\n"; $idx .= '[_i' . $i . ']'; $i ++; push @tab, q{ } x 2; } } foreach (@{$array_max}) { $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"value\""; print $FH @tab,"\$os.write_open_tag (",$tag,");\n"; if (defined $_) { print $FH @tab,"if (value",$idx,".length > (",$_->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; } print $FH @tab,"for (int _i",$i," = 0; _i",$i," < value",$idx,".length; _i",$i,"++)\n"; print $FH @tab,"{\n"; $idx .= '[_i' . $i . ']'; $i ++; push @tab, q{ } x 2; } if (($type2->isa('StringType') or $type2->isa('WideStringType')) and exists $type2->{max}) { print $FH @tab,"if (value",$idx,".length () > (",$type2->{max}->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; } $tag = $i ? "\"item\"" : "\"value\""; print $FH @tab,$type2->{java_write_xml},"value",$idx,", ",$tag,");\n"; foreach (@{$array_max}) { pop @tab; $i --; $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"value\""; print $FH @tab,"}\n"; print $FH @tab,"\$os.write_close_tag (",$tag,");\n"; } if (exists $node->{array_size}) { foreach (@{$node->{array_size}}) { pop @tab; $i --; $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"value\""; print $FH @tab,"}\n"; print $FH @tab,"\$os.write_close_tag (",$tag,");\n"; } } } print $FH " \$os.write_close_tag (tag);\n"; print $FH " }\n"; print $FH "\n"; print $FH "}\n"; close $FH; } # # 3.11 Type Declaration # sub _typedeclarator_helperXML { my ($self, $node, $type, $array, $type2, $array_max) = @_; $self->open_stream($node, 'HelperXML.java'); my $FH = $self->{out}; print $FH "abstract public class ",$node->{java_helper},"HelperXML\n"; print $FH "{\n"; print $FH "\n"; print $FH " public static ",$type->{java_Name},@{$array}," read (",$self->{xml_pkg},"InputStream \$is)\n"; print $FH " {\n"; print $FH " return read (\$is, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static ",$type->{java_Name},@{$array}," read (",$self->{xml_pkg},"InputStream \$is, java.lang.String tag)\n"; print $FH " {\n"; if (scalar(@{$array})) { print $FH " ",$type->{java_Name}," value",@{$array}," = null;\n"; } else { print $FH " ",$type->{java_Name}," value = ",$type->{java_init},";\n"; } my @tab = (q{ } x 4); my $i = 0; my $idx = q{}; my @array1= @{$array}; my $tag; my $nb_item = scalar(@{$array}); if (exists $node->{array_size}) { foreach (@{$node->{array_size}}) { $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "tag"; pop @array1; print $FH @tab,"\$is.read_open_tag (",$tag,");\n"; print $FH @tab,"value",$idx," = new ",$type->{java_Name}," [",$_->{java_literal},"]",@array1,";\n"; print $FH @tab,"for (int _o",$i," = 0; _o",$i," < (",$_->{java_literal},"); _o",$i,"++)\n"; print $FH @tab,"{\n"; $idx .= '[_o' . $i . ']'; $i ++; push @tab, q{ } x 2; } } foreach (@{$array_max}) { $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "tag"; pop @array1; print $FH @tab,"\$is.read_open_tag (",$tag,");\n"; print $FH @tab,"value",$idx," = new ",$type->{java_Name}," [0]",@array1,";\n"; print $FH @tab,"for (int _o",$i," = 0; true; _o",$i,"++)\n"; print $FH @tab,"{\n"; print $FH @tab," try {\n"; $idx .= '[_o' . $i . ']'; $i ++; push @tab, q{ } x 4; } $tag = $i ? "\"item\"" : "tag"; print $FH @tab,"value",$idx," = ",$type2->{java_read_xml},$tag,");\n"; if (($type2->isa('StringType') or $type2->isa('WideStringType')) and exists $type2->{max}) { print $FH @tab,"if (value",$idx,".length () > (",$type2->{max}->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; } foreach (@{$array_max}) { pop @tab; $i --; $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "tag"; $idx =~ s/\[[^\]]+\]$//; print $FH @tab," }\n"; print $FH @tab," catch (Exception \$ex) {\n"; print $FH @tab," break;\n"; print $FH @tab," }\n"; print $FH @tab,"}\n"; if (defined $_) { print $FH @tab,"if (value",$idx,".length > (",$_->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; } print $FH @tab,"\$is.read_close_tag (",$tag,");\n"; } if (exists $node->{array_size}) { foreach (@{$node->{array_size}}) { pop @tab; $i --; $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "tag"; print $FH @tab,"}\n"; print $FH @tab,"\$is.read_close_tag (",$tag,");\n"; } } print $FH " return value;\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$type->{java_Name},@{$array}," value)\n"; print $FH " {\n"; print $FH " write (\$os, value, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$type->{java_Name},@{$array}," value, java.lang.String tag)\n"; print $FH " {\n"; @tab = (q{ } x 4); $i = 0; $idx = q{}; if (exists $node->{array_size}) { foreach (@{$node->{array_size}}) { $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "tag"; print $FH @tab,"\$os.write_open_tag (",$tag,");\n"; print $FH @tab,"if (value",$idx,".length != (",$_->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; print $FH @tab,"for (int _i",$i," = 0; _i",$i," < (",$_->{java_literal},"); _i",$i,"++)\n"; print $FH @tab,"{\n"; $idx .= '[_i' . $i . ']'; $i ++; push @tab, q{ } x 2; } } foreach (@{$array_max}) { $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "tag"; print $FH @tab,"\$os.write_open_tag (",$tag,");\n"; if (defined $_) { print $FH @tab,"if (value",$idx,".length > (",$_->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; } print $FH @tab,"for (int _i",$i," = 0; _i",$i," < value",$idx,".length; _i",$i,"++)\n"; print $FH @tab,"{\n"; $idx .= '[_i' . $i . ']'; $i ++; push @tab, q{ } x 2; } if (($type2->isa('StringType') or $type2->isa('WideStringType')) and exists $type2->{max}) { print $FH @tab,"if (value",$idx,".length () > (",$type2->{max}->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; } $tag = $i ? "\"item\"" : "tag"; print $FH @tab,$type2->{java_write_xml},"value",$idx,", ",$tag,");\n"; foreach (@{$array_max}) { pop @tab; $i --; $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "tag"; print $FH @tab,"}\n"; print $FH @tab,"\$os.write_close_tag (",$tag,");\n"; } if (exists $node->{array_size}) { foreach (@{$node->{array_size}}) { pop @tab; $i --; $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "tag"; print $FH @tab,"}\n"; print $FH @tab,"\$os.write_close_tag (",$tag,");\n"; } } print $FH " }\n"; print $FH "\n"; print $FH "}\n"; close $FH; } # # 3.11.2 Constructed Types # # 3.11.2.1 Structures # sub _struct_helperXML { my ($self, $node) = @_; $self->open_stream($node, 'HelperXML.java'); my $FH = $self->{out}; print $FH "abstract public class ",$node->{java_name},"HelperXML\n"; print $FH "{\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is)\n"; print $FH " {\n"; print $FH " return read (\$is, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is, java.lang.String tag)\n"; print $FH " {\n"; print $FH " ",$node->{java_Name}," value = new ",$node->{java_Name}," ();\n"; print $FH " \$is.read_open_tag (tag);\n"; my $idx = 0; foreach (@{$node->{list_member}}) { my $member = $self->_get_defn($_); $self->_member_helperXML_read($member, $node, \$idx); } print $FH " \$is.read_close_tag (tag);\n"; print $FH " return value;\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value)\n"; print $FH " {\n"; print $FH " write (\$os, value, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value, java.lang.String tag)\n"; print $FH " {\n"; print $FH " \$os.write_open_tag (tag);\n"; $idx = 0; foreach (@{$node->{list_member}}) { my $member = $self->_get_defn($_); $self->_member_helperXML_write($member, $node, \$idx); } print $FH " \$os.write_close_tag (tag);\n"; print $FH " }\n"; print $FH "\n"; print $FH "}\n"; close $FH; } sub _member_helperXML_read { my $self = shift; my ($member, $parent, $r_idx) = @_; my $FH = $self->{out}; my $label = q{}; # unless ($member->isa('StateMember')) { if ($parent->isa('UnionType')) { $label = '_'; } else { # StructType or ExceptionType $label = 'value.'; } # } my $type = $self->_get_defn($member->{type}); my $name = $member->{java_name}; my @tab = (q{ } x 4); push @tab, q{ } x 4 if ($parent->isa('UnionType')); my $idx = q{}; my $i = 0; my $tag; my @array1 = (); if (exists $member->{array_size}) { foreach (@{$member->{array_size}}) { push @array1, '[]'; } } my @array_max = (); while ($type->isa('SequenceType')) { if (exists $type->{max}) { push @array_max, $type->{max}; } else { push @array_max, undef; } push @array1, '[]'; $type = $self->_get_defn($type->{type}); } my $nb_item = scalar(@array_max); $nb_item += scalar(@{$member->{array_size}}) if (exists $member->{array_size}); if ($parent->isa('UnionType')) { print $FH @tab," ",$member->{java_type}," _",$member->{java_name}," = ",$member->{java_init},";\n"; } if (exists $member->{array_size}) { foreach (@{$member->{array_size}}) { $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"" . $member->{xsd_name} . "\""; pop @array1; print $FH @tab,"\$is.read_open_tag (",$tag,");\n"; if ($parent->isa('UnionType')) { print $FH @tab,"_",$name,$idx," = new ",$type->{java_Name}," [",$_->{java_literal},"]",@array1,";\n"; } else { # StructType or ExceptionType print $FH @tab,"value.",$name,$idx," = new ",$type->{java_Name}," [",$_->{java_literal},"]",@array1,";\n"; } print $FH @tab,"for (int _o",$$r_idx," = 0; _o",$$r_idx," < (",$_->{java_literal},"); _o",$$r_idx,"++)\n"; print $FH @tab,"{\n"; $idx .= '[_o' . $$r_idx . ']'; $$r_idx ++; $i ++; push @tab, q{ } x 2; } } foreach (@array_max) { $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"" . $member->{xsd_name} . "\""; pop @array1; print $FH @tab,"\$is.read_open_tag (",$tag,");\n"; if ($parent->isa('UnionType')) { print $FH @tab,"_",$name,$idx," = new ",$type->{java_Name}," [0]",@array1,";\n"; } else { # StructType or ExceptionType print $FH @tab,"value.",$name,$idx," = new ",$type->{java_Name}," [0]",@array1,";\n"; } print $FH @tab,"for (int _o",$$r_idx," = 0; true; _o",$$r_idx,"++)\n"; print $FH @tab,"{\n"; print $FH @tab," try {\n"; $idx .= '[_o' . $$r_idx . ']'; $$r_idx ++; $i ++; push @tab, q{ } x 4; } $tag = $i ? "\"item\"" : "\"" . $member->{xsd_name} . "\""; if ($parent->isa('UnionType')) { print $FH @tab,"_",$name,$idx," = ",$type->{java_read_xml},$tag,");\n"; } else { # StructType or ExceptionType print $FH @tab,"value.",$name,$idx," = ",$type->{java_read_xml},$tag,");\n"; } if (($type->isa('StringType') or $type->isa('WideStringType')) and exists $type->{max}) { print $FH @tab,"if (",$label,$name,$idx,".length () > (",$type->{max}->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; } foreach (@array_max) { pop @tab; $i --; $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"" . $member->{xsd_name} . "\""; $idx =~ s/\[[^\]]+\]$//; print $FH @tab," }\n"; print $FH @tab," catch (Exception \$ex) {\n"; print $FH @tab," break;\n"; print $FH @tab," }\n"; print $FH @tab,"}\n"; if (defined $_) { print $FH @tab,"if (value",$idx,".length > (",$_->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; } print $FH @tab,"\$is.read_close_tag (",$tag,");\n"; } if (exists $member->{array_size}) { foreach (@{$member->{array_size}}) { pop @tab; $i --; $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"" . $member->{xsd_name} . "\""; print $FH @tab,"}\n"; print $FH @tab,"\$is.read_close_tag (",$tag,");\n"; pop @tab; } } } sub _member_helperXML_write { my $self = shift; my ($member, $parent, $r_idx) = @_; my $FH = $self->{out}; # my $label = ($member->isa('StateMember')) ? q{} : 'value.'; my $label = 'value.'; my $type = $self->_get_defn($member->{type}); my $name = $member->{java_name}; my @tab = (q{ } x 4); push @tab, q{ } x 4 if ($parent->isa('UnionType')); my $idx = q{}; my $i = 0; my $tag; my @array_max = (); while ($type->isa('SequenceType')) { if (exists $type->{max}) { push @array_max, $type->{max}; } else { push @array_max, undef; } $type = $self->_get_defn($type->{type}); } my $nb_item = scalar(@array_max); $nb_item += scalar(@{$member->{array_size}}) if (exists $member->{array_size}); if (exists $member->{array_size}) { foreach (@{$member->{array_size}}) { $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"" . $member->{xsd_name} . "\""; print $FH @tab,"\$os.write_open_tag (",$tag,");\n"; print $FH @tab,"if (value.",$name,$idx,".length != (",$_->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; print $FH @tab,"for (int _i",$$r_idx," = 0; _i",$$r_idx," < (",$_->{java_literal},"); _i",$$r_idx,"++)\n"; print $FH @tab,"{\n"; $idx .= '[_i' . $$r_idx . ']'; $$r_idx ++; $i ++; push @tab, q{ } x 2; } } foreach (@array_max) { $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"" . $member->{xsd_name} . "\""; print $FH @tab,"\$os.write_open_tag (",$tag,");\n"; if (defined $_) { print $FH @tab,"if (value.",$name,$idx,".length > (",$_->{java_literal},"))\n"; print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; } print $FH @tab,"for (int _i",$$r_idx," = 0; _i",$$r_idx," < value.",$name,$idx,".length; _i",$$r_idx,"++)\n"; print $FH @tab,"{\n"; $idx .= '[_i' . $$r_idx . ']'; $$r_idx ++; $i ++; push @tab, q{ } x 2; } if (($type->isa('StringType') or $type->isa('WideStringType')) and exists $type->{max}) { if ($parent->isa('UnionType')) { print $FH @tab,"if (",$label,$name,$idx," ().length () > (",$type->{max}->{java_literal},"))\n"; } else { # StructType or ExceptionType print $FH @tab,"if (",$label,$name,$idx,".length () > (",$type->{max}->{java_literal},"))\n"; } print $FH @tab," throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);\n"; } $tag = $i ? "\"item\"" : "\"" . $member->{xsd_name} . "\""; if ($parent->isa('UnionType')) { print $FH @tab,$type->{java_write_xml},"value.",$name," ()",$idx,", ",$tag,");\n"; } else { # StructType or ExceptionType print $FH @tab,$type->{java_write_xml},"value.",$name,$idx,", ",$tag,");\n"; } foreach (@array_max) { pop @tab; $i --; $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"" . $member->{xsd_name} . "\""; print $FH @tab,"}\n"; print $FH @tab,"\$os.write_close_tag (",$tag,");\n"; } if (exists $member->{array_size}) { foreach (@{$member->{array_size}}) { pop @tab; $i --; $tag = $i ? "\"item" . ($nb_item - $i) . "\"" : "\"" . $member->{xsd_name} . "\""; print $FH @tab,"}\n"; print $FH @tab,"\$os.write_close_tag (",$tag,");\n"; } } } # 3.11.2.2 Discriminated Unions # sub _union_helperXML { my ($self, $node, $dis, $effective_dis) = @_; $self->open_stream($node, 'HelperXML.java'); my $FH = $self->{out}; print $FH "abstract public class ",$node->{java_name},"HelperXML\n"; print $FH "{\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is)\n"; print $FH " {\n"; print $FH " return read (\$is, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is, java.lang.String tag)\n"; print $FH " {\n"; print $FH " ",$node->{java_Name}," value = new ",$node->{java_Name}," ();\n"; print $FH " ",$effective_dis->{java_Name}," _dis0 = ",$effective_dis->{java_init},";\n"; print $FH " \$is.read_open_tag (tag);\n"; print $FH " _dis0 = ",$dis->{java_read_xml},"\"discriminator\");\n"; if ($effective_dis->isa('EnumType')) { print $FH " switch (_dis0.value ())\n"; } else { print $FH " switch (_dis0)\n"; } print $FH " {\n"; my $idx = 0; foreach my $case (@{$node->{list_expr}}) { my $flag_default = 0; foreach (@{$case->{list_label}}) { # default or expression if ($_->isa('Default')) { print $FH " default:\n"; $flag_default = 1; } else { print $FH " case ",$_->{java_literal},":\n"; } } my $elt = $case->{element}; my $value = $self->_get_defn($elt->{value}); $self->_member_helperXML_read($value, $node, \$idx); if (scalar(@{$case->{list_label}}) > 1 || $flag_default) { if ($effective_dis->isa('EnumType')) { print $FH " value.",$value->{java_name}," (_dis0.value (), _",$value->{java_name},");\n"; } else { print $FH " value.",$value->{java_name}," (_dis0, _",$value->{java_name},");\n"; } } else { print $FH " value.",$value->{java_name}," (_",$value->{java_name},");\n"; } print $FH " break;\n"; } if (exists $node->{need_default}) { print $FH " default:\n"; print $FH " throw new org.omg.CORBA.BAD_OPERATION ();\n"; } print $FH " }\n"; print $FH " \$is.read_close_tag (tag);\n"; print $FH " return value;\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value)\n"; print $FH " {\n"; print $FH " write (\$os, value, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value, java.lang.String tag)\n"; print $FH " {\n"; print $FH " \$os.write_open_tag (tag);\n"; print $FH " ",$dis->{java_write_xml},"value.discriminator (), \"discriminator\");\n"; if ($effective_dis->isa('EnumType')) { print $FH " switch (value.discriminator ().value ())\n"; } else { print $FH " switch (value.discriminator ())\n"; } print $FH " {\n"; $idx = 0; foreach my $case (@{$node->{list_expr}}) { foreach (@{$case->{list_label}}) { # default or expression if ($_->isa('Default')) { print $FH " default:\n"; } else { print $FH " case ",$_->{java_literal},":\n"; } } my $elt = $case->{element}; my $value = $self->_get_defn($elt->{value}); $self->_member_helperXML_write($value, $node, \$idx); print $FH " break;\n"; } if (exists $node->{need_default}) { print $FH " default:\n"; print $FH " throw new org.omg.CORBA.BAD_OPERATION ();\n"; } print $FH " }\n"; print $FH " \$os.write_close_tag (tag);\n"; print $FH " }\n"; print $FH "\n"; print $FH "}\n"; close $FH; } # 3.11.2.4 Enumerations # sub _enum_helperXML { my ($self, $node) = @_; $self->open_stream($node, 'HelperXML.java'); my $FH = $self->{out}; print $FH "abstract public class ",$node->{java_name},"HelperXML\n"; print $FH "{\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is)\n"; print $FH " {\n"; print $FH " return read (\$is, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is, java.lang.String tag)\n"; print $FH " {\n"; print $FH " \$is.read_open_tag (tag);\n"; print $FH " java.lang.String str = \$is.read_pcdata ();\n"; print $FH " \$is.read_close_tag (tag);\n"; foreach (@{$node->{list_expr}}) { print $FH " if (str.equals (\"",$_->{java_name},"\"))\n"; print $FH " return ",$_->{java_Name},";\n"; } print $FH " throw new org.omg.CORBA.BAD_PARAM ();\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value)\n"; print $FH " {\n"; print $FH " write (\$os, value, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value, java.lang.String tag)\n"; print $FH " {\n"; print $FH " \$os.write_open_tag (tag);\n"; print $FH " \$os.write_pcdata (value.toString ());\n"; print $FH " \$os.write_close_tag (tag);\n"; print $FH " }\n"; print $FH "\n"; print $FH "}\n"; close $FH; } # # 3.12 Exception Declaration # sub _exception_helperXML { my ($self, $node) = @_; $self->open_stream($node, 'HelperXML.java'); my $FH = $self->{out}; print $FH "abstract public class ",$node->{java_name},"HelperXML\n"; print $FH "{\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is)\n"; print $FH " {\n"; print $FH " return read (\$is, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static ",$node->{java_Name}," read (",$self->{xml_pkg},"InputStream \$is, java.lang.String tag)\n"; print $FH " {\n"; print $FH " ",$node->{java_Name}," value = new ",$node->{java_Name}," ();\n"; print $FH " \$is.read_open_tag (tag);\n"; my $idx = 0; foreach (@{$node->{list_member}}) { my $member = $self->_get_defn($_); $self->_member_helperXML_read($member, $node, \$idx); } print $FH " \$is.read_close_tag (tag);\n"; print $FH " return value;\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value)\n"; print $FH " {\n"; print $FH " write (\$os, value, \"",$node->{xsd_name},"\");\n"; print $FH " }\n"; print $FH "\n"; print $FH " public static void write (",$self->{xml_pkg},"OutputStream \$os, ",$node->{java_Name}," value, java.lang.String tag)\n"; print $FH " {\n"; print $FH " \$os.write_open_tag (tag);\n"; $idx = 0; foreach (@{$node->{list_member}}) { my $member = $self->_get_defn($_); $self->_member_helperXML_write($member, $node, \$idx); } print $FH " \$os.write_close_tag (tag);\n"; print $FH " }\n"; print $FH "\n"; print $FH "}\n"; close $FH; } 1;