OSDN Git Service

6a62a14e2b074024763d4ebd0810e04c76553afe
[xerial/xerial-core.git] / src / main / java / org / xerial / util / opt / ArgumentItem.java
1 /*--------------------------------------------------------------------------\r
2  *  Copyright 2008 Taro L. Saito\r
3  *\r
4  *  Licensed under the Apache License, Version 2.0 (the "License");\r
5  *  you may not use this file except in compliance with the License.\r
6  *  You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  *  Unless required by applicable law or agreed to in writing, software\r
11  *  distributed under the License is distributed on an "AS IS" BASIS,\r
12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  *  See the License for the specific language governing permissions and\r
14  *  limitations under the License.\r
15  *--------------------------------------------------------------------------*/\r
16 //--------------------------------------\r
17 // XerialJ\r
18 //\r
19 // ArgumentItem.java\r
20 // Since: 2008/10/27 23:49:28\r
21 //\r
22 // $URL$\r
23 // $Author$\r
24 //--------------------------------------\r
25 package org.xerial.util.opt;\r
26 \r
27 import java.lang.reflect.Field;\r
28 import java.lang.reflect.Method;\r
29 \r
30 import org.xerial.util.Range;\r
31 import org.xerial.util.bean.TypeInfo;\r
32 \r
33 /**\r
34  * ArgumentItem\r
35  * \r
36  * @author leo\r
37  * \r
38  */\r
39 public class ArgumentItem\r
40 {\r
41     private final Argument     argumentDescriptor;\r
42     private final OptionSetter argumentSetter;\r
43 \r
44     public ArgumentItem(Method setter)\r
45     {\r
46         argumentDescriptor = setter.getAnnotation(Argument.class);\r
47         if (argumentDescriptor == null)\r
48             throw new IllegalArgumentException(setter + " is not for an option argument");\r
49 \r
50         argumentSetter = new OptionSetterViaMethod(setter);\r
51     }\r
52 \r
53     public ArgumentItem(Field field)\r
54     {\r
55         argumentDescriptor = field.getAnnotation(Argument.class);\r
56         if (argumentDescriptor == null)\r
57             throw new IllegalArgumentException(field + " is not for an option argument");\r
58 \r
59         argumentSetter = new OptionSetterViaField(field);\r
60     }\r
61 \r
62     @Override\r
63     public boolean equals(Object obj)\r
64     {\r
65         if (obj instanceof ArgumentItem)\r
66         {\r
67             ArgumentItem other = (ArgumentItem) obj;\r
68             return argumentDescriptor.equals(other.argumentDescriptor);\r
69         }\r
70         else\r
71             return false;\r
72     }\r
73 \r
74     @Override\r
75     public int hashCode()\r
76     {\r
77         return argumentDescriptor.hashCode();\r
78     }\r
79 \r
80     public boolean takesMultipleArguments()\r
81     {\r
82         return TypeInfo.isCollection(argumentSetter.getOptionDataType());\r
83     }\r
84 \r
85     public static Range getRangeOf(ArgumentItem arg)\r
86     {\r
87         int start = arg.getArgumentDescriptor().index();\r
88         int end = arg.takesMultipleArguments() ? Integer.MAX_VALUE : start;\r
89         return new Range(start, end);\r
90     }\r
91 \r
92     public Range getRange()\r
93     {\r
94         return getRangeOf(this);\r
95     }\r
96 \r
97     public void set(Object bean, Object value) throws OptionParserException\r
98     {\r
99         argumentSetter.setOption(bean, value);\r
100     }\r
101 \r
102     public Argument getArgumentDescriptor()\r
103     {\r
104         return argumentDescriptor;\r
105     }\r
106 \r
107     public void initialize(Object optionHolder) throws OptionParserException\r
108     {\r
109         argumentSetter.initialize(optionHolder);\r
110     }\r
111 \r
112     @Override\r
113     public String toString()\r
114     {\r
115         return String.format("name=%s, index=%s, required=%s", argumentDescriptor.name(), getRange().toString(),\r
116                 argumentDescriptor.required());\r
117     }\r
118 \r
119     public String getArgumentName()\r
120     {\r
121         String name = argumentDescriptor.name();\r
122         if (name == null || name.length() <= 0)\r
123             name = argumentSetter.getParameterName();\r
124 \r
125         return name;\r
126     }\r
127 \r
128 }\r