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 java.util.regex.Pattern; 19 20 import javax.annotation.Nullable; 21 22 /** 23 * Thrown to indicate that a method has been passed a sequence of {@code char} values as argument that does not matches 24 * against the specified pattern. For example, if a method needs a string with a exactly four alphanumeric characters 25 * and is passed with a five characters long string. 26 * 27 * @author André Rouél 28 * @author Dominik Seichter 29 */ 30 public class IllegalPatternArgumentException extends RuntimeException { 31 32 private static final long serialVersionUID = -6741481389295600427L; 33 34 /** 35 * Default message to indicate that the a given argument must match against the specified pattern. 36 */ 37 protected static final String DEFAULT_MESSAGE = "The passed argument must match against the specified pattern: %s"; 38 39 /** 40 * Message to indicate that the the given argument with <em>name</em> must match against the specified pattern. 41 */ 42 protected static final String MESSAGE_WITH_NAME = "The passed argument '%s' must match against the specified pattern: %s"; 43 44 /** 45 * Placeholder for an unset pattern to format a message human readable 46 */ 47 protected static final String NO_PATTERN_PLACEHOLDER = "[not set]"; 48 49 /** 50 * Determines the message to be used, depending on the passed argument name. If if the given argument name is 51 * {@code null} or empty {@code DEFAULT_MESSAGE} will be returned, otherwise a formatted {@code MESSAGE_WITH_NAME} 52 * with the passed name and pattern which the argument must match. 53 * 54 * @param argumentName 55 * the name of the passed argument 56 * @param pattern 57 * Pattern, that a string or character sequence should correspond to 58 * @return {@code DEFAULT_MESSAGE} if the given argument name is {@code null} or empty, otherwise a formatted 59 * {@code MESSAGE_WITH_NAME} 60 */ 61 private static String determineMessage(@Nullable final String argumentName, @Nullable final Pattern pattern) { 62 return argumentName != null && !argumentName.isEmpty() ? format(argumentName, pattern) : format(pattern); 63 } 64 65 /** 66 * Returns the formatted string {@link IllegalPatternArgumentException#DEFAULT_MESSAGE} with the given pattern which 67 * the argument must match. 68 * 69 * @param argumentName 70 * the name of the passed argument 71 * @param pattern 72 * Pattern, that a string or character sequence should correspond to 73 * @return a formatted string of message with the given argument name 74 */ 75 private static String format(@Nullable final Pattern pattern) { 76 return String.format(DEFAULT_MESSAGE, patternToString(pattern)); 77 } 78 79 /** 80 * Returns the formatted string {@link IllegalPatternArgumentException#MESSAGE_WITH_NAME} with the given 81 * {@code argumentName} and pattern which the argument must match. 82 * 83 * @param argumentName 84 * the name of the passed argument 85 * @param pattern 86 * Pattern, that a string or character sequence should correspond to 87 * @return a formatted string of message with the given argument name 88 */ 89 private static String format(@Nullable final String argumentName, @Nullable final Pattern pattern) { 90 final String p = patternToString(pattern); 91 return String.format(MESSAGE_WITH_NAME, argumentName, p); 92 } 93 94 /** 95 * Converts a {@link Pattern} to a string representation. 96 * 97 * @param pattern 98 * Pattern 99 * @return string representation of a pattern 100 */ 101 private static String patternToString(@Nullable final Pattern pattern) { 102 return pattern != null ? pattern.pattern() + " (flags: " + pattern.flags() + ")" : NO_PATTERN_PLACEHOLDER; 103 } 104 105 /** 106 * Constructs an {@code IllegalNullArgumentException} with the default message 107 * {@link IllegalPatternArgumentException#DEFAULT_MESSAGE} including the pattern which the argument must match. 108 * 109 * @param pattern 110 * Pattern, that a string or character sequence should correspond to 111 */ 112 public IllegalPatternArgumentException(@Nullable final Pattern pattern) { 113 super(format(pattern)); 114 } 115 116 /** 117 * Constructs a new exception with the default message {@link IllegalPatternArgumentException#DEFAULT_MESSAGE} 118 * including the pattern which the argument must match. 119 * 120 * @param pattern 121 * Pattern, that a string or character sequence should correspond to 122 * @param cause 123 * the cause (which is saved for later retrieval by the {@link Throwable#getCause()} method). (A 124 * {@code null} value is permitted, and indicates that the cause is nonexistent or unknown.) 125 */ 126 public IllegalPatternArgumentException(@Nullable final Pattern pattern, @Nullable final Throwable cause) { 127 super(format(pattern), cause); 128 } 129 130 /** 131 * Constructs an {@code IllegalNullArgumentException} with the message 132 * {@link IllegalPatternArgumentException#MESSAGE_WITH_NAME} including the given name of the argument as string 133 * representation and pattern which the argument must match. 134 * 135 * @param argumentName 136 * the name of the passed argument 137 * @param pattern 138 * Pattern, that a string or character sequence should correspond to 139 */ 140 public IllegalPatternArgumentException(@Nullable final String argumentName, @Nullable final Pattern pattern) { 141 super(determineMessage(argumentName, pattern)); 142 } 143 144 /** 145 * Constructs a new exception with the message {@link IllegalPatternArgumentException#MESSAGE_WITH_NAME} including 146 * the given name as string representation, the pattern which the argument must match and cause. 147 * 148 * @param argumentName 149 * the name of the passed argument 150 * @param pattern 151 * Pattern, that a string or character sequence should correspond to 152 * @param cause 153 * the cause (which is saved for later retrieval by the {@link Throwable#getCause()} method). (A 154 * {@code null} value is permitted, and indicates that the cause is nonexistent or unknown.) 155 */ 156 public IllegalPatternArgumentException(@Nullable final String argumentName, @Nullable final Pattern pattern, 157 @Nullable final Throwable cause) { 158 super(determineMessage(argumentName, pattern), cause); 159 } 160 161 }