duke@1: /* ohair@158: * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as ohair@158: * published by the Free Software Foundation. Oracle designates this duke@1: * particular file as subject to the "Classpath" exception as provided ohair@158: * by Oracle in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * ohair@158: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@158: * or visit www.oracle.com if you need additional information or have any ohair@158: * questions. duke@1: */ duke@1: duke@1: /* duke@1: * Licensed Materials - Property of IBM duke@1: * RMI-IIOP v1.0 duke@1: * Copyright IBM Corp. 1998 1999 All Rights Reserved duke@1: * duke@1: */ duke@1: duke@1: package sun.rmi.rmic.iiop; duke@1: duke@1: import sun.rmi.rmic.Main; duke@1: import sun.tools.java.ClassPath; duke@1: import java.io.OutputStream; duke@1: import sun.tools.java.ClassDefinition; duke@1: import sun.tools.java.ClassDeclaration; duke@1: import sun.tools.java.Identifier; duke@1: import sun.tools.java.ClassNotFound; duke@1: import java.util.HashSet; duke@1: import java.util.Hashtable; duke@1: import java.util.Enumeration; duke@1: import java.util.Iterator; duke@1: duke@1: /** duke@1: * BatchEnvironment for iiop extends rmic's version to add duke@1: * parse state. duke@1: */ duke@1: public class BatchEnvironment extends sun.rmi.rmic.BatchEnvironment implements Constants { duke@1: duke@1: /* duke@1: * If the following flag is true, then the IDL generator can map duke@1: * the methods and constants of non-conforming types. However, duke@1: * this is very expensive, so the default should be false. duke@1: */ duke@1: private boolean parseNonConforming = false; duke@1: duke@1: /** duke@1: * This flag indicates that the stubs and ties need to be generated without duke@1: * the package prefix (org.omg.stub). duke@1: */ duke@1: private boolean standardPackage; duke@1: duke@1: /* Common objects used within package */ duke@1: duke@1: HashSet alreadyChecked = new HashSet(); duke@1: Hashtable allTypes = new Hashtable(3001, 0.5f); duke@1: Hashtable invalidTypes = new Hashtable(256, 0.5f); duke@1: DirectoryLoader loader = null; duke@1: ClassPathLoader classPathLoader = null; duke@1: Hashtable nameContexts = null; duke@1: Hashtable namesCache = new Hashtable(); duke@1: NameContext modulesContext = new NameContext(false); duke@1: duke@1: ClassDefinition defRemote = null; duke@1: ClassDefinition defError = null; duke@1: ClassDefinition defException = null; duke@1: ClassDefinition defRemoteException = null; duke@1: ClassDefinition defCorbaObject = null; duke@1: ClassDefinition defSerializable = null; duke@1: ClassDefinition defExternalizable = null; duke@1: ClassDefinition defThrowable = null; duke@1: ClassDefinition defRuntimeException = null; duke@1: ClassDefinition defIDLEntity = null; duke@1: ClassDefinition defValueBase = null; duke@1: duke@1: sun.tools.java.Type typeRemoteException = null; duke@1: sun.tools.java.Type typeIOException = null; duke@1: sun.tools.java.Type typeException = null; duke@1: sun.tools.java.Type typeThrowable = null; duke@1: duke@1: ContextStack contextStack = null; duke@1: duke@1: /** duke@1: * Create a BatchEnvironment for rmic with the given class path, duke@1: * stream for messages and Main. duke@1: */ duke@1: public BatchEnvironment(OutputStream out, ClassPath path, Main main) { duke@1: duke@1: super(out,path,main); duke@1: duke@1: // Make sure we have our definitions... duke@1: duke@1: try { duke@1: defRemote = duke@1: getClassDeclaration(idRemote).getClassDefinition(this); duke@1: defError = duke@1: getClassDeclaration(idJavaLangError).getClassDefinition(this); duke@1: defException = duke@1: getClassDeclaration(idJavaLangException).getClassDefinition(this); duke@1: defRemoteException = duke@1: getClassDeclaration(idRemoteException).getClassDefinition(this); duke@1: defCorbaObject = duke@1: getClassDeclaration(idCorbaObject).getClassDefinition(this); duke@1: defSerializable = duke@1: getClassDeclaration(idJavaIoSerializable).getClassDefinition(this); duke@1: defRuntimeException = duke@1: getClassDeclaration(idJavaLangRuntimeException).getClassDefinition(this); duke@1: defExternalizable = duke@1: getClassDeclaration(idJavaIoExternalizable).getClassDefinition(this); duke@1: defThrowable= duke@1: getClassDeclaration(idJavaLangThrowable).getClassDefinition(this); duke@1: defIDLEntity= duke@1: getClassDeclaration(idIDLEntity).getClassDefinition(this); duke@1: defValueBase= duke@1: getClassDeclaration(idValueBase).getClassDefinition(this); duke@1: typeRemoteException = defRemoteException.getClassDeclaration().getType(); duke@1: typeException = defException.getClassDeclaration().getType(); duke@1: typeIOException = getClassDeclaration(idJavaIoIOException).getType(); duke@1: typeThrowable = getClassDeclaration(idJavaLangThrowable).getType(); duke@1: duke@1: classPathLoader = new ClassPathLoader(path); duke@1: duke@1: } catch (ClassNotFound e) { duke@1: error(0, "rmic.class.not.found", e.name); duke@1: throw new Error(); duke@1: } duke@1: } duke@1: duke@1: /** duke@1: * Return whether or not to parse non-conforming types. duke@1: */ duke@1: public boolean getParseNonConforming () { duke@1: return parseNonConforming; duke@1: } duke@1: duke@1: /** duke@1: * Set whether or not to parse non-conforming types. duke@1: */ duke@1: public void setParseNonConforming (boolean parseEm) { duke@1: duke@1: // If we are transitioning from not parsing to duke@1: // parsing, we need to throw out any previously duke@1: // parsed types... duke@1: duke@1: if (parseEm && !parseNonConforming) { duke@1: reset(); duke@1: } duke@1: duke@1: parseNonConforming = parseEm; duke@1: } duke@1: duke@1: void setStandardPackage(boolean standardPackage) { duke@1: this.standardPackage = standardPackage; duke@1: } duke@1: duke@1: boolean getStandardPackage() { duke@1: return standardPackage; duke@1: } duke@1: duke@1: /** duke@1: * Clear out any data from previous executions. duke@1: */ duke@1: public void reset () { duke@1: duke@1: // First, find all Type instances and call destroy() duke@1: // on them... duke@1: duke@1: for (Enumeration e = allTypes.elements() ; e.hasMoreElements() ;) { duke@1: Type type = (Type) e.nextElement(); duke@1: type.destroy(); duke@1: } duke@1: duke@1: for (Enumeration e = invalidTypes.keys() ; e.hasMoreElements() ;) { duke@1: Type type = (Type) e.nextElement(); duke@1: type.destroy(); duke@1: } duke@1: duke@1: for (Iterator e = alreadyChecked.iterator() ; e.hasNext() ;) { duke@1: Type type = (Type) e.next(); duke@1: type.destroy(); duke@1: } duke@1: duke@1: if (contextStack != null) contextStack.clear(); duke@1: duke@1: // Remove and clear all NameContexts in the duke@1: // nameContexts cache... duke@1: duke@1: if (nameContexts != null) { duke@1: for (Enumeration e = nameContexts.elements() ; e.hasMoreElements() ;) { duke@1: NameContext context = (NameContext) e.nextElement(); duke@1: context.clear(); duke@1: } duke@1: nameContexts.clear(); duke@1: } duke@1: duke@1: // Now remove all table entries... duke@1: duke@1: allTypes.clear(); duke@1: invalidTypes.clear(); duke@1: alreadyChecked.clear(); duke@1: namesCache.clear(); duke@1: modulesContext.clear(); duke@1: duke@1: // Clean up remaining... duke@1: loader = null; duke@1: parseNonConforming = false; duke@1: duke@1: // REVISIT - can't clean up classPathLoader here duke@1: } duke@1: duke@1: /** duke@1: * Release resources, if any. duke@1: */ duke@1: public void shutdown() { duke@1: if (alreadyChecked != null) { duke@1: //System.out.println(); duke@1: //System.out.println("allTypes.size() = "+ allTypes.size()); duke@1: //System.out.println(" InstanceCount before reset = "+Type.instanceCount); duke@1: reset(); duke@1: //System.out.println(" InstanceCount AFTER reset = "+Type.instanceCount); duke@1: duke@1: alreadyChecked = null; duke@1: allTypes = null; duke@1: invalidTypes = null; duke@1: nameContexts = null; duke@1: namesCache = null; duke@1: modulesContext = null; duke@1: defRemote = null; duke@1: defError = null; duke@1: defException = null; duke@1: defRemoteException = null; duke@1: defCorbaObject = null; duke@1: defSerializable = null; duke@1: defExternalizable = null; duke@1: defThrowable = null; duke@1: defRuntimeException = null; duke@1: defIDLEntity = null; duke@1: defValueBase = null; duke@1: typeRemoteException = null; duke@1: typeIOException = null; duke@1: typeException = null; duke@1: typeThrowable = null; duke@1: duke@1: super.shutdown(); duke@1: } duke@1: } duke@1: }