From 49cb219849a193b8d7ac1593f15a85cf3661e67c Mon Sep 17 00:00:00 2001 From: Albert Shift Date: Tue, 9 Jun 2015 13:23:25 -0700 Subject: [PATCH] parse contraint annotations and initilize validators --- .../core/reflect/CasserNamedProperty.java | 8 +++ .../core/reflect/ReflectionInstantiator.java | 35 +++++++++++++ .../casser/mapping/CasserMappingProperty.java | 13 +++++ .../noorq/casser/mapping/CasserProperty.java | 5 ++ .../com/noorq/casser/mapping/MappingUtil.java | 49 +++++++++++++++++++ 5 files changed, 110 insertions(+) create mode 100644 src/main/java/com/noorq/casser/core/reflect/ReflectionInstantiator.java diff --git a/src/main/java/com/noorq/casser/core/reflect/CasserNamedProperty.java b/src/main/java/com/noorq/casser/core/reflect/CasserNamedProperty.java index df3afbd..1adf1bc 100644 --- a/src/main/java/com/noorq/casser/core/reflect/CasserNamedProperty.java +++ b/src/main/java/com/noorq/casser/core/reflect/CasserNamedProperty.java @@ -15,15 +15,19 @@ */ package com.noorq.casser.core.reflect; +import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.Optional; import java.util.function.Function; +import javax.validation.ConstraintValidator; + import com.noorq.casser.core.SessionRepository; import com.noorq.casser.mapping.CasserEntity; import com.noorq.casser.mapping.CasserProperty; import com.noorq.casser.mapping.ColumnType; import com.noorq.casser.mapping.IdentityName; +import com.noorq.casser.mapping.MappingUtil; import com.noorq.casser.mapping.OrderingDirection; import com.noorq.casser.mapping.type.AbstractDataType; import com.noorq.casser.support.CasserMappingException; @@ -98,4 +102,8 @@ public final class CasserNamedProperty implements CasserProperty { return Optional.empty(); } + @Override + public ConstraintValidator[] getValidators() { + return MappingUtil.EMPTY_VALIDATORS; + } } diff --git a/src/main/java/com/noorq/casser/core/reflect/ReflectionInstantiator.java b/src/main/java/com/noorq/casser/core/reflect/ReflectionInstantiator.java new file mode 100644 index 0000000..bea26db --- /dev/null +++ b/src/main/java/com/noorq/casser/core/reflect/ReflectionInstantiator.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2015 Noorq, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.noorq.casser.core.reflect; + +import com.noorq.casser.support.CasserMappingException; + +public final class ReflectionInstantiator { + + private ReflectionInstantiator() { + } + + public static T instantiateClass(Class clazz) { + + try { + return clazz.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new CasserMappingException("invalid class " + clazz, e); + } + + } + +} diff --git a/src/main/java/com/noorq/casser/mapping/CasserMappingProperty.java b/src/main/java/com/noorq/casser/mapping/CasserMappingProperty.java index 33f41f0..cae7b7c 100644 --- a/src/main/java/com/noorq/casser/mapping/CasserMappingProperty.java +++ b/src/main/java/com/noorq/casser/mapping/CasserMappingProperty.java @@ -15,11 +15,14 @@ */ package com.noorq.casser.mapping; +import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Optional; import java.util.function.Function; +import javax.validation.ConstraintValidator; + import com.noorq.casser.core.SessionRepository; import com.noorq.casser.mapping.javatype.AbstractJavaType; import com.noorq.casser.mapping.javatype.MappingJavaTypes; @@ -43,6 +46,8 @@ public final class CasserMappingProperty implements CasserProperty { private volatile Optional> readConverter = null; private volatile Optional> writeConverter = null; + private final ConstraintValidator[] validators; + public CasserMappingProperty(CasserMappingEntity entity, Method getter) { this.entity = entity; this.getter = getter; @@ -57,6 +62,8 @@ public final class CasserMappingProperty implements CasserProperty { this.abstractJavaType = MappingJavaTypes.resolveJavaType(this.javaType); this.dataType = abstractJavaType.resolveDataType(this.getter, this.genericJavaType, this.columnInfo.getColumnType()); + + this.validators = MappingUtil.getValidators(getter); } @Override @@ -129,4 +136,10 @@ public final class CasserMappingProperty implements CasserProperty { return writeConverter; } + @Override + public ConstraintValidator[] getValidators() { + return validators; + } + + } diff --git a/src/main/java/com/noorq/casser/mapping/CasserProperty.java b/src/main/java/com/noorq/casser/mapping/CasserProperty.java index c75856d..b2d8369 100644 --- a/src/main/java/com/noorq/casser/mapping/CasserProperty.java +++ b/src/main/java/com/noorq/casser/mapping/CasserProperty.java @@ -15,10 +15,13 @@ */ package com.noorq.casser.mapping; +import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.Optional; import java.util.function.Function; +import javax.validation.ConstraintValidator; + import com.noorq.casser.core.SessionRepository; import com.noorq.casser.mapping.type.AbstractDataType; @@ -48,4 +51,6 @@ public interface CasserProperty { Optional> getWriteConverter(SessionRepository repository); + ConstraintValidator[] getValidators(); + } diff --git a/src/main/java/com/noorq/casser/mapping/MappingUtil.java b/src/main/java/com/noorq/casser/mapping/MappingUtil.java index 1c1b4f1..be82e57 100644 --- a/src/main/java/com/noorq/casser/mapping/MappingUtil.java +++ b/src/main/java/com/noorq/casser/mapping/MappingUtil.java @@ -15,9 +15,15 @@ */ package com.noorq.casser.mapping; +import java.lang.annotation.Annotation; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; +import javax.validation.Constraint; +import javax.validation.ConstraintValidator; + import com.noorq.casser.core.Casser; import com.noorq.casser.core.Getter; import com.noorq.casser.core.reflect.CasserPropertyNode; @@ -25,6 +31,7 @@ import com.noorq.casser.core.reflect.DslExportable; import com.noorq.casser.core.reflect.ListDsl; import com.noorq.casser.core.reflect.MapDsl; import com.noorq.casser.core.reflect.MapExportable; +import com.noorq.casser.core.reflect.ReflectionInstantiator; import com.noorq.casser.core.reflect.SetDsl; import com.noorq.casser.mapping.annotation.Index; import com.noorq.casser.mapping.annotation.Table; @@ -33,11 +40,53 @@ import com.noorq.casser.mapping.annotation.UDT; import com.noorq.casser.support.CasserMappingException; import com.noorq.casser.support.DslPropertyException; + public final class MappingUtil { + @SuppressWarnings("unchecked") + public static final ConstraintValidator[] EMPTY_VALIDATORS = new ConstraintValidator[0]; + private MappingUtil() { } + public static ConstraintValidator[] getValidators(Method getterMethod) { + + List> list = null; + + for (Annotation constraintAnnotation : getterMethod.getDeclaredAnnotations()) { + + Class annotationType = constraintAnnotation.annotationType(); + + Constraint constraint = annotationType.getDeclaredAnnotation(Constraint.class); + + if (constraint == null) { + continue; + } + + for (Class> clazz : constraint.validatedBy()) { + + ConstraintValidator validator = ReflectionInstantiator.instantiateClass(clazz); + + ((ConstraintValidator) validator).initialize(constraintAnnotation); + + if (list == null) { + list = new ArrayList>(); + } + + list.add(validator); + + } + + } + + if (list == null) { + return EMPTY_VALIDATORS; + } + else { + return list.toArray(EMPTY_VALIDATORS); + } + } + public static Optional getIndexName(Method getterMethod) { String indexName = null;