KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > commons > cli > GnuParser


1 /*
2  * $Header: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/GnuParser.java,v 1.10 2002/09/19 22:59:43 jkeyes Exp $
3  * $Revision: 1.10 $
4  * $Date: 2002/09/19 22:59:43 $
5  *
6  * ====================================================================
7  *
8  * The Apache Software License, Version 1.1
9  *
10  * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
11  * reserved.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  *
17  * 1. Redistributions of source code must retain the above copyright
18  * notice, this list of conditions and the following disclaimer.
19  *
20  * 2. Redistributions in binary form must reproduce the above copyright
21  * notice, this list of conditions and the following disclaimer in
22  * the documentation and/or other materials provided with the
23  * distribution.
24  *
25  * 3. The end-user documentation included with the redistribution, if
26  * any, must include the following acknowlegement:
27  * "This product includes software developed by the
28  * Apache Software Foundation (http://www.apache.org/)."
29  * Alternately, this acknowlegement may appear in the software itself,
30  * if and wherever such third-party acknowlegements normally appear.
31  *
32  * 4. The names "The Jakarta Project", "Commons", and "Apache Software
33  * Foundation" must not be used to endorse or promote products derived
34  * from this software without prior written permission. For written
35  * permission, please contact apache@apache.org.
36  *
37  * 5. Products derived from this software may not be called "Apache"
38  * nor may "Apache" appear in their names without prior written
39  * permission of the Apache Group.
40  *
41  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44  * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52  * SUCH DAMAGE.
53  * ====================================================================
54  *
55  * This software consists of voluntary contributions made by many
56  * individuals on behalf of the Apache Software Foundation. For more
57  * information on the Apache Software Foundation, please see
58  * <http://www.apache.org/>.
59  *
60  */

61 package org.apache.commons.cli;
62
63 import java.util.Arrays JavaDoc;
64 import java.util.ArrayList JavaDoc;
65 import java.util.Collection JavaDoc;
66 import java.util.Iterator JavaDoc;
67
68 /**
69  * The class GnuParser provides an implementation of the
70  * {@link Parser#flatten(Options,String[],boolean) flatten} method.
71  *
72  * @author John Keyes (john at integralsource.com)
73  * @see Parser
74  * @version $Revision: 1.10 $
75  */

76 public class GnuParser extends Parser {
77
78     /** holder for flattened tokens */
79     private ArrayList JavaDoc tokens = new ArrayList JavaDoc();
80
81     /**
82      * <p>Resets the members to their original state i.e. remove
83      * all of <code>tokens</code> entries.
84      */

85     private void init() {
86         tokens.clear();
87     }
88
89     /**
90      * <p>This flatten method does so using the following rules:
91      * <ol>
92      * <li>If an {@link Option} exists for the first character of
93      * the <code>arguments</code> entry <b>AND</b> an {@link Option}
94      * does not exist for the whole <code>argument</code> then
95      * add the first character as an option to the processed tokens
96      * list e.g. "-D" and add the rest of the entry to the also.</li>
97      * <li>Otherwise just add the token to the processed tokens list.
98      * </li>
99      * </ol>
100      * </p>
101      */

102     protected String JavaDoc[] flatten( Options options,
103                                 String JavaDoc[] arguments,
104                                 boolean stopAtNonOption )
105     {
106         init();
107         boolean eatTheRest = false;
108         Option currentOption = null;
109
110         for( int i = 0; i < arguments.length; i++ ) {
111             if( "--".equals( arguments[i] ) ) {
112                 eatTheRest = true;
113                 tokens.add( "--" );
114             }
115             else if ( "-".equals( arguments[i] ) ) {
116                 tokens.add( "-" );
117             }
118             else if( arguments[i].startsWith( "-" ) ) {
119                 Option option = options.getOption( arguments[i] );
120
121                 // this is not an Option
122
if( option == null ) {
123                     // handle special properties Option
124
Option specialOption = options.getOption( arguments[i].substring(0,2) );
125                     if( specialOption != null ) {
126                         tokens.add( arguments[i].substring(0,2) );
127                         tokens.add( arguments[i].substring(2) );
128                     }
129                     else if( stopAtNonOption ) {
130                         eatTheRest = true;
131                         tokens.add( arguments[i] );
132                     }
133                     else {
134                         tokens.add( arguments[i] );
135                     }
136                 }
137                 else {
138                     currentOption = option;
139                     // special option
140
Option specialOption = options.getOption( arguments[i].substring(0,2) );
141                     if( specialOption != null && option == null ) {
142                         tokens.add( arguments[i].substring(0,2) );
143                         tokens.add( arguments[i].substring(2) );
144                     }
145                     else if( currentOption != null && currentOption.hasArg() ) {
146                         if( currentOption.hasArg() ) {
147                             tokens.add( arguments[i] );
148                             currentOption= null;
149                         }
150                         else if ( currentOption.hasArgs() ) {
151                             tokens.add( arguments[i] );
152                         }
153                         else if ( stopAtNonOption ) {
154                             eatTheRest = true;
155                             tokens.add( "--" );
156                             tokens.add( arguments[i] );
157                         }
158                         else {
159                             tokens.add( arguments[i] );
160                         }
161                     }
162                     else if (currentOption != null ) {
163                         tokens.add( arguments[i] );
164                     }
165                     else if ( stopAtNonOption ) {
166                         eatTheRest = true;
167                         tokens.add( "--" );
168                         tokens.add( arguments[i] );
169                     }
170                     else {
171                         tokens.add( arguments[i] );
172                     }
173                 }
174             }
175             else {
176                 tokens.add( arguments[i] );
177             }
178
179             if( eatTheRest ) {
180                 for( i++; i < arguments.length; i++ ) {
181                     tokens.add( arguments[i] );
182                 }
183             }
184         }
185         return (String JavaDoc[])tokens.toArray( new String JavaDoc[] {} );
186     }
187 }
Popular Tags