1:
17: package ;
18:
19: import ;
20: import ;
21: import ;
22:
23: import ;
24: import ;
25: import ;
26: import ;
27: import ;
28: import ;
29: import ;
30: import ;
31:
32:
38: public class PatternBuilder
39: {
40: private final GroupBuilder m_gbuilder;
41: private final DefaultOptionBuilder m_obuilder;
42: private final ArgumentBuilder m_abuilder;
43: private final Set m_options = new HashSet();
44:
45:
48: public PatternBuilder()
49: {
50: this(
51: new GroupBuilder(),
52: new DefaultOptionBuilder(),
53: new ArgumentBuilder() );
54: }
55:
56:
62: public PatternBuilder(
63: final GroupBuilder gbuilder,
64: final DefaultOptionBuilder obuilder,
65: final ArgumentBuilder abuilder )
66: {
67: m_gbuilder = gbuilder;
68: m_obuilder = obuilder;
69: m_abuilder = abuilder;
70: }
71:
72:
76: public Option create()
77: {
78: final Option option;
79: if( m_options.size() == 1 )
80: {
81: option = (Option) m_options.iterator().next();
82: }
83: else
84: {
85: m_gbuilder.reset();
86: for( final Iterator i = m_options.iterator(); i.hasNext();)
87: {
88: m_gbuilder.withOption( (Option) i.next() );
89: }
90: option = m_gbuilder.create();
91: }
92: reset();
93: return option;
94: }
95:
96:
100: public PatternBuilder reset()
101: {
102: m_options.clear();
103: return this;
104: }
105:
106: private void createOption( final char type, final boolean required, final char opt )
107: {
108: final Argument argument;
109: if( type != ' ' )
110: {
111: m_abuilder.reset();
112: m_abuilder.withValidator( validator( type ) );
113: if( required )
114: {
115: m_abuilder.withMinimum( 1 );
116: }
117: if( type != '*' )
118: {
119: m_abuilder.withMaximum( 1 );
120: }
121: argument = m_abuilder.create();
122: }
123: else
124: {
125: argument = null;
126: }
127:
128: m_obuilder.reset();
129: m_obuilder.withArgument( argument );
130: m_obuilder.withShortName( String.valueOf( opt ) );
131: m_obuilder.withRequired( required );
132: m_options.add( m_obuilder.create() );
133: }
134:
135:
139: public void withPattern( final String pattern )
140: {
141: int sz = pattern.length();
142: char opt = ' ';
143: char ch = ' ';
144: char type = ' ';
145: boolean required = false;
146:
147: for( int i=0; i < sz; i++ )
148: {
149: ch = pattern.charAt( i );
150: switch( ch )
151: {
152: case '!' :
153: required = true;
154: break;
155: case '@' :
156: case ':' :
157: case '%' :
158: case '+' :
159: case '#' :
160: case '<' :
161: case '>' :
162: case '*' :
163: case '/' :
164: type = ch;
165: break;
166: default :
167: if( opt != ' ' )
168: {
169: createOption( type, required, opt );
170: required = false;
171: type = ' ';
172: }
173: opt = ch;
174: }
175: }
176: if( opt != ' ' )
177: {
178: createOption( type, required, opt );
179: }
180: }
181:
182: private static Validator validator( final char c )
183: {
184: switch( c )
185: {
186: case '@' :
187: final ClassValidator classv = new ClassValidator();
188: classv.setInstance( true );
189: return classv;
190: case '+' :
191: final ClassValidator instancev = new ClassValidator();
192: return instancev;
193:
194: case '%' :
195: return NumberValidator.getNumberInstance();
196: case '#' :
197: return DateValidator.getDateInstance();
198: case '<' :
199: final FileValidator existingv = new FileValidator();
200: existingv.setExisting( true );
201: existingv.setFile( true );
202: return existingv;
203: case '>' :
204: case '*' :
205: return new FileValidator();
206: case '/' :
207: return new URLValidator();
208: default :
209: return null;
210: }
211: }
212: }