invocationcontextimpl.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 195 行

JAVA
195
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source 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, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free SoftwareFoundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Rodrigo Westrupp */package com.caucho.ejb.interceptor;import com.caucho.bytecode.JClass;import com.caucho.ejb.cfg.Interceptor;import com.caucho.util.L10N;import javax.interceptor.InvocationContext;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;/** * InvocationContext implementation. */public class InvocationContextImpl implements InvocationContext {  private static final L10N L = new L10N(InvocationContextImpl.class);  private Object _target;  private Object _home;  private Object _parameters[];  private Method _method;  private String _methodName;  private Class _parameterTypes[];  private HashMap<String, Object> _contextData;  private Object _context[];  // Current interceptor in chain.  private int _curr;  private Object _interceptors[];  private Method _methods[];  private boolean _hasCalledTargetMethod;  public InvocationContextImpl(Object target,                               Object home,                               String methodName,                               Class parameterTypes[],                               Object interceptors[],                               Method methods[])  {    _target = target;    _home = home;    _methodName = methodName;    _parameterTypes = parameterTypes;    _interceptors = interceptors;    _methods = methods;    _context = new Object[] { this };  }  public Object getHome()  {    return _home;  }  public Object getTarget()  {    return _target;  }  public Method getMethod()  {    if (_method == null) {      if (_methodName == null)        return null;      Class cl = _target.getClass();      try {        _method = cl.getMethod(_methodName, _parameterTypes);      } catch (NoSuchMethodException e) {        throw new RuntimeException(e);      }    }    return _method;  }  public Object[] getParameters()    throws IllegalStateException  {    return _parameters;  }  public void setParameters(Object[] parameters)    throws IllegalStateException  {    _parameters = parameters;  }  public Map<String, Object> getContextData()  {    if (_contextData == null) {      _contextData = new HashMap<String, Object>();    }    return _contextData;  }  public Object proceed()    throws Exception  {    try {      if (hasNextInterceptor()) {        Object interceptor = nextInterceptor();        return invokeMethod(getCurrentMethod(), interceptor, _context);      }      else if (! hasCalledTargetMethod()) {        return invokeMethod(getMethod(), getTarget(), getParameters());      }    } catch (InvocationTargetException e) {      throw (Exception) e.getCause();    } catch (Exception e) {      throw e;    }    return null;  }  public static Object invokeMethod(Method method, Object obj, Object params[])    throws Exception  {    if (method == null)      return null;    Interceptor.makeAccessible(method);    return method.invoke(obj, params);  }  private boolean hasCalledTargetMethod()  {    return _hasCalledTargetMethod;  }  private void setHasCalledTargetMethod(boolean b)  {    _hasCalledTargetMethod = b;  }  private boolean hasNextInterceptor()  {    if (_curr < _interceptors.length)      return true;    return false;  }  private Object nextInterceptor()  {    return _interceptors[_curr++];  }  private Method getCurrentMethod()  {    return _methods[_curr - 1];  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?