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 * Runs a static method with the object (or array) being processed. The returned object
027 * will be exqueued on the main pipeline if it is not null. If the returned
028 * object is null, this stage will attempt to place the original object on the
029 * branch specified by {@link #setNullResultBranchTag(String)}.
030 */
031 public class InvokeStaticMethodStage extends BaseStage {
032
033 // Branch upon which the original objects will be enqueued if the defined
034 // Method returned a null result.
035 private String nullResultBranchKey;
036
037 // Method used to process objects in the queue
038 private Method method;
039
040 /**
041 * Creates a new instance of InvokeStaticMethodStage
042 */
043 public InvokeStaticMethodStage(Method method) {
044 super();
045 this.method = method;
046 }
047
048 /**
049 * Convenience method to create the new stage with String description of className, methodName and argumentType
050 *
051 * @param className The fully qualified class name, such as "java.lang.String" of the class in which the method resides
052 * @param methodName The name of the method
053 * @param argumentType The argument type of the method (Sorry, this doesn't support multiple argument methods)
054 */
055 public InvokeStaticMethodStage(String className, String methodName, String... argumentTypeNames) throws ClassNotFoundException, NoSuchMethodException {
056 Class clazz = InvokeStaticMethodStage.class.getClassLoader().loadClass(className);
057 Class[] argTypes = new Class[argumentTypeNames.length];
058 for (int i = 0; i < argumentTypeNames.length; i++) {
059 argTypes[i] = Class.forName(argumentTypeNames[i]);
060 }
061
062 this.method = clazz.getMethod(methodName, argTypes);
063 }
064
065 /**
066 * Returns the Method object for the method that will be used to process
067 * objects in the queue.
068 */
069 public Method getMethod(){
070 return this.method;
071 }
072
073 /**
074 * <p>Calls the defined static method and exqueues the returned object if it is
075 * not null, otherwise placing the original object on the branch specified
076 * by the nullResultBranchKey property if nullResultBranchKey is not null.</p>
077 *
078 * @param obj The object to be processed.
079 */
080 public void process(Object obj) throws StageException {
081 try {
082 Object result = this.method.invoke(null, obj);
083 if (result != null){
084 this.emit(result);
085 } else if (nullResultBranchKey != null) {
086 this.context.getBranchFeeder(nullResultBranchKey).feed(obj);
087 }
088 } catch (IllegalAccessException e){
089 throw new StageException(this, e);
090 } catch (InvocationTargetException e){
091 throw new StageException(this, e);
092 }
093 }
094
095 /**
096 * Getter for property nullResultBranchKey.
097 *
098 * @return Value of property nullResultBranchKey.
099 */
100 public String getNullResultBranchKey() {
101 return this.nullResultBranchKey;
102 }
103
104 /**
105 * Setter for property nullResultBranchKey. If set to null (default)
106 * then objects generating null results are simply dropped from the stream.
107 *
108 * @param nullResultBranchKey New value of property nullResultBranchKey.
109 */
110 public void setNullResultBranchKey(String nullResultBranchKey) {
111 this.nullResultBranchKey = nullResultBranchKey;
112 }
113 }