OSDN Git Service

DBFlute-0.9.3に更新
[ea2ddl/ea2ddl.git] / ea2ddl-dao / src / main / java / jp / sourceforge / ea2ddl / dao / allcommon / helper / stacktrace / impl / InvokeNameExtractorImpl.java
1 package jp.sourceforge.ea2ddl.dao.allcommon.helper.stacktrace.impl;\r
2 \r
3 import jp.sourceforge.ea2ddl.dao.allcommon.helper.stacktrace.InvokeNameResult;\r
4 import jp.sourceforge.ea2ddl.dao.allcommon.helper.stacktrace.InvokeNameExtractingResource;\r
5 import jp.sourceforge.ea2ddl.dao.allcommon.helper.stacktrace.InvokeNameExtractor;\r
6 \r
7 /**\r
8  * @author DBFlute(AutoGenerator)\r
9  */\r
10 public class InvokeNameExtractorImpl implements InvokeNameExtractor {\r
11 \r
12     // ==========================================================================================\r
13     //                                                                                  Attribute\r
14     //                                                                                  =========\r
15     protected StackTraceElement[] _stackTrace;\r
16 \r
17     // ==========================================================================================\r
18     //                                                                                       Main\r
19     //                                                                                       ====\r
20     /**\r
21      * @param resource the call-back resource for invoke-name-extracting. (NotNull)\r
22      * @return Invoke name. (NotNull: If not found, returns empty string.)\r
23      */\r
24     public InvokeNameResult extractInvokeName(InvokeNameExtractingResource resource) {\r
25         if (_stackTrace == null) {\r
26             String msg = "The attribute 'stackTrace' should not be null: resource=" + resource;\r
27             throw new IllegalStateException(msg);\r
28         }\r
29         String targetSimpleClassName = null;\r
30         String targetMethodName = null;\r
31         int lineNumber = 0;\r
32         int foundIndex = -1; // The minus one means 'Not Found'.\r
33         int foundFirstIndex = -1; // The minus one means 'Not Found'.\r
34         boolean onTarget = false;\r
35         for (int i=resource.getStartIndex(); i < _stackTrace.length; i++) {\r
36             final StackTraceElement element = _stackTrace[i];\r
37             if (i > resource.getStartIndex() + resource.getLoopSize()) {\r
38                 break;\r
39             }\r
40             final String className = element.getClassName();\r
41             if (className.startsWith("sun.") || className.startsWith("java.")) {\r
42                 if (onTarget) {\r
43                     break;\r
44                 }\r
45                 continue;\r
46             }\r
47             final String methodName = element.getMethodName();\r
48             if (resource.isTargetElement(className, methodName)) {\r
49                 if (methodName.equals("invoke")) {\r
50                     continue;\r
51                 }\r
52                 targetSimpleClassName = className.substring(className.lastIndexOf(".") + 1);\r
53                 targetMethodName = methodName;\r
54                 if (resource.isUseAdditionalInfo()) {\r
55                     lineNumber = element.getLineNumber();\r
56                 }\r
57                 foundIndex = i;\r
58                 if (foundFirstIndex == -1) {\r
59                     foundFirstIndex = i;\r
60                 }\r
61                 onTarget = true;\r
62                 continue;\r
63             }\r
64             if (onTarget) {\r
65                 break;\r
66             }\r
67         }\r
68         final InvokeNameResult result = new InvokeNameResult();\r
69         if (targetSimpleClassName == null) {\r
70             result.beEmptyResult(); // Not Found! It sets empty result.\r
71             return result;\r
72         }\r
73         final String filteredClassName = resource.filterSimpleClassName(targetSimpleClassName);\r
74         result.setSimpleClassName(resource.filterSimpleClassName(targetSimpleClassName));\r
75         result.setMethodName(targetMethodName);\r
76         if (lineNumber > 0) {\r
77             result.setInvokeName(filteredClassName + "." + targetMethodName + "():" + lineNumber + " --> ");\r
78         } else {\r
79             result.setInvokeName(filteredClassName + "." + targetMethodName + "() --> ");\r
80         }\r
81         result.setFoundIndex(foundIndex);\r
82         result.setFoundFirstIndex(foundFirstIndex);\r
83         return result;\r
84     }\r
85 \r
86     // ==========================================================================================\r
87     //                                                                                   Accessor\r
88     //                                                                                   ========\r
89     public void setStackTrace(StackTraceElement[] stackTrace) {\r
90         _stackTrace = stackTrace;\r
91     }\r
92 }