]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.application/src/org/simantics/application/arguments/IArgumentFactory.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.application / src / org / simantics / application / arguments / IArgumentFactory.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.application.arguments;\r
13 \r
14 import java.util.ListIterator;\r
15 \r
16 /**\r
17  * @author Tuukka Lehtonen\r
18  *\r
19  * @param <T>\r
20  */\r
21 public interface IArgumentFactory<T> {\r
22 \r
23     String getArgument();\r
24 \r
25     IArgument<T> parse(String arg, ListIterator<String> tail);\r
26     \r
27     abstract class ArgumentFactory<V> implements IArgumentFactory<V> {\r
28         String arg;\r
29         protected IArgumentValidator<V> validator;\r
30         public ArgumentFactory(String arg) {\r
31             this(arg, null);\r
32         }\r
33         public ArgumentFactory(String arg, IArgumentValidator<V> validator) {\r
34             this.arg = arg;\r
35             this.validator = validator;\r
36         }\r
37         public String getArgument() {\r
38             return arg;\r
39         }\r
40         protected IArgumentValidator<V> getValidator() {\r
41             return validator;\r
42         }\r
43     }\r
44     \r
45     abstract class Argument<T> implements IArgument<T> {\r
46         String key;\r
47 \r
48         public Argument(String key) {\r
49             assert key != null;\r
50             this.key = key;\r
51         }\r
52 \r
53         @Override\r
54         public String getArgument() {\r
55             return key;\r
56         }\r
57 \r
58         public abstract T getValue();\r
59 \r
60         @Override\r
61         public String toString() {\r
62             return "(" + getValue().getClass().getSimpleName() + ") " + getValue().toString();\r
63         }\r
64     }\r
65     \r
66     class BooleanArgument extends Argument<Boolean> {\r
67         Boolean value;\r
68         public BooleanArgument(String key, Boolean value) {\r
69             super(key);\r
70             this.value = value;\r
71         }\r
72         public Boolean getValue() {\r
73             return value;\r
74         }\r
75     };\r
76     \r
77     class StringArgument extends Argument<String> {\r
78         String value;\r
79         public StringArgument(String key, String value) {\r
80             super(key);\r
81             this.value = value;\r
82         }\r
83         public String getValue() {\r
84             return value;\r
85         }\r
86     };\r
87     \r
88     class IntegerArgument extends Argument<Integer> {\r
89         Integer value;\r
90         public IntegerArgument(String key, Integer value) {\r
91             super(key);\r
92             this.value = value;\r
93         }\r
94         public Integer getValue() {\r
95             return value;\r
96         }\r
97     };\r
98 \r
99     class LongArgument extends Argument<Long> {\r
100         Long value;\r
101         public LongArgument(String key, Long value) {\r
102             super(key);\r
103             this.value = value;\r
104         }\r
105         public Long getValue() {\r
106             return value;\r
107         }\r
108     };\r
109 \r
110     \r
111     class StringArgumentFactory extends ArgumentFactory<String> {\r
112         public StringArgumentFactory(String key) {\r
113             super(key);\r
114         }\r
115         public StringArgumentFactory(String key, IArgumentValidator<String> validator) {\r
116             super(key, validator);\r
117         }\r
118         @Override\r
119         public IArgument<String> parse(String key, ListIterator<String> tail) {\r
120             if (getArgument().equalsIgnoreCase(key)) {\r
121                 if (tail.hasNext()) {\r
122                     String next = tail.next();\r
123                     IArgumentValidator<String> validator = getValidator();\r
124                     if(validator != null) {\r
125                             String valid = validator.isValid(next);\r
126                             if (valid != null) {\r
127                                 tail.previous();\r
128                                 throw new IllegalArgumentException(valid);\r
129                             }\r
130                     }\r
131                     return new StringArgument(getArgument(), next);\r
132                 }\r
133             }\r
134             return null;\r
135         }\r
136     }\r
137     \r
138     class IntegerArgumentFactory extends ArgumentFactory<Integer> {\r
139         private Integer lowLimit;\r
140         private Integer highLimit;\r
141         public IntegerArgumentFactory(String key) {\r
142             this(key, null, null);\r
143         }\r
144         public IntegerArgumentFactory(String key, Integer lowLimit, Integer highLimit) {\r
145             super(key);\r
146             this.lowLimit = lowLimit;\r
147             this.highLimit = highLimit;\r
148         }\r
149         @Override\r
150         public IArgument<Integer> parse(String key, ListIterator<String> tail) {\r
151             if (getArgument().equalsIgnoreCase(key)) {\r
152                 if (tail.hasNext()) {\r
153                     try {\r
154                         Integer l = Integer.valueOf(tail.next());\r
155                         if (lowLimit != null && lowLimit > l)\r
156                             throw new IllegalArgumentException("value is less than low limit, " + l + " < " + lowLimit);\r
157                         if (highLimit != null && highLimit < l)\r
158                             throw new IllegalArgumentException("value is greater than high limit, " + l + " > " + highLimit);\r
159                         return new IntegerArgument(getArgument(), l);\r
160                     } catch (NumberFormatException e) {\r
161                         throw new IllegalArgumentException(e);\r
162                     }\r
163                 }\r
164             }\r
165             return null;\r
166         }\r
167     }\r
168     \r
169     class LongArgumentFactory extends ArgumentFactory<Long> {\r
170         public LongArgumentFactory(String key) {\r
171             super(key);\r
172         }\r
173         @Override\r
174         public IArgument<Long> parse(String key, ListIterator<String> tail) {\r
175             if (getArgument().equalsIgnoreCase(key)) {\r
176                 if (tail.hasNext()) {\r
177                     try {\r
178                         Long l = Long.valueOf(tail.next());\r
179                         return new LongArgument(getArgument(), l);\r
180                     } catch (NumberFormatException e) {\r
181                         throw new IllegalArgumentException(e);\r
182                     }\r
183                 }\r
184             }\r
185             return null;\r
186         }\r
187     }\r
188     \r
189     class NoValueArgumentFactory extends ArgumentFactory<Boolean> {\r
190         public NoValueArgumentFactory(String key) {\r
191             super(key);\r
192         }\r
193         @Override\r
194         public IArgument<Boolean> parse(String key, ListIterator<String> tail) {\r
195             if (getArgument().equalsIgnoreCase(key)) {\r
196                 return new BooleanArgument(getArgument(), Boolean.TRUE);\r
197             }\r
198             return null;\r
199         }\r
200     }\r
201 \r
202 }\r