src/share/classes/com/sun/corba/se/impl/presentation/rmi/ExceptionHandlerImpl.java

Tue, 28 Dec 2010 15:52:36 -0800

author
ohair
date
Tue, 28 Dec 2010 15:52:36 -0800
changeset 240
f90b3e014e83
parent 173
032585ad970d
child 748
6845b95cba6b
permissions
-rw-r--r--

6962318: Update copyright year
Reviewed-by: xdono

duke@1 1 /*
ohair@240 2 * Copyright (c) 2003, 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 package com.sun.corba.se.impl.presentation.rmi ;
duke@1 27
duke@1 28 import java.io.Serializable ;
duke@1 29 import java.io.Externalizable ;
duke@1 30
duke@1 31 import javax.rmi.PortableRemoteObject ;
duke@1 32 import javax.rmi.CORBA.Util ;
duke@1 33
duke@1 34 import java.rmi.RemoteException ;
duke@1 35 import java.rmi.UnexpectedException ;
duke@1 36
duke@1 37 import org.omg.CORBA.UserException ;
duke@1 38
duke@1 39 import org.omg.CORBA_2_3.portable.InputStream ;
duke@1 40 import org.omg.CORBA_2_3.portable.OutputStream ;
duke@1 41 import org.omg.CORBA.portable.ApplicationException ;
duke@1 42
duke@1 43 import java.lang.reflect.Method ;
duke@1 44
duke@1 45 import com.sun.corba.se.spi.logging.CORBALogDomains ;
duke@1 46 import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
duke@1 47
duke@1 48 public class ExceptionHandlerImpl implements ExceptionHandler
duke@1 49 {
duke@1 50 private ExceptionRW[] rws ;
duke@1 51
duke@1 52 private final ORBUtilSystemException wrapper ;
duke@1 53
duke@1 54 ///////////////////////////////////////////////////////////////////////////////
duke@1 55 // ExceptionRW interface and implementations.
duke@1 56 // Used to read and write exceptions.
duke@1 57 ///////////////////////////////////////////////////////////////////////////////
duke@1 58
duke@1 59 public interface ExceptionRW
duke@1 60 {
duke@1 61 Class getExceptionClass() ;
duke@1 62
duke@1 63 String getId() ;
duke@1 64
duke@1 65 void write( OutputStream os, Exception ex ) ;
duke@1 66
duke@1 67 Exception read( InputStream is ) ;
duke@1 68 }
duke@1 69
duke@1 70 public abstract class ExceptionRWBase implements ExceptionRW
duke@1 71 {
duke@1 72 private Class cls ;
duke@1 73 private String id ;
duke@1 74
duke@1 75 public ExceptionRWBase( Class cls )
duke@1 76 {
duke@1 77 this.cls = cls ;
duke@1 78 }
duke@1 79
duke@1 80 public Class getExceptionClass()
duke@1 81 {
duke@1 82 return cls ;
duke@1 83 }
duke@1 84
duke@1 85 public String getId()
duke@1 86 {
duke@1 87 return id ;
duke@1 88 }
duke@1 89
duke@1 90 void setId( String id )
duke@1 91 {
duke@1 92 this.id = id ;
duke@1 93 }
duke@1 94 }
duke@1 95
duke@1 96 public class ExceptionRWIDLImpl extends ExceptionRWBase
duke@1 97 {
duke@1 98 private Method readMethod ;
duke@1 99 private Method writeMethod ;
duke@1 100
duke@1 101 public ExceptionRWIDLImpl( Class cls )
duke@1 102 {
duke@1 103 super( cls ) ;
duke@1 104
duke@1 105 String helperName = cls.getName() + "Helper" ;
duke@1 106 ClassLoader loader = cls.getClassLoader() ;
duke@1 107 Class helperClass ;
duke@1 108
duke@1 109 try {
duke@1 110 helperClass = Class.forName( helperName, true, loader ) ;
jjg@173 111 Method idMethod = helperClass.getDeclaredMethod( "id", (Class[])null ) ;
jjg@173 112 setId( (String)idMethod.invoke( null, (Object[])null ) ) ;
duke@1 113 } catch (Exception ex) {
duke@1 114 throw wrapper.badHelperIdMethod( ex, helperName ) ;
duke@1 115 }
duke@1 116
duke@1 117 try {
duke@1 118 Class[] argTypes = new Class[] {
duke@1 119 org.omg.CORBA.portable.OutputStream.class, cls } ;
duke@1 120 writeMethod = helperClass.getDeclaredMethod( "write",
duke@1 121 argTypes ) ;
duke@1 122 } catch (Exception ex) {
duke@1 123 throw wrapper.badHelperWriteMethod( ex, helperName ) ;
duke@1 124 }
duke@1 125
duke@1 126 try {
duke@1 127 Class[] argTypes = new Class[] {
duke@1 128 org.omg.CORBA.portable.InputStream.class } ;
duke@1 129 readMethod = helperClass.getDeclaredMethod( "read", argTypes ) ;
duke@1 130 } catch (Exception ex) {
duke@1 131 throw wrapper.badHelperReadMethod( ex, helperName ) ;
duke@1 132 }
duke@1 133 }
duke@1 134
duke@1 135 public void write( OutputStream os, Exception ex )
duke@1 136 {
duke@1 137 try {
duke@1 138 Object[] args = new Object[] { os, ex } ;
duke@1 139 writeMethod.invoke( null, args ) ;
duke@1 140 } catch (Exception exc) {
duke@1 141 throw wrapper.badHelperWriteMethod( exc,
duke@1 142 writeMethod.getDeclaringClass().getName() ) ;
duke@1 143 }
duke@1 144 }
duke@1 145
duke@1 146 public Exception read( InputStream is )
duke@1 147 {
duke@1 148 try {
duke@1 149 Object[] args = new Object[] { is } ;
duke@1 150 return (Exception)readMethod.invoke( null, args ) ;
duke@1 151 } catch (Exception ex) {
duke@1 152 throw wrapper.badHelperReadMethod( ex,
duke@1 153 readMethod.getDeclaringClass().getName() ) ;
duke@1 154 }
duke@1 155 }
duke@1 156 }
duke@1 157
duke@1 158 public class ExceptionRWRMIImpl extends ExceptionRWBase
duke@1 159 {
duke@1 160 public ExceptionRWRMIImpl( Class cls )
duke@1 161 {
duke@1 162 super( cls ) ;
duke@1 163 setId( IDLNameTranslatorImpl.getExceptionId( cls ) ) ;
duke@1 164 }
duke@1 165
duke@1 166 public void write( OutputStream os, Exception ex )
duke@1 167 {
duke@1 168 os.write_string( getId() ) ;
duke@1 169 os.write_value( ex, getExceptionClass() ) ;
duke@1 170 }
duke@1 171
duke@1 172 public Exception read( InputStream is )
duke@1 173 {
duke@1 174 is.read_string() ; // read and ignore!
duke@1 175 return (Exception)is.read_value( getExceptionClass() ) ;
duke@1 176 }
duke@1 177 }
duke@1 178
duke@1 179 ///////////////////////////////////////////////////////////////////////////////
duke@1 180
duke@1 181 public ExceptionHandlerImpl( Class[] exceptions )
duke@1 182 {
duke@1 183 wrapper = ORBUtilSystemException.get(
duke@1 184 CORBALogDomains.RPC_PRESENTATION ) ;
duke@1 185
duke@1 186 int count = 0 ;
duke@1 187 for (int ctr=0; ctr<exceptions.length; ctr++) {
duke@1 188 Class cls = exceptions[ctr] ;
duke@1 189 if (!RemoteException.class.isAssignableFrom(cls))
duke@1 190 count++ ;
duke@1 191 }
duke@1 192
duke@1 193 rws = new ExceptionRW[count] ;
duke@1 194
duke@1 195 int index = 0 ;
duke@1 196 for (int ctr=0; ctr<exceptions.length; ctr++) {
duke@1 197 Class cls = exceptions[ctr] ;
duke@1 198 if (!RemoteException.class.isAssignableFrom(cls)) {
duke@1 199 ExceptionRW erw = null ;
duke@1 200 if (UserException.class.isAssignableFrom(cls))
duke@1 201 erw = new ExceptionRWIDLImpl( cls ) ;
duke@1 202 else
duke@1 203 erw = new ExceptionRWRMIImpl( cls ) ;
duke@1 204
duke@1 205 /* The following check is not performed
duke@1 206 * in order to maintain compatibility with
duke@1 207 * rmic. See bug 4989312.
duke@1 208
duke@1 209 // Check for duplicate repository ID
duke@1 210 String repositoryId = erw.getId() ;
duke@1 211 int duplicateIndex = findDeclaredException( repositoryId ) ;
duke@1 212 if (duplicateIndex > 0) {
duke@1 213 ExceptionRW duprw = rws[duplicateIndex] ;
duke@1 214 String firstClassName =
duke@1 215 erw.getExceptionClass().getName() ;
duke@1 216 String secondClassName =
duke@1 217 duprw.getExceptionClass().getName() ;
duke@1 218 throw wrapper.duplicateExceptionRepositoryId(
duke@1 219 firstClassName, secondClassName, repositoryId ) ;
duke@1 220 }
duke@1 221
duke@1 222 */
duke@1 223
duke@1 224 rws[index++] = erw ;
duke@1 225 }
duke@1 226 }
duke@1 227 }
duke@1 228
duke@1 229 private int findDeclaredException( Class cls )
duke@1 230 {
duke@1 231 for (int ctr = 0; ctr < rws.length; ctr++) {
duke@1 232 Class next = rws[ctr].getExceptionClass() ;
duke@1 233 if (next.isAssignableFrom(cls))
duke@1 234 return ctr ;
duke@1 235 }
duke@1 236
duke@1 237 return -1 ;
duke@1 238 }
duke@1 239
duke@1 240 private int findDeclaredException( String repositoryId )
duke@1 241 {
duke@1 242 for (int ctr=0; ctr<rws.length; ctr++) {
duke@1 243 // This may occur when rws has not been fully
duke@1 244 // populated, in which case the search should just fail.
duke@1 245 if (rws[ctr]==null)
duke@1 246 return -1 ;
duke@1 247
duke@1 248 String rid = rws[ctr].getId() ;
duke@1 249 if (repositoryId.equals( rid ))
duke@1 250 return ctr ;
duke@1 251 }
duke@1 252
duke@1 253 return -1 ;
duke@1 254 }
duke@1 255
duke@1 256 public boolean isDeclaredException( Class cls )
duke@1 257 {
duke@1 258 return findDeclaredException( cls ) >= 0 ;
duke@1 259 }
duke@1 260
duke@1 261 public void writeException( OutputStream os, Exception ex )
duke@1 262 {
duke@1 263 int index = findDeclaredException( ex.getClass() ) ;
duke@1 264 if (index < 0)
duke@1 265 throw wrapper.writeUndeclaredException( ex,
duke@1 266 ex.getClass().getName() ) ;
duke@1 267
duke@1 268 rws[index].write( os, ex ) ;
duke@1 269 }
duke@1 270
duke@1 271 public Exception readException( ApplicationException ae )
duke@1 272 {
duke@1 273 // Note that the exception ID is present in both ae
duke@1 274 // and in the input stream from ae. The exception
duke@1 275 // reader must actually read the exception ID from
duke@1 276 // the stream.
duke@1 277 InputStream is = (InputStream)ae.getInputStream() ;
duke@1 278 String excName = ae.getId() ;
duke@1 279 int index = findDeclaredException( excName ) ;
duke@1 280 if (index < 0) {
duke@1 281 excName = is.read_string() ;
duke@1 282 Exception res = new UnexpectedException( excName ) ;
duke@1 283 res.initCause( ae ) ;
duke@1 284 return res ;
duke@1 285 }
duke@1 286
duke@1 287 return rws[index].read( is ) ;
duke@1 288 }
duke@1 289
duke@1 290 // This is here just for the dynamicrmiiiop test
duke@1 291 public ExceptionRW getRMIExceptionRW( Class cls )
duke@1 292 {
duke@1 293 return new ExceptionRWRMIImpl( cls ) ;
duke@1 294 }
duke@1 295 }

mercurial