1
2
3
4
5
6
7
8
9
10
11 package org.astrogrid.applications.javaclass;
12
13 import org.astrogrid.applications.AbstractApplication;
14 import org.astrogrid.applications.CeaException;
15 import org.astrogrid.applications.Status;
16 import org.astrogrid.applications.beans.v1.parameters.ParameterValue;
17 import org.astrogrid.applications.description.ApplicationInterface;
18 import org.astrogrid.applications.description.ParameterDescription;
19 import org.astrogrid.applications.parameter.ParameterAdapter;
20 import org.astrogrid.applications.parameter.protocol.ExternalValue;
21 import org.astrogrid.applications.parameter.protocol.ProtocolLibrary;
22 import org.astrogrid.workflow.beans.v1.Tool;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26
27 import java.lang.reflect.InvocationTargetException;
28 import java.lang.reflect.Method;
29 import java.util.ArrayList;
30 import java.util.Iterator;
31 import java.util.List;
32
33 /*** An application that executes by calling a static java method
34 * @see org.astrogrid.applications.javaclass.JavaClassApplicationDescription
35 * @see java.lang.reflect.Method
36 * @author Noel Winstanley nw@jb.man.ac.uk 08-Jun-2004
37 */
38 public class JavaClassApplication extends AbstractApplication {
39 /***
40 * Commons Logger for this class
41 */
42 private static final Log logger = LogFactory.getLog(JavaClassApplication.class);
43
44 /*** Construct a new JavaClassApplication
45 * @param ids
46 * @param user
47 * @param tool
48 * @param description
49 */
50 public JavaClassApplication(IDs ids, Tool tool, ApplicationInterface interf, ProtocolLibrary lib) {
51 super(ids, tool, interf,lib);
52
53 }
54
55 /*** Starts the application executing.
56 * standard pattern - processes all input parameters, then starts a background thread to perform the execution itself.
57 * @todo bug here - we assume our parameters are in the correct order to pass to the java method. should sort them into correct order first.
58 * @see org.astrogrid.applications.Application#execute(org.astrogrid.applications.ApplicationExitMonitor)
59 */
60 public Runnable createExecutionTask() throws CeaException {
61 createAdapters();
62
63 JavaClassApplicationDescription jappDesc = (JavaClassApplicationDescription)getApplicationDescription();
64 Runnable task = new Worker(jappDesc.method);
65 setStatus(Status.INITIALIZED);
66 return task;
67
68 }
69 /*** A Worker thread, that performs the computation after {@link JavaClassApplication#execute() } returns */
70 protected class Worker implements Runnable {
71 /*** Construct a new Worker
72 * @param args the arguments to the call
73 * @param m the method to call
74 */
75 public Worker(Method m) {
76 this.method =m;
77 }
78 protected final Method method;
79 /*** 'executes' the application by calling {@link Method#invoke(java.lang.Object, java.lang.Object[])}*/
80 public void run() {
81 try {
82 List args = new ArrayList();
83 for (Iterator i = inputParameterAdapters(); i.hasNext(); ) {
84 ParameterAdapter a = (ParameterAdapter)i.next();
85 args.add( a.process());
86 }
87 setStatus(Status.RUNNING);
88 Object resultVal = null;
89
90 resultVal = method.invoke(null,args.toArray());
91
92
93 setStatus(Status.WRITINGBACK);
94 ParameterAdapter result = (ParameterAdapter)outputParameterAdapters().next();
95 result.writeBack(resultVal);
96 setStatus(Status.COMPLETED);
97 } catch (IllegalArgumentException e) {
98 reportError("Illegal Argument passed to java 'application'",e);
99 } catch (IllegalAccessException e) {
100 reportError("Could not access java 'application'",e);
101 } catch (InvocationTargetException e) {
102 reportError("Invoked java 'application' raised an exception",e.getTargetException());
103 } catch (CeaException e) {
104 reportError("Failed to write back parameter values",e);
105 } catch (Throwable t) {
106 reportError("Something else gone wrong",t);
107 }
108 }
109 }
110
111 /*** overridden to return a {@link JavaClassParameterAdapter}
112 * @see org.astrogrid.applications.AbstractApplication#instantiateAdapter(org.astrogrid.applications.beans.v1.parameters.ParameterValue, org.astrogrid.applications.description.ParameterDescription, org.astrogrid.applications.parameter.indirect.IndirectParameterValue)
113 */
114 protected ParameterAdapter instantiateAdapter(ParameterValue pval,
115 ParameterDescription descr, ExternalValue indirectVal) {
116 return new JavaClassParameterAdapter(pval, descr, indirectVal);
117 }
118
119 }
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164