src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Stub.java

Sun, 05 Dec 2010 22:22:54 -0800

author
skoppar
date
Sun, 05 Dec 2010 22:22:54 -0800
changeset 236
33ca1bceec2d
parent 227
459c07278c3c
child 748
6845b95cba6b
permissions
-rw-r--r--

7004713: regression: cannot find symbol: variable delegate failed compile _Stub
Summary: Also reviewed by ken.cavanaugh@oracle.com
Reviewed-by: asaha

duke@1 1 /*
skoppar@227 2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
ohair@158 7 * published by the Free Software Foundation. Oracle designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
ohair@158 9 * by Oracle in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
ohair@158 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@158 22 * or visit www.oracle.com if you need additional information or have any
ohair@158 23 * questions.
duke@1 24 */
duke@1 25 /*
duke@1 26 * COMPONENT_NAME: idl.toJava
duke@1 27 *
duke@1 28 * ORIGINS: 27
duke@1 29 *
duke@1 30 * Licensed Materials - Property of IBM
duke@1 31 * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
duke@1 32 * RMI-IIOP v1.0
duke@1 33 *
duke@1 34 */
duke@1 35
duke@1 36 package com.sun.tools.corba.se.idl.toJavaPortable;
duke@1 37
duke@1 38 // NOTES:
duke@1 39
duke@1 40 import java.io.File;
duke@1 41 import java.io.PrintWriter;
duke@1 42 import java.util.Enumeration;
duke@1 43 import java.util.Hashtable;
duke@1 44 import java.util.Vector;
duke@1 45
duke@1 46 import com.sun.tools.corba.se.idl.AttributeEntry;
duke@1 47 import com.sun.tools.corba.se.idl.GenFileStream;
duke@1 48 import com.sun.tools.corba.se.idl.InterfaceEntry;
duke@1 49 import com.sun.tools.corba.se.idl.MethodEntry;
duke@1 50 import com.sun.tools.corba.se.idl.SymtabEntry;
duke@1 51
duke@1 52 /**
duke@1 53 *
duke@1 54 **/
duke@1 55 public class Stub implements AuxGen
duke@1 56 {
duke@1 57 /**
duke@1 58 * Public zero-argument constructor.
duke@1 59 **/
duke@1 60 public Stub ()
duke@1 61 {
duke@1 62 } // ctor
duke@1 63
duke@1 64 /**
duke@1 65 *
duke@1 66 **/
duke@1 67 public void generate (Hashtable symbolTable, SymtabEntry entry)
duke@1 68 {
duke@1 69 this.symbolTable = symbolTable;
duke@1 70 this.i = (InterfaceEntry)entry;
duke@1 71 this.localStub = i.isLocalServant();
duke@1 72 this.isAbstract = i.isAbstract( );
duke@1 73 init ();
duke@1 74
duke@1 75 openStream ();
duke@1 76 if (stream == null)
duke@1 77 return;
duke@1 78 writeHeading ();
duke@1 79 writeBody ();
duke@1 80 writeClosing ();
duke@1 81 closeStream ();
duke@1 82 } // generate
duke@1 83
duke@1 84 /**
duke@1 85 * Initialize unique members of this generator.
duke@1 86 **/
duke@1 87 protected void init ()
duke@1 88 {
duke@1 89 classSuffix = "Stub";
duke@1 90 } // init
duke@1 91
duke@1 92 /**
duke@1 93 *
duke@1 94 **/
duke@1 95 protected void openStream ()
duke@1 96 {
duke@1 97 String name = '_' + i.name () + classSuffix;
duke@1 98 String pkg = Util.containerFullName (i.container ());
duke@1 99 if (pkg != null && !pkg.equals (""))
duke@1 100 {
duke@1 101 Util.mkdir (pkg);
duke@1 102 name = pkg + '/' + name;
duke@1 103 }
duke@1 104 stream = Util.getStream (name.replace ('/', File.separatorChar) + ".java", i);
duke@1 105 } // openStream
duke@1 106
duke@1 107 /**
duke@1 108 *
duke@1 109 **/
duke@1 110 protected void writeHeading ()
duke@1 111 {
duke@1 112 Util.writePackage (stream, i, Util.StubFile);
duke@1 113 Util.writeProlog (stream, ((GenFileStream)stream).name ());
duke@1 114
duke@1 115 // Transfer interface comment to target <31jul1997>.
duke@1 116 if (i.comment () != null)
duke@1 117 i.comment ().generate ("", stream);
duke@1 118
duke@1 119 writeClassDeclaration ();
duke@1 120 stream.println ('{');
duke@1 121 } // writeHeading
duke@1 122
duke@1 123 /**
duke@1 124 *
duke@1 125 **/
duke@1 126 protected void writeClassDeclaration ()
duke@1 127 {
duke@1 128 stream.print ("public class _" + i.name () + classSuffix + " extends org.omg.CORBA.portable.ObjectImpl");
duke@1 129 stream.println (" implements " + Util.javaName (i));
duke@1 130 } // writeClassDeclaration
duke@1 131
duke@1 132 /**
duke@1 133 * Steps done within writeBody include:
duke@1 134 * 1.) makeCtors ();
duke@1 135 * 2.) buildMethodList ();
duke@1 136 * 3.) makeMethods ();
duke@1 137 * 4.) makeCORBAObjectMethods ()
duke@1 138 **/
duke@1 139 protected void writeBody ()
duke@1 140 {
duke@1 141 writeCtors ();
duke@1 142 buildMethodList ();
duke@1 143 writeMethods ();
duke@1 144 writeCORBAObjectMethods ();
duke@1 145 writeSerializationMethods ();
duke@1 146 } // writeBody
duke@1 147
duke@1 148 /**
duke@1 149 *
duke@1 150 **/
duke@1 151 protected void writeClosing ()
duke@1 152 {
duke@1 153 stream.println ("} // class _" + i.name () + classSuffix);
duke@1 154 } // writeClosing
duke@1 155
duke@1 156 /**
duke@1 157 *
duke@1 158 **/
duke@1 159 protected void closeStream ()
duke@1 160 {
duke@1 161 stream.close ();
duke@1 162 } // closeStream
duke@1 163
duke@1 164 /**
duke@1 165 *
duke@1 166 **/
duke@1 167 protected void writeCtors ()
duke@1 168 {
duke@1 169 String name = i.name ();
duke@1 170
duke@1 171 /*** the constructors are not generated as per ptc/00-01-08.pdf
duke@1 172 * since these are non-standard APIs, and same can be accomplished
duke@1 173 * programatically, we need to comment this out, in order to
duke@1 174 * be able to generate standard stubs
duke@1 175 */
duke@1 176
duke@1 177 /*************
duke@1 178 stream.println (" // Constructors");
duke@1 179 stream.println (" // NOTE: If the default constructor is used, the");
duke@1 180 stream.println (" // object is useless until _set_delegate (...)");
duke@1 181 stream.println (" // is called.");
duke@1 182 stream.println (" public _" + name + classSuffix + " ()");
duke@1 183 stream.println (" {");
duke@1 184 stream.println (" super ();");
duke@1 185 stream.println (" }");
duke@1 186 stream.println ();
duke@1 187 stream.println (" public _" + name + classSuffix + " (org.omg.CORBA.portable.Delegate delegate)");
duke@1 188 stream.println (" {");
duke@1 189 stream.println (" super ();");
duke@1 190 stream.println (" _set_delegate (delegate);");
duke@1 191 stream.println (" }");
duke@1 192 ***************/
duke@1 193 // This is confusing since we have localOptimization flag as well.
duke@1 194 // We have left this code because JCK team filed a P1 bug for changing
duke@1 195 // _opsClass to $opsClass. Will clean it up in Tiger
duke@1 196 // _REVISIT_ (Hemanth 03/05/2002)
duke@1 197 if (localStub) {
duke@1 198 stream.println (" final public static java.lang.Class _opsClass = " +
duke@1 199 name + "Operations.class;");
duke@1 200 stream.println ();
duke@1 201 }
duke@1 202 stream.println ();
duke@1 203 } // writeCtors
duke@1 204
duke@1 205 /**
duke@1 206 * Build a list of all of the methods, keeping out duplicates.
duke@1 207 **/
duke@1 208 protected void buildMethodList ()
duke@1 209 {
duke@1 210 // Start from scratch
duke@1 211 methodList = new Vector ();
duke@1 212
duke@1 213 buildMethodList (i);
duke@1 214 } // buildMethodList
duke@1 215
duke@1 216 /**
duke@1 217 *
duke@1 218 **/
duke@1 219 private void buildMethodList (InterfaceEntry entry)
duke@1 220 {
duke@1 221 // Add the local methods
duke@1 222 Enumeration locals = entry.methods ().elements ();
duke@1 223 while (locals.hasMoreElements ())
duke@1 224 addMethod ((MethodEntry)locals.nextElement ());
duke@1 225
duke@1 226 // Add the inherited methods
duke@1 227 Enumeration parents = entry.derivedFrom ().elements ();
duke@1 228 while (parents.hasMoreElements ())
duke@1 229 {
duke@1 230 InterfaceEntry parent = (InterfaceEntry)parents.nextElement ();
duke@1 231 if (!parent.name ().equals ("Object"))
duke@1 232 buildMethodList (parent);
duke@1 233 }
duke@1 234 } // buildMethodList
duke@1 235
duke@1 236 /**
duke@1 237 *
duke@1 238 **/
duke@1 239 private void addMethod (MethodEntry method)
duke@1 240 {
duke@1 241 if (!methodList.contains (method))
duke@1 242 methodList.addElement (method);
duke@1 243 } // addMethod
duke@1 244
duke@1 245 /**
duke@1 246 *
duke@1 247 **/
duke@1 248 protected void writeMethods ()
duke@1 249 {
duke@1 250 // Count the methods, attributes which are not readonly are
duke@1 251 // counted as 2 methods.
duke@1 252 int count = methodList.size ();
duke@1 253 Enumeration e = methodList.elements ();
duke@1 254 while (e.hasMoreElements ())
duke@1 255 {
duke@1 256 Object method = e.nextElement ();
duke@1 257 if (method instanceof AttributeEntry && !((AttributeEntry)method).readOnly ())
duke@1 258 ++count;
duke@1 259 }
duke@1 260
duke@1 261 if( (((Arguments)Compile.compiler.arguments).LocalOptimization )
duke@1 262 && !isAbstract )
duke@1 263 {
duke@1 264 stream.println( " final public static java.lang.Class _opsClass =" );
duke@1 265 stream.println( " " + this.i.name() + "Operations.class;" );
duke@1 266 }
duke@1 267
duke@1 268 // Write the methods
duke@1 269 int realI = 0;
duke@1 270 for (int i = 0; i < methodList.size (); ++i)
duke@1 271 {
duke@1 272 MethodEntry method = (MethodEntry)methodList.elementAt (i);
duke@1 273 if (!localStub) {
duke@1 274 ((MethodGen)method.generator ()).stub (this.i.name(), isAbstract, symbolTable, method, stream, realI);
duke@1 275 } else {
duke@1 276 ((MethodGen)method.generator ()).localstub (symbolTable, method, stream, realI, this.i);
duke@1 277 }
duke@1 278 if (method instanceof AttributeEntry && !((AttributeEntry)method).readOnly ())
duke@1 279 realI += 2;
duke@1 280 else
duke@1 281 ++realI;
duke@1 282 }
duke@1 283 } // writeMethods
duke@1 284
duke@1 285 /**
duke@1 286 *
duke@1 287 **/
duke@1 288 private void buildIDList (InterfaceEntry entry, Vector list)
duke@1 289 {
duke@1 290 if (!entry.fullName ().equals ("org/omg/CORBA/Object"))
duke@1 291 {
duke@1 292 String id = Util.stripLeadingUnderscoresFromID (entry.repositoryID ().ID ());
duke@1 293 if (!list.contains (id))
duke@1 294 list.addElement (id);
duke@1 295 Enumeration e = entry.derivedFrom ().elements ();
duke@1 296 while (e.hasMoreElements ())
duke@1 297 buildIDList ((InterfaceEntry)e.nextElement (), list);
duke@1 298 }
duke@1 299 } // buildIDList
duke@1 300
duke@1 301 /**
duke@1 302 *
duke@1 303 **/
duke@1 304 private void writeIDs ()
duke@1 305 {
duke@1 306 Vector list = new Vector ();
duke@1 307 buildIDList (i, list);
duke@1 308 Enumeration e = list.elements ();
duke@1 309 boolean first = true;
duke@1 310 while (e.hasMoreElements ())
duke@1 311 {
duke@1 312 if (first)
duke@1 313 first = false;
duke@1 314 else
duke@1 315 stream.println (", ");
duke@1 316 stream.print (" \"" + (String)e.nextElement () + '"');
duke@1 317 }
duke@1 318 } // writeIDs
duke@1 319
duke@1 320 /**
duke@1 321 *
duke@1 322 **/
duke@1 323 protected void writeCORBAObjectMethods ()
duke@1 324 {
duke@1 325 stream.println (" // Type-specific CORBA::Object operations");
duke@1 326 stream.println (" private static String[] __ids = {");
duke@1 327 writeIDs ();
duke@1 328 stream.println ("};");
duke@1 329 stream.println ();
duke@1 330 stream.println (" public String[] _ids ()");
duke@1 331 stream.println (" {");
duke@1 332 stream.println (" return (String[])__ids.clone ();");
duke@1 333 stream.println (" }");
duke@1 334 stream.println ();
duke@1 335 } // writeCORBAObjectMethods
duke@1 336
duke@1 337 /**
duke@1 338 *
duke@1 339 **/
duke@1 340 protected void writeSerializationMethods ()
duke@1 341 {
duke@1 342 stream.println (" private void readObject (java.io.ObjectInputStream s) throws java.io.IOException");
duke@1 343 stream.println (" {");
duke@1 344 stream.println (" String str = s.readUTF ();");
duke@1 345 stream.println (" String[] args = null;");
duke@1 346 stream.println (" java.util.Properties props = null;");
skoppar@227 347 stream.println (" org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);");
skoppar@227 348 stream.println (" try {");
skoppar@227 349 stream.println (" org.omg.CORBA.Object obj = orb.string_to_object (str);");
skoppar@236 350 stream.println (" org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl) obj)._get_delegate ();");
duke@1 351 stream.println (" _set_delegate (delegate);");
skoppar@227 352 stream.println (" } finally {");
skoppar@227 353 stream.println (" orb.destroy() ;");
skoppar@227 354 stream.println (" }");
duke@1 355 stream.println (" }");
duke@1 356 stream.println ();
duke@1 357 stream.println (" private void writeObject (java.io.ObjectOutputStream s) throws java.io.IOException");
duke@1 358 stream.println (" {");
duke@1 359 stream.println (" String[] args = null;");
duke@1 360 stream.println (" java.util.Properties props = null;");
skoppar@227 361 stream.println (" org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);");
skoppar@227 362 stream.println (" try {");
skoppar@227 363 stream.println (" String str = orb.object_to_string (this);");
duke@1 364 stream.println (" s.writeUTF (str);");
skoppar@227 365 stream.println (" } finally {");
skoppar@227 366 stream.println (" orb.destroy() ;");
skoppar@227 367 stream.println (" }");
duke@1 368 stream.println (" }");
duke@1 369 }
duke@1 370
duke@1 371 protected Hashtable symbolTable = null;
duke@1 372 protected InterfaceEntry i = null;
duke@1 373 protected PrintWriter stream = null;
duke@1 374
duke@1 375 // Unique to this generator
duke@1 376 protected Vector methodList = null;
duke@1 377 protected String classSuffix = "";
duke@1 378 protected boolean localStub = false;
duke@1 379 private boolean isAbstract = false;
duke@1 380 } // class Stub

mercurial