Wed, 27 Apr 2016 01:21:28 +0800
Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/corba/
changeset: 765:f46df0af2ca8
tag: jdk8u25-b17
1 /*
2 * Copyright (c) 1999, 2001, 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 */
36 package com.sun.tools.corba.se.idl.toJavaPortable;
38 // NOTES:
39 // -F46082.51<daz> Remove -stateful feature; javaStatefulName() obsolete.
40 // -D57147 <klr> Make _Tie implement org.omg.CORBA.portable.InvokeHandler
41 // -D58037 <klr> Make _Tie delegate to Operations interface
42 // -D62739 <klr> no TIE for values that support abstract interfaces, etc.
44 import java.io.File;
45 import java.io.PrintWriter;
47 import java.util.Enumeration;
48 import java.util.Hashtable;
49 import java.util.Vector;
51 import com.sun.tools.corba.se.idl.AttributeEntry;
52 import com.sun.tools.corba.se.idl.GenFileStream;
54 import com.sun.tools.corba.se.idl.InterfaceEntry;
55 import com.sun.tools.corba.se.idl.InterfaceState;
56 import com.sun.tools.corba.se.idl.MethodEntry;
57 import com.sun.tools.corba.se.idl.SymtabEntry;
58 import com.sun.tools.corba.se.idl.TypedefEntry;
59 import com.sun.tools.corba.se.idl.ValueEntry;
61 /**
62 *
63 **/
64 public class Skeleton implements AuxGen
65 {
66 private NameModifier skeletonNameModifier ;
67 private NameModifier tieNameModifier ;
69 public Skeleton ()
70 {
71 }
73 public void generate (Hashtable symbolTable, SymtabEntry entry)
74 {
75 // <d62739-begin>
76 // Per Simon, 5-12-99, don't generate TIE or Skeleton for
77 //
78 // 1) valuetypes supporting abstract interfaces
79 // 2) valuetypes with no supports.
80 // 3) abstract interfaces
81 //
82 if (entry instanceof ValueEntry)
83 {
84 ValueEntry v = (ValueEntry) entry;
85 if ((v.supports ().size () == 0) ||
86 ((InterfaceEntry) v.supports ().elementAt (0)).isAbstract ()) {
87 return;
88 }
89 }
90 if (((InterfaceEntry) entry).isAbstract ()) {
91 return;
92 }
93 // <d62739-end>
95 this.symbolTable = symbolTable;
97 this.i = (InterfaceEntry)entry;
98 init ();
99 openStream ();
100 if (stream == null)
101 return;
102 writeHeading ();
103 writeBody ();
104 writeClosing ();
105 closeStream ();
106 } // generate
108 /**
109 * Initialize members unique to this generator.
110 **/
111 protected void init ()
112 {
113 tie = ((Arguments)Compile.compiler.arguments).TIEServer ;
114 poa = ((Arguments)Compile.compiler.arguments).POAServer ;
116 skeletonNameModifier =
117 ((Arguments)Compile.compiler.arguments).skeletonNameModifier ;
118 tieNameModifier =
119 ((Arguments)Compile.compiler.arguments).tieNameModifier ;
121 tieClassName = tieNameModifier.makeName( i.name() ) ;
122 skeletonClassName = skeletonNameModifier.makeName( i.name() ) ;
124 intfName = Util.javaName (i);
125 // for valuetype, get the name of the interface the valuetype supports
126 if (i instanceof ValueEntry)
127 {
128 ValueEntry v = (ValueEntry) i;
129 InterfaceEntry intf = (InterfaceEntry) v.supports ().elementAt (0);
130 intfName = Util.javaName (intf);
131 }
132 } // init
134 protected void openStream ()
135 {
136 if (tie)
137 stream = Util.stream( i, tieNameModifier, ".java" ) ;
138 else
139 stream = Util.stream( i, skeletonNameModifier, ".java" ) ;
140 } // openStream
142 protected void writeHeading ()
143 {
144 Util.writePackage (stream, i, Util.StubFile);
145 Util.writeProlog (stream, ((GenFileStream)stream).name ());
146 if (i.comment () != null)
147 i.comment ().generate ("", stream);
148 writeClassDeclaration ();
149 stream.println ('{');
150 stream.println ();
151 } // writeHeading
153 protected void writeClassDeclaration ()
154 {
155 if (tie){
156 stream.println ("public class " + tieClassName +
157 " extends " + skeletonClassName ) ;
158 } else {
159 if (poa) {
160 stream.println ("public abstract class " + skeletonClassName +
161 " extends org.omg.PortableServer.Servant");
162 stream.print (" implements " + intfName + "Operations, ");
163 stream.println ("org.omg.CORBA.portable.InvokeHandler");
164 } else {
165 stream.println ("public abstract class " + skeletonClassName +
166 " extends org.omg.CORBA.portable.ObjectImpl");
167 stream.print (" implements " + intfName + ", ");
168 stream.println ("org.omg.CORBA.portable.InvokeHandler");
169 }
170 }
171 } // writeClassDeclaration
173 /**
174 *
175 **/
176 protected void writeBody ()
177 {
178 // <f46082.51> Remove -stateful feature. ?????
179 //if (i.state () != null)
180 // writeState ();
181 writeCtors ();
182 if (i instanceof ValueEntry)
183 {
184 // use the interface the valuetype supports to generate the
185 // tie class instead of using the valuetype itself
186 ValueEntry v = (ValueEntry) i;
187 this.i = (InterfaceEntry) v.supports ().elementAt (0);
188 }
189 buildMethodList ();
190 //DispatchMethod and MethodTable
191 if (tie){ //Concrete class implementing the remote interface
192 //The logic is here for future use
193 if (poa) {
194 writeMethods ();
195 stream.println (" private " + intfName + "Operations _impl;");
196 stream.println (" private org.omg.PortableServer.POA _poa;");
197 } else {
198 writeMethods ();
199 stream.println (" private " + intfName + "Operations _impl;");
200 }
201 } else { //Both POA and ImplBase are abstract InvokeHandler
202 //The logic is here for future use
203 if (poa) {
204 writeMethodTable ();
205 writeDispatchMethod ();
206 writeCORBAOperations ();
207 } else {
208 writeMethodTable ();
209 writeDispatchMethod ();
210 writeCORBAOperations ();
211 }
212 }
213 //legacy !!
214 writeOperations ();
215 } // writeBody
217 /**
218 * Close the skeleton class. The singleton ORB member is
219 * necessary only for portable skeletons.
220 **/
221 protected void writeClosing ()
222 {
223 stream.println ();
224 if (tie){
225 stream.println ("} // class " + tieClassName);
226 } else {
227 stream.println ("} // class " + skeletonClassName);
228 }
229 } // writeClosing
231 /**
232 * Close the print stream, which flushes the stream to file.
233 **/
234 protected void closeStream ()
235 {
236 stream.close ();
237 } // closeStream
239 protected void writeCtors ()
240 {
241 stream.println (" // Constructors");
242 // Empty argument constructors
243 if (!poa) {
244 if (tie){
245 stream.println (" public " + tieClassName + " ()");
246 stream.println (" {");
247 stream.println (" }");
248 } else {
249 stream.println (" public " + skeletonClassName + " ()");
250 stream.println (" {");
251 stream.println (" }");
252 }
253 }
254 stream.println ();
255 // Argumented constructors
256 if (tie){
257 if (poa) {
258 //Write constructors
259 writePOATieCtors();
260 //Write state setters and getters
261 writePOATieFieldAccessMethods();
262 } else {
263 stream.println (" public " + tieClassName +
264 " (" + intfName + "Operations impl)");
265 stream.println (" {");
266 // Does it derive from a interface having state, e.g., valuetype?
267 if (((InterfaceEntry)i.derivedFrom ().firstElement ()).state () != null)
268 stream.println (" super (impl);");
269 else
270 stream.println (" super ();");
271 stream.println (" _impl = impl;");
272 stream.println (" }");
273 stream.println ();
274 }
275 } else { //Skeleton is not Tie so it has no constructors.
276 if (poa) {
277 } else {
278 }
279 }
281 } // writeCtors
284 private void writePOATieCtors(){
285 //First constructor
286 stream.println (" public " + tieClassName + " ( " + intfName + "Operations delegate ) {");
287 stream.println (" this._impl = delegate;");
288 stream.println (" }");
289 //Second constructor specifying default poa.
290 stream.println (" public " + tieClassName + " ( " + intfName +
291 "Operations delegate , org.omg.PortableServer.POA poa ) {");
292 stream.println (" this._impl = delegate;");
293 stream.println (" this._poa = poa;");
294 stream.println (" }");
295 }
297 private void writePOATieFieldAccessMethods(){
298 //Getting delegate
299 stream.println (" public " + intfName+ "Operations _delegate() {");
300 stream.println (" return this._impl;");
301 stream.println (" }");
302 //Setting delegate
303 stream.println (" public void _delegate (" + intfName + "Operations delegate ) {");
304 stream.println (" this._impl = delegate;");
305 stream.println (" }");
306 //Overriding default poa
307 stream.println (" public org.omg.PortableServer.POA _default_POA() {");
308 stream.println (" if(_poa != null) {");
309 stream.println (" return _poa;");
310 stream.println (" }");
311 stream.println (" else {");
312 stream.println (" return super._default_POA();");
313 stream.println (" }");
314 stream.println (" }");
315 }
317 /**
318 * Build a list of all of the methods, keeping out duplicates.
319 **/
320 protected void buildMethodList ()
321 {
322 // Start from scratch
323 methodList = new Vector ();
325 buildMethodList (i);
326 } // buildMethodList
328 /**
329 *
330 **/
331 private void buildMethodList (InterfaceEntry entry)
332 {
333 // Add the local methods
334 Enumeration locals = entry.methods ().elements ();
335 while (locals.hasMoreElements ())
336 addMethod ((MethodEntry)locals.nextElement ());
338 // Add the inherited methods
339 Enumeration parents = entry.derivedFrom ().elements ();
340 while (parents.hasMoreElements ())
341 {
342 InterfaceEntry parent = (InterfaceEntry)parents.nextElement ();
343 if (!parent.name ().equals ("Object"))
344 buildMethodList (parent);
345 }
346 } // buildMethodList
348 /**
349 *
350 **/
351 private void addMethod (MethodEntry method)
352 {
353 if (!methodList.contains (method))
354 methodList.addElement (method);
355 } // addMethod
357 /**
358 *
359 **/
360 protected void writeDispatchMethod ()
361 {
362 String indent = " ";
363 stream.println (" public org.omg.CORBA.portable.OutputStream _invoke (String $method,");
364 stream.println (indent + "org.omg.CORBA.portable.InputStream in,");
365 stream.println (indent + "org.omg.CORBA.portable.ResponseHandler $rh)");
366 stream.println (" {");
368 // this is a special case code generation for cases servantLocator and
369 // servantActivator, where OMG is taking too long to define them
370 // as local objects
372 boolean isLocalInterface = false;
373 if (i instanceof InterfaceEntry) {
374 isLocalInterface = i.isLocalServant();
375 }
377 if (!isLocalInterface) {
378 // Per Simon 8/26/98, create and return reply stream for all methods - KLR
379 stream.println (" org.omg.CORBA.portable.OutputStream out = null;");
380 stream.println (" java.lang.Integer __method = (java.lang.Integer)_methods.get ($method);");
381 stream.println (" if (__method == null)");
382 stream.println (" throw new org.omg.CORBA.BAD_OPERATION (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);");
383 stream.println ();
384 if (methodList.size () > 0)
385 {
386 stream.println (" switch (__method.intValue ())");
387 stream.println (" {");
389 // Write the method case statements
390 int realI = 0;
391 for (int i = 0; i < methodList.size (); ++i)
392 {
393 MethodEntry method = (MethodEntry)methodList.elementAt (i);
394 ((MethodGen)method.generator ()).dispatchSkeleton (symbolTable, method, stream, realI);
395 if (method instanceof AttributeEntry && !((AttributeEntry)method).readOnly ())
396 realI += 2;
397 else
398 ++realI;
399 }
401 indent = " ";
402 stream.println (indent + "default:");
403 stream.println (indent + " throw new org.omg.CORBA.BAD_OPERATION (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);");
404 stream.println (" }");
405 stream.println ();
406 }
407 stream.println (" return out;");
408 } else {
409 stream.println(" throw new org.omg.CORBA.BAD_OPERATION();");
410 }
411 stream.println (" } // _invoke");
412 stream.println ();
413 } // writeDispatchMethod
415 /**
416 *
417 **/
418 protected void writeMethodTable ()
419 {
420 // Write the methods hashtable
421 stream.println (" private static java.util.Hashtable _methods = new java.util.Hashtable ();");
422 stream.println (" static");
423 stream.println (" {");
425 int count = -1;
426 Enumeration e = methodList.elements ();
427 while (e.hasMoreElements ())
428 {
429 MethodEntry method = (MethodEntry)e.nextElement ();
430 if (method instanceof AttributeEntry)
431 {
432 stream.println (" _methods.put (\"_get_" + Util.stripLeadingUnderscores (method.name ()) + "\", new java.lang.Integer (" + (++count) + "));");
433 if (!((AttributeEntry)method).readOnly ())
434 stream.println (" _methods.put (\"_set_" + Util.stripLeadingUnderscores (method.name ()) + "\", new java.lang.Integer (" + (++count) + "));");
435 }
436 else
437 stream.println (" _methods.put (\"" + Util.stripLeadingUnderscores (method.name ()) + "\", new java.lang.Integer (" + (++count) + "));");
438 }
439 stream.println (" }");
440 stream.println ();
441 } // writeMethodTable
443 /**
444 *
445 **/
446 protected void writeMethods ()
447 {
448 int realI = 0;
449 for (int i = 0; i < methodList.size (); ++i)
450 {
451 MethodEntry method = (MethodEntry)methodList.elementAt (i);
452 ((MethodGen)method.generator ()).skeleton
453 (symbolTable, method, stream, realI);
454 if (method instanceof AttributeEntry &&
455 !((AttributeEntry)method).readOnly ())
456 realI += 2;
457 else
458 ++realI;
459 stream.println ();
460 }
461 } // writeMethods
463 /**
464 *
465 **/
466 private void writeIDs ()
467 {
468 Vector list = new Vector ();
469 buildIDList (i, list);
470 Enumeration e = list.elements ();
471 boolean first = true;
472 while (e.hasMoreElements ())
473 {
474 if (first)
475 first = false;
476 else
477 stream.println (", ");
478 stream.print (" \"" + (String)e.nextElement () + '"');
479 }
480 } // writeIDs
482 /**
483 *
484 **/
485 private void buildIDList (InterfaceEntry entry, Vector list)
486 {
487 if (!entry.fullName ().equals ("org/omg/CORBA/Object"))
488 {
489 String id = Util.stripLeadingUnderscoresFromID (entry.repositoryID ().ID ());
490 if (!list.contains (id))
491 list.addElement (id);
492 Enumeration e = entry.derivedFrom ().elements ();
493 while (e.hasMoreElements ())
494 buildIDList ((InterfaceEntry)e.nextElement (), list);
495 }
496 } // buildIDList
498 /**
499 *
500 **/
501 protected void writeCORBAOperations ()
502 {
503 stream.println (" // Type-specific CORBA::Object operations");
505 stream.println (" private static String[] __ids = {");
506 writeIDs ();
507 stream.println ("};");
508 stream.println ();
509 if (poa)
510 writePOACORBAOperations();
511 else
512 writeNonPOACORBAOperations();
514 } // writeCORBAOperations
516 protected void writePOACORBAOperations(){
517 stream.println (" public String[] _all_interfaces (org.omg.PortableServer.POA poa, byte[] objectId)");
518 //Right now, with our POA implementation, the same
519 //implementation of _ids() type methods seem to work for both non-POA
520 //as well as POA servers. We need to REVISIT since the equivalent
521 //POA interface, i.e. _all_interfaces, has parameters which are not being
522 //used in the _ids() implementation.
523 stream.println (" {");
524 stream.println (" return (String[])__ids.clone ();");
525 stream.println (" }");
526 stream.println ();
527 //_this()
528 stream.println (" public "+ i.name() +" _this() ");
529 stream.println (" {");
530 stream.println (" return "+ i.name() +"Helper.narrow(" );
531 stream.println (" super._this_object());");
532 stream.println (" }");
533 stream.println ();
534 //_this(org.omg.CORBA.ORB orb)
535 stream.println (" public "+ i.name() +" _this(org.omg.CORBA.ORB orb) ");
536 stream.println (" {");
537 stream.println (" return "+ i.name() +"Helper.narrow(" );
538 stream.println (" super._this_object(orb));");
539 stream.println (" }");
540 stream.println ();
541 }
542 protected void writeNonPOACORBAOperations(){
543 stream.println (" public String[] _ids ()");
544 stream.println (" {");
545 stream.println (" return (String[])__ids.clone ();");
546 stream.println (" }");
547 stream.println ();
548 }
549 /**
550 *
551 **/
552 protected void writeOperations ()
553 {
554 // _get_ids removed at Simon's request 8/26/98 - KLR
555 } // writeOperations
557 protected Hashtable symbolTable = null;
558 protected InterfaceEntry i = null;
559 protected PrintWriter stream = null;
561 // Unique to this generator
562 protected String tieClassName = null;
563 protected String skeletonClassName = null;
564 protected boolean tie = false;
565 protected boolean poa = false;
566 protected Vector methodList = null;
567 protected String intfName = "";
568 } // class Skeleton