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 java.util.Locale;
020    
021    import org.apache.commons.math.exception.util.ArgUtils;
022    import org.apache.commons.math.exception.util.MessageFactory;
023    import org.apache.commons.math.exception.util.Localizable;
024    
025    /**
026     * Base class for all preconditions violation exceptions.
027     * This class is not intended to be instantiated directly: it should serve
028     * as a base class to create all the exceptions that share the semantics of
029     * the standard {@link IllegalArgumentException}, but must also provide a
030     * localized message.
031     *
032     * @since 2.2
033     * @version $Revision$ $Date$
034     */
035    public class MathIllegalArgumentException extends IllegalArgumentException implements MathThrowable {
036    
037        /** Serializable version Id. */
038        private static final long serialVersionUID = -6024911025449780478L;
039    
040        /**
041         * Pattern used to build the message (specific context).
042         */
043        private final Localizable specific;
044        /**
045         * Pattern used to build the message (general problem description).
046         */
047        private final Localizable general;
048        /**
049         * Arguments used to build the message.
050         */
051        private final Object[] arguments;
052    
053        /**
054         * @param specific Message pattern providing the specific context of
055         * the error.
056         * @param general Message pattern explaining the cause of the error.
057         * @param args Arguments.
058         */
059        protected MathIllegalArgumentException(Localizable specific,
060                                               Localizable general,
061                                               Object ... args) {
062            this.specific = specific;
063            this.general = general;
064            arguments = ArgUtils.flatten(args);
065        }
066        /**
067         * @param general Message pattern explaining the cause of the error.
068         * @param args Arguments.
069         */
070        protected MathIllegalArgumentException(Localizable general,
071                                               Object ... args) {
072            this(null, general, args);
073        }
074    
075        /** {@inheritDoc} */
076        public Localizable getSpecificPattern() {
077            return specific;
078        }
079    
080        /** {@inheritDoc} */
081        public Localizable getGeneralPattern() {
082            return general;
083        }
084    
085        /** {@inheritDoc} */
086        public Object[] getArguments() {
087            return arguments.clone();
088        }
089    
090        /**
091         * Get the message in a specified locale.
092         *
093         * @param locale Locale in which the message should be translated.
094         *
095         * @return the localized message.
096         */
097        public String getMessage(final Locale locale) {
098            return MessageFactory.buildMessage(locale, specific, general, arguments);
099        }
100    
101       /** {@inheritDoc} */
102        @Override
103        public String getMessage() {
104            return getMessage(Locale.US);
105        }
106    
107        /** {@inheritDoc} */
108        @Override
109        public String getLocalizedMessage() {
110            return getMessage(Locale.getDefault());
111        }
112    }