1 /* 2 * Copyright 2016 Andrew Rucker Jones. 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 com.opencsv.exceptions; 17 18 import java.lang.reflect.Field; 19 import java.util.Collections; 20 import java.util.List; 21 import org.apache.commons.collections4.CollectionUtils; 22 import org.apache.commons.collections4.list.UnmodifiableList; 23 24 /** 25 * This exception should be thrown when a field marked as required is empty in 26 * the CSV file. 27 * 28 * @author Andrew Rucker Jones 29 * @since 3.8 30 */ 31 public class CsvRequiredFieldEmptyException extends CsvFieldAssignmentException { 32 private static final long serialVersionUID = 1L; 33 34 private final Class<?> beanClass; 35 private transient final List<Field> destinationFields; 36 37 /** 38 * Default constructor, in case no further information is necessary. 39 */ 40 public CsvRequiredFieldEmptyException() { 41 beanClass = null; 42 destinationFields = Collections.emptyList(); 43 } 44 45 /** 46 * Constructor with a simple text. 47 * 48 * @param message Human-readable error text 49 */ 50 public CsvRequiredFieldEmptyException(String message) { 51 super(message); 52 beanClass = null; 53 destinationFields = Collections.emptyList(); 54 } 55 56 /** 57 * Constructor for setting the intended class and field of the target bean. 58 * <p>These may not be known in every context.</p> 59 * <p>This constructor is provided for backward compatibility and for 60 * convenience if you only have one missing destination field.</p> 61 * 62 * @param beanClass Class of the destination bean 63 * @param destinationField Field of the destination field in the destination bean 64 */ 65 public CsvRequiredFieldEmptyException(Class<?> beanClass, Field destinationField) { 66 this.beanClass = beanClass; 67 this.destinationFields = Collections.singletonList(destinationField); 68 } 69 70 /** 71 * Constructor for setting the intended class and fields of the target bean. 72 * These may not be known in every context. 73 * 74 * @param beanClass Class of the destination bean 75 * @param destinationFields Fields of the destination fields in the destination bean 76 * @since 4.2 77 */ 78 public CsvRequiredFieldEmptyException(Class<?> beanClass, List<Field> destinationFields) { 79 this.beanClass = beanClass; 80 this.destinationFields = new UnmodifiableList<>(destinationFields); 81 } 82 83 /** 84 * Constructor for setting the intended class of the target bean and a 85 * human-readable error message. 86 * These may not be known in every context. 87 * 88 * @param beanClass Class of the destination bean 89 * @param message Human-readable error text 90 * @since 3.10 91 */ 92 public CsvRequiredFieldEmptyException(Class<?> beanClass, String message) { 93 super(message); 94 this.beanClass = beanClass; 95 this.destinationFields = Collections.emptyList(); 96 } 97 98 /** 99 * Constructor for setting the intended class and field of the target bean 100 * along with an error message. 101 * <p>The class and field may not be known in every context.</p> 102 * <p>This constructor is provided for backward compatibility and for 103 * convenience if you only have one missing destination field.</p> 104 * 105 * @param beanClass Class of the destination bean 106 * @param destinationField Field of the destination field in the destination bean 107 * @param message Human-readable error text 108 */ 109 public CsvRequiredFieldEmptyException(Class<?> beanClass, Field destinationField, String message) { 110 super(message); 111 this.beanClass = beanClass; 112 this.destinationFields = Collections.singletonList(destinationField); 113 } 114 115 /** 116 * Constructor for setting the intended class and fields of the target bean 117 * along with an error message. 118 * The class and field may not be known in every context. 119 * 120 * @param beanClass Class of the destination bean 121 * @param destinationFields Field of the destination field in the destination bean 122 * @param message Human-readable error text 123 * @since 4.2 124 */ 125 public CsvRequiredFieldEmptyException(Class<?> beanClass, List<Field> destinationFields, String message) { 126 super(message); 127 this.beanClass = beanClass; 128 this.destinationFields = new UnmodifiableList<>(destinationFields); 129 } 130 131 /** 132 * Gets the class of the bean to which the value was to be assigned. 133 * 134 * @return The class of the bean to which the destination field belongs 135 */ 136 public Class<?> getBeanClass() { 137 return beanClass; 138 } 139 140 /** 141 * Gets the field from the Reflection API that was to be assigned. 142 * <p>This method is provided as a convenience for when you know there can 143 * be only one field, or you really only care about the first field.</p> 144 * <p>{@code destinationFields} is marked {@code transient}, because 145 * {@link java.lang.reflect.Field} is not {@link java.io.Serializable}. If 146 * for any reason this exception is serialized and deserialized, this method 147 * will subsequently return {@code null}.</p> 148 * 149 * @return The first destination field that was to receive the empty value 150 */ 151 public Field getDestinationField() { 152 return CollectionUtils.isEmpty(destinationFields)?null:destinationFields.get(0); 153 } 154 155 /** 156 * Returns the complete list of all fields that were to be empty. 157 * {@code destinationFields} is marked {@code transient}, because 158 * {@link java.lang.reflect.Field} is not {@link java.io.Serializable}. If 159 * for any reason this exception is serialized and deserialized, this method 160 * will subsequently return {@code null}. 161 * 162 * @return All destination fields that were to receive the empty value 163 * @since 4.2 164 */ 165 public List<Field> getDestinationFields() { 166 return destinationFields; 167 } 168 }