/* * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package com.sun.corba.se.spi.orbutil.proxy ; import java.io.Serializable ; import java.util.Map ; import java.util.LinkedHashMap ; import java.lang.reflect.Proxy ; import java.lang.reflect.Method ; import java.lang.reflect.InvocationHandler ; import com.sun.corba.se.spi.logging.CORBALogDomains ; import com.sun.corba.se.impl.logging.ORBUtilSystemException ; public class CompositeInvocationHandlerImpl implements CompositeInvocationHandler { private Map classToInvocationHandler = new LinkedHashMap() ; private InvocationHandler defaultHandler = null ; public void addInvocationHandler( Class interf, InvocationHandler handler ) { classToInvocationHandler.put( interf, handler ) ; } public void setDefaultHandler( InvocationHandler handler ) { defaultHandler = handler ; } public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable { // Note that the declaring class in method is the interface // in which the method was defined, not the proxy class. Class cls = method.getDeclaringClass() ; InvocationHandler handler = (InvocationHandler)classToInvocationHandler.get( cls ) ; if (handler == null) { if (defaultHandler != null) handler = defaultHandler ; else { ORBUtilSystemException wrapper = ORBUtilSystemException.get( CORBALogDomains.UTIL ) ; throw wrapper.noInvocationHandler( "\"" + method.toString() + "\"" ) ; } } // handler should never be null here. return handler.invoke( proxy, method, args ) ; } }