1 /*******************************************************************************
2 * Copyright 2013 André Rouél and Dominik Seichter
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 ******************************************************************************/
16 package net.sf.qualitycheck.exception;
17
18 import javax.annotation.Nullable;
19
20 /**
21 * Thrown to indicate that a class cannot be instantiated.
22 *
23 * @author André Rouél
24 * @author Dominik Seichter
25 */
26 public class RuntimeInstantiationException extends RuntimeException {
27
28 private static final long serialVersionUID = 7304261330061136504L;
29
30 /**
31 * Default message to indicate that the a given class cannot be instantiated.
32 */
33 protected static final String DEFAULT_MESSAGE = "The passed class cannot be instantiated.";
34
35 /**
36 * Message to indicate that the the given class with <em>name</em> cannot be instantiated.
37 */
38 protected static final String MESSAGE_WITH_NAME = "The passed class '%s' cannot be instantiated.";
39
40 /**
41 * Determines the message to be used, depending on the passed argument name. If if the given argument name is
42 * {@code null} or empty {@code DEFAULT_MESSAGE} will be returned, otherwise a formatted {@code MESSAGE_WITH_NAME}
43 * with the passed name.
44 *
45 * @param className
46 * the name of the passed {@link Class}
47 * @return {@code DEFAULT_MESSAGE} if the given argument name is {@code null} or empty, otherwise a formatted
48 * {@code MESSAGE_WITH_NAME}
49 */
50 private static String determineMessage(@Nullable final String className) {
51 return className != null && !className.isEmpty() ? format(className) : DEFAULT_MESSAGE;
52 }
53
54 /**
55 * Returns the formatted string {@link RuntimeInstantiationException#MESSAGE_WITH_NAME} with the given
56 * {@code argumentName}.
57 *
58 * @param argumentName
59 * the name of the passed argument
60 * @return a formatted string of message with the given argument name
61 */
62 private static String format(@Nullable final String argumentName) {
63 return String.format(MESSAGE_WITH_NAME, argumentName);
64 }
65
66 /**
67 * Constructs an {@code IllegalNullArgumentException} with the default message
68 * {@link RuntimeInstantiationException#DEFAULT_MESSAGE}.
69 */
70 public RuntimeInstantiationException() {
71 super(DEFAULT_MESSAGE);
72 }
73
74 /**
75 * Constructs an {@code RuntimeInstantiationException} with the message
76 * {@link RuntimeInstantiationException#MESSAGE_WITH_NAME} including the given name of the argument as string
77 * representation.
78 *
79 * @param className
80 * the name of the {@link Class}
81 */
82 public RuntimeInstantiationException(@Nullable final String className) {
83 super(determineMessage(className));
84 }
85
86 /**
87 * Constructs a new exception with the message {@link RuntimeInstantiationException#MESSAGE_WITH_NAME} including the
88 * given name as string representation and cause.
89 *
90 * @param className
91 * the name of the {@link Class}
92 * @param cause
93 * the cause (which is saved for later retrieval by the {@link Throwable#getCause()} method). (A
94 * {@code null} value is permitted, and indicates that the cause is nonexistent or unknown.)
95 */
96 public RuntimeInstantiationException(@Nullable final String className, @Nullable final Throwable cause) {
97 super(determineMessage(className), cause);
98 }
99
100 /**
101 * Constructs a new exception with the default message {@link RuntimeInstantiationException#DEFAULT_MESSAGE}.
102 *
103 * @param cause
104 * the cause (which is saved for later retrieval by the {@link Throwable#getCause()} method). (A
105 * {@code null} value is permitted, and indicates that the cause is nonexistent or unknown.)
106 */
107 public RuntimeInstantiationException(@Nullable final Throwable cause) {
108 super(DEFAULT_MESSAGE, cause);
109 }
110
111 }