Add UnqualifiedQName.tryCreate()
[yangtools.git] / yang / yang-common / src / main / java / org / opendaylight / yangtools / yang / common / AbstractCanonicalValueValidator.java
index c1ef9519428ea614eef2b4d28679ddaf4829ed5e..2d6c247dd07f0542fbfd61600ca8a67a1348bb96 100644 (file)
@@ -10,8 +10,8 @@ package org.opendaylight.yangtools.yang.common;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
-import javax.annotation.concurrent.ThreadSafe;
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.concepts.Variant;
 
 /**
  * Abstract base class for implementing validators.
@@ -22,7 +22,6 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
  */
 @Beta
 @NonNullByDefault
-@ThreadSafe
 public abstract class AbstractCanonicalValueValidator<T extends DerivedString<T>, V extends T>
         implements CanonicalValueValidator<T, V> {
     private static final ClassValue<Boolean> IMPLEMENTATIONS = new AbstractCanonicalValueImplementationValidator() {
@@ -53,15 +52,16 @@ public abstract class AbstractCanonicalValueValidator<T extends DerivedString<T>
     }
 
     @Override
-    public final V validateRepresentation(final T value) {
+    public final Variant<T, CanonicalValueViolation> validateRepresentation(final T value) {
         return validatedClass.isAssignableFrom(value.validator().getValidatedRepresentationClass())
-                ? validatedClass.cast(value) : validate(value);
+                ? Variant.ofFirst(validatedClass.cast(value)) : validate(value);
     }
 
     @Override
-    public final V validateRepresentation(final T value, final String canonicalString) {
+    public final Variant<T, CanonicalValueViolation> validateRepresentation(final T value,
+            final String canonicalString) {
         return validatedClass.isAssignableFrom(value.validator().getValidatedRepresentationClass())
-                ? validatedClass.cast(value) : validate(value, requireNonNull(canonicalString));
+                ? Variant.ofFirst(validatedClass.cast(value)) : validate(value, requireNonNull(canonicalString));
     }
 
     /**
@@ -69,11 +69,10 @@ public abstract class AbstractCanonicalValueValidator<T extends DerivedString<T>
      * provide a validation algorithm which does not rely on canonical strings but works on representation state only.
      *
      * @param value Representation value
-     * @return Validated representation
+     * @return Validated representation or CanonicalValueViolation
      * @throws NullPointerException if {@code value} is null
-     * @throws IllegalArgumentException if the value does not meet validation criteria.
      */
-    protected V validate(final T value) {
+    protected Variant<T, CanonicalValueViolation> validate(final T value) {
         return validate(value, value.toCanonicalString());
     }
 
@@ -85,7 +84,6 @@ public abstract class AbstractCanonicalValueValidator<T extends DerivedString<T>
      * @param canonicalString Canonical string matching the representation value
      * @return Validated representation
      * @throws NullPointerException if {@code value} or {@code canonicalString} is null.
-     * @throws IllegalArgumentException if the value does not meet validation criteria.
      */
-    protected abstract V validate(T value, String canonicalString);
+    protected abstract Variant<T, CanonicalValueViolation> validate(T value, String canonicalString);
 }