]> source.dussan.org Git - vaadin-framework.git/commitdiff
#8095 Only use BeanValidation if a JSR-303 implementation is available
authorArtur Signell <artur@vaadin.com>
Mon, 19 Dec 2011 14:39:04 +0000 (16:39 +0200)
committerArtur Signell <artur@vaadin.com>
Mon, 19 Dec 2011 14:41:11 +0000 (16:41 +0200)
src/com/vaadin/data/fieldbinder/BeanFieldBinder.java
src/com/vaadin/data/validator/BeanValidationValidator.java

index 6777f1b9af55a10285cdd19f24cb134febc796df..127d37c1bd630b0197cf64555103c1a46a2d65f9 100644 (file)
@@ -115,10 +115,12 @@ public class BeanFieldBinder<T> extends FieldBinder {
     protected void configureField(Field<?> field) {\r
         super.configureField(field);\r
         // Add Bean validators if there are annotations\r
-        BeanValidationValidator validator = BeanValidationValidator\r
-                .addValidator(field, getPropertyIdForField(field), beanType);\r
-        if (field.getLocale() != null) {\r
-            validator.setLocale(field.getLocale());\r
+        if (BeanValidationValidator.isImplementationAvailable()) {\r
+            BeanValidationValidator validator = BeanValidationValidator\r
+                    .addValidator(field, getPropertyIdForField(field), beanType);\r
+            if (field.getLocale() != null) {\r
+                validator.setLocale(field.getLocale());\r
+            }\r
         }\r
     }\r
 \r
index 527ffac245fbd55764243d5b4af590bef7dc0077..e144018698ca5510f53d4139aa4d64b59d88ccc9 100644 (file)
@@ -4,8 +4,6 @@
 \r
 package com.vaadin.data.validator;\r
 \r
-import java.io.IOException;\r
-import java.io.ObjectInputStream;\r
 import java.io.Serializable;\r
 import java.lang.annotation.Annotation;\r
 import java.lang.reflect.Method;\r
@@ -46,10 +44,9 @@ import com.vaadin.ui.Field;
 public class BeanValidationValidator implements Validator {\r
 \r
     private static final long serialVersionUID = 1L;\r
-    private static ValidatorFactory factory = Validation\r
-            .buildDefaultValidatorFactory();\r
+    private static ValidatorFactory factory;\r
 \r
-    private transient javax.validation.Validator validator;\r
+    private transient javax.validation.Validator javaxBeanValidator;\r
     private String propertyName;\r
     private Class<?> beanClass;\r
     private Locale locale;\r
@@ -89,7 +86,6 @@ public class BeanValidationValidator implements Validator {
     public BeanValidationValidator(Class<?> beanClass, String propertyName) {\r
         this.beanClass = beanClass;\r
         this.propertyName = propertyName;\r
-        validator = factory.getValidator();\r
         locale = Locale.getDefault();\r
     }\r
 \r
@@ -111,12 +107,13 @@ public class BeanValidationValidator implements Validator {
      * @return the created validator\r
      */\r
     public static BeanValidationValidator addValidator(Field field,\r
-            Object propertyId, Class<?> beanClass) {\r
+            Object objectPropertyId, Class<?> beanClass) {\r
+        String propertyId = (String) objectPropertyId;\r
         BeanValidationValidator validator = new BeanValidationValidator(\r
-                beanClass, String.valueOf(propertyId));\r
-        PropertyDescriptor constraintsForProperty = validator.validator\r
-                .getConstraintsForClass(beanClass).getConstraintsForProperty(\r
-                        propertyId.toString());\r
+                beanClass, propertyId);\r
+        PropertyDescriptor constraintsForProperty = validator\r
+                .getJavaxBeanValidator().getConstraintsForClass(beanClass)\r
+                .getConstraintsForProperty(propertyId);\r
         if (constraintsForProperty != null) {\r
             int nonNotNullValidators = constraintsForProperty\r
                     .getConstraintDescriptors().size();\r
@@ -148,8 +145,9 @@ public class BeanValidationValidator implements Validator {
      * @return true if the field is marked as not null\r
      */\r
     public boolean isRequired() {\r
-        PropertyDescriptor desc = validator.getConstraintsForClass(beanClass)\r
-                .getConstraintsForProperty(propertyName);\r
+        PropertyDescriptor desc = getJavaxBeanValidator()\r
+                .getConstraintsForClass(beanClass).getConstraintsForProperty(\r
+                        propertyName);\r
         if (desc != null) {\r
             Iterator<ConstraintDescriptor<?>> it = desc\r
                     .getConstraintDescriptors().iterator();\r
@@ -170,13 +168,13 @@ public class BeanValidationValidator implements Validator {
     }\r
 \r
     public void validate(final Object value) throws InvalidValueException {\r
-        Set<?> violations = validator.validateValue(beanClass, propertyName,\r
-                value);\r
+        Set<?> violations = getJavaxBeanValidator().validateValue(beanClass,\r
+                propertyName, value);\r
         if (violations.size() > 0) {\r
             List<String> exceptions = new ArrayList<String>();\r
             for (Object v : violations) {\r
                 final ConstraintViolation<?> violation = (ConstraintViolation<?>) v;\r
-                String msg = factory.getMessageInterpolator().interpolate(\r
+                String msg = getJavaxBeanValidatorFactory().getMessageInterpolator().interpolate(\r
                         violation.getMessageTemplate(),\r
                         new SimpleContext(value, violation\r
                                 .getConstraintDescriptor()), locale);\r
@@ -195,7 +193,8 @@ public class BeanValidationValidator implements Validator {
 \r
     private String getErrorMessage(final Object value,\r
             Class<? extends Annotation>... an) {\r
-        BeanDescriptor beanDesc = validator.getConstraintsForClass(beanClass);\r
+        BeanDescriptor beanDesc = getJavaxBeanValidator()\r
+                .getConstraintsForClass(beanClass);\r
         PropertyDescriptor desc = beanDesc\r
                 .getConstraintsForProperty(propertyName);\r
         if (desc == null) {\r
@@ -227,7 +226,7 @@ public class BeanValidationValidator implements Validator {
                     throw new InvalidValueException(\r
                             "Annotation must have message attribute");\r
                 }\r
-                String msg = factory.getMessageInterpolator().interpolate(\r
+                String msg = getJavaxBeanValidatorFactory().getMessageInterpolator().interpolate(\r
                         messageTemplate, new SimpleContext(value, d), locale);\r
                 exceptions.add(msg);\r
             }\r
@@ -265,9 +264,28 @@ public class BeanValidationValidator implements Validator {
         return locale;\r
     }\r
 \r
-    private void readObject(ObjectInputStream in) throws IOException,\r
-            ClassNotFoundException {\r
-        in.defaultReadObject();\r
-        validator = factory.getValidator();\r
+    protected static ValidatorFactory getJavaxBeanValidatorFactory() {\r
+        if (factory == null) {\r
+            factory = Validation.buildDefaultValidatorFactory();\r
+        }\r
+\r
+        return factory;\r
+    }\r
+\r
+    protected javax.validation.Validator getJavaxBeanValidator() {\r
+        if (javaxBeanValidator == null) {\r
+            javaxBeanValidator = getJavaxBeanValidatorFactory().getValidator();\r
+        }\r
+\r
+        return javaxBeanValidator;\r
+    }\r
+\r
+    public static boolean isImplementationAvailable() {\r
+        try {\r
+            getJavaxBeanValidatorFactory();\r
+            return true;\r
+        } catch (Exception e) {\r
+            return false;\r
+        }\r
     }\r
 }
\ No newline at end of file