KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jacorb > idl > EnumType


1 /*
2 * JacORB - a free Java ORB
3 *
4 * Copyright (C) 1997-2004 Gerald Brose.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the Free
18 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */

20
21 package org.jacorb.idl;
22
23 import java.io.File JavaDoc;
24 import java.io.PrintWriter JavaDoc;
25 import java.util.*;
26
27 /**
28  * @author Gerald Brose
29  * @version $Id: EnumType.java,v 1.33 2004/05/06 12:39:58 nicolas Exp $
30  */

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 JavaDoc 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     /**
72      */

73
74     public void set_included(boolean i)
75     {
76         included = i;
77     }
78
79     public String JavaDoc 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 JavaDoc 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 JavaDoc("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 JavaDoc enum_ident = null;
126
127             // we have to get the scoping right: enums do not
128
// define scopes, but their element identifiers are scoped.
129
// for the Java mapping, we need to get the enum type name
130
// back as it defines the class name where the constants
131
// are defined. Therefore, an additional mapping in
132
// ScopedName is required.
133

134             String JavaDoc 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 JavaDoc) 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 JavaDoc className()
162     {
163         String JavaDoc 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 JavaDoc printReadExpression(String JavaDoc streamname)
175     {
176         return toString() + "Helper.read(" + streamname + ")";
177     }
178
179     public String JavaDoc printWriteStatement(String JavaDoc var_name, String JavaDoc streamname)
180     {
181         return toString() + "Helper.write(" + streamname + "," + var_name + ");";
182     }
183
184     public String JavaDoc holderName()
185     {
186         return typeName() + "Holder";
187     }
188
189
190     public String JavaDoc getTypeCodeExpression()
191     {
192         return full_name() + "Helper.type()";
193     }
194
195     public String JavaDoc 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 JavaDoc className, PrintWriter JavaDoc 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 JavaDoc className, PrintWriter JavaDoc 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 JavaDoc className, PrintWriter JavaDoc 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         /* type() method */
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 JavaDoc sb = new StringBuffer JavaDoc();
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 JavaDoc) 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 JavaDoc 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     /** print the class that maps the enum */
317
318     private void printEnumClass(String JavaDoc className, PrintWriter JavaDoc 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 JavaDoc label = (String JavaDoc) 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 JavaDoc label = (String JavaDoc) 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     /** generate required classes */
373
374     public void print(PrintWriter JavaDoc ps)
375     {
376         setPrintPhaseNames();
377
378         // no code generation for included definitions
379
if (included && !generateIncluded())
380         {
381             return ;
382         }
383
384         // only write once
385

386         if (!written)
387         {
388             try
389             {
390                 String JavaDoc className = className();
391                 String JavaDoc path =
392                     parser.out_dir + fileSeparator +
393                     pack_name.replace('.', fileSeparator);
394
395                 File JavaDoc dir = new File JavaDoc(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 JavaDoc fname = className + ".java";
405                 File JavaDoc f = new File JavaDoc(dir, fname);
406                 if (GlobalInputStream.isMoreRecentThan(f))
407                 {
408                     // print the mapped java class
409
PrintWriter JavaDoc printWriter = new PrintWriter JavaDoc(new java.io.FileWriter JavaDoc(f));
410                     printEnumClass(className, printWriter);
411                     printWriter.close();
412                 }
413
414                 fname = className + "Holder.java";
415                 f = new File JavaDoc(dir, fname);
416                 if (GlobalInputStream.isMoreRecentThan(f))
417                 {
418                     // print the holder class
419
PrintWriter JavaDoc printWriter = new PrintWriter JavaDoc(new java.io.FileWriter JavaDoc(f));
420                     printHolderClass(className, printWriter);
421                     printWriter.close();
422                 }
423
424                 fname = className + "Helper.java";
425                 f = new File JavaDoc(dir, fname);
426                 if (GlobalInputStream.isMoreRecentThan(f))
427                 {
428                     // print the helper class
429
PrintWriter JavaDoc printWriter = new PrintWriter JavaDoc(new java.io.FileWriter JavaDoc(f));
430                     printHelperClass(className, printWriter);
431                     printWriter.close();
432                 }
433
434                 written = true;
435             }
436             catch (java.io.IOException JavaDoc i)
437             {
438                 throw new RuntimeException JavaDoc("File IO error" + i);
439             }
440         }
441     }
442
443     public String JavaDoc toString()
444     {
445         return typeName();
446     }
447
448     public boolean isSwitchable()
449     {
450         return true;
451     }
452
453     /**
454      */

455
456     public void accept(IDLTreeVisitor visitor)
457     {
458         visitor.visitEnum(this);
459     }
460
461 }
462
Popular Tags