Skip to content

Commit 043c62b

Browse files
committed
Moving the CLI1->2 converter into CLI2 as it would require dependency on both and 1 doesn't care about 2's existence.
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/cli/trunk@741413 13f79535-47bb-0310-9956-ffa450edef68
1 parent 0a531db commit 043c62b

2 files changed

Lines changed: 324 additions & 0 deletions

File tree

CLI2Converter.java

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.commons.cli;
18+
19+
import java.util.HashSet;
20+
import java.util.Iterator;
21+
import java.util.List;
22+
import java.util.ListIterator;
23+
import java.util.Set;
24+
25+
import org.apache.commons.cli2.Group;
26+
import org.apache.commons.cli2.Option;
27+
import org.apache.commons.cli2.builder.ArgumentBuilder;
28+
import org.apache.commons.cli2.builder.DefaultOptionBuilder;
29+
import org.apache.commons.cli2.builder.GroupBuilder;
30+
import org.apache.commons.cli2.validation.InvalidArgumentException;
31+
import org.apache.commons.cli2.validation.Validator;
32+
33+
/**
34+
* A utility class for converting data structures version 1 to
35+
* version 2 Option instances.
36+
*/
37+
public class CLI2Converter {
38+
39+
private CLI2Converter(){
40+
// prevent creation of static utility class
41+
}
42+
43+
/**
44+
* Creates a version 2 Option instance from a version 1 Option instance.
45+
*
46+
* @param option1 the version 1 Option to convert
47+
* @return a version 2 Option
48+
*/
49+
public static Option option(final org.apache.commons.cli.Option option1){
50+
51+
final DefaultOptionBuilder obuilder = new DefaultOptionBuilder();
52+
obuilder.withRequired(option1.isRequired());
53+
54+
final String shortName = option1.getOpt();
55+
if(shortName!=null && !" ".equals(shortName)){
56+
obuilder.withShortName(shortName);
57+
}
58+
59+
final String longName = option1.getLongOpt();
60+
if(longName!=null){
61+
obuilder.withLongName(longName);
62+
}
63+
obuilder.withId(option1.getId());
64+
65+
final String description = option1.getDescription();
66+
if(description!=null){
67+
obuilder.withDescription(description);
68+
}
69+
70+
if(option1.hasArg()){
71+
final ArgumentBuilder abuilder = new ArgumentBuilder();
72+
final String argName = option1.getArgName();
73+
abuilder.withName(argName);
74+
abuilder.withMaximum(option1.getArgs());
75+
if(option1.hasValueSeparator()){
76+
abuilder.withSubsequentSeparator(option1.getValueSeparator());
77+
}
78+
if(option1.hasOptionalArg()){
79+
abuilder.withMinimum(0);
80+
}
81+
else{
82+
//TODO check what non-optional arg means
83+
abuilder.withMinimum(option1.getArgs());
84+
}
85+
86+
final Object type = option1.getType();
87+
if(type!=null){
88+
abuilder.withValidator(new TypeHandlerValidator(type));
89+
}
90+
91+
obuilder.withArgument(abuilder.create());
92+
}
93+
94+
return obuilder.create();
95+
}
96+
97+
/**
98+
* Creates a version 2 Group instance from a version 1 OptionGroup instance.
99+
*
100+
* @param optionGroup1 the version 1 OptionGroup to convert
101+
* @return a version 2 Group
102+
*/
103+
public static Group group(final OptionGroup optionGroup1){
104+
105+
final GroupBuilder gbuilder = new GroupBuilder();
106+
107+
for(final Iterator i = optionGroup1.getOptions().iterator();i.hasNext();){
108+
final org.apache.commons.cli.Option option1 = (org.apache.commons.cli.Option)i.next();
109+
final Option option2 = option(option1);
110+
gbuilder.withOption(option2);
111+
}
112+
113+
gbuilder.withMaximum(1);
114+
115+
if(optionGroup1.isRequired()){
116+
gbuilder.withMinimum(1);
117+
}
118+
119+
return gbuilder.create();
120+
}
121+
122+
/**
123+
* Creates a version 2 Group instance from a version 1 Options instance.
124+
*
125+
* @param options1 the version 1 Options to convert
126+
* @return a version 2 Group
127+
*/
128+
public static Group group(final Options options1){
129+
130+
final GroupBuilder gbuilder = new GroupBuilder();
131+
132+
final Set optionGroups = new HashSet();
133+
134+
for(final Iterator i = options1.getOptionGroups().iterator();i.hasNext();){
135+
final OptionGroup optionGroup1 = (OptionGroup)i.next();
136+
Group group = group(optionGroup1);
137+
gbuilder.withOption(group);
138+
optionGroups.add(optionGroup1);
139+
}
140+
141+
for(final Iterator i = options1.getOptions().iterator();i.hasNext();){
142+
final org.apache.commons.cli.Option option1 = (org.apache.commons.cli.Option)i.next();
143+
if(!optionInAGroup(option1,optionGroups)){
144+
final Option option2 = option(option1);
145+
gbuilder.withOption(option2);
146+
}
147+
}
148+
149+
return gbuilder.create();
150+
}
151+
152+
private static boolean optionInAGroup(final org.apache.commons.cli.Option option1, final Set optionGroups) {
153+
for (Iterator i = optionGroups.iterator(); i.hasNext();) {
154+
OptionGroup group = (OptionGroup) i.next();
155+
if(group.getOptions().contains(option1)){
156+
return true;
157+
}
158+
}
159+
return false;
160+
}
161+
}
162+
163+
class TypeHandlerValidator implements Validator{
164+
165+
private final Object type;
166+
167+
/**
168+
* Creates a new Validator using the TypeHandler class.
169+
*
170+
* @see TypeHandler
171+
* @param type The required type for valid elements
172+
*/
173+
public TypeHandlerValidator(final Object type){
174+
this.type = type;
175+
}
176+
177+
/* (non-Javadoc)
178+
* @see org.apache.commons.cli2.validation.Validator#validate(java.util.List)
179+
*/
180+
public void validate(final List values) throws InvalidArgumentException {
181+
final ListIterator i = values.listIterator();
182+
while(i.hasNext()){
183+
final String value = (String)i.next();
184+
final Object converted = TypeHandler.createValue(value,type);
185+
if(converted==null){
186+
throw new InvalidArgumentException("Unable to understand value: " + value);
187+
}
188+
i.set(converted);
189+
}
190+
}
191+
}

CLI2ConverterTest.java

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.commons.cli;
18+
19+
import org.apache.commons.cli2.Group;
20+
import org.apache.commons.cli2.builder.PatternBuilder;
21+
import org.apache.commons.cli2.option.GroupImpl;
22+
23+
import junit.framework.TestCase;
24+
25+
public class CLI2ConverterTest extends TestCase {
26+
27+
private Options aceOptions;
28+
private OptionGroup aceOptionGroup;
29+
private Options abcdeOptions;
30+
private Options pattern;
31+
32+
private Option a;
33+
private Option bbb;
34+
private Option c;
35+
private Option ddd;
36+
private Option e;
37+
private Option f;
38+
private Option g;
39+
private Option h;
40+
private Option i;
41+
42+
public void setUp(){
43+
a = OptionBuilder.withDescription("A description").create('a');
44+
bbb = OptionBuilder.create("bbb");
45+
c = OptionBuilder.withLongOpt("ccc").create('c');
46+
ddd = OptionBuilder.withLongOpt("ddd").create();
47+
e = OptionBuilder.isRequired(true).create("e");
48+
f = OptionBuilder.hasArg().withArgName("argument").create('f');
49+
g = OptionBuilder.hasArgs(5).create('g');
50+
h = OptionBuilder.hasOptionalArg().create('h');
51+
i = OptionBuilder.hasOptionalArgs(5).create('i');
52+
53+
aceOptions = new Options();
54+
aceOptions.addOption(OptionBuilder.create('a'));
55+
aceOptions.addOption(OptionBuilder.create('c'));
56+
aceOptions.addOption(OptionBuilder.create('e'));
57+
58+
aceOptionGroup = new OptionGroup();
59+
aceOptionGroup.addOption(OptionBuilder.create('a'));
60+
aceOptionGroup.addOption(OptionBuilder.create('c'));
61+
aceOptionGroup.addOption(OptionBuilder.create('e'));
62+
63+
abcdeOptions = new Options();
64+
abcdeOptions.addOption(OptionBuilder.create('d'));
65+
OptionGroup og = new OptionGroup();
66+
og.addOption(OptionBuilder.create('a'));
67+
og.addOption(OptionBuilder.create('c'));
68+
og.addOption(OptionBuilder.create('e'));
69+
abcdeOptions.addOptionGroup(og);
70+
abcdeOptions.addOption(OptionBuilder.create('b'));
71+
72+
pattern = PatternOptionBuilder.parsePattern("a%ce:");
73+
}
74+
75+
/*
76+
* Class to test for Option option(Option)
77+
*/
78+
public void testOption() {
79+
assertTrue(e.isRequired());
80+
81+
assertEquals("A description",a.getDescription());
82+
assertEquals('a',a.getId());
83+
assertEquals("[-a]",CLI2Converter.option(a).toString());
84+
assertEquals("[-bbb]",CLI2Converter.option(bbb).toString());
85+
assertEquals("[-c (--ccc)]",CLI2Converter.option(c).toString());
86+
assertEquals("[--ddd]",CLI2Converter.option(ddd).toString());
87+
assertEquals("-e",CLI2Converter.option(e).toString());
88+
assertEquals("[-f <argument>]",CLI2Converter.option(f).toString());
89+
assertEquals("[-g <arg1> <arg2> <arg3> <arg4> <arg5>]",CLI2Converter.option(g).toString());
90+
assertEquals("[-h [<arg>]]",CLI2Converter.option(h).toString());
91+
assertEquals("[-i [<arg1> [<arg2> [<arg3> [<arg4> [<arg5>]]]]]]",CLI2Converter.option(i).toString());
92+
}
93+
/*
94+
* Class to test for Group group(OptionGroup)
95+
*/
96+
public void testGroupOptionGroup() {
97+
GroupImpl group;
98+
99+
group = (GroupImpl)CLI2Converter.group(aceOptionGroup);
100+
assertEquals("[-a|-c|-e]",group.toString());
101+
assertEquals(0,group.getMinimum());
102+
assertEquals(1,group.getMaximum());
103+
104+
aceOptionGroup.setRequired(true);
105+
group = (GroupImpl)CLI2Converter.group(aceOptionGroup);
106+
assertEquals("-a|-c|-e",group.toString());
107+
assertEquals(1,group.getMinimum());
108+
assertEquals(1,group.getMaximum());
109+
}
110+
/*
111+
* Class to test for Group group(Options)
112+
*/
113+
public void testGroupOptions() {
114+
115+
GroupImpl group;
116+
117+
group = (GroupImpl)CLI2Converter.group(aceOptions);
118+
assertEquals("[-a|-c|-e]",group.toString());
119+
assertEquals(0,group.getMinimum());
120+
assertEquals(Integer.MAX_VALUE,group.getMaximum());
121+
122+
group = (GroupImpl)CLI2Converter.group(abcdeOptions);
123+
124+
assertEquals("[-a|-c|-e|-d|-b]",group.toString());
125+
assertEquals(0,group.getMinimum());
126+
assertEquals(Integer.MAX_VALUE,group.getMaximum());
127+
128+
group = (GroupImpl)CLI2Converter.group(pattern);
129+
assertEquals("[-a <arg>|-c|-e <arg>]",group.toString());
130+
assertEquals(0,group.getMinimum());
131+
assertEquals(Integer.MAX_VALUE,group.getMaximum());
132+
}
133+
}

0 commit comments

Comments
 (0)