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     */
017    package org.apache.commons.cli2.option;
018    
019    import java.util.Comparator;
020    import java.util.Set;
021    
022    import org.apache.commons.cli2.HelpLine;
023    import org.apache.commons.cli2.Option;
024    
025    /**
026     * Represents a line in the help screen.
027     */
028    public class HelpLineImpl implements HelpLine {
029    
030        /** The option that this HelpLineImpl describes */
031        private final Option option;
032    
033        /** The level of indenting for this item */
034        private final int indent;
035    
036        /** The help settings used to obtain the previous usage */
037        private transient Set cachedHelpSettings;
038    
039        /** The comparator used to obtain the previous usage */
040        private transient Comparator cachedComparator;
041    
042        /** The previously obtained usage */
043        private transient String cachedUsage;
044    
045        /**
046         * Creates a new HelpLineImpl to represent a particular Option in the online
047         * help.
048         *
049         * @param option
050         *            Option that the HelpLineImpl describes
051         * @param indent
052         *            Level of indentation for this line
053         */
054        public HelpLineImpl(final Option option, final int indent) {
055            this.option = option;
056            this.indent = indent;
057        }
058    
059        /**
060         * @return The description of the option
061         */
062        public String getDescription() {
063            return option.getDescription();
064        }
065    
066        /**
067         * @return The level of indentation for this line
068         */
069        public int getIndent() {
070            return indent;
071        }
072    
073        /**
074         * @return The Option that the help line relates to
075         */
076        public Option getOption() {
077            return option;
078        }
079    
080        /**
081         * Builds a usage string for the option using the specified settings and
082         * comparator.
083         *
084         *
085         * @param helpSettings the settings to apply
086         * @param comparator a comparator to sort options when applicable
087         * @return the usage string
088         */
089        public String usage(final Set helpSettings, final Comparator comparator) {
090            if (cachedUsage == null
091                || cachedHelpSettings != helpSettings
092                || cachedComparator != comparator) {
093    
094                // cache the arguments to avoid redoing work
095                cachedHelpSettings = helpSettings;
096                cachedComparator = comparator;
097    
098                // build the new buffer
099                final StringBuffer buffer = new StringBuffer();
100                for (int i = 0; i < indent; ++i) {
101                    buffer.append("  ");
102                }
103                option.appendUsage(buffer, helpSettings, comparator);
104    
105                // cache the usage string
106                cachedUsage = buffer.toString();
107            }
108            return cachedUsage;
109        }
110    }