1 20 21 package org.jacorb.idl; 22 23 import java.io.File ; 24 import java.io.PrintWriter ; 25 import java.util.*; 26 27 31 32 public class EnumType 33 extends TypeDeclaration 34 implements SwitchTypeSpec 35 { 36 public SymbolList enumlist; 37 int const_counter = 0; 38 private boolean written = false; 39 private boolean parsed = false; 40 41 public EnumType(int num) 42 { 43 super(num); 44 pack_name = ""; 45 } 46 47 public Object clone() 48 { 49 EnumType et = new EnumType(new_num()); 50 et.enumlist = this.enumlist; 51 et.typeName = this.typeName; 52 et.pack_name = this.pack_name; 53 et.name = this.name; 54 et.token = this.token; 55 et.included = this.included; 56 et.enclosing_symbol = this.enclosing_symbol; 57 et.parsed = this.parsed; 58 return et; 59 } 60 61 public TypeDeclaration declaration() 62 { 63 return this; 64 } 65 66 public int size() 67 { 68 return enumlist.v.size(); 69 } 70 71 73 74 public void set_included(boolean i) 75 { 76 included = i; 77 } 78 79 public String typeName() 80 { 81 if (typeName == null) 82 { 83 setPrintPhaseNames(); 84 } 85 return typeName; 86 } 87 88 public boolean basic() 89 { 90 return true; 91 } 92 93 public void setPackage(String s) 94 { 95 s = parser.pack_replace(s); 96 if (pack_name.length() > 0) 97 pack_name = s + "." + pack_name; 98 else 99 pack_name = s; 100 } 101 102 public void setEnclosingSymbol(IdlSymbol s) 103 { 104 if (enclosing_symbol != null && enclosing_symbol != s) 105 throw new RuntimeException ("Compiler Error: trying to reassign container for " + name); 106 enclosing_symbol = s; 107 } 108 109 public void parse() 110 { 111 if (parsed) 112 { 113 return ; 114 } 115 parsed = true; 116 117 escapeName(); 118 119 try 120 { 121 ConstrTypeSpec ctspec = new ConstrTypeSpec(new_num()); 122 ctspec.c_type_spec = this; 123 NameTable.define(full_name(), "type"); 124 TypeMap.typedef(full_name(), ctspec); 125 String enum_ident = null; 126 127 134 String prefix = (pack_name.length() > 0 ? 135 full_name().substring(0, full_name().lastIndexOf('.') + 1) : 136 ""); 137 138 for (Enumeration e = enumlist.v.elements(); e.hasMoreElements();) 139 { 140 enum_ident = (String ) e.nextElement(); 141 try 142 { 143 NameTable.define(prefix + enum_ident, "enum label"); 144 ScopedName.enumMap(prefix + enum_ident, full_name() + 145 "." + enum_ident); 146 } 147 catch (NameAlreadyDefined p) 148 { 149 parser.error("Identifier " + enum_ident + 150 " already defined in immediate scope\n", 151 token); 152 } 153 } 154 } 155 catch (NameAlreadyDefined p) 156 { 157 parser.error("Enum " + full_name() + " already defined", token); 158 } 159 } 160 161 public String className() 162 { 163 String fullName = typeName(); 164 if (fullName.indexOf('.') > 0) 165 { 166 return fullName.substring(fullName.lastIndexOf('.') + 1); 167 } 168 else 169 { 170 return fullName; 171 } 172 } 173 174 public String printReadExpression(String streamname) 175 { 176 return toString() + "Helper.read(" + streamname + ")"; 177 } 178 179 public String printWriteStatement(String var_name, String streamname) 180 { 181 return toString() + "Helper.write(" + streamname + "," + var_name + ");"; 182 } 183 184 public String holderName() 185 { 186 return typeName() + "Holder"; 187 } 188 189 190 public String getTypeCodeExpression() 191 { 192 return full_name() + "Helper.type()"; 193 } 194 195 public String getTypeCodeExpression(Set knownTypes) 196 { 197 if (knownTypes.contains(this)) 198 { 199 return this.getRecursiveTypeCodeExpression(); 200 } 201 else 202 { 203 return this.getTypeCodeExpression(); 204 } 205 } 206 207 private void printClassComment(String className, PrintWriter ps) 208 { 209 ps.println("/**"); 210 ps.println(" *\tGenerated from IDL definition of enum " + 211 "\"" + className + "\""); 212 ps.println(" *\t@author JacORB IDL compiler "); 213 ps.println(" */\n"); 214 } 215 216 private void printHolderClass(String className, PrintWriter ps) 217 { 218 if (Environment.JAVA14 && pack_name.equals("")) 219 lexer.emit_warn 220 ("No package defined for " + className + " - illegal in JDK1.4", token); 221 if (!pack_name.equals("")) 222 ps.println("package " + pack_name + ";"); 223 224 printClassComment(className, ps); 225 226 ps.println("public" + parser.getFinalString() + " class " + className + "Holder"); 227 ps.println("\timplements org.omg.CORBA.portable.Streamable"); 228 ps.println("{"); 229 230 ps.println("\tpublic " + className + " value;\n"); 231 232 ps.println("\tpublic " + className + "Holder ()"); 233 ps.println("\t{"); 234 ps.println("\t}"); 235 236 ps.println("\tpublic " + className + "Holder (final " + className + " initial)"); 237 ps.println("\t{"); 238 ps.println("\t\tvalue = initial;"); 239 ps.println("\t}"); 240 241 ps.println("\tpublic org.omg.CORBA.TypeCode _type ()"); 242 ps.println("\t{"); 243 ps.println("\t\treturn " + className + "Helper.type ();"); 244 ps.println("\t}"); 245 246 ps.println("\tpublic void _read (final org.omg.CORBA.portable.InputStream in)"); 247 ps.println("\t{"); 248 ps.println("\t\tvalue = " + className + "Helper.read (in);"); 249 ps.println("\t}"); 250 251 ps.println("\tpublic void _write (final org.omg.CORBA.portable.OutputStream out)"); 252 ps.println("\t{"); 253 ps.println("\t\t" + className + "Helper.write (out,value);"); 254 ps.println("\t}"); 255 256 ps.println("}"); 257 } 258 259 private void printHelperClass(String className, PrintWriter ps) 260 { 261 if (Environment.JAVA14 && pack_name.equals("")) 262 lexer.emit_warn 263 ("No package defined for " + className + " - illegal in JDK1.4", token); 264 if (!pack_name.equals("")) 265 ps.println("package " + pack_name + ";"); 266 267 printClassComment(className, ps); 268 269 ps.println("public" + parser.getFinalString() + " class " + className + "Helper"); 270 ps.println("{"); 271 272 ps.println("\tprivate static org.omg.CORBA.TypeCode _type = null;"); 273 274 275 ps.println("\tpublic static org.omg.CORBA.TypeCode type ()"); 276 ps.println("\t{"); 277 ps.println("\t\tif (_type == null)"); 278 ps.println("\t\t{"); 279 280 StringBuffer sb = new StringBuffer (); 281 sb.append("org.omg.CORBA.ORB.init().create_enum_tc(" + 282 typeName() + "Helper.id(),\"" + className() + "\","); 283 284 sb.append("new String[]{"); 285 286 for (Enumeration e = enumlist.v.elements(); e.hasMoreElements();) 287 { 288 sb.append("\"" + (String ) e.nextElement() + "\""); 289 if (e.hasMoreElements()) 290 sb.append(","); 291 } 292 sb.append("})"); 293 294 ps.println("\t\t\t_type = " + sb.toString() + ";"); 295 ps.println("\t\t}"); 296 ps.println("\t\treturn _type;"); 297 ps.println("\t}\n"); 298 299 String type = typeName(); 300 301 TypeSpec.printInsertExtractMethods(ps, type); 302 printIdMethod(ps); 303 304 ps.println("\tpublic static " + className + " read (final org.omg.CORBA.portable.InputStream in)"); 305 ps.println("\t{"); 306 ps.println("\t\treturn " + className + ".from_int(in.read_long());"); 307 ps.println("\t}\n"); 308 309 ps.println("\tpublic static void write (final org.omg.CORBA.portable.OutputStream out, final " + className + " s)"); 310 ps.println("\t{"); 311 ps.println("\t\tout.write_long(s.value());"); 312 ps.println("\t}"); 313 ps.println("}"); 314 } 315 316 317 318 private void printEnumClass(String className, PrintWriter pw) 319 { 320 if (Environment.JAVA14 && pack_name.equals("")) 321 lexer.emit_warn 322 ("No package defined for " + className + " - illegal in JDK1.4", token); 323 if (!pack_name.equals("")) 324 pw.println("package " + pack_name + ";"); 325 326 printClassComment(className, pw); 327 328 pw.println("public" + parser.getFinalString() + " class " + className); 329 pw.println("\timplements org.omg.CORBA.portable.IDLEntity\n{"); 330 331 pw.println("\tprivate int value = -1;"); 332 333 for (Enumeration e = enumlist.v.elements(); e.hasMoreElements();) 334 { 335 String label = (String ) e.nextElement(); 336 pw.println("\tpublic static final int _" + label + " = " + (const_counter++) + ";"); 337 pw.println("\tpublic static final " + name + " " + label + " = new " + name + "(_" + label + ");"); 338 } 339 pw.println("\tpublic int value()"); 340 pw.println("\t{"); 341 pw.println("\t\treturn value;"); 342 pw.println("\t}"); 343 344 pw.println("\tpublic static " + name + " from_int(int value)"); 345 pw.println("\t{"); 346 pw.println("\t\tswitch (value) {"); 347 348 for (Enumeration e = enumlist.v.elements(); e.hasMoreElements();) 349 { 350 String label = (String ) e.nextElement(); 351 pw.println("\t\t\tcase _" + label + ": return " + label + ";"); 352 } 353 pw.println("\t\t\tdefault: throw new org.omg.CORBA.BAD_PARAM();"); 354 pw.println("\t\t}"); 355 pw.println("\t}"); 356 357 pw.println("\tprotected " + name + "(int i)"); 358 pw.println("\t{"); 359 pw.println("\t\tvalue = i;"); 360 pw.println("\t}"); 361 362 pw.println("\tjava.lang.Object readResolve()"); 363 if (!parser.cldc10 ) 364 pw.println("\tthrows java.io.ObjectStreamException"); 365 pw.println("\t{"); 366 pw.println("\t\treturn from_int(value());"); 367 pw.println("\t}"); 368 pw.println("}"); 369 } 370 371 372 373 374 public void print(PrintWriter ps) 375 { 376 setPrintPhaseNames(); 377 378 if (included && !generateIncluded()) 380 { 381 return ; 382 } 383 384 386 if (!written) 387 { 388 try 389 { 390 String className = className(); 391 String path = 392 parser.out_dir + fileSeparator + 393 pack_name.replace('.', fileSeparator); 394 395 File dir = new File (path); 396 if (!dir.exists()) 397 { 398 if (!dir.mkdirs()) 399 { 400 org.jacorb.idl.parser.fatal_error("Unable to create " + path, null); 401 } 402 } 403 404 String fname = className + ".java"; 405 File f = new File (dir, fname); 406 if (GlobalInputStream.isMoreRecentThan(f)) 407 { 408 PrintWriter printWriter = new PrintWriter (new java.io.FileWriter (f)); 410 printEnumClass(className, printWriter); 411 printWriter.close(); 412 } 413 414 fname = className + "Holder.java"; 415 f = new File (dir, fname); 416 if (GlobalInputStream.isMoreRecentThan(f)) 417 { 418 PrintWriter printWriter = new PrintWriter (new java.io.FileWriter (f)); 420 printHolderClass(className, printWriter); 421 printWriter.close(); 422 } 423 424 fname = className + "Helper.java"; 425 f = new File (dir, fname); 426 if (GlobalInputStream.isMoreRecentThan(f)) 427 { 428 PrintWriter printWriter = new PrintWriter (new java.io.FileWriter (f)); 430 printHelperClass(className, printWriter); 431 printWriter.close(); 432 } 433 434 written = true; 435 } 436 catch (java.io.IOException i) 437 { 438 throw new RuntimeException ("File IO error" + i); 439 } 440 } 441 } 442 443 public String toString() 444 { 445 return typeName(); 446 } 447 448 public boolean isSwitchable() 449 { 450 return true; 451 } 452 453 455 456 public void accept(IDLTreeVisitor visitor) 457 { 458 visitor.visitEnum(this); 459 } 460 461 } 462 | Popular Tags |