Fixes default method resolution (#159)
[jpf-core.git] / src / main / gov / nasa / jpf / tool / Run.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18
19 package gov.nasa.jpf.tool;
20
21 import java.lang.reflect.InvocationTargetException;
22 import java.lang.reflect.Method;
23 import java.lang.reflect.Modifier;
24
25 /**
26  * common base for Run* classes
27  */
28 public class Run {
29
30   protected static void error (String msg){
31     System.err.print("error: ");
32     System.err.println(msg);
33     System.exit(1);
34   }
35
36   protected static void warning (String msg){
37     System.err.print("warning: ");
38     System.err.println(msg);
39   }
40   
41   // filter out leading '+' arguments (Config initialization)
42   protected static String[] removeConfigArgs(String[]args){
43     int i;
44     for (i=0; i<args.length; i++){
45       String a = args[i];
46       if (a != null && a.length() > 0 && a.charAt(0) != '+'){
47         break;
48       }
49     }
50
51     String[] newArgs = new String[args.length - i];
52     System.arraycopy(args,i,newArgs,0,newArgs.length);
53
54     return newArgs;
55   }
56
57   protected static String checkClassName (String cls){
58     if (cls == null || cls.isEmpty()){
59       return null;
60     }
61
62     if (cls.charAt(0) == '.'){
63       cls = "gov.nasa.jpf" + cls;
64     }
65
66     return cls;
67   }
68
69   protected static boolean call( Class<?> cls, String mthName, Object[] args) throws InvocationTargetException {
70     try {
71       Class<?>[] argTypes = new Class<?>[args.length];
72       for (int i=0; i<args.length; i++){
73         argTypes[i] = args[i].getClass();
74       }
75
76       Method m = cls.getMethod(mthName, argTypes);
77
78       int modifiers = m.getModifiers();
79       if (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers)){
80         m.invoke(null, args);
81         return true;
82       }
83
84     } catch (NoSuchMethodException nsmx){
85       return false;
86     } catch (IllegalAccessException iax){
87       return false;
88     }
89
90     return false;
91   }
92
93 }