1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.commons.pipeline.stage;
19
20 import java.lang.reflect.InvocationTargetException;
21 import java.lang.reflect.Method;
22
23 import org.apache.commons.pipeline.StageException;
24
25 /**
26 * Runs a static method with the object (or array) being processed. The returned object
27 * will be exqueued on the main pipeline if it is not null. If the returned
28 * object is null, this stage will attempt to place the original object on the
29 * branch specified by {@link #setNullResultBranchTag(String)}.
30 */
31 public class InvokeStaticMethodStage extends BaseStage {
32
33 // Branch upon which the original objects will be enqueued if the defined
34 // Method returned a null result.
35 private String nullResultBranchKey;
36
37 // Method used to process objects in the queue
38 private Method method;
39
40 /**
41 * Creates a new instance of InvokeStaticMethodStage
42 */
43 public InvokeStaticMethodStage(Method method) {
44 super();
45 this.method = method;
46 }
47
48 /**
49 * Convenience method to create the new stage with String description of className, methodName and argumentType
50 *
51 * @param className The fully qualified class name, such as "java.lang.String" of the class in which the method resides
52 * @param methodName The name of the method
53 * @param argumentType The argument type of the method (Sorry, this doesn't support multiple argument methods)
54 */
55 public InvokeStaticMethodStage(String className, String methodName, String... argumentTypeNames) throws ClassNotFoundException, NoSuchMethodException {
56 Class clazz = InvokeStaticMethodStage.class.getClassLoader().loadClass(className);
57 Class[] argTypes = new Class[argumentTypeNames.length];
58 for (int i = 0; i < argumentTypeNames.length; i++) {
59 argTypes[i] = Class.forName(argumentTypeNames[i]);
60 }
61
62 this.method = clazz.getMethod(methodName, argTypes);
63 }
64
65 /**
66 * Returns the Method object for the method that will be used to process
67 * objects in the queue.
68 */
69 public Method getMethod(){
70 return this.method;
71 }
72
73 /**
74 * <p>Calls the defined static method and exqueues the returned object if it is
75 * not null, otherwise placing the original object on the branch specified
76 * by the nullResultBranchKey property if nullResultBranchKey is not null.</p>
77 *
78 * @param obj The object to be processed.
79 */
80 public void process(Object obj) throws StageException {
81 try {
82 Object result = this.method.invoke(null, obj);
83 if (result != null){
84 this.emit(result);
85 } else if (nullResultBranchKey != null) {
86 this.context.getBranchFeeder(nullResultBranchKey).feed(obj);
87 }
88 } catch (IllegalAccessException e){
89 throw new StageException(this, e);
90 } catch (InvocationTargetException e){
91 throw new StageException(this, e);
92 }
93 }
94
95 /**
96 * Getter for property nullResultBranchKey.
97 *
98 * @return Value of property nullResultBranchKey.
99 */
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 }