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.math.exception;
018    
019    import org.apache.commons.math.util.MathUtils;
020    import org.apache.commons.math.exception.util.LocalizedFormats;
021    
022    /**
023     * Exception to be thrown when the a sequence of values is not monotonously
024     * increasing or decreasing.
025     *
026     * @since 2.2
027     * @version $Revision$ $Date$
028     */
029    public class NonMonotonousSequenceException extends MathIllegalNumberException {
030    
031        /** Serializable version Id. */
032        private static final long serialVersionUID = 3596849179428944575L;
033    
034        /**
035         * Direction (positive for increasing, negative for decreasing).
036         */
037        private final MathUtils.OrderDirection direction;
038        /**
039         * Whether the sequence must be strictly increasing or decreasing.
040         */
041        private final boolean strict;
042        /**
043         * Index of the wrong value.
044         */
045        private final int index;
046        /**
047         * Previous value.
048         */
049        private final Number previous;
050    
051        /**
052         * Construct the exception.
053         * This constructor uses default values assuming that the sequence should
054         * have been strictly increasing.
055         *
056         * @param wrong Value that did not match the requirements.
057         * @param previous Previous value in the sequence.
058         * @param index Index of the value that did not match the requirements.
059         */
060        public NonMonotonousSequenceException(Number wrong,
061                                              Number previous,
062                                              int index) {
063            this(wrong, previous, index, MathUtils.OrderDirection.INCREASING, true);
064        }
065    
066        /**
067         * Construct the exception.
068         *
069         * @param wrong Value that did not match the requirements.
070         * @param previous Previous value in the sequence.
071         * @param index Index of the value that did not match the requirements.
072         * @param direction Strictly positive for a sequence required to be
073         * increasing, negative (or zero) for a decreasing sequence.
074         * @param strict Whether the sequence must be strictly increasing or
075         * decreasing.
076         */
077        public NonMonotonousSequenceException(Number wrong,
078                                              Number previous,
079                                              int index,
080                                              MathUtils.OrderDirection direction,
081                                              boolean strict) {
082            super(direction == MathUtils.OrderDirection.INCREASING ?
083                  (strict ?
084                   LocalizedFormats.NOT_STRICTLY_INCREASING_SEQUENCE :
085                   LocalizedFormats.NOT_INCREASING_SEQUENCE) :
086                  (strict ?
087                   LocalizedFormats.NOT_STRICTLY_DECREASING_SEQUENCE :
088                   LocalizedFormats.NOT_DECREASING_SEQUENCE),
089                  wrong, previous, index, index - 1);
090    
091            this.direction = direction;
092            this.strict = strict;
093            this.index = index;
094            this.previous = previous;
095        }
096    
097        /**
098         * @return the order direction.
099         **/
100        public MathUtils.OrderDirection getDirection() {
101            return direction;
102        }
103        /**
104         * @return {@code true} is the sequence should be strictly monotonous.
105         **/
106        public boolean getStrict() {
107            return strict;
108        }
109        /**
110         * Get the index of the wrong value.
111         *
112         * @return the current index.
113         */
114        public int getIndex() {
115            return index;
116        }
117        /**
118         * @return the previous value.
119         */
120        public Number getPrevious() {
121            return previous;
122        }
123    }