/*
 * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * Licensed Materials - Property of IBM
 * RMI-IIOP v1.0
 * Copyright IBM Corp. 1998 1999  All Rights Reserved
 *
 */

package sun.rmi.rmic.iiop;

import sun.rmi.rmic.Main;
import sun.tools.java.ClassPath;
import java.io.OutputStream;
import sun.tools.java.ClassDefinition;
import sun.tools.java.ClassDeclaration;
import sun.tools.java.Identifier;
import sun.tools.java.ClassNotFound;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.Iterator;

BatchEnvironment for iiop extends rmic's version to add parse state.
/** * BatchEnvironment for iiop extends rmic's version to add * parse state. */
public class BatchEnvironment extends sun.rmi.rmic.BatchEnvironment implements Constants { /* * If the following flag is true, then the IDL generator can map * the methods and constants of non-conforming types. However, * this is very expensive, so the default should be false. */ private boolean parseNonConforming = false;
This flag indicates that the stubs and ties need to be generated without the package prefix (org.omg.stub).
/** * This flag indicates that the stubs and ties need to be generated without * the package prefix (org.omg.stub). */
private boolean standardPackage; /* Common objects used within package */ HashSet alreadyChecked = new HashSet(); Hashtable allTypes = new Hashtable(3001, 0.5f); Hashtable invalidTypes = new Hashtable(256, 0.5f); DirectoryLoader loader = null; ClassPathLoader classPathLoader = null; Hashtable nameContexts = null; Hashtable namesCache = new Hashtable(); NameContext modulesContext = new NameContext(false); ClassDefinition defRemote = null; ClassDefinition defError = null; ClassDefinition defException = null; ClassDefinition defRemoteException = null; ClassDefinition defCorbaObject = null; ClassDefinition defSerializable = null; ClassDefinition defExternalizable = null; ClassDefinition defThrowable = null; ClassDefinition defRuntimeException = null; ClassDefinition defIDLEntity = null; ClassDefinition defValueBase = null; sun.tools.java.Type typeRemoteException = null; sun.tools.java.Type typeIOException = null; sun.tools.java.Type typeException = null; sun.tools.java.Type typeThrowable = null; ContextStack contextStack = null;
Create a BatchEnvironment for rmic with the given class path, stream for messages and Main.
/** * Create a BatchEnvironment for rmic with the given class path, * stream for messages and Main. */
public BatchEnvironment(OutputStream out, ClassPath path, Main main) { super(out,path,main); // Make sure we have our definitions... try { defRemote = getClassDeclaration(idRemote).getClassDefinition(this); defError = getClassDeclaration(idJavaLangError).getClassDefinition(this); defException = getClassDeclaration(idJavaLangException).getClassDefinition(this); defRemoteException = getClassDeclaration(idRemoteException).getClassDefinition(this); defCorbaObject = getClassDeclaration(idCorbaObject).getClassDefinition(this); defSerializable = getClassDeclaration(idJavaIoSerializable).getClassDefinition(this); defRuntimeException = getClassDeclaration(idJavaLangRuntimeException).getClassDefinition(this); defExternalizable = getClassDeclaration(idJavaIoExternalizable).getClassDefinition(this); defThrowable= getClassDeclaration(idJavaLangThrowable).getClassDefinition(this); defIDLEntity= getClassDeclaration(idIDLEntity).getClassDefinition(this); defValueBase= getClassDeclaration(idValueBase).getClassDefinition(this); typeRemoteException = defRemoteException.getClassDeclaration().getType(); typeException = defException.getClassDeclaration().getType(); typeIOException = getClassDeclaration(idJavaIoIOException).getType(); typeThrowable = getClassDeclaration(idJavaLangThrowable).getType(); classPathLoader = new ClassPathLoader(path); } catch (ClassNotFound e) { error(0, "rmic.class.not.found", e.name); throw new Error(); } }
Return whether or not to parse non-conforming types.
/** * Return whether or not to parse non-conforming types. */
public boolean getParseNonConforming () { return parseNonConforming; }
Set whether or not to parse non-conforming types.
/** * Set whether or not to parse non-conforming types. */
public void setParseNonConforming (boolean parseEm) { // If we are transitioning from not parsing to // parsing, we need to throw out any previously // parsed types... if (parseEm && !parseNonConforming) { reset(); } parseNonConforming = parseEm; } void setStandardPackage(boolean standardPackage) { this.standardPackage = standardPackage; } boolean getStandardPackage() { return standardPackage; }
Clear out any data from previous executions.
/** * Clear out any data from previous executions. */
public void reset () { // First, find all Type instances and call destroy() // on them... for (Enumeration e = allTypes.elements() ; e.hasMoreElements() ;) { Type type = (Type) e.nextElement(); type.destroy(); } for (Enumeration e = invalidTypes.keys() ; e.hasMoreElements() ;) { Type type = (Type) e.nextElement(); type.destroy(); } for (Iterator e = alreadyChecked.iterator() ; e.hasNext() ;) { Type type = (Type) e.next(); type.destroy(); } if (contextStack != null) contextStack.clear(); // Remove and clear all NameContexts in the // nameContexts cache... if (nameContexts != null) { for (Enumeration e = nameContexts.elements() ; e.hasMoreElements() ;) { NameContext context = (NameContext) e.nextElement(); context.clear(); } nameContexts.clear(); } // Now remove all table entries... allTypes.clear(); invalidTypes.clear(); alreadyChecked.clear(); namesCache.clear(); modulesContext.clear(); // Clean up remaining... loader = null; parseNonConforming = false; // REVISIT - can't clean up classPathLoader here }
Release resources, if any.
/** * Release resources, if any. */
public void shutdown() { if (alreadyChecked != null) { //System.out.println(); //System.out.println("allTypes.size() = "+ allTypes.size()); //System.out.println(" InstanceCount before reset = "+Type.instanceCount); reset(); //System.out.println(" InstanceCount AFTER reset = "+Type.instanceCount); alreadyChecked = null; allTypes = null; invalidTypes = null; nameContexts = null; namesCache = null; modulesContext = null; defRemote = null; defError = null; defException = null; defRemoteException = null; defCorbaObject = null; defSerializable = null; defExternalizable = null; defThrowable = null; defRuntimeException = null; defIDLEntity = null; defValueBase = null; typeRemoteException = null; typeIOException = null; typeException = null; typeThrowable = null; super.shutdown(); } } }