Repository: tomee Updated Branches: refs/heads/master 6098bfacc -> 4a39c0cc2
correct serialization impl for LazyValidator Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/4a39c0cc Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/4a39c0cc Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/4a39c0cc Branch: refs/heads/master Commit: 4a39c0cc2d845660f42b0e04b1bd91c6fb42892d Parents: 6098bfa Author: rmannibucau <rmannibu...@apache.org> Authored: Wed Jun 21 10:52:37 2017 +0200 Committer: rmannibucau <rmannibu...@apache.org> Committed: Wed Jun 21 10:52:37 2017 +0200 ---------------------------------------------------------------------- .../assembler/classic/LazyValidator.java | 34 ++++++++++------- .../assembler/classic/LazyValidatorFactory.java | 2 +- .../assembler/classic/LazyValidatorTest.java | 39 ++++++++++++++++++++ 3 files changed, 60 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/4a39c0cc/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LazyValidator.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LazyValidator.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LazyValidator.java index 03fd304..407000c 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LazyValidator.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LazyValidator.java @@ -17,18 +17,20 @@ package org.apache.openejb.assembler.classic; +import org.apache.openejb.bval.ValidatorUtil; + +import javax.naming.NamingException; +import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; +import java.io.Serializable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.concurrent.locks.ReentrantLock; - -public class LazyValidator implements InvocationHandler { - private final ReentrantLock lock = new ReentrantLock(); - private final ValidatorFactory factory; - private Validator validator; +public class LazyValidator implements InvocationHandler, Serializable { + private transient ValidatorFactory factory; + private transient volatile Validator validator; public LazyValidator(final ValidatorFactory factory) { this.factory = factory; @@ -46,20 +48,24 @@ public class LazyValidator implements InvocationHandler { private void ensureDelegate() { if (validator == null) { - - final ReentrantLock l = lock; - l.lock(); - - try { + synchronized (this) { if (validator == null) { - validator = factory.usingContext().getValidator(); + if (validator == null) { + validator = (factory == null ? findFactory() : factory).usingContext().getValidator(); + } } - } finally { - l.unlock(); } } } + private ValidatorFactory findFactory() { + try { + return ValidatorUtil.lookupFactory(); + } catch (final NamingException ne) { + return Validation.buildDefaultValidatorFactory(); + } + } + public Validator getValidator() { ensureDelegate(); return validator; http://git-wip-us.apache.org/repos/asf/tomee/blob/4a39c0cc/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LazyValidatorFactory.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LazyValidatorFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LazyValidatorFactory.java index 6265804..57b2c42 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LazyValidatorFactory.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/LazyValidatorFactory.java @@ -24,7 +24,7 @@ import java.lang.reflect.Method; import java.util.concurrent.locks.ReentrantLock; // TODO: make it generic (LazyDelegate + Factory + refactor LazyValidator) -public class LazyValidatorFactory implements InvocationHandler { +public class LazyValidatorFactory implements InvocationHandler, Serializable { private final ReentrantLock lock = new ReentrantLock(); private final ClassLoader loader; private final ValidationInfo info; http://git-wip-us.apache.org/repos/asf/tomee/blob/4a39c0cc/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/LazyValidatorTest.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/LazyValidatorTest.java b/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/LazyValidatorTest.java new file mode 100644 index 0000000..2f65fdb --- /dev/null +++ b/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/LazyValidatorTest.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.openejb.assembler.classic; + +import org.apache.commons.lang3.SerializationUtils; +import org.junit.Test; + +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; +import java.io.Serializable; +import java.lang.reflect.Proxy; + +import static org.junit.Assert.assertNotNull; + +public class LazyValidatorTest { + @Test + public void serialize() { + final Serializable obj = Serializable.class.cast(Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), + new Class<?>[]{ValidatorFactory.class}, new LazyValidator(Validation.buildDefaultValidatorFactory()))); + final LazyValidator deserialized = LazyValidator.class.cast(Proxy.getInvocationHandler(SerializationUtils.deserialize(SerializationUtils.serialize(obj)))); + final Validator validator = deserialized.getValidator(); + assertNotNull(validator); + } +}