Revert "Bug 487889 - Fix EclipseLink Bean Validation optimization and added tests from Bug 461880."
This reverts commit 403396d724a7727ace5a45ad6ba3088659014b77.
diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/config/PersistenceUnitProperties.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/config/PersistenceUnitProperties.java
index 4e7d9ff..010f2f2 100644
--- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/config/PersistenceUnitProperties.java
+++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/config/PersistenceUnitProperties.java
@@ -1140,18 +1140,6 @@
*/
public static final String VALIDATION_GROUP_PRE_REMOVE = "javax.persistence.validation.group.pre-remove";
- /**
- * Property for disabling Bean Validation optimisations.
- * Bean Validation features optimisations, which are used to skip BV processes on non-constrained objects.
- *
- * This is to make maintenance easier and to allow for debugging in case that some object is not validated,
- * but should be.
- *
- * Usage: set to {@link Boolean#TRUE} to disable optimisations, set to {@link Boolean#FALSE} to re-enable them
- * again.
- */
- public static final String BEAN_VALIDATION_NO_OPTIMISATION = "eclipselink.beanvalidation.no-optimisation";
-
// Caching Properties
/**
diff --git a/jpa/eclipselink.jpa.test/antbuild.properties b/jpa/eclipselink.jpa.test/antbuild.properties
index 0d0e571..2df6298 100644
--- a/jpa/eclipselink.jpa.test/antbuild.properties
+++ b/jpa/eclipselink.jpa.test/antbuild.properties
@@ -108,7 +108,6 @@
eclipselink.delimited.model=eclipselink-delimited-model
eclipselink.extensibility.model=eclipselink-extensibility-model
eclipselink.beanvalidation.model=eclipselink-beanvalidation-model
-eclipselink.beanvalidation.dynamic.model=eclipselink-beanvalidation-dynamic-model
eclipselink.composite.advanced.model=eclipselink-composite-advanced-model
eclipselink.composite.advanced.model.member_1=eclipselink-composite-advanced-model-member_1
diff --git a/jpa/eclipselink.jpa.test/antbuild.xml b/jpa/eclipselink.jpa.test/antbuild.xml
index 02c7e98..caaa5c9 100644
--- a/jpa/eclipselink.jpa.test/antbuild.xml
+++ b/jpa/eclipselink.jpa.test/antbuild.xml
@@ -550,7 +550,6 @@
<fileset file="${jpatest.basedir}/${eclipselink.delimited.model}.jar"/>
<fileset file="${jpatest.basedir}/${eclipselink.extensibility.model}.jar"/>
<fileset file="${jpatest.basedir}/${eclipselink.beanvalidation.model}.jar"/>
- <fileset file="${jpatest.basedir}/${eclipselink.beanvalidation.dynamic.model}.jar"/>
<fileset file="${jpatest.basedir}/${eclipselink.composite.advanced.model}.jar"/>
<fileset file="${jpatest.basedir}/${eclipselink.composite.advanced.model.member_1}.jar"/>
<fileset file="${jpatest.basedir}/${eclipselink.composite.advanced.model.member_2}.jar"/>
@@ -593,7 +592,6 @@
<mkdir dir="${jpatest.basedir}/${build.dir}/${eclipselink.delimited.model}"/>
<mkdir dir="${jpatest.basedir}/${build.dir}/${eclipselink.extensibility.model}"/>
<mkdir dir="${jpatest.basedir}/${build.dir}/${eclipselink.beanvalidation.model}"/>
- <mkdir dir="${jpatest.basedir}/${build.dir}/${eclipselink.beanvalidation.dynamic.model}"/>
<mkdir dir="${jpatest.basedir}/${build.dir}/${eclipselink.composite.advanced.model}"/>
<mkdir dir="${jpatest.basedir}/${build.dir}/${eclipselink.composite.advanced.model.member_1}"/>
<mkdir dir="${jpatest.basedir}/${build.dir}/${eclipselink.composite.advanced.model.member_2}"/>
@@ -783,7 +781,7 @@
</target>
<!-- Packages JPA persistent unit test jars. -->
- <target name="package" depends="config-classpath, package-annotation, package-ddl, package-xml-only, package-xml-merge, package-jpa21-model, package-xml-extended, package-validation-failed, package-jpa-advanced-field-access, package-jpa-advanced-properties, package-jpa-pu_with_spaces, package-partitioned, package-plsql, package-jpa-performance, package-jpa-performance2, package-cascade-deletes, package-jpa-metamodel, package-delimited, package-beanvalidation, package-beanvalidation-dynamic,
+ <target name="package" depends="config-classpath, package-annotation, package-ddl, package-xml-only, package-xml-merge, package-jpa21-model, package-xml-extended, package-validation-failed, package-jpa-advanced-field-access, package-jpa-advanced-properties, package-jpa-pu_with_spaces, package-partitioned, package-plsql, package-jpa-performance, package-jpa-performance2, package-cascade-deletes, package-jpa-metamodel, package-delimited, package-beanvalidation,
package-composite-advanced, package-composite-advanced-member_1, package-composite-advanced-member_2, package-composite-advanced-member_3,
package-xml-composite-advanced, package-xml-composite-advanced-member_1, package-xml-composite-advanced-member_2, package-xml-composite-advanced-member_3,
package-xml-extended-composite-advanced, package-xml-extended-composite-advanced-member_1, package-xml-extended-composite-advanced-member_2, package-xml-extended-composite-advanced-member_3, package-extensibility, package-jpa-remote, package-xml-mapping-metadata-complete" description="build EclipseLink jar">
@@ -1206,7 +1204,7 @@
</copy>
<copy todir="${jpatest.basedir}/${build.dir}/${eclipselink.beanvalidation.model}">
<fileset dir="${jpatest.basedir}/${classes.dir}"
- includes="org/eclipse/persistence/testing/models/jpa/beanvalidation/BeanValidationJunitTest*"/>
+ includes="org/eclipse/persistence/testing/models/jpa/beanvalidation/**"/>
</copy>
<jar jarfile="${jpatest.basedir}/${eclipselink.beanvalidation.model}.jar">
<fileset dir="${jpatest.basedir}/${build.dir}/${eclipselink.beanvalidation.model}">
@@ -1214,20 +1212,6 @@
</jar>
</target>
- <target name="package-beanvalidation-dynamic" depends="">
- <copy todir="${jpatest.basedir}/${build.dir}/${eclipselink.beanvalidation.dynamic.model}/META-INF">
- <fileset dir="${jpatest.basedir}/resource/${eclipselink.beanvalidation.dynamic.model}" includes="*.xml"/>
- </copy>
- <copy todir="${jpatest.basedir}/${build.dir}/${eclipselink.beanvalidation.dynamic.model}">
- <fileset dir="${jpatest.basedir}/${classes.dir}"
- includes="org/eclipse/persistence/testing/models/jpa/beanvalidation/dynamic/BeanValidationDynamicEntityJunitTest*"/>
- </copy>
- <jar jarfile="${jpatest.basedir}/${eclipselink.beanvalidation.dynamic.model}.jar">
- <fileset dir="${jpatest.basedir}/${build.dir}/${eclipselink.beanvalidation.dynamic.model}">
- </fileset>
- </jar>
- </target>
-
<target name="package-composite-advanced" depends="">
<copy todir="${jpatest.basedir}/${build.dir}/${eclipselink.composite.advanced.model}/META-INF">
<fileset dir="${jpatest.basedir}/resource/${eclipselink.composite.advanced.model}" includes="*.xml"/>
@@ -1482,10 +1466,6 @@
<pathelement path="${extensions.depend.dir}/${classmate.jar}"/>
<pathelement path="${extensions.depend.dir}/${javax.validation.jar}"/>
</path>
- <path id="run.bean.validation.dynamic.classpath">
- <path refid="run.bean.validation.classpath"/>
- <pathelement path="${jpatest.basedir}/${eclipselink.beanvalidation.dynamic.model}.jar"/>
- </path>
<path id="run.jpa21.classpath">
<pathelement path="${jpatest.basedir}/${classes21.dir}"/>
<path refid="jpa21.compile.path"/>
@@ -1678,15 +1658,6 @@
<param name="RUN_PATH" value="run.bean.validation.classpath"/>
<param name="DB_URL" value="${db.url}"/>
</antcall>
- <antcall target="run-test" inheritRefs="true">
- <param name="TEST_CLASS" value="org.eclipse.persistence.testing.tests.jpa.beanvalidation.dynamic.BeanValidationDynamicEntityJunitTest"/>
- <param name="TEST_AGENT" value="${test.agent}"/>
- <param name="TEST_WEAVING" value="${test.weaving}"/>
- <param name="TEST_WEAVING_OPTION" value="${test.weaving.option}"/>
- <param name="ORM_TESTING" value="-Dorm.testing=jpa"/>
- <param name="RUN_PATH" value="run.bean.validation.dynamic.classpath"/>
- <param name="DB_URL" value="${db.url}"/>
- </antcall>
</target>
<target name="oracle-test" if="is.oracle" depends="config-classpath">
@@ -1838,7 +1809,6 @@
<pathelement path="${jpatest.basedir}/woven-${eclipselink.delimited.model}.jar"/>
<pathelement path="${jpatest.basedir}/woven-${eclipselink.extensibility.model}.jar"/>
<pathelement path="${jpatest.basedir}/woven-${eclipselink.beanvalidation.model}.jar"/>
- <pathelement path="${jpatest.basedir}/woven-${eclipselink.beanvalidation.dynamic.model}.jar"/>
<pathelement path="${jpatest.basedir}/${eclipselink.composite.advanced.model}.jar"/>
<pathelement path="${jpatest.basedir}/woven-${eclipselink.composite.advanced.model.member_1}.jar"/>
<pathelement path="${jpatest.basedir}/woven-${eclipselink.composite.advanced.model.member_2}.jar"/>
@@ -2424,20 +2394,6 @@
<path refid="run.classpath"/>
</classpath>
</weave>
- <weave source= "${jpatest.basedir}/${eclipselink.beanvalidation.dynamic.model}.jar"
- target = "${jpatest.basedir}/woven-${eclipselink.beanvalidation.dynamic.model}.jar"
- loglevel="${logging.level}">
- <classpath>
- <path refid="run.classpath"/>
- </classpath>
- </weave>
- <weave source= "${jpatest.basedir}/${eclipselink.beanvalidation.dynamic.model}.jar"
- target = "${jpatest.basedir}/woven-${eclipselink.beanvalidation.dynamic.model}.jar"
- loglevel="${logging.level}">
- <classpath>
- <path refid="run.classpath"/>
- </classpath>
- </weave>
<weave source= "${jpatest.basedir}/${eclipselink.composite.advanced.model.member_1}.jar"
target = "${jpatest.basedir}/woven-${eclipselink.composite.advanced.model.member_1}.jar"
persistenceinfo="${jpatest.basedir}/${eclipselink.composite.advanced.model}.jar"
@@ -3782,23 +3738,12 @@
<param name="PERSISTENCE_UNIT_NAME" value="beanvalidation"/>
<param name="MODEL_DIR" value="org/eclipse/persistence/testing/models/jpa/beanvalidation"/>
<param name="MODEL_NAME" value="eclipselink-beanvalidation-model"/>
- <!-- This also includes dynamic entity test class - tests pass but maybe should separate -->
<param name="TEST_DIR" value="org/eclipse/persistence/testing/tests/jpa/beanvalidation"/>
<param name="TEST_NAME" value="eclipselink-beanvalidation-model"/>
<param name="EAR_NAME" value="eclipselink-beanvalidation-model"/>
<param name="TEST_SUITE" value="org.eclipse.persistence.testing.tests.jpa.beanvalidation.BeanValidationJunitTest"/>
<param name="eclipselink.jpa.test.dir" value="."/>
</antcall>
- <!--<antcall target="server-run-all" inheritRefs="true">-->
- <!--<param name="PERSISTENCE_UNIT_NAME" value="beanvalidation-dynamic"/>-->
- <!--<param name="MODEL_DIR" value="org/eclipse/persistence/testing/models/jpa/beanvalidation-dynamic"/>-->
- <!--<param name="MODEL_NAME" value="eclipselink-beanvalidation-dynamic-model"/>-->
- <!--<param name="TEST_DIR" value="org/eclipse/persistence/testing/tests/jpa/beanvalidation/dynamic"/>-->
- <!--<param name="TEST_NAME" value="eclipselink-beanvalidation-dynamic-model"/>-->
- <!--<param name="EAR_NAME" value="eclipselink-beanvalidation-dynamic-model"/>-->
- <!--<param name="TEST_SUITE" value="org.eclipse.persistence.testing.tests.jpa.beanvalidation.dynamic.BeanValidationDynamicEntityJunitTest"/>-->
- <!--<param name="eclipselink.jpa.test.dir" value="."/>-->
- <!--</antcall>-->
</target>
<target name="prepare-project-cache-persistence-xml">
diff --git a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/employee-constraints.xml b/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/employee-constraints.xml
deleted file mode 100644
index cdba423..0000000
--- a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/employee-constraints.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<constraint-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd"
- xmlns="http://jboss.org/xml/ns/javax/validation/mapping">
- <default-package>org.eclipse.persistence.testing.models.jpa.beanvalidation</default-package>
- <bean class="DynamicEmployee" ignore-annotations="true">
- <getter name="name" ignore-annotations="true">
- <constraint annotation="javax.validation.constraints.NotNull" />
- </getter>
- <getter name="surname" ignore-annotations="true">
- <constraint annotation="javax.validation.constraints.NotNull" />
- </getter>
- </bean>
-</constraint-mappings>
\ No newline at end of file
diff --git a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/employee-orm.xml b/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/employee-orm.xml
deleted file mode 100644
index a4c0539..0000000
--- a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/employee-orm.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<entity-mappings version="2.1"
- xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
- <package>org.eclipse.persistence.testing.models.jpa.beanvalidation</package>
-
- <entity class="DynamicEmployee" access="VIRTUAL">
- <attributes>
- <id name="id" attribute-type="Integer">
- <generated-value strategy="SEQUENCE" generator="employee-generator" />
- <sequence-generator name="employee-generator" sequence-name="DYN_EMP_SEQ" />
- </id>
- <basic name="name" attribute-type="String"/>
- <basic name="surname" attribute-type="String"/>
- <version name="version" attribute-type="Long"/>
- </attributes>
- </entity>
-
-</entity-mappings>
diff --git a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/persistence.xml b/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/persistence.xml
deleted file mode 100644
index 42d094a..0000000
--- a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/persistence.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_2_0.xsd" version="2.0">
- <persistence-unit name="beanvalidation-dynamic" transaction-type="RESOURCE_LOCAL">
- <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
- <mapping-file>META-INF/employee-orm.xml</mapping-file>
- <exclude-unlisted-classes>true</exclude-unlisted-classes>
- <validation-mode>CALLBACK</validation-mode>
- <properties>
- <property name="eclipselink.weaving" value="static"/>
- <property name="javax.persistence.schema-generation.database.action" value="create"/>
- </properties>
- </persistence-unit>
-</persistence>
diff --git a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/employee-constraints.xml b/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/employee-constraints.xml
deleted file mode 100644
index cdba423..0000000
--- a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/employee-constraints.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<constraint-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd"
- xmlns="http://jboss.org/xml/ns/javax/validation/mapping">
- <default-package>org.eclipse.persistence.testing.models.jpa.beanvalidation</default-package>
- <bean class="DynamicEmployee" ignore-annotations="true">
- <getter name="name" ignore-annotations="true">
- <constraint annotation="javax.validation.constraints.NotNull" />
- </getter>
- <getter name="surname" ignore-annotations="true">
- <constraint annotation="javax.validation.constraints.NotNull" />
- </getter>
- </bean>
-</constraint-mappings>
\ No newline at end of file
diff --git a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/employee-orm.xml b/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/employee-orm.xml
deleted file mode 100644
index a4c0539..0000000
--- a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/employee-orm.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<entity-mappings version="2.1"
- xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
- <package>org.eclipse.persistence.testing.models.jpa.beanvalidation</package>
-
- <entity class="DynamicEmployee" access="VIRTUAL">
- <attributes>
- <id name="id" attribute-type="Integer">
- <generated-value strategy="SEQUENCE" generator="employee-generator" />
- <sequence-generator name="employee-generator" sequence-name="DYN_EMP_SEQ" />
- </id>
- <basic name="name" attribute-type="String"/>
- <basic name="surname" attribute-type="String"/>
- <version name="version" attribute-type="Long"/>
- </attributes>
- </entity>
-
-</entity-mappings>
diff --git a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/persistence.xml b/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/persistence.xml
deleted file mode 100644
index 5a35000..0000000
--- a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/persistence.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_2_0.xsd" version="2.0">
- <persistence-unit name="%%default%%" transaction-type="%%transaction-type%%">
- <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
- <%%datasource-type%%>%%data-source-name%%</%%datasource-type%%>
- <mapping-file>META-INF/employee-orm.xml</mapping-file>
- <exclude-unlisted-classes>true</exclude-unlisted-classes>
- <validation-mode>CALLBACK</validation-mode>
- <properties>
- <property name="eclipselink.target-server" value="%%server-platform%%"/>
- <property name="eclipselink.target-database" value="%%database-platform%%"/>
- <property name="eclipselink.weaving" value="static"/>
- <property name="eclipselink.validate-existence" value="true"/>
- <property name="eclipselink.logging.logger" value="DefaultLogger"/>
- <property name="eclipselink.jdbc.allow-native-sql-queries" value="true"/>
- <property name="javax.persistence.schema-generation.database.action" value="create"/>
- </properties>
- </persistence-unit>
-</persistence>
diff --git a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/validation.xml b/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/validation.xml
deleted file mode 100644
index 434c8d2..0000000
--- a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/server/validation.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<validation-config version="1.1" xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">
- <default-provider>org.hibernate.validator.HibernateValidator</default-provider>
- <message-interpolator>org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator</message-interpolator>
- <traversable-resolver>org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver</traversable-resolver>
- <constraint-validator-factory>org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl</constraint-validator-factory>
- <constraint-mapping>META-INF/employee-constraints.xml</constraint-mapping>
-</validation-config>
diff --git a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/validation.xml b/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/validation.xml
deleted file mode 100644
index 434c8d2..0000000
--- a/jpa/eclipselink.jpa.test/resource/eclipselink-beanvalidation-dynamic-model/validation.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<validation-config version="1.1" xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">
- <default-provider>org.hibernate.validator.HibernateValidator</default-provider>
- <message-interpolator>org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator</message-interpolator>
- <traversable-resolver>org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver</traversable-resolver>
- <constraint-validator-factory>org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl</constraint-validator-factory>
- <constraint-mapping>META-INF/employee-constraints.xml</constraint-mapping>
-</validation-config>
diff --git a/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/beanvalidation/dynamic/BeanValidationDynamicEntityJunitTest.java b/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/beanvalidation/dynamic/BeanValidationDynamicEntityJunitTest.java
deleted file mode 100644
index dcb0014..0000000
--- a/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/beanvalidation/dynamic/BeanValidationDynamicEntityJunitTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- ******************************************************************************/
-package org.eclipse.persistence.testing.tests.jpa.beanvalidation.dynamic;
-
-import java.util.*;
-
-import javax.persistence.*;
-import javax.validation.ConstraintViolationException;
-import javax.validation.ConstraintViolation;
-
-import junit.framework.*;
-
-import junit.framework.Test;
-import org.eclipse.persistence.config.PersistenceUnitProperties;
-import org.eclipse.persistence.descriptors.ClassDescriptor;
-import org.eclipse.persistence.dynamic.DynamicClassLoader;
-import org.eclipse.persistence.dynamic.DynamicEntity;
-import org.eclipse.persistence.dynamic.DynamicType;
-import org.eclipse.persistence.internal.jpa.config.metadata.ReflectiveDynamicClassLoader;
-import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper;
-import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
-import org.junit.Assert;
-
-public class BeanValidationDynamicEntityJunitTest extends JUnitTestCase {
-
- public BeanValidationDynamicEntityJunitTest() {
- super();
- }
-
- public BeanValidationDynamicEntityJunitTest(String name) {
- super(name);
- }
-
- public static Test suite() {
- TestSuite suite = new TestSuite();
- suite.setName("BeanValidationDynamicEntityJunitTest");
- if (! JUnitTestCase.isJPA10()) {
- suite.addTest(new BeanValidationDynamicEntityJunitTest("testPersistDynamicEntityWithInvalidData"));
- }
- return suite;
- }
-
- /**
- * Strategy:
- * 1. Persist a dynamic entity with invalid values
- * 2. Assert - a ConstraintViolationException is raised
- * 3. Assert - transaction is rolled back
- * 4. Assert - The validation exception is due to invalid value given by us.
- */
- @SuppressWarnings("unchecked")
- public void testPersistDynamicEntityWithInvalidData() {
- // Create an entity manager factory with a dynamic class loader.
- DynamicClassLoader dcl = new ReflectiveDynamicClassLoader(Thread.currentThread().getContextClassLoader());
- Map<String,Object> properties = new HashMap<>(getPersistenceProperties());
- properties.put(PersistenceUnitProperties.CLASSLOADER, dcl);
-// properties.put(PersistenceUnitProperties.BEAN_VALIDATION_NO_OPTIMISATION, "true");
- EntityManager em = createEntityManager("beanvalidation-dynamic", properties);
- EntityManagerFactory entityManagerFactory = em.getEntityManagerFactory();
-
- // Create types
- JPADynamicHelper helper = new JPADynamicHelper(entityManagerFactory);
-
- DynamicType empType = helper.getType("DynamicEmployee");
- ClassDescriptor empTypeDescriptor = empType.getDescriptor();
- DynamicEntity employee = (DynamicEntity) empTypeDescriptor.getInstantiationPolicy().buildNewInstance();
-
- employee.set("name", "Bob");
- employee.set("surname", "Smith");
-
- try {
- beginTransaction(em);
- em.persist(employee);
- commitTransaction(em);
- } catch (Exception e) {
- if (isTransactionActive(em)) {
- rollbackTransaction(em);
- }
- closeEntityManager(em);
- Assert.fail(e.getMessage());
- }
- Integer employeeId = employee.<Integer>get("id");
- assertTrue("Employee id not set!", employeeId > 0);
-
- DynamicEntity emp = em.find(empType.getJavaClass(), employeeId);
-
- emp.set("name", null);
- emp.set("surname", null);
-
- try {
- beginTransaction(em);
- em.flush();
- } catch (ConstraintViolationException e) {
- System.out.println("ConstraintException: " + e.getMessage());
- for (ConstraintViolation<?> cv : e.getConstraintViolations()) {
- System.out.println("\t>> " + cv.getPropertyPath() + "::" + cv.getMessage());
- }
- return;
- } finally {
- if (isTransactionActive(em)) {
- rollbackTransaction(em);
- }
- closeEntityManager(em);
- }
- Assert.fail("ConstraintViolationException not thrown");
- }
-
-// public String getPersistenceUnitName() {
-// return "beanvalidation-dynamic";
-// }
-}
diff --git a/jpa/org.eclipse.persistence.jpa/META-INF/MANIFEST.MF b/jpa/org.eclipse.persistence.jpa/META-INF/MANIFEST.MF
index 638a59ee..94b19a9 100644
--- a/jpa/org.eclipse.persistence.jpa/META-INF/MANIFEST.MF
+++ b/jpa/org.eclipse.persistence.jpa/META-INF/MANIFEST.MF
@@ -55,7 +55,6 @@
javax.transaction.xa;version="1.1.0";resolution:=optional,
javax.validation;resolution:=optional,
javax.validation.groups;resolution:=optional,
- javax.validation.metadata;resolution:=optional,
javax.xml.parsers;resolution:=optional,
javax.xml.transform;resolution:=optional,
javax.xml.transform.stream;resolution:=optional,
diff --git a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/beanvalidation/BeanValidationHelper.java b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/beanvalidation/BeanValidationHelper.java
new file mode 100644
index 0000000..3d96236
--- /dev/null
+++ b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/beanvalidation/BeanValidationHelper.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ * Marcel Valovy - 2.6 - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.persistence.internal.jpa.metadata.beanvalidation;
+
+import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * INTERNAL:
+ *
+ * Utility class for bean validation related tasks.
+ * - Singleton.
+ * - Thread-safe.
+ */
+public enum BeanValidationHelper {
+ BEAN_VALIDATION_HELPER;
+
+ /**
+ * # default constraints in {@link #KNOWN_CONSTRAINTS} map.
+ *
+ * The value reflects the number of default constraints; if
+ * more default constraints are added, update the value.
+ */
+ private static final int DEFAULT_CONSTRAINTS_QUANTITY = 25;
+
+ /**
+ * Load factor for concurrent maps.
+ */
+ private static final float LOAD_FACTOR = 0.75f;
+
+ /**
+ * Size parameter for {@link #KNOWN_CONSTRAINTS} map.
+ */
+ private static final int KNOWN_CONSTRAINTS_DEFAULT_SIZE = nextPowerOfTwo(
+ (int) (DEFAULT_CONSTRAINTS_QUANTITY / LOAD_FACTOR));
+
+ /**
+ * Set of all default BeanValidation field annotations and discovered custom field constraints.
+ * Implemented as a ConcurrentHashMap with "Null Object" idiom.
+ */
+ private static final Set<String> KNOWN_CONSTRAINTS = Collections.newSetFromMap(new ConcurrentHashMap<String,
+ Boolean>( KNOWN_CONSTRAINTS_DEFAULT_SIZE, LOAD_FACTOR ));
+
+ /**
+ * Map of all classes that have undergone check for bean validation constraints.
+ * Maps the key with boolean value telling whether the class contains an annotation from {@link #KNOWN_CONSTRAINTS}.
+ */
+ private static final Map<Class<?>, Boolean> CONSTRAINTS_ON_CLASSES = Collections.synchronizedMap(new
+ WeakHashMap<Class<?>, Boolean>());
+
+ static {
+ initializeKnownConstraints();
+ }
+
+ /**
+ * Tells whether any of the class's fields are constrained by Bean Validation annotations or custom constraints.
+ *
+ * @param clazz checked class
+ * @return true or false
+ */
+ public boolean isConstrained(Class<?> clazz) {
+ Boolean annotated = CONSTRAINTS_ON_CLASSES.get(clazz);
+ if (annotated == null) {
+ annotated = detectConstraints(clazz);
+ CONSTRAINTS_ON_CLASSES.put(clazz, annotated);
+ }
+ return annotated;
+ }
+
+ /**
+ * INTERNAL:
+ * Reveals whether any of the class's fields are constrained by Bean Validation annotations or custom constraints.
+ * Uses reflection.
+ * @see Class#getDeclaredFields
+ */
+ private Boolean detectConstraints(Class<?> clazz) {
+ for (Field f : getDeclaredFields(clazz)) {
+ for (Annotation a : f.getDeclaredAnnotations()) {
+ final Class<? extends Annotation> type = a.annotationType();
+ final String typeCanonicalName = type.getCanonicalName();
+
+ if (KNOWN_CONSTRAINTS.contains(typeCanonicalName)) {
+ return true;
+ }
+
+ // Check for custom annotations on the field (+ check inheritance on class annotations).
+ // Custom bean validation annotation is defined by having @Constraint annotation on its class.
+ for (Annotation typesClassAnnotation : type.getAnnotations()) {
+ final Class<? extends Annotation> classAnnotationType = typesClassAnnotation.annotationType();
+ if ("javax.validation.Constraint".equals(classAnnotationType.getCanonicalName())) {
+ // Avoid adding anonymous class constraints.
+ if (typeCanonicalName != null) {
+ KNOWN_CONSTRAINTS.add(typeCanonicalName);
+ }
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Retrieves declared fields.
+ * <p/>
+ * If security is enabled, makes {@linkplain java.security.AccessController#doPrivileged(PrivilegedAction)
+ * privileged calls}.
+ *
+ * @param clazz fields of that class will be returned
+ * @return array of declared fields
+ * @see Class#getDeclaredFields()
+ */
+ private Field[] getDeclaredFields(final Class<?> clazz) {
+ return PrivilegedAccessHelper.shouldUsePrivilegedAccess()
+ ? AccessController.doPrivileged(
+ new PrivilegedAction<Field[]>() {
+ @Override
+ public Field[] run() {
+ return clazz.getDeclaredFields();
+ }
+ })
+ : PrivilegedAccessHelper.getDeclaredFields(clazz);
+ }
+
+ /**
+ * Adds canonical names of bean validation constraints into set of known constraints (internally represented by
+ * map).
+ * Canonical name is the name that would be used in an import statement and uniquely identifies the class,
+ * i.e. anonymous classes receive a 'null' value as their canonical name,
+ * which allows no ambiguity and is what we are looking for.
+ */
+ private static void initializeKnownConstraints() {
+ KNOWN_CONSTRAINTS.add("javax.validation.Valid");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.Max");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.Min");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.DecimalMax");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.DecimalMin");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.Digits");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.NotNull");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.Pattern");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.Size");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.AssertTrue");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.AssertFalse");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.Future");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.Past");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.Max");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.Min");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.DecimalMax");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.DecimalMin");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.Digits");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.NotNull");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.Pattern");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.Size");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.AssertTrue");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.AssertFalse");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.Future");
+ KNOWN_CONSTRAINTS.add("javax.validation.constraints.List.Past");
+ }
+
+
+ /**
+ * Calculate the next power of 2, greater than or equal to x.<p>
+ * From Hacker's Delight, Chapter 3, Harry S. Warren Jr.
+ *
+ * @param x integer greater than 0
+ * @return next power of two
+ */
+ private static int nextPowerOfTwo(int x) {
+ assert x > 0;
+ x |= --x >> 1;
+ x |= x >> 2;
+ x |= x >> 4;
+ x |= x >> 8;
+ x |= x >> 16;
+ return x + 1;
+ }
+}
diff --git a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/listeners/BeanValidationListener.java b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/listeners/BeanValidationListener.java
index 82a0e64..045f7f3 100644
--- a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/listeners/BeanValidationListener.java
+++ b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/listeners/BeanValidationListener.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2016 Sun Microsystems, Inc, IBM Corporation. All rights reserved.
+ * Copyright (c) 2009, 2015 Sun Microsystems, Inc, IBM Corporation. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
@@ -11,8 +11,6 @@
* 08/20/2014-2.5 Rick Curtis
* - 441890: Cache Validator instances.
* Marcel Valovy - 2.6 - skip validation of objects that are not constrained.
- * 02/17/2016-2.6 Dalia Abo Sheasha
- * - 487889: Fix EclipseLink Bean Validation optimization
******************************************************************************/
package org.eclipse.persistence.internal.jpa.metadata.listeners;
@@ -25,7 +23,6 @@
import javax.validation.ValidatorFactory;
import javax.validation.groups.Default;
-import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.descriptors.DescriptorEventAdapter;
import org.eclipse.persistence.descriptors.DescriptorEvent;
import org.eclipse.persistence.descriptors.ClassDescriptor;
@@ -39,6 +36,8 @@
import java.util.concurrent.ConcurrentHashMap;
import java.lang.annotation.ElementType;
+import static org.eclipse.persistence.internal.jpa.metadata.beanvalidation.BeanValidationHelper.BEAN_VALIDATION_HELPER;
+
/**
* Responsible for performing automatic bean validation on call back events.
* @author Mitesh Meswani
@@ -98,9 +97,7 @@
private void validateOnCallbackEvent(DescriptorEvent event, String callbackEventName, Class[] validationGroup) {
Object source = event.getSource();
- boolean noOptimization = "true".equalsIgnoreCase((String) event.getSession().getProperty(PersistenceUnitProperties.BEAN_VALIDATION_NO_OPTIMISATION));
- boolean isBeanConstrained = getValidator(event).getConstraintsForClass(source.getClass()).isBeanConstrained();
- boolean shouldValidate = noOptimization || isBeanConstrained;
+ boolean shouldValidate = BEAN_VALIDATION_HELPER.isConstrained(source.getClass());
if (shouldValidate) {
Set<ConstraintViolation<Object>> constraintViolations = getValidator(event).validate(source, validationGroup);
if (constraintViolations.size() > 0) {