1dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond/*
2dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Licensed to the Apache Software Foundation (ASF) under one or more
3dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * contributor license agreements.  See the NOTICE file distributed with
4dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * this work for additional information regarding copyright ownership.
5dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * The ASF licenses this file to You under the Apache License, Version 2.0
6dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * (the "License"); you may not use this file except in compliance with
7dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * the License.  You may obtain a copy of the License at
8dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond *
9dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond *      http://www.apache.org/licenses/LICENSE-2.0
10dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond *
11dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Unless required by applicable law or agreed to in writing, software
12dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * distributed under the License is distributed on an "AS IS" BASIS,
13dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * See the License for the specific language governing permissions and
15dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * limitations under the License.
16dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */
17dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondpackage org.apache.commons.math.exception;
18dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
19dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport java.util.Locale;
20dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
21dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.exception.util.ArgUtils;
22dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.exception.util.MessageFactory;
23dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.exception.util.Localizable;
24dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
25dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond/**
26dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Base class for all preconditions violation exceptions.
27dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * This class is not intended to be instantiated directly: it should serve
28dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * as a base class to create all the exceptions that share the semantics of
29dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * the standard {@link IllegalArgumentException}, but must also provide a
30dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * localized message.
31dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond *
32dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @since 2.2
33dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @version $Revision$ $Date$
34dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */
35dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondpublic class MathIllegalArgumentException extends IllegalArgumentException implements MathThrowable {
36dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
37dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /** Serializable version Id. */
38dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private static final long serialVersionUID = -6024911025449780478L;
39dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
40dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
41dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Pattern used to build the message (specific context).
42dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
43dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private final Localizable specific;
44dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
45dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Pattern used to build the message (general problem description).
46dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
47dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private final Localizable general;
48dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
49dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Arguments used to build the message.
50dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
51dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    private final Object[] arguments;
52dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
53dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
54dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param specific Message pattern providing the specific context of
55dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * the error.
56dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param general Message pattern explaining the cause of the error.
57dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param args Arguments.
58dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
59dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    protected MathIllegalArgumentException(Localizable specific,
60dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                                           Localizable general,
61dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                                           Object ... args) {
62dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        this.specific = specific;
63dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        this.general = general;
64dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        arguments = ArgUtils.flatten(args);
65dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
66dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
67dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param general Message pattern explaining the cause of the error.
68dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param args Arguments.
69dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
70dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    protected MathIllegalArgumentException(Localizable general,
71dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond                                           Object ... args) {
72dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        this(null, general, args);
73dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
74dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
75dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /** {@inheritDoc} */
76dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public Localizable getSpecificPattern() {
77dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return specific;
78dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
79dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
80dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /** {@inheritDoc} */
81dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public Localizable getGeneralPattern() {
82dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return general;
83dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
84dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
85dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /** {@inheritDoc} */
86dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public Object[] getArguments() {
87dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return arguments.clone();
88dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
89dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
90dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /**
91dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * Get the message in a specified locale.
92dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     *
93dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @param locale Locale in which the message should be translated.
94dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     *
95dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     * @return the localized message.
96dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond     */
97dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public String getMessage(final Locale locale) {
98dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return MessageFactory.buildMessage(locale, specific, general, arguments);
99dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
100dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
101dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond   /** {@inheritDoc} */
102dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    @Override
103dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public String getMessage() {
104dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return getMessage(Locale.US);
105dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
106dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond
107dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    /** {@inheritDoc} */
108dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    @Override
109dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    public String getLocalizedMessage() {
110dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond        return getMessage(Locale.getDefault());
111dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond    }
112dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond}
113