001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.cli2.commandline;
018
019import java.util.ArrayList;
020import java.util.Collections;
021import java.util.HashSet;
022import java.util.Iterator;
023import java.util.List;
024import java.util.Set;
025
026import org.apache.commons.cli2.CommandLine;
027import org.apache.commons.cli2.Option;
028import org.apache.commons.cli2.option.PropertyOption;
029
030/**
031 * Manages a queue of default CommandLines. This CommandLine implementation is
032 * backed by a queue of CommandLine instances which are queried in turn until a
033 * suitable result is found.
034 *
035 * CommandLine instances can either be added to the back of the queue or can be
036 * pushed in at a specific position.
037 *
038 * @see #appendCommandLine(CommandLine)
039 * @see #insertCommandLine(int, CommandLine)
040 */
041public class DefaultingCommandLine extends CommandLineImpl {
042
043    /**
044     * The list of default CommandLine instances
045     */
046    private final List commandLines = new ArrayList();
047
048    /**
049     * Adds a CommandLine instance to the back of the queue. The supplied
050     * CommandLine will be used as defaults when all other CommandLines produce
051     * no result
052     *
053     * @param commandLine
054     *            the default values to use if all CommandLines
055     */
056    public void appendCommandLine(final CommandLine commandLine) {
057        commandLines.add(commandLine);
058    }
059
060    /**
061     * Adds a CommandLine instance to a specified position in the queue.
062     *
063     * @param index ths position at which to insert
064     * @param commandLine the CommandLine to insert
065     */
066    public void insertCommandLine(
067        final int index,
068        final CommandLine commandLine) {
069        commandLines.add(index, commandLine);
070    }
071
072    /**
073     * Builds an iterator over the build in CommandLines.
074     *
075     * @return an unmodifiable iterator
076     */
077    public Iterator commandLines(){
078        return Collections.unmodifiableList(commandLines).iterator();
079    }
080
081    public Option getOption(String trigger) {
082        for (final Iterator i = commandLines.iterator(); i.hasNext();) {
083            final CommandLine commandLine = (CommandLine)i.next();
084            final Option actual = commandLine.getOption(trigger);
085            if (actual != null) {
086                return actual;
087            }
088        }
089        return null;
090    }
091
092    public List getOptions() {
093        final List options = new ArrayList();
094
095        final List temp = new ArrayList();
096        for (final Iterator i = commandLines.iterator(); i.hasNext();) {
097            final CommandLine commandLine = (CommandLine)i.next();
098            temp.clear();
099            temp.addAll(commandLine.getOptions());
100            temp.removeAll(options);
101            options.addAll(temp);
102        }
103
104        return Collections.unmodifiableList(options);
105    }
106
107    public Set getOptionTriggers() {
108        final Set all = new HashSet();
109        for (final Iterator i = commandLines.iterator(); i.hasNext();) {
110            final CommandLine commandLine = (CommandLine)i.next();
111            all.addAll(commandLine.getOptionTriggers());
112        }
113
114        return Collections.unmodifiableSet(all);
115    }
116
117    public boolean hasOption(Option option) {
118        for (final Iterator i = commandLines.iterator(); i.hasNext();) {
119            final CommandLine commandLine = (CommandLine)i.next();
120            if (commandLine.hasOption(option)) {
121                return true;
122            }
123        }
124        return false;
125    }
126
127    public List getValues(Option option, List defaultValues) {
128        for (final Iterator i = commandLines.iterator(); i.hasNext();) {
129            final CommandLine commandLine = (CommandLine)i.next();
130            final List actual = commandLine.getValues(option);
131            if (actual != null && !actual.isEmpty()) {
132                return actual;
133            }
134        }
135        if(defaultValues==null){
136            return Collections.EMPTY_LIST;
137        }
138        else{
139            return defaultValues;
140        }
141    }
142
143    public Boolean getSwitch(Option option, Boolean defaultValue) {
144        for (final Iterator i = commandLines.iterator(); i.hasNext();) {
145            final CommandLine commandLine = (CommandLine)i.next();
146            final Boolean actual = commandLine.getSwitch(option);
147            if (actual != null) {
148                return actual;
149            }
150        }
151        return defaultValue;
152    }
153
154    public String getProperty(final String property) {
155        return getProperty(new PropertyOption(), property);
156    }
157
158    public String getProperty(final Option option, String property, String defaultValue) {
159        for (final Iterator i = commandLines.iterator(); i.hasNext();) {
160            final CommandLine commandLine = (CommandLine)i.next();
161            final String actual = commandLine.getProperty(option, property);
162            if (actual != null) {
163                return actual;
164            }
165        }
166        return defaultValue;
167    }
168
169    public Set getProperties(final Option option) {
170        final Set all = new HashSet();
171        for (final Iterator i = commandLines.iterator(); i.hasNext();) {
172            final CommandLine commandLine = (CommandLine)i.next();
173            all.addAll(commandLine.getProperties(option));
174        }
175        return Collections.unmodifiableSet(all);
176    }
177
178    public Set getProperties() {
179        return getProperties(new PropertyOption());
180    }
181}