View Javadoc
1   /*
2    * Copyright 2007 Kasper B. Graversen
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 org.supercsv.exception;
17  
18  import org.supercsv.cellprocessor.ift.CellProcessor;
19  import org.supercsv.util.CsvContext;
20  
21  /**
22   * Exception thrown when CellProcessor execution fails (typically due to invalid input) - constraint validating
23   * CellProcessors should throw {@link SuperCsvConstraintViolationException} for constraint validation failures.
24   * 
25   * @author James Bassett
26   * @since 2.0.0
27   */
28  public class SuperCsvCellProcessorException extends SuperCsvException {
29  	
30  	private static final long serialVersionUID = 1L;
31  	
32  	private final CellProcessor processor;
33  	
34  	/**
35  	 * Constructs a new <tt>SuperCsvCellProcessorException</tt>.
36  	 * 
37  	 * @param msg
38  	 *            the exception message
39  	 * @param context
40  	 *            the CSV context
41  	 * @param processor
42  	 *            the cell processor that was executing
43  	 */
44  	public SuperCsvCellProcessorException(final String msg, final CsvContext context, final CellProcessor processor) {
45  		super(msg, context);
46  		this.processor = processor;
47  	}
48  	
49  	/**
50  	 * Constructs a new <tt>SuperCsvCellProcessorException</tt>.
51  	 * 
52  	 * @param msg
53  	 *            the exception message
54  	 * @param context
55  	 *            the CSV context
56  	 * @param processor
57  	 *            the cell processor that was executing
58  	 * @param t
59  	 *            the nested exception
60  	 */
61  	public SuperCsvCellProcessorException(final String msg, final CsvContext context, final CellProcessor processor,
62  		final Throwable t) {
63  		super(msg, context, t);
64  		this.processor = processor;
65  	}
66  	
67  	/**
68  	 * Constructs a new <tt>SuperCsvCellProcessorException</tt> to indicate that the value received by a CellProcessor
69  	 * wasn't of the correct type.
70  	 * 
71  	 * @param expectedType
72  	 *            the expected type
73  	 * @param actualValue
74  	 *            the value received by the CellProcessor
75  	 * @param context
76  	 *            the CSV context
77  	 * @param processor
78  	 *            the cell processor that was executing
79  	 */
80  	public SuperCsvCellProcessorException(final Class<?> expectedType, final Object actualValue,
81  		final CsvContext context, final CellProcessor processor) {
82  		super(getUnexpectedTypeMessage(expectedType, actualValue), context);
83  		this.processor = processor;
84  	}
85  	
86  	/**
87  	 * Assembles the exception message when the value received by a CellProcessor isn't of the correct type.
88  	 * 
89  	 * @param expectedType
90  	 *            the expected type
91  	 * @param actualValue
92  	 *            the value received by the CellProcessor
93  	 * @return the message
94  	 * @throws NullPointerException
95  	 *             if expectedType is null
96  	 */
97  	private static String getUnexpectedTypeMessage(final Class<?> expectedType, final Object actualValue) {
98  		if( expectedType == null ) {
99  			throw new NullPointerException("expectedType should not be null");
100 		}
101 		String expectedClassName = expectedType.getName();
102 		String actualClassName = (actualValue != null) ? actualValue.getClass().getName() : "null";
103 		return String.format("the input value should be of type %s but is %s", expectedClassName, actualClassName);
104 	}
105 	
106 	/**
107 	 * Gets the processor that was executing.
108 	 * 
109 	 * @return the processor that was executing
110 	 */
111 	public CellProcessor getProcessor() {
112 		return processor;
113 	}
114 	
115 	/**
116 	 * Returns the String representation of this exception.
117 	 */
118 	@Override
119 	public String toString() {
120 		return String.format("%s: %s%nprocessor=%s%ncontext=%s", getClass().getName(), getMessage(), processor,
121 			getCsvContext());
122 	}
123 	
124 }