1818import java .util .HashMap ;
1919import java .util .Map ;
2020import java .util .Queue ;
21+ import java .util .Set ;
2122import java .util .concurrent .ConcurrentLinkedQueue ;
2223import java .util .function .Supplier ;
24+ import java .util .stream .Collectors ;
25+
26+ import jakarta .validation .ConstraintViolation ;
27+ import jakarta .validation .ConstraintViolationException ;
28+ import jakarta .validation .Validation ;
29+ import jakarta .validation .Validator ;
30+ import jakarta .validation .ValidatorFactory ;
2331
2432import org .eclipse .serializer .persistence .binary .types .Binary ;
2533import org .eclipse .serializer .persistence .binary .types .BinaryStorer ;
@@ -45,6 +53,7 @@ public class EclipseSerializerRegisteringCopier implements AutoCloseable
4553 private final Supplier <PersistenceManager <Binary >> persistenceManagerSupplier ;
4654 private final SupportedChecker supportedChecker ;
4755 private final RegisteringWorkingCopyAndOriginal register ;
56+ private final Validator validator ;
4857
4958 public EclipseSerializerRegisteringCopier (
5059 final SupportedChecker supportedChecker ,
@@ -55,6 +64,9 @@ public EclipseSerializerRegisteringCopier(
5564 this .register = register ;
5665 this .persistenceManagerSupplier = persistenceManagerSupplier ;
5766 this .persistenceManagers = new ConcurrentLinkedQueue <>();
67+
68+ final ValidatorFactory validatorFactory = Validation .buildDefaultValidatorFactory ();
69+ this .validator = validatorFactory .getValidator ();
5870 }
5971
6072 private PersistenceManager <Binary > ensurePersistenceManager ()
@@ -138,9 +150,25 @@ private <T> T copy(final T source, final PersistenceManager<Binary> persistenceM
138150 {
139151 return ;
140152 }
141- if (copiedObject != null && ! this . supportedChecker . isSupported ( copiedObject . getClass ()) )
153+ if (copiedObject != null )
142154 {
143- throw new DataTypeNotSupportedException (copiedObject .getClass ());
155+ if (!this .supportedChecker .isSupported (copiedObject .getClass ()))
156+ {
157+ throw new DataTypeNotSupportedException (copiedObject .getClass ());
158+ }
159+ final Set <ConstraintViolation <Object >> violations = this .validator .validate (copiedObject );
160+ if (!violations .isEmpty ())
161+ {
162+ final String violationsAsMessage = violations .stream ()
163+ .map (cv -> cv == null ? "null" : cv .getPropertyPath () + ": " + cv .getMessage ())
164+ .collect (Collectors .joining (", " ));
165+
166+ throw new ConstraintViolationException (
167+ "Error validating " + copiedObject .getClass ().getName () + ":" + System .lineSeparator ()
168+ + violationsAsMessage ,
169+ violations
170+ );
171+ }
144172 }
145173 summarizer .incrementCopiedObjectsCount ();
146174 if (DataTypeUtil .isPrimitiveType (copiedObject .getClass ()))
0 commit comments