View Javadoc

1   /*
2    * Copyright 2012-2013 smartics, Kronseder & Reiner GmbH
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 de.smartics.properties.api.core.domain;
17  
18  import java.io.Serializable;
19  import java.util.List;
20  
21  
22  
23  /**
24   * Signals that the value does not match the given constraints.
25   */
26  public class PropertyValidationException extends PropertyDescriptorException
27  {
28    // ********************************* Fields *********************************
29  
30    // --- constants ------------------------------------------------------------
31  
32    /**
33     * The class version identifier.
34     * <p>
35     * The value of this constant is {@value}.
36     */
37    private static final long serialVersionUID = 1L;
38  
39    // --- members --------------------------------------------------------------
40  
41    /**
42     * The property constraints that failed to be met.
43     *
44     * @serial
45     */
46    private final List<? extends PropertyConstraint<?>> constraints;
47  
48    /**
49     * The value of the property that does not meet the constraints.
50     *
51     * @serial
52     */
53    private final Serializable value;
54  
55    // ****************************** Initializer *******************************
56  
57    // ****************************** Constructors ******************************
58  
59    /**
60     * Convenience constructor with no message and no root cause.
61     *
62     * @param propertyDescriptor the descriptor of the property raising the
63     *          exception.
64     * @param constraints the property constraints that failed to be met.
65     * @param value the value of the property that does not meet the constraints.
66     *          If the value is not serializable, its string representation is
67     *          stored.
68     */
69    public PropertyValidationException(
70        final PropertyDescriptor propertyDescriptor,
71        final List<? extends PropertyConstraint<?>> constraints,
72        final Object value)
73    {
74      this(createMessage(propertyDescriptor, constraints, value),
75          propertyDescriptor, constraints, value);
76    }
77  
78    /**
79     * Convenience constructor with no root cause.
80     *
81     * @param message the detail message (which is saved for later retrieval by
82     *          the {@link #getMessage()} method).
83     * @param propertyDescriptor the descriptor of the property raising the
84     *          exception.
85     * @param constraints the property constraints that failed to be met.
86     * @param value the value of the property that does not meet the constraints.
87     *          If the value is not serializable, its string representation is
88     *          stored.
89     */
90    public PropertyValidationException(final String message,
91        final PropertyDescriptor propertyDescriptor,
92        final List<? extends PropertyConstraint<?>> constraints,
93        final Object value)
94    {
95      this(message, null, propertyDescriptor, constraints, value);
96    }
97  
98    /**
99     * Convenience constructor with no message.
100    *
101    * @param cause the cause (which is saved for later retrieval by the
102    *          {@link #getCause()} method). (A <tt>null</tt> value is permitted,
103    *          and indicates that the cause is nonexistent or unknown.)
104    * @param propertyDescriptor the descriptor of the property raising the
105    *          exception.
106    * @param constraints the property constraints that failed to be met.
107    * @param value the value of the property that does not meet the constraints.
108    *          If the value is not serializable, its string representation is
109    *          stored.
110    */
111   public PropertyValidationException(final Throwable cause,
112       final PropertyDescriptor propertyDescriptor,
113       final List<? extends PropertyConstraint<?>> constraints,
114       final Object value)
115   {
116     this(null, cause, propertyDescriptor, constraints, value);
117   }
118 
119   /**
120    * Default constructor.
121    *
122    * @param message the detail message (which is saved for later retrieval by
123    *          the {@link #getMessage()} method).
124    * @param cause the cause (which is saved for later retrieval by the
125    *          {@link #getCause()} method). (A <tt>null</tt> value is permitted,
126    *          and indicates that the cause is nonexistent or unknown.)
127    * @param propertyDescriptor the descriptor of the property raising the
128    *          exception.
129    * @param constraints the property constraints that failed to be met.
130    * @param value the value of the property that does not meet the constraints.
131    *          If the value is not serializable, its string representation is
132    *          stored.
133    */
134   public PropertyValidationException(final String message,
135       final Throwable cause, final PropertyDescriptor propertyDescriptor,
136       final List<? extends PropertyConstraint<?>> constraints,
137       final Object value)
138   {
139     super(message, cause, propertyDescriptor);
140 
141     this.constraints = constraints;
142     this.value =
143         value instanceof Serializable ? (Serializable) value : String
144             .valueOf(value);
145   }
146 
147   // ****************************** Inner Classes *****************************
148 
149   // ********************************* Methods ********************************
150 
151   // --- init -----------------------------------------------------------------
152 
153   private static String createMessage(
154       final PropertyDescriptor propertyDescriptor,
155       final List<? extends PropertyConstraint<?>> constraints,
156       final Object value)
157   {
158     final StringBuilder buffer = new StringBuilder();
159 
160     buffer.append("Invalid value '"
161                   + value
162                   + '\''
163                   + (value != null ? " (" + value.getClass().getSimpleName()
164                                      + ')' : "") + " for property '"
165                   + propertyDescriptor.getKey() + "':");
166     if (constraints != null && !constraints.isEmpty())
167     {
168       for (final PropertyConstraint<?> constraint : constraints)
169       {
170         buffer.append('\n').append(constraint.getDescription());
171       }
172     }
173 
174     return buffer.toString();
175   }
176 
177   // --- get&set --------------------------------------------------------------
178 
179   /**
180    * Returns the property constraint that failed to be met.
181    *
182    * @return the property constraint that failed to be met.
183    */
184   public final List<? extends PropertyConstraint<?>> getConstraints()
185   {
186     return constraints;
187   }
188 
189   /**
190    * Returns the value of the property that does not meet the constraints.
191    *
192    * @return the value of the property that does not meet the constraints.
193    */
194   public final Serializable getValue()
195   {
196     return value;
197   }
198 
199   // --- business -------------------------------------------------------------
200 
201   // --- object basics --------------------------------------------------------
202 
203 }