001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.commons.pipeline.stage; 019 020 import java.lang.reflect.InvocationTargetException; 021 import java.lang.reflect.Method; 022 023 import org.apache.commons.pipeline.StageException; 024 025 /** 026 * Calls a method on the processed object giving it the arguments specified 027 * at the time of object construction. 028 * 029 * 030 * @version $Id: InvokeMethodStage.java 3742 2006-08-28 16:50:23Z kjn $ 031 */ 032 public class InvokeMethodStage extends BaseStage { 033 //private static final Log log = LogFactory.getLog(InvokeMethodStage.class); 034 035 private Method method; 036 private Object[] arguments; 037 038 /** 039 * Creates a new instance of InvokeMethodStage 040 */ 041 public InvokeMethodStage(Method method){ 042 this.method = method; 043 this.arguments = new Object[] { }; 044 } 045 046 /** 047 * Creates a new instance of InvokeMethodStage 048 */ 049 public InvokeMethodStage(Method method, Object... arguments) { 050 this.method = method; 051 this.arguments = arguments; 052 } 053 054 /** 055 * Creates a new instance of InvokeMethodStage from the class and method names. 056 */ 057 public InvokeMethodStage(String className, String methodName, Object... arguments) throws ClassNotFoundException, NoSuchMethodException{ 058 Class<?> clazz = InvokeMethodStage.class.getClassLoader().loadClass(className); 059 Class[] argTypes = new Class[arguments.length]; 060 for (int i = 0; i < arguments.length; i++) argTypes[i] = arguments[i].getClass(); 061 062 this.method = clazz.getMethod(methodName, argTypes); 063 this.arguments = arguments; 064 } 065 066 /** Returns the method to be accessed by processing 067 *@return the method 068 */ 069 public Method getMethod(){ 070 return this.method; 071 } 072 073 /** Returns the objects being used to invoke this method 074 *@return The objects being used 075 */ 076 public Object[] getArguments(){ 077 return this.arguments; 078 } 079 080 /** Calls the specified method on the object being processed and exqueues the result 081 * @param obj The object being processed. 082 */ 083 public void process(Object obj) throws org.apache.commons.pipeline.StageException { 084 try { 085 Object result = method.invoke(obj, arguments); 086 this.emit(result); 087 } catch (IllegalAccessException e){ 088 throw new StageException(this, e); 089 } catch (InvocationTargetException e){ 090 throw new StageException(this, e); 091 } 092 } 093 }