SequenceGen.java revision 608:7e06bf1dcb09
1/* 2 * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25/* 26 * COMPONENT_NAME: idl.toJava 27 * 28 * ORIGINS: 27 29 * 30 * Licensed Materials - Property of IBM 31 * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999 32 * RMI-IIOP v1.0 33 * 34 */ 35 36package com.sun.tools.corba.se.idl.toJavaPortable; 37 38// NOTES: 39// -F46082.51<daz> Remove -stateful feature; javaStatefulName() obsolete. 40// -D61056 <klr> Use Util.helperName 41 42import java.io.PrintWriter; 43import java.util.Hashtable; 44 45import com.sun.tools.corba.se.idl.InterfaceEntry; 46import com.sun.tools.corba.se.idl.PrimitiveEntry; 47import com.sun.tools.corba.se.idl.SequenceEntry; 48import com.sun.tools.corba.se.idl.StringEntry; 49import com.sun.tools.corba.se.idl.SymtabEntry; 50 51import com.sun.tools.corba.se.idl.constExpr.Expression; 52 53/** 54 * 55 **/ 56public class SequenceGen implements com.sun.tools.corba.se.idl.SequenceGen, JavaGenerator 57{ 58 /** 59 * Public zero-argument constructor. 60 **/ 61 public SequenceGen () 62 { 63 } // ctor 64 65 /** 66 * 67 **/ 68 public void generate (Hashtable symbolTable, SequenceEntry s, PrintWriter stream) 69 { 70 } // generator 71 72 /////////////// 73 // From JavaGenerator 74 75 public int helperType (int index, String indent, TCOffsets tcoffsets, String name, SymtabEntry entry, PrintWriter stream) 76 { 77 int offsetOfType = tcoffsets.offset (entry.type ().fullName ()); 78 if (offsetOfType >= 0) 79 { 80 // This code uses the deprecated create_recursive_sequence_tc() 81 // It should be eliminated when the API is removed from the ORB class 82 // Regardles, this code will not be emitted since updated emitters invoke 83 // method type() below instead of helperType() when handling sequences 84 85 // This is a recursive sequence 86 tcoffsets.set (null); 87 Expression maxSize = ((SequenceEntry)entry).maxSize (); 88 if (maxSize == null) 89 stream.println (indent + name + " = org.omg.CORBA.ORB.init ().create_recursive_sequence_tc (0, " + (offsetOfType - tcoffsets.currentOffset ()) + ");"); 90 else 91 stream.println (indent + name + " = org.omg.CORBA.ORB.init ().create_recursive_sequence_tc (" + Util.parseExpression (maxSize) + ", " + (offsetOfType - tcoffsets.currentOffset ()) + ");"); 92 tcoffsets.bumpCurrentOffset (4); // add indirection field 93 } 94 else 95 { 96 // This is a normal sequence 97 tcoffsets.set (entry); 98 index = ((JavaGenerator)entry.type ().generator ()).helperType (index + 1, indent, tcoffsets, name, entry.type (), stream); 99 Expression maxSize = ((SequenceEntry)entry).maxSize (); 100 if (maxSize == null) 101 stream.println (indent + name + " = org.omg.CORBA.ORB.init ().create_sequence_tc (0, " + name + ");"); 102 else 103 stream.println (indent + name + " = org.omg.CORBA.ORB.init ().create_sequence_tc (" + Util.parseExpression (maxSize) + ", " + name + ");"); 104 } 105 tcoffsets.bumpCurrentOffset (4); // add on the seq max size 106 return index; 107 } // helperType 108 109 public int type (int index, String indent, TCOffsets tcoffsets, String name, SymtabEntry entry, PrintWriter stream) { 110 int offsetOfType = tcoffsets.offset (entry.type ().fullName ()); 111 if (offsetOfType >= 0) 112 { 113 // This is a recursive sequence 114 tcoffsets.set (null); 115 116 // Need to fix later: how to get repositoryId of IDL type containing this sequence? 117 // entry.repositoryID().ID() returns empty string and 118 // Util.javaQualifiedName(entry) returns internal name which is not valid repId 119 120 stream.println (indent + name + " = org.omg.CORBA.ORB.init ().create_recursive_tc (" + "\"\"" + ");"); 121 tcoffsets.bumpCurrentOffset (4); // add indirection field 122 } 123 else 124 { 125 // This is a normal sequence 126 tcoffsets.set (entry); 127 index = ((JavaGenerator)entry.type ().generator ()).type (index + 1, indent, tcoffsets, name, entry.type (), stream); 128 Expression maxSize = ((SequenceEntry)entry).maxSize (); 129 if (maxSize == null) 130 stream.println (indent + name + " = org.omg.CORBA.ORB.init ().create_sequence_tc (0, " + name + ");"); 131 else 132 stream.println (indent + name + " = org.omg.CORBA.ORB.init ().create_sequence_tc (" + Util.parseExpression (maxSize) + ", " + name + ");"); 133 } 134 //stream.println (indent + name + " = " + Util.helperName (entry, true) + ".type ();"); // <d61056> 135 return index; 136 } // type 137 138 public void helperRead (String entryName, SymtabEntry entry, PrintWriter stream) 139 { 140 } // helperRead 141 142 public void helperWrite (SymtabEntry entry, PrintWriter stream) 143 { 144 } // helperWrite 145 146 public int read (int index, String indent, String name, SymtabEntry entry, PrintWriter stream) 147 { 148 SequenceEntry seq = (SequenceEntry)entry; 149 String length = "_len" + index++; 150 stream.println (indent + "int " + length + " = istream.read_long ();"); 151 if (seq.maxSize () != null) 152 { 153 stream.println (indent + "if (" + length + " > (" + Util.parseExpression (seq.maxSize ()) + "))"); 154 stream.println (indent + " throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);"); 155 } 156 String seqOfName; 157 try 158 { 159 seqOfName = Util.sansArrayInfo ((String)seq.dynamicVariable (Compile.typedefInfo)); 160 } 161 catch (NoSuchFieldException e) 162 { 163 seqOfName = seq.name (); 164 } 165 int startArray = seqOfName.indexOf ('['); 166 String arrayDcl = seqOfName.substring (startArray); 167 seqOfName = seqOfName.substring (0, startArray); 168 169 // For interfaces having state, e.g., valuetypes. 170 SymtabEntry seqOfEntry = (SymtabEntry)Util.symbolTable.get (seqOfName.replace ('.', '/')); 171 if (seqOfEntry != null && seqOfEntry instanceof InterfaceEntry && ((InterfaceEntry)seqOfEntry).state () != null) 172 // <f46082.51> Remove -stateful feature; javaStatefulName() obsolete. 173 //seqOfName = Util.javaStatefulName ((InterfaceEntry)seqOfEntry); 174 seqOfName = Util.javaName ((InterfaceEntry)seqOfEntry); 175 176 arrayDcl = arrayDcl.substring (2); 177 stream.println (indent + name + " = new " + seqOfName + '[' + length + ']' + arrayDcl + ';'); 178 if (seq.type () instanceof PrimitiveEntry) 179 // <d61961> Check for CORBA::Principal, too 180 //if (seq.type ().name ().equals ("any") || seq.type ().name ().equals ("TypeCode")) 181 if (seq.type ().name ().equals ("any") || 182 seq.type ().name ().equals ("TypeCode") || 183 seq.type ().name ().equals ("Principal")) 184 { 185 String loopIndex = "_o" + index; 186 stream.println (indent + "for (int " + loopIndex + " = 0;" + loopIndex + " < " + name + ".length; ++" + loopIndex + ')'); 187 stream.println (indent + " " + name + '[' + loopIndex + "] = istream.read_" + seq.type ().name () + " ();"); 188 } 189 else 190 { // special case for ValueBox: if name is "xxx tmp", drop xxx 191 String varName = name; 192 int nameIndex = varName.indexOf (' '); 193 if ( nameIndex != -1 ) 194 varName = varName.substring( nameIndex + 1 ); 195 stream.println (indent + "istream.read_" + Util.collapseName (entry.type ().name ()) + "_array (" + varName + ", 0, " + length + ");"); 196 } 197 else if (entry.type () instanceof StringEntry) 198 { 199 String loopIndex = "_o" + index; 200 stream.println (indent + "for (int " + loopIndex + " = 0;" + loopIndex + " < " + name + ".length; ++" + loopIndex + ')'); 201 stream.println (indent + " " + name + '[' + loopIndex + "] = istream.read_" + seq.type ().name () + " ();"); 202 } 203 else if (entry.type () instanceof SequenceEntry) 204 { 205 String loopIndex = "_o" + index; 206 stream.println (indent + "for (int " + loopIndex + " = 0;" + loopIndex + " < " + name + ".length; ++" + loopIndex + ')'); 207 stream.println (indent + '{'); 208 index = ((JavaGenerator)seq.type ().generator ()).read (index, indent + " ", name + '[' + loopIndex + ']', seq.type (), stream); 209 stream.println (indent + '}'); 210 } 211 else 212 { // special case for ValueBox: if name is "xxx tmp", drop xxx 213 String varName = name; 214 int nameIndex = varName.indexOf (' '); 215 if ( nameIndex != -1 ) 216 varName = varName.substring( nameIndex + 1 ); 217 String loopIndex = "_o" + index; 218 stream.println (indent + "for (int " + loopIndex + " = 0;" + loopIndex + " < " + varName + ".length; ++" + loopIndex + ')'); 219 stream.println (indent + " " + varName + '[' + loopIndex + "] = " + Util.helperName (seq.type (), true) + ".read (istream);"); // <d61056> 220 } 221 return index; 222 } // read 223 224 public int write (int index, String indent, String name, SymtabEntry entry, PrintWriter stream) 225 { 226 SequenceEntry seq = (SequenceEntry)entry; 227 if (seq.maxSize () != null) 228 { 229 stream.println (indent + "if (" + name + ".length > (" + Util.parseExpression (seq.maxSize ()) + "))"); 230 stream.println (indent + " throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);"); 231 } 232 stream.println (indent + "ostream.write_long (" + name + ".length);"); 233 if (entry.type () instanceof PrimitiveEntry) 234 // <d61961> Check for CORBA::Principal, too. 235 //if (entry.type ().name ().equals ("any") || entry.type ().name ().equals ("TypeCode")) 236 if (entry.type ().name ().equals ("any") || 237 entry.type ().name ().equals ("TypeCode") || 238 entry.type ().name ().equals ("Principal")) 239 { 240 String loopIndex = "_i" + index++; 241 stream.println (indent + "for (int " + loopIndex + " = 0;" + loopIndex + " < " + name + ".length; ++" + loopIndex + ')'); 242 stream.println (indent + " ostream.write_" + seq.type ().name () + " (" + name + '[' + loopIndex + "]);"); 243 } 244 else 245 stream.println (indent + "ostream.write_" + Util.collapseName (entry.type ().name ()) + "_array (" + name + ", 0, " + name + ".length);"); 246 else if (entry.type () instanceof StringEntry) 247 { 248 String loopIndex = "_i" + index++; 249 stream.println (indent + "for (int " + loopIndex + " = 0;" + loopIndex + " < " + name + ".length; ++" + loopIndex + ')'); 250 stream.println (indent + " ostream.write_" + seq.type ().name () + " (" + name + '[' + loopIndex + "]);"); 251 } 252 else if (entry.type () instanceof SequenceEntry) 253 { 254 String loopIndex = "_i" + index++; 255 stream.println (indent + "for (int " + loopIndex + " = 0;" + loopIndex + " < " + name + ".length; ++" + loopIndex + ')'); 256 stream.println (indent + '{'); 257 index = ((JavaGenerator)seq.type ().generator ()).write (index, indent + " ", name + '[' + loopIndex + ']', seq.type (), stream); 258 stream.println (indent + '}'); 259 } 260 else 261 { 262 String loopIndex = "_i" + index++; 263 stream.println (indent + "for (int " + loopIndex + " = 0;" + loopIndex + " < " + name + ".length; ++" + loopIndex + ')'); 264 stream.println (indent + " " + Util.helperName (seq.type (), true) + ".write (ostream, " + name + '[' + loopIndex + "]);"); // <d61056> 265 } 266 return index; 267 } // write 268 269 // From JavaGenerator 270 /////////////// 271} // class SequenceGen 272