1/* 2 * Copyright (c) 1998, 2007, 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/* 27 * Licensed Materials - Property of IBM 28 * RMI-IIOP v1.0 29 * Copyright IBM Corp. 1998 1999 All Rights Reserved 30 * 31 */ 32 33package sun.rmi.rmic.iiop; 34 35import java.util.Vector; 36import sun.tools.java.CompilerError; 37import sun.tools.java.ClassNotFound; 38import sun.tools.java.ClassDefinition; 39 40/** 41 * NCClassType represents any non-special class which does not 42 * extends one or more interfaces which inherit from java.rmi.Remote. 43 * <p> 44 * The static forImplementation(...) method must be used to obtain an instance, 45 * and will return null if the ClassDefinition is non-conforming. 46 * 47 * @author Bryan Atsatt 48 */ 49public class NCClassType extends ClassType { 50 51 //_____________________________________________________________________ 52 // Public Interfaces 53 //_____________________________________________________________________ 54 55 /** 56 * Create an NCClassType for the given class. 57 * 58 * If the class is not a properly formed or if some other error occurs, the 59 * return value will be null, and errors will have been reported to the 60 * supplied BatchEnvironment. 61 */ 62 public static NCClassType forNCClass(ClassDefinition classDef, 63 ContextStack stack) { 64 65 if (stack.anyErrors()) return null; 66 67 boolean doPop = false; 68 try { 69 // Do we already have it? 70 71 sun.tools.java.Type theType = classDef.getType(); 72 Type existing = getType(theType,stack); 73 74 if (existing != null) { 75 76 if (!(existing instanceof NCClassType)) return null; // False hit. 77 78 // Yep, so return it... 79 80 return (NCClassType) existing; 81 82 } 83 84 NCClassType it = new NCClassType(stack, classDef); 85 putType(theType,it,stack); 86 stack.push(it); 87 doPop = true; 88 89 if (it.initialize(stack)) { 90 stack.pop(true); 91 return it; 92 } else { 93 removeType(theType,stack); 94 stack.pop(false); 95 return null; 96 } 97 } catch (CompilerError e) { 98 if (doPop) stack.pop(false); 99 return null; 100 } 101 } 102 103 /** 104 * Return a string describing this type. 105 */ 106 public String getTypeDescription () { 107 return addExceptionDescription("Non-conforming class"); 108 } 109 110 //_____________________________________________________________________ 111 // Internal/Subclass Interfaces 112 //_____________________________________________________________________ 113 114 /** 115 * Create a NCClassType instance for the given class. The resulting 116 * object is not yet completely initialized. 117 */ 118 private NCClassType(ContextStack stack, ClassDefinition classDef) { 119 super(stack,classDef,TYPE_NC_CLASS | TM_CLASS | TM_COMPOUND); 120 } 121 122 //_____________________________________________________________________ 123 // Internal Interfaces 124 //_____________________________________________________________________ 125 126 /** 127 * Initialize this instance. 128 */ 129 private boolean initialize (ContextStack stack) { 130 if (!initParents(stack)) { 131 return false; 132 } 133 134 if (stack.getEnv().getParseNonConforming()) { 135 136 Vector directInterfaces = new Vector(); 137 Vector directMethods = new Vector(); 138 Vector directMembers = new Vector(); 139 140 try { 141 142 // Get methods... 143 144 if (addAllMethods(getClassDefinition(),directMethods,false,false,stack) != null) { 145 146 // Update parent class methods... 147 148 if (updateParentClassMethods(getClassDefinition(),directMethods,false,stack) != null) { 149 150 // Get conforming constants... 151 152 if (addConformingConstants(directMembers,false,stack)) { 153 154 // We're ok, so pass 'em up... 155 156 if (!initialize(directInterfaces,directMethods,directMembers,stack,false)) { 157 return false; 158 } 159 } 160 } 161 } 162 return true; 163 164 } catch (ClassNotFound e) { 165 classNotFound(stack,e); 166 } 167 return false; 168 } else { 169 return initialize(null,null,null,stack,false); 170 } 171 } 172} 173