@a = qw(Object boolean byte char short int float long double String Object[] boolean[] byte[] char[] short[] int[] float[] long[] double[] String[]); %class = qw(Object Object.class boolean Boolean.TYPE byte Byte.TYPE char Character.TYPE short Short.TYPE int Integer.TYPE float Float.TYPE long Long.TYPE double Double.TYPE String String.class); open CONV, "conversions"; for () { chomp; ($a, $b, $c) = split /\t/, $_; $conv{$a}{$b} = $c; } close CONV; for $a (@a) { $ua = "\u$a"; $typename = $ua; $typename =~ s/\[\]$/Array/; $typename =~ s/ObjectArray/Array/; open FILE, ">Push$typename.java"; print FILE "public abstract class Push$typename extends Push {\n"; for $b (@a) { if ($a eq $b) { print FILE " public abstract boolean push($b msg);\n"; } else { $conv = conv($b, $a); next if $conv eq ''; $conv =~ s/x/msg/; print FILE " public boolean push($b msg) { return push($conv); }\n"; } } print FILE "}\n"; close FILE; open FILE, ">Pull$typename.java"; print FILE "public abstract class Pull$typename extends Pull {\n"; for $b (@a) { $ub = "\u$b"; $b_typename = $ub; $b_typename =~ s/\[\]$/Array/; $methodB = "pull"; $methodB .= $b_typename; $methodB =~ s/Object//; if ($a eq $b) { print FILE " public abstract $b $methodB();\n"; } else { $methodA = "pull"; $methodA .= $typename; $methodA =~ s/Object//; $conv = conv($a, $b); next if $conv eq ''; $conv =~ s/x/$methodA()/; print FILE " public $b $methodB() { return $conv; }\n"; } } print FILE "}\n"; close FILE; } sub conv { my ($a, $b) = @_; my $c; if ($c = $conv{$a}{$b}) { return $c; } # todo: use proper conversions for the elements of the arrays if (($a eq 'Object' || ($a =~ /\[\]$/)) && $b =~ /\[\]$/) { $a =~ s/\[\]$//; $b =~ s/\[\]$//; return "($b"."[])Sockets.convertArray(x, $class{$b})"; } elsif ($b eq 'Object') { return "(Object)x"; } return ''; }